MySQL5.7下多源复制知识要点(原创)
By admin
- One minute read - 172 words架构为两主一从,两主为同一台服务器的多实例,安装方法请参考上篇文章 http://blog.haohtml.com/archives/17300。
主master1 IP: 192.168.1.116 PORT: 3306 主master2 IP: 192.168.1.116 PORT: 3307 从slave IP: 192.168.1.200 PORT: 3306
两主为全新安装。如果以前安装过的话,可以将原来的数据库删除掉,再执行 reset master
即可。(否则需要将两个主的想着库表使用 mysqldump到从中) my.cnf
配置
[master1 3306]
[client]
port=3306
socket=/data/mysql/mysql3306/tmp/mysql.sock
[mysqld]
basedir=/data/mysql/mysql3306
datadir=/data/mysql/mysql3306/datadir
#socket=/var/lib/mysql/mysql.sock
socket=/data/mysql/mysql3306/tmp/mysql.sock
port=3306
log-bin=mysql-bin
binlog-format=row # 二进制日志的格式:有 `row`、`statement` 和 `mixed` 三种
注:当设置隔离级别为 READ-COMMITED
必须设置二进制日志格式为 ROW
,MySQL官方认为 STATEMENT
这个已经不再适合继续使用; 但mixed类型在默认的事务隔离级别下,可能会导致主从数据不一致; 推荐使用 row
server-id=1 # 设置server_id,一般建议设置为IP,或者再加一些数字,如端口号[在以前版本为server-id]
gtid-mode=on
enforce-gtid-consistency=1
log-slave-updates=true
skip_slave_start=1 # log-slave-updates/gtid-mode/enforce-gtid-consistency/report-port/report-host:用于启动GTID及满足附属的其它需求[其中启动GTID必须同时设置gtid-mode/enforce-gtid-consistency/]
master-info-repository=TABLE
relay-log-info-repository=TABLE
# master-info-repository/relay-log-info-repository都设置为TABLE,mysql.slave_master_info与 mysql.slave_relay_log_info 中,table都是innodb类型的,支持事务,比文件安全
# 默认值是FILE, 比如master info就保存在master.info文件中,relay log info保存在relay-log.info文件中,如果服务器意外关闭,正确的relay info 没有来得及更新到 relay-log.info文件,这样会造成数据丢失
sync-master-info=1 # 启用之后,使binlog在每N次binlog写入后与硬盘 同步
slave-parallel-workers=4 # 开启基于库的多线程复制.默认是0,不开启,最大并发数为1024个线程
binlog-do-db # 需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可 http://dev.mysql.com/doc/refman/5.0/en/replication-options-binary-log.html#option_mysqld_binlog-do-db
binlog-ignore-db # 不需要复制的数据库苦命,如果复制多个数据库,重复设置这个选项即可,http://dev.mysql.com/doc/refman/5.0/en/replication-options-binary-log.html#option_mysqld_binlog-ignore-db
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/data/mysql/mysql3306/log/mysqld.log
pid-file=/data/mysql/mysql3306/mysqld.pid
对于另一个主master2(3307)的配置文件 my.cnf
与上面差不多 ,只需要将相应的3306字眼修改为3307即可,记得修改server-id=2。
在两个主上执行授权
grant replication slave on *.* to repl@’192.168.1.%’ identified by ‘repl123’;
对于从服务器,配置和上面的差不多。
由于我们这里是多源配置,所以要求两台主数据库的名称不能一致,还有一些授权数据库名(mysql),所以这里我们需要将slave中的mysql数据库忽略掉,需要在my.cnf中添加
binlog-do-db=test
binlog-ignore-db=mysql
replicate-do-db =需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
replicate-ignore-db =需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
============================================
待主从配置全部配置完以后,在slave中执行
change master to master_host=’192.168.1.116′,master_user=’repl’,master_password=’repl123′,master_port=3306,master_auto_position=1** for channel ‘master-3306’**;
change master to master_host=’192.168.1.116′,master_user=’repl’,master_password=’repl123′,master_port=3307,master_auto_position=1 **for channel ‘master-3307’**;
启用复制
start slave;
show slave status\G;
如果看到两个源的IO/SQL THREAD状态全部为 YES ,则说明配置成功。
Slave_IO_Running: Yes Slave_SQL_Running: Yes
=======================
常见问题:
有时候会产生复制错误,如一些sql语句语句冲突,这个时候只需要跳过去那个事务即可(通过提交一个空事务)
stop slave sql_thread;
set gtid_next=’uuid:N’;
begin;commit;
set gtid_next=’automatic’;
start slave sql_thread: