目录
10. show slave status \G 各个参数解释
1. 服务器介绍
2. 环境配置(建议先看一下第7章和第8章)
2.1 在MySQL主服务器128配置文件my.cnf里面加入
# 启用二进制日志log-bin=mysql-bin
#主服务器唯一ID
server-id=128
auto_increment_increment=2
auto_increment_offset=1 #不一样的点 相当于起始值
log-slave-updates
sync_binlog=1# 设置不要复制的数据库 ( 可设置多个,这里仅是测试,就注释了 )#binlog-ignore-db=mysql#binlog-ignore-db=information_schema# 设置需要复制的数据库#binlog-do-db=需要复制的主数据库名字#设置binlob模式binlog_format=STATEMENT
2.2 在MySQL主服务器129配置文件my.cnf里面加入
#启用二进制日志
log-bin=mysql-bin
#主服务器唯一ID
server-id=129
auto_increment_increment=2
auto_increment_offset=2 #不一样的点 相当于起始值
log-slave-updates
sync_binlog=1# 设置不要复制的数据库 ( 可设置多个,这里仅是测试,就注释了 )#binlog-ignore-db=mysql#binlog-ignore-db=information_schema# 设置需要复制的数据库#binlog-do-db=需要复制的主数据库名字#设置binlob模式binlog_format=STATEMENT
2.3 在MySQL从服务器130配置文件my.cnf里面加入
server-id=130
2.4 在MySQL从服务器131配置文件my.cnf里面加入
server-id=131
配置项说明
auto_increment_increment
控制主键自增的自增步长,用于防止 Master 与 Master 之间复制出现重复自增字段值,通常auto_increment_increment=n,有多少台主服务器,n 就设置为多少
auto_increment_offset=1
设置自增起始值,这里设置为1,这样 Master 的 auto_increment 字段产生的数值是:1, 3, 5, 7, …等奇数ID
注意 auto_increment_offset 的设置,不同的 master 设置不应该一样,否则就容易引起主键冲突,比如 master1 的 offset=1,则 master2 的 offset=2,master3的 offset=3
log-slave-updates
在双主模式中,log-slave-updates 配置项一定要配置,否则在master1(128)上进行了更新数据,在 master (129) 和 slave1 (130) 上会更新,但是在 slave2 (131) 上不会更新
sync_binlog
表示每几次事务提交,MySQL把binlog缓存刷进日志文件中,默认是0,最安全的是设置为1。sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
注意:
从库只开启 log-bin 功能,不添加 log-slave-updates 参数,从库从主库复制的数据不会写入log-bin日志文件里。
开启 log-slave-updates 参数后,从库从主库复制的数据会写入 log-bin 日志文件里。这也是该参数的功能。
直接向从库写入数据时,是会写入log-bin日志的。
在自动生成主键的时候,会在已生成主键的基础上按照规则生成,即比存在的值大
binlog_format设置 logbin 格式,有一下三种模式1. statement 模式
statement 模式记录的是 SQL 语句。
优点:日志量较小,占用空间小。执行速度快,因为只需要记录 SQL 语句即可。
缺点:对于使用了函数或随机数的 SQL 语句,可能会出现不一致的情况,比如随机数每次生成的都不一样。
因此,使用了函数或随机数的场景下,不建议使用 statement 模式。2. row 模式
row 模式记录的是数据行的变化情况。
优点:对于使用了函数或随机数的 SQL 语句,不会出现不一致的情况。
缺点:日志量较大,占用空间较大。执行速度较慢,因为需要记录每一条数据的变化情况。3. mixed 模式
mixed 模式是 statement 模式和 row 模式的混合模式,它能够根据具体的情况自动选择使用哪种模式。优点:能够根据具体情况自动选择使用最优的模式。
缺点:执行速度较慢,因为需要根据具体情况选择使用不同的模式。
3. 重启4台服务器上的mysql
systemctl restart mysql
4. 主服务器数据库配置
4.1 两台主服务器128、129进入mysql之后(mysql -uroot -p),开始创建用户:
mysql>CREATE USER 'copy'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
mysql>GRANT REPLICATION SLAVE ON *.* TO 'copy'@'%';
两台主服务器都要执行
4.2 重置两台主服务器状态
mysql>reset master;
4.3 查看两台主服务器状态
mysql>show master status;
4.4 如果之前设置过主从关系,也要重置一下(最好四台服务器都执行以下)
mysql>stop slave;
mysql>reset slave;
5. 从服务器数据库配置
5.1 为128主服务器数据库配置从关系(129、130这两台服务器相当于都是它的从服务器)
在129、130服务器上执行:
mysql>change master to master_host='192.168.164.128',master_user='copy',master_port=3306,master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=155;
5.2 为129主服务器数据库配置从关系
在128、131上执行:
mysql>change master to master_host='192.168.164.129',master_user='copy',master_port=3306,master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=155;
5.3 在4台服务器上都执行以下命令
mysql>start slave;
6. 验证是否配置成功
7. 解决Slave_IO_Running: No
如果Slave_IO_Running: No,原因是从数据库的uuid相同了(其它三台服务器如果是直接克隆第一台服务器,然后配置主从数据库,一通操作,到最后启动数据库,会发现这个问题)
解决方法:
7.1 find / -iname "auto.cnf"
7.2 vi /usr/local/mysql-8.0/data/auto.cnf (每个人的安装路径可能不同)
7.3 重启mysql
systemctl restart mysql
7.4 登录 mysql,重启slave,再次验证
mysql -uroot -p 登录mysql
mysql>stop slave; 停止链路
mysql>start slave; 启动链路
mysql>show slave status \G 查看链路
8. 解决Slave_SQL_Running: No的问题
如果 Slave_SQL_Running: No ,那么执行以下步骤:
a. 先停掉slave
mysql> stop slave;
b. 跳过错误步数,后面步数可变
mysql> set global sql_slave_skip_counter=1;
c. 再启动slave
mysql> start slave;
d. 查看同步状态
mysql> show slave status \G
9. 进入数据库的方式
果我们使用 mysql -hhostname -uusername -ppassword -Pport 的方式进入数据,那么很可能会出现下面的提示信息,这是由于这种方式进入数据库会进行预读,如果数据量特别大就会容易卡住。
mysql> use han3;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
解决方式:
mysql -hhostname -uusername -ppassword -Pport -A的方式进入数据库, -A的意思就是不让数据库进行预读,这样打开数据库的速度就会快很多。
10. show slave status \G 各个参数解释
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.164.128 (指的是主服务器的地址。 )
Master_User: copy (指的是主服务器上用来复制的用户。从服务器会用此账号来登录主服务。进行复制。)
Master_Port: 3306 (主服务器上数据库的端口号)
Connect_Retry: 60 (–master-connect-retry选项的当前值,连接重试时间)
Master_Log_File: mysql-bin.000001 (I/O线程当前正在读取的主服务器二进制日志文件的名称)
Read_Master_Log_Pos: 3384 (在当前的主服务器二进制日志中,I/O线程已经读取的位置)
Relay_Log_File: node-3-relay-bin.000003 (SQL线程当前正在读取和执行的中继日志文件的名称。)
Relay_Log_Pos: 2200 (在当前的中继日志中,SQL线程已读取和执行的位置)
Relay_Master_Log_File: mysql-bin.000001 (由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称)
Slave_IO_Running: Yes (I/O线程是否被启动并成功地连接到主服务器上)
Slave_SQL_Running: Yes (SQL线程是否被启动)
Replicate_Do_DB: (搭建主从复制时使用–replicate-do-db和–replicate-ignore-db选项指定的数据库清单)
Replicate_Ignore_DB: (同上)
Replicate_Do_Table: (使用–replicate-do-table,–replicate-ignore-table,–replicate-wild-do-table和–replicate-wild-ignore_table选项指定的表清单)
Replicate_Ignore_Table: (同上)
Replicate_Wild_Do_Table: (同上)
Replicate_Wild_Ignore_Table: (同上)
Last_Errno: 0
Last_Error: (被多数最近被执行的查询返回的错误数量和错误消息。错误数量为0并且消息为空字符串意味着“没有错误”。如果Last_Error值不是空值,它也会在从服务器的错误日志中作为消息显示)
Skip_Counter: 0 (最近被使用的用于SQL_SLAVE_SKIP_COUNTER的值)
Exec_Master_Log_Pos: 3384 (表示SQL线程已经执行的Relay log相对于主库二进制日志偏移量的位置,一般gtid复制出错使用该项去主库中查询)
Relay_Log_Space: 3927 (表示所有原有的中继日志结合起来的总大小)
Until_Condition: None (如果没有指定UNTIL子句,则没有值。如果从属服务器正在读取,直到达到主服务器的二进制日志的给定位置为止,则值为Master,如果从属服务器正在读取,直到达到其中继日志的给定位置为止,则值为Relay)
Until_Log_File:
Until_Log_Pos: 0 (Until_Log_File和Until_Log_Pos用于指示日志文件名和位置值,日志文件名和位置值定义了SQL线程在哪个点中止执行)
Master_SSL_Allowed: No (显示了从服务器是否使用SSL连接到主服务器。如果允许对主服务器进行SSL连接,则值为Yes;如果不允许对主服务器进行SSL连接,则值为No;如果允许SSL连接,但是从服务器没有让SSL支持被启用,则值为Ignored)
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key: (如果Slave使用SSL连接Master服务器,这里就会显示对应的证书和私钥信息。使用CHANGE MASTER与SSL相关的选项有:–master-ca,–master-capath,–master-cert,–master-cipher和–master-key等)
Seconds_Behind_Master: 0 (表示主从之间延迟的时间,单位是秒。就是SQL线程当前执行的binlog(实际上是relay log)中的timestamp和IO线程最新的timestamp的差值。
实质上,此字段计算Slave SQL线程和Slave i/o线程之间的时间差 (以秒为单位)。如果主节点和从服务器之间的网络连接速度较快,则Slave i/o线程非常接近主服务器,
因此此字段是对从SQL线程与主服务器进行比较的后的一个很好的近似值。如果网络很慢,这不是一个好的近似;从SQL线程可能经常被从i/o线程所捕获,
因此Seconds_Behind_Master通常显示值为0,即使i/o线程比主服务器慢很多。换言之,此列仅适用于快速网络)
Master_SSL_Verify_Server_Cert: No (显示是否认证Master证书)
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error: (类似last_error,在出现IO线程错误和SQL线程错误的时候会有值)
Replicate_Ignore_Server_Ids: (slave当前会跳过的事件号)
Master_Server_Id: 128 (显示主服务器的Server_id)
Master_UUID: e6c0141a-c705-11ed-9acc-000c290cc524 (记录Master的UUID)
Master_Info_File: mysql.slave_master_info (记录Master info信息的存储位置)
SQL_Delay: 0 (记录Slave设置延迟复制的时间,0表示无延迟,主动延迟复制在某些情况下有助于恢复)
SQL_Remaining_Delay: NULL (当 Slave_SQL_Running_State 等待,直到MASTER_DELAY秒后,Master执行的事件, 此字段包含一个整数,表示有多少秒左右的延迟。在其他时候,这个字段是0)
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates (记录SQL线程的状态。常见的三种状态如下)
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp: (记录最近IO线程错误的时间戳)
Last_SQL_Error_Timestamp: (记录最近SQL线程错误的时间戳)
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: (接收的二进制日志集合,对应IO线程)
Executed_Gtid_Set: (执行的二进制日志集合,对应SQL线程)
Auto_Position: 0 (记录在GTID模式下是否开启了自动事务校验)
Replicate_Rewrite_DB:
Channel_Name: (在多源复制下(5.7支持),复制通道的名称,可以有多个)
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set (0.00 sec)
参考文章:
MySQL 集群 (三) ---------- 一主多从环境搭建_mysql一主多从搭建_在森林中麋了鹿的博客-CSDN博客