基本环境
- 全部基于GTID复制
- Master
- 在192.168.1.102上面搭建多实例,端口分别是3306,3307
- Slave
- 在192.168.1.103上面搭建3306端口的实例
约束
- 每个实例上DB名字不能一样
- 创建用户或是复制用户名时名字不能一样,如果经常遇到一样的账号或是为了规范常见的账号是一样的,考虑在Slave的过滤规则把mysql库复制忽略掉
主库配置
Master1
- gtid-mode=on
- enforce-gtid-consistency=1
- binlog_format=row
- server-id=3306102
- log-bin=/data/mysql/mysql3306/logs/mysql-bin
- skip-slave-start=1
Master2
- gtid-mode=on
- enforce-gtid-consistency=1
- binlog_format=row
- server-id=3307102
- log-bin=/data/mysql/mysql3307/logs/mysql-bin
- skip-slave-start=1
创建复制用的账号
从库配置
Slave
- gtid-mode=on
- enforce-gtid-consistency=1
- binlog_format=row
- server-id=3306103
- log-bin=/data/mysql/mysql3307/logs/mysql-bin
- skip-slave-start=1
- master-info-repository=TABLE
- relay-log-info-repository=TABLE
change master to master_host='192.168.1.102',master_port=3306,master_user='repl',master_password='repl4slave',master_auto_position=1 for channel 'master-3306102';
change master to master_host='192.168.1.102',master_port=3307,master_user='repl',master_password='repl4slave',master_auto_position=1 for channel 'master-3307102';
常用管理命令
- 开关复制
- start slave [tread_type][for channel ...]
- 监控
- show slave status [for channel...]
- select * from performance_schema.replication_connection_configuration
- select * from performance_schema.replication_connection_status
多源复制出错处理
- binlog+position
- stop slave sql_thread for channel 'master-3307102';
- set global sql_slave_skip_counter=1;
- start slave sql_tread for channel 'master-3307102';
- GTID
- stop slave sql thread for channel 'master-3307102';
- set gtid_next='uuid:N';
- begin;commit;
- set gtid_next='automatic';
- start slave sql_tread for channel 'master-3307102';
复制账号重复问题
set sql_log_bin=0;
create user ...
grant ...
set sql_log_bin=1;
stop slave sql_thread;
change replication filter Replicate_Ignore_DB=(mysql);
start slave sql_thread;
对一个运行很久的库做备份恢复建同步
环境
- Master
- 在192.168.1.102上面搭建多实例,端口分别是3306,3307
- Slave
- 在192.168.1.103上面搭建3306端口的实例
- 前提条件
- 3306102和3306103是运行很久的一对主从复制,现在想把3307102加进来,变成多源复制
- 先将3307102数据备份出来hetan3307.sql
- 这个时候导入数据会报错,就是gtid_purged没有清空的原因
- 在从库上执行
- stop slave;
- show master status;
- 记录下Executed_Gtid_Set的值
- more hetan3307.sql
- 记录下它的gtid的值
- mysql -f -S /tmp/mysql.sock -p < /path/hetan3307.sql #强制导入一下
- reset master; #清空从库的purge信息
- set gtid_purged='上面两个的gtid值,逗号隔开';
- 执行change master to语句,先执行3307102的,看一下能不能正常复制,可以就不用再执行3306102的,不行就将3306102的也change一下
- start slave;