mysql学习

查看glibc版本

ldd --version

--mysql启动失败,尝试启动

1 查看错误日志,端口被占用,参数名写错,有不支持的参数

2 通过mysqld启动 mysqld --default-file=my.cnf &

3 mysqld --no-defaults --basedir=/user/local/mysql --datadir=/data/mysql/3306/data/ --user=mysql

4 strace查看mysql启动过程的系统调用情况

查看当前用户

select user();

系统表中注册已加载的组件

rpm包安装的软件默认加载了validate_password

show plugins;

SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS;

select * from mysql.component;

show variables like 'validate_password%';

加载validate_password

mysql5.7

install plugin validate_password soname 'validate_password.so';

vi /etc/my.cnf

plugin-load=validate_password.so

mysql8.0

install component 'file://component_validate_password';

--参数

--查看参数的信息

select * from variables_info limit 1 \G

default_authentication_plugin:默认的密码认证插件

master_info_repository:复制的相关信息保存在文件还是表里(mysql.slave_master_info,mysql.slave_relay_log_info)

gtid_mode=on

enforce_gtid_consistency=on

--错误

--mysql8.0以下的客户端连接mysql8.0报错

Authentication plugin 'caching_sha2_password' cannot be loaded

原因:mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password。

解决方法:

1 升级mysql客户端或驱动

2 将参数default_authentication_plugin设置为mysql_native_password

3 创建用户时指定auth_plugin为mysql_native_password

create user user1@'%' identified with mysql_native_password 'xxxxx';

创建用户不指定密码认证插件,实际上被默认指定

--主从复制

mysql8.0要加 get_master_public_key=1 ,主要是由于复制用户使用新的密码认证插件

change master to master_host='xxx', master_port=xxx, master_user='xxx', master_password='xxxx', get_master_public_key=1,master_log_file='binlog.000003',master_log_pos=155 for channel 'channel_201_3306';

基于gtid复制

change master to master_host='xxx', master_port=xxx, master_user='xxx', master_password='xxxx', master_auto_position=1;

--数据字典

mysql.slave_master_info 保存连接主库的信息,IO线程读取主库binlog信息(非实时,写入sync_master_info参数个事务后更新)

mysql.slave_relay_log_info sql线程重放relay_log的位置

--查看binlog事件

show binlog events in 'mysql-bin.000001';

--查看全局变量

show global variables like 'gtid_executed';

============================延迟复制============================

暂停SQL线程应用,并不会暂停IO线程接受日志

在主库执行后,要等待若干秒才在备库执行

===============使用场景:

1 应对主库的误操作,比如drop table

delete,update误操作,如果日志格式是ROW,可通过binlog闪回恢复.drop操作binlog只记录原生SQL,无法使用工具恢复

2 查看数据的历史状态

3 人为模拟主从延迟

也可使用flush tables with read lock模拟来模拟延迟

===============开启延迟复制

CHANGE MASTER TO master_host='xxxxx',master_port=xxxx,master_user='xxx',master_password='******',MASTER_LOG_FILE='mysql1_bin.000007', MASTER_LOG_POS=426114256 ,master_delay=28800;

stop slave;

CHANGE MASTER TO master_delay=28800;

start slave;

show slave status\G

SQL_Delay: 28800 ---期望的延迟时间

SQL_Remaining_Delay: 28774 ---需要等待多久才能到达期望延迟时间

Slave_SQL_Running_State: Waiting until MASTER_DELAY seconds after master executed event

===============使用延迟复制恢复主库误删的表

从库开启延迟复制

主库查看删表的binlog位置

show master status;

show binlog events in 'mysql-bin.000003';

pager grep -iB 5 drop

show binlog events in 'mysql-bin.000003';

从库恢复到drop之前的位点

stop slave;

CHANGE MASTER TO master_delay=0;

start slave until master_log_file='xxx',master_log_pos=xxx;

show slave status\G --确认恢复到指定位置

Master_Log_File=Relay_Master_Log_File

Exec_Master_Log_Pos=Until_Log_Pos

Slave_SQL_Running='No'

导出数据导入到主库

============================主从延迟============================

===============如何分析主从延迟

1 从库服务器的负载情况

top

iostat -xm 1

2 主从复制状态

show master status;

show slave status\G

对比主位点以及备读取位点

对比备读取位点以及备执行位点

3 主库binlog写入量

===============主从延迟常见原因以及解决方法

1 IO线程存在延迟

网络延迟 --开启slave_compressed_protocol,启用binlog压缩

磁盘IO存在瓶颈 --调整从库双1设置或者关闭binlog

网卡问题

2 sql线程存在延迟

a 主库binlog写入量过大,SQL线程单线程重放

具体体现:

从库磁盘IO无明显瓶颈

relay_master_log_file和exec_master_log_pos不断变化

binlog生成速度快于5分钟一个,主库写入量过大

解决:升级到5.7以上,开启并行复制

b statement格式下的慢SQL

具体体现:

relay_master_log_file和exec_master_log_pos一段时间没变化

解决:设置log_slow_slave_statements,记录从库的慢SQL,优化SQL

c 表上无索引且binlog为row格式

具体体现:

relay_master_log_file和exec_master_log_pos一段时间没变化

表无索引操作时,主库表只会被扫描一次,而row格式下的从库,对于每条记录都会扫描一次

解决

从库临时创建一个索引

将参数slave_rows_search_algorithms设置为INDEX_SCAN,HASH_SCAN

d 大事务

拆分成小事务

e 从库上有查询

消耗系统资源,有锁等待

查询操作阻塞主库的DDL

f 从库上有备份

全局读锁阻塞SQL线程

g 磁盘IO存在瓶颈

===============如何理解seconds_behind_master

根据计算逻辑

1 seconds_behind_master只计算SQL线程的延迟,不计算IO线程的延迟

网络原因,磁盘瓶颈,slave_net_timeout设置过大,导致的binlog未及时发送

2 binlog为statement和row计算逻辑不一样

3 级联复制无法真正反映延迟

主从延迟的监控

8.0之前使用pt-hearteat

8.0使用如下SQL

select case when min_commit_timestamp is null then 0

else unix_timestamp(now(6))-unix_timestamp(min_commit_timestamp) end as seconds_behind_master

from (select min(APPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP) as min_commit_timestamp

from performance_schema.replication_applier_status_by_worker

where applying_transaction<>'') t;

相关推荐
虾球xz11 分钟前
游戏引擎学习第228天
c++·学习·游戏引擎
Nuyoah.26 分钟前
《Vue3学习手记2》
javascript·vue.js·学习
星星火柴93642 分钟前
Git 学习笔记
笔记·git·学习
.R^O^1 小时前
VLAN的知识
linux·服务器·网络·mysql
风中飘爻2 小时前
MySQL入门:数据表的创建
数据库·mysql·oracle
大雄野比3 小时前
【scikit-learn基础】--『监督学习』之 支持向量机回归
学习·支持向量机·scikit-learn
神仙别闹3 小时前
基于JSP+MySQL实现用户注册登录及短信发送功能
java·开发语言·mysql
浪淘沙jkp3 小时前
AI大模型学习十:‌Ubuntu 22.04.5 调整根目录大小,解决根目录磁盘不够问题
linux·学习·ubuntu
LVerrrr4 小时前
Missashe考研日记-day20
学习·考研
AI绘画咪酱4 小时前
SD教程|巧用Stable Diffusion,实现不同风格的LOGO设计|实战篇幅,建议收藏!
人工智能·学习·ai作画·stable diffusion·sd