本文作者:wuXing
QQ:1226032602
E-mail:1226032602@qq.com
https://dev.mysql.com/doc/refman/5.7/en/replication-implementation-details.html
- mysql复制
- 工作原理
复制(replication)是mysql提供的一种高可用性的解决方案。
1、主库(master)把数据更改记录到二进制日志(binlog)中
2、从库(slave)I/O线程请求主库建立连接,获取master的binlog并记录成本地的中继日志(relay log)
3、从库(slave)sql线程读取并应用relaylog
- 用途
1、利用从库做负载均衡,提高读数据的能力
2、利用从库做master的故障切换服务器,高可用性
3、利用从库做备份服务器
4、利用从库做延时数据的备份
5、利用复制做mysql升级
6、利用从库做查询服务器
- 复制模式
mysql5.6开始支持:
传统复制
1、基于语句的复制 binlog_format = statement (SBR)
2、基于行复制 binlog_format = row (RBR)
3、混合复制 binlog_format = mixed
GTID复制
半同步复制是复制安全的一种技术实现
- 基于行的复制
binlog_format = row
优点:
1、安全的复制模式
2、某些情况下复制速度快(sql复杂,表有主键,直接复制更新的目标记录)
3、系统函数也可以复制
4、更少的锁
缺点:
1、binary log文件大
2、单独语句如更新,删除的记录过多,会产生大量的binary log
3、无法从日志中看到具体的语句内容,(binlog-row-query-log events=1 可以增加这部分信息)
注意:DDL语句,还是会记录为statement
- 查看表里面字段的顺序
mysql> select TABLE_NAME,COLUMN_NAME from columns where TABLE_SCHEMA='oldboy' limit 10;
+------------+-------------+
| TABLE_NAME | COLUMN_NAME |
+------------+-------------+
| backupstep | id |
| backupstep | step |
| student | id |
| student | name |
| student | age |
| student | dept |
| test | id |
| test | name |
+------------+-------------+
8 rows in set (0.01 sec)
- 基于mixed的复制
binlog_format = mixed
混合使用两种模式
Innodb表,事物级别为read-uncommitted read-committed日志类型只能为row
转换为row模式条件:
1、表的存储引擎为NDB引擎表,这时对于表的DML操作都会以row格式记录
2、使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不确定函数
3、两个及以上含有Auto_increment字段的表被更新时
4、使用了INSERT DELAY语句
5、使用了用户定义函数
6、使用了临时表
- 转换为row模式条件
当是有grant,revoke,set password,rename user,create(all forms except create table…select),alter(all forms),and drop (all forms)都将使用statement级别来记录binlog而忽视系统设置
create table…select 是一个集数据定义和数据处理为一体的语句。他的create table部分使用statement方式,而select部分使用系统定义的方式
- 复制常用命令
show slave status\G;
show master status;
start slave;
start slave IO_THREAD;
start slave SQL_THREAD;
start slave [SQL_THREAD] until
master_log_file = 'log_name'
master_log_pos = log_pos
stop slave IO_THREAD;
stop slave SQL_THREAD;
reset master/slave;
- 跳过错误
stop slave;
set global sql_slave_skip_counter=1;
start slave;
- 从库配置主从同步执行命令
change master to
master_host = '10.0.0.51',
master_port=3306,
master_user = 'replication',
master_password ='slave',
master_log_file = 'mysqld-bin.006572',
master_log_pos=514294150;
- 复制创建的基本原则
1、一个mysql从库只能有一个主库(mysql5.7后可以多源复制)
2、每个主库,从库必须有唯一的server id
3、 一个主库可以有多个从库
4、如果级联复制需要打开log_slave_updates,从库把relaylog记录到binlog中用于它的从库的复制
- 一主多从
适用于少量写大量读,可以实现:
1、为不同从库设置不同角色
2、把一台从库当做待用的主库,除了复制没有其他数据查询
3、将一台从库放到远程数据中心,用作灾难恢复
4、延迟一个备库,以备灾难恢复
- 双主
主动-主动模式复制包含2台服务器,每一方都设置成对方的主库和从库。适用于两边都需要写入的情况
问题:自增列的冲突问题
auto_increment_increment=2#自增ID的间隔,如 1 3 5间隔为2
Master A: auto_increment_offset=1 #分布1 3 5 7 9 …
Master B: auto_increment_offset=2 #分布 2 4 6 8 10 …
主动-被动模式区别其中一台是只读的被动服务器。这种方式使反复切换主动和被动服务器非常方便。
故障转移和故障恢复很方便。可以在不关闭服务器的情况下进行维护,优化,升级操作系统
测试单个主库
create database oldboy CHARACTER SET utf8 COLLATE utf8_general_ci;
use oldboy;
CREATE TABLE `student` (
`id` bigint(12) NOT NULL auto_increment COMMENT '主键',
`name` varchar(12) NOT NULL COMMENT '姓名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
- 拥有从库的双主
- 级联复制
级联复制中,添加log-slave-updates参数,从库从主库复制的数据才会写入log-bin日志文件里
- mysql主从复制配置
- 配置复制
复制的准备
1、master创建一个replication专用复制账号
replication slave replication client
2、master和slave设置不同的server-id
3、在master上执行一次完整逻辑备份
4、拷贝到slave,执行一次全量恢复
5、slave上面执行change master设置主服务器信息
slave上面执行start slave 启用复制,从库连接到主库读取数据
- 主库和从库都建立复制账户
grant replication slave,replication client on *.* to repuser@'172.16.1.%' identified by '123456';
grant replication slave on *.* to rep@'10.0.0.%' identified by '123';
mysql8.0主从复制用户
default-authentication-plugin=mysql_native_password
create user 'aaa'@'10.0.0.%' identified with mysql_native_password by '123';
- 配置主库
在主库需要指定唯一的server id和启用二进制日志
[mysqld]
server-id=1
log-bin=mysql-bin
log-bin_index
binlog_format=row
binlog_cache_size=2M
max_binlog_size=1G
expire_logs_days=7
binlog-ignore-db = mysql
replicate-ignore-db = mysql
skip-name-resolve
gtid_mode=off
[mysqld]
server-id=1
log-bin=/application/mysql/mysqlbinlog/mysql-bin
basedir=/application/mysql
datadir=/application/mysql/data
binlog-ignore-db=mysql
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
user=mysql
socket=/usr/local/mysql/mysql.sock
log_error=/var/log/mysql.log
secure-file-priv=/tmp
server-id=1
log_bin=/data/binlog/mysql-bin
binlog_format=row
sync_binlog=1
slow_query_log=1
slow_query_log_file=/data/binlog/slow.log
long_query_time=0.01
log_queries_not_using_indexes
重启使二进制日志生效。注意如果你没有明确的设置server-id或者设置为它的默认值0
master会拒绝从库的任何连接
建议启用
innodb_flush_log_at_trx_commit=1
sync_binlog=1
innodb_support_xa=1
- 主库创建主从复制账号
grant replication slave on *.* to 'rep'@'172.16.1.%' identified by '123456';
- 主库锁表
flush table with read lock;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 405 | | | |
+------------------+----------+--------------+------------------+-------------------+
- 导出全部数据
mysqldump -uroot -p123456 -A -B --triggers --routines --events --master-data=2 --single-transaction |gzip >all_$(date +%F).sql.gz
- 解锁
unlock table;
- 配置从库
在从库需要指定唯一的server id
[mysqld]
server-id=2
log-bin=mysql-bin
relay-log=/directory/mysql-relay-bin
relay-log-info-file=/directory/relay-log.info
log-slave-updates=1
read-only=1
sync_master_info=1
sync_relay_log=1
sync_relay_log_info=1
master_info_repository=table
relay-log-info-repository=table
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
user=mysql
socket=/usr/local/mysql/mysql.sock
log_error=/var/log/mysql.log
secure-file-priv=/tmp
server-id=2
log_bin=/data/binlog/mysql-bin
binlog_format=row
sync_binlog=1
slow_query_log=1
slow_query_log_file=/data/binlog/slow.log
long_query_time=0.01
log_queries_not_using_indexes
relay-log=/data/relaylog/mysql-relay-bin
relay-log-info-file=/data/relaylog/relay-log.info
relay_log
relay_log_index
relay_log_info_file
master_info_repository
[mysqld]
server-id=2
log-bin=/application/mysql/mysqlbinlog/mysql-bin
log-slave-updates=1
basedir=/application/mysql
datadir=/application/mysql/data
relay-log=/application/mysql/mysqlrelaylog/mysql-relay-bin
[mysql]
user=root
password=oldboy123
[mysqladmin]
user=root
password=oldboy123
[mysqldump]
user=root
password=oldboy123
[mysqld]
server-id=3
basedir=/application/mysql
datadir=/application/mysql/data
socket=/application/mysql/tmp/mysql.sock
character-set-server=utf8
innodb_data_file_path=ibdata1:12M;ibdata2:50M:autoextend
log-bin=/application/mysql/mysql-bin
binlog_format = 'ROW'
binlog-ignore-db = mysql
replicate-ignore-db = mysql
skip-name-resolve
slow-query-log=1
long_query_time = 2
log_queries_not_using_indexes
slow_query_log_file= /application/mysql/slow.log
min_examined_row_limit = 1000
- 在从库执行配置主从同步
change master to
master_host='172.17.0.3',
master_port=3306,
master_user='rep',
master_password='123456',
master_log_file='mysql-bin.000006',
master_log_pos=120;
master_connect_retry=10;
启动主从复制所有线程
start slave;
启动io线程
start slave io_thread;
启动SQL线程
start slave sql_thread;
- 锁表
mysql> flush table with read lock;
Query OK, 0 rows affected (0.00 sec)
- 解锁
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
- 复制的础数据来源
前面的方法适用于刚刚搭建服务器没有应用的情况。
如何在一个运行中的主库搭建从库呢?
1、从主库复制数据
2、从另外一个从库克隆数据
3、最近的一次完全备份,启动从库。
我们需要确定三个因素:
1、某一个时间点的主库的数据快照
2、主库的二进制日志文件,以及获得快照时在该二进制文件中的偏移量
3、从获得快照到现在的二进制文件
- 从主服务器搭建复制
获得数据的方法:
1、使用冷备份,或者flush tables with read lock; 把数据复制到从库,缺点就是需要停服务
2、使用热备份。mysqldump
3、使用percona xtrabackup (innobackupex)
如果是从主库获得的备份,可以从xtrabackup_binlog_pos_innodb获得开始的位置
如果是从从库获得的备份,可以从xtrabackup_slave_info获得开始位置
注意冷备份和热备份需要参考从库的:
show slave status; 获得从库的现在执行主库的二进制文件的执行位置
缺点:如果从库已经跟主库数据不同步,得到的数据为脏数据
Tip: 如果需要在已经配置过复制的从服务器重新配置。需要reset slave命令初始化
- 复制状态信息文件
复制过程中,slave服务器会创建多个信息文件,记录复制的状态信息。
1、 master info log master.info
master-info-repository = table
记录到 mysql.slave_master_info
sync-master-info = 1
2、 relay log info log relay-log.info
relay-log-info-repository = table
记录到mysql.slave_relay_log_info
sync_relay_log_info=1
大小由max_relay_log_size决定,如果该值为0,大小由max_binlog_size决定
3、 relay log mysqld-relay-bin.000001
relay-log=
sync_relay_log=1
relay log格式和二进制日志相同可以用mysqlbinlog 读取
4、 relay log index
relay-log-index=
mysqld-relay-bin.index 追踪当前使用的relay log
- 启动但是不启动slave
./mysql start --skip-slave-start
- 复制的应用
- 使用复制作为备份服务器
对于小数据量可以使用mysqldump
对于大数据量可以使用冷备份或者Xtrabackup
-
复制不同数据库到不同slave
-
复制的常见故障和解决方法
错误信息来源show slave status\G;
现象:
Slave_IO_Running:No
Slave_SQL_Running:No
Last_IO_Errno:
Last_IO_Error:
Last_SQL_Errno:
Last_SQL_Error:
- server-id相同
主从相同时:
出现从库不能io线程不能同步,show slave status
从和从相同:
从服务器的io线程总是在这个之间切换,两个从库的io线程轮流争抢主库连接
master不知道该将binlog发送到哪个slave,slave看起来是不发送binlog给它
- 主键冲突 Error_code:1062
查看master对应的记录跟slave记录是否一致,如果一致跳过错误,如果不一致删除slave对应记录
注意: 如果当前高可用架构为master-master,则以下均在从库的操作都必须
set sql_log_bin=0避免从库执行的语句同步到主库
一致:
Mysql> stop slave;
Mysql> set global sql_slave_skip_counter=1;
Mysql> start slave;
不一致:
Mysql> stop slave;
Mysql> set sql_log_bin=0;
Mysql> delete from trends_uint where itemid=xx and clock=xxx;
Mysql> start slave;
Mysql> set sql_log_bin=1;
- 记录不存在Error_code:1032
delete:可以直接跳过错误
update:根据binlog位置信息到master找到对应记录insert到slave
Mysql> set sql_log_bin=0;
Mysql>insert into items values(...);
Mysql> start slave;
Mysql> set sql_log_bin=1;
扩展:如果业务需要,对于确认错误可以跳过。不建议使用
[mysqld]
slave-skip-errors=1062,1053,1146
slave-skip-errors=all
建议slave上面设置read_only=1 除非有super权限,否则不能修改数据
- 表不存在Error_code:1146
属于严重错误,建议重建slave
- 复制延迟
Seconds_Behind_Master:xxx
0 表示主从复制良好,可以认为没有延迟
正值 表示主从已经出现延迟,数字越大表示从库落后主库越多
造成原因:mysql是通过比较sql_thread执行的event的timestamp和 io_thread复制到relay log中的
event的timestamp进行比较得出的差值单位秒
注意:
如果主库I/O负载很大或是网络阻塞io_thread不能及时复制binlog(没有中断,也在复制),
而 sql_thread一直都能跟上io_thread的脚本,这时Seconds_Behind_Master的值是0,也就是我们认为的无延时,但是这种情况不能正确反映出复制的情况
可以通过在主上 show master status\G 的 Position, 和从执行 show slave status\G 的
Read_Master_Log_Pos 和 Exec_Master_Log_Pos进行比较得出复制是否能跟上主的状态
如果主库压力正常,网络正常。造成延迟的原因:
1、从库负载高,系统压力大
2、SQL进程为单线程,执行速度慢。MsSQL5.6开始改进
- Master Slave 字段定义不同
mysql> stop slave;
mysql> set global slave_type_conversions=ALL_NON_LOSSY;
mysql> start slave;
默认为,即不支持主从字段类型不一致,
其它3种类型为:
all_lossy 支持有损转换,如 int -> tiny int
all_non_lossy 支持无损转换, 如 char(20) -> varchar(25)
all_lossy,all_non_lossy支持所有转换
- 字段不一致错误
1.修改student表结构 从char20到 char40
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql> alter table student modify column name char(40);
Query OK, 6 rows affected (0.04 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)
2.master 插入记录
mysql> insert into student(name,age) values('xxxxxxxxxxxxxxxxxxxx',36);
Query OK, 1 row affected (0.00 sec)
3.Slave错误信息
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.1.51
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1603
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 809
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1677
Last_Error: Column 1 of table 'oldboy.student' cannot be converted from type 'char(20)' to type 'char(40)'
Skip_Counter: 0
Exec_Master_Log_Pos: 1390
Relay_Log_Space: 1172
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1677
Last_SQL_Error: Column 1 of table 'oldboy.student' cannot be converted from type 'char(20)' to type 'char(40)'
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
解决方法
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> set global slave_type_conversions=ALL_NON_LOSSY;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.1.51
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1603
Relay_Log_File: relay-bin.000003
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1603
Relay_Log_Space: 1318
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
mysql> select * from student;
+----+----------------------+-----+------+
| id | name | age | dept |
+----+----------------------+-----+------+
| 2 | oldboy | 0 | NULL |
| 4 | oldboy2 | 0 | NULL |
| 6 | andy | 36 | NULL |
| 8 | andy | 36 | NULL |
| 10 | andy2 | 36 | NULL |
| 12 | andy2 | 36 | NULL |
| 13 | xxxxxxxxxxxxxxxxxxxx | 36 | NULL |
+----+----------------------+-----+------+
7 rows in set (0.00 sec)
- slave 启动错误
mysql> reset slave;
mysql> change master to ...
mysql> start slave;
- sql线程NO
stop slave; #<==临时停止同步开关。
set globalsql_slave_skip_counter = 1; #<==将同步指针向下移动一个,如果多次不同步,可以重复操作。
start slave;
配置文件
slave-skip-errors = 1032,1062,1007
set global sql_slave_skip_counter=N;
这条语句跳过N 主设备的下一个事件。这对从语句引起的复制停止恢复很有用
MySQL常见错误代码(error code)及代码说明
http://oldboy.blog.51cto.com/2561410/1728380
- 主从复制延迟
- 问题1:一个主库的从库太多,导致复制延迟
建议从库数量3~5个为宜,要复制的从节点数量过多,会导致复制延迟
- 问题2:从库硬件比主库差,导致复制延迟
查看master和slave的系统配置,可能会因为机器配置的问题,包括磁盘io、CPU、内存等各方面因素造成复制的延迟,一般发生在高并发大数据量写入场景
- 问题3:慢SQL语句过多
假如一条SQL语句,执行时间是20秒,那么从库执行完毕,到从库上能查到数据也至少是20秒,这样就延迟20秒
问题4:主从复制的设计问题
例如,主从复制单线程,如果主库写并发太大,来不及传送到从库就会导致延迟
更高版本的MySQL可以支持多线程复制,
-
从库只读(read-only)
-
复制的监控
主要监控:
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
Seconds_Behind_Master:0
- binlog_row_image
当一个表中含有blob text 类型字段, update的时候,即使不更新这些字段,也要被log,导致binlog暴增,5.6增加了这个参数,我们可以配置来减少binlog的量
可选的值有:
full: 记录所有的行信息,和以前没有区别
nolob: 记录除了BLOB和TEXT之外的所有字段
minimal: binlog只记录了要修改的列的记录
注意:
当binlog_format = statement的时候,不起作用;
= row 完美支持;
= mixed 根据实际情况决定;
- mysql主从架构深入
面向普通人的php加密
http://justcoding.iteye.com/blog/2120329?utm_source=tuicool
- 半同步复制
mysql5.5 之前,复制其实是异步操作,而不是同步,也就意味着允许主从之间的数据存在一定的延迟,异步复制使得master处于一种性能最优的状态:写完binlog后即可提交而不需要等待slave的操作完成
缺点:当你使用slave作为备份时,如果master挂掉,那么会存在部分已提交的事务未能成功传输到slave的可能,这就意味着数据丢失!
master会等到binlog成功传送并写入至少一个slave的relay log 之后才会提交,否则一直等待,直到timeout(默认10s)。当出现timeout的时候,master会自动切换半同步为异步,直到至少有一个slave确认已经接受到了该复制事件,master会再切换回半同步模式,结合这个新功能,我们可以做到,在允许损失一定的事务吞吐量的前提下来保证同步数据的绝对安全,因为当你设置timeout为一个足够大的值的情况下,任何提交的数据都会安全抵达slave
mysql5.5 版本支持半同步复制功能,但还不是原生的支持,是通过plugin来支持的,并且默认是没有安装这个插件的
不论是二进制发布的,还是自己源代码编译的,都会默认生成这个插件,一个是针对master的,一个是针对slave的,在使用之前需要先安装这两个plugins
mysql> show plugins; #查看所有支持的plugin
- 加载插件
master
install plugin rpl_semi_sync_master soname 'semisync_master.so';
slave
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
- 查看插件
show plugins;
- 启动
主
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = N; #单位:milliseconds. 默认值10000 (10 seconds).
配置文件
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second
从
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
- 重启从库上的IO线程
stop slave io_thread;
start slave io_thread;
- 查看是否在运行
主:
show status like 'Rpl_semi_sync_master_status';
从:
show status like 'Rpl_semi_sync_slave_status';
- 测试
查看延迟时间
show variables like '%rpl_semi_sync%';
- mysql 5.7半同步复制
master:
mysql> show global variables like '%rpl_semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 1000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)
slave:
show global variables like '%rpl_semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 1000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+-------------------------------------------+------------+
GTID
- GTID的优点:
在主从切换后,在传统的方式里,你需要找到binlog和POS点,然后change master to 指向。
在mysql5.6里,你无需再知道binlog和POS点,你只需要知道master的ip、端口,账号密码即可,
因为同步复制是自动的,mysql通过内部机制GTID自动找到同步
- GTID介绍
Global Transaction Identifiers
一个事务对应一个ID
一个GTID事务在一个服务器上面只执行一次
GTID 5.6.2支持,5.6.10完善
binlog_format=row 必须为 row 模式
- GTID的限制条件
不支持create table … select 语句 master直接报错
不支持非事务引擎
一个复制组中,要求统一开启或者关闭GTID
开启GTID需要重启
不支持create temporary table drop temporary table
不支持 sql_slave_skip_counter
- 如何跳过语句
mysql> show slave status\G;
mysql>stop slave;
mysql>set gtid_next 'xxxx:N'; (此处的xxxx为show slave status 的executed_Gtid_Set,而N参考executed_Gtid_Set里本身uuid的N值,填写它的下一个值)
mysql>begin;commit;
mysql>set gtid_next='AUTOMATIC';
mysql>start slave;
Retrieved_Gtid_Set: f2e00f82-3ed1-11e8-b729-000c29c2da47:1-2
Executed_Gtid_Set: f2e00f82-3ed1-11e8-b729-000c29c2da47:1,
f6f43626-3ed1-11e8-b729-000c29ed3675:1
stop slave;
set gtid_next='f2e00f82-3ed1-11e8-b729-000c29c2da47:2';
begin;commit;
set gtid_next='AUTOMATIC';
start slave;
这里的xxxxx:N 也就是你的slave sql thread报错的GTID,或者说是你想要跳过的GTID
change master to并带上master_auto_position=1启用基于GTID的复制
开启GTID的数据库,在导出数据库时,要加上--set-gtid-purged=OFF , 否则在导入时不记录binlog
- 延迟复制
CHANGE MASTER TO MASTER_DELAY = 60;