1 简介
mysql复制的原理现阶段都是一样的,master将操作记录到bin-log中,slave的一个线程去master读取bin-log,并将他们保存到relay-log中,slave的另外一个线程去重放relay-log中的操作来实现和master数据同步。
基本介绍可参考我的文章:【 http://blog.csdn.net/jesseyoung/article/details/41942467】
2 主机配置信息
2.1 相关配置介绍
开启二进制日志,建立主机唯一server ID。
在主机上开启二进制日志是因为它是master向slave复制变化数据的基础。
对一个复制组里的主机建立唯一server ID是为了将一组内的数据库服务器区分开来,server ID的取值范围为1至2^32-1之间任意值。
配置binlog及server ID时需要关闭mysql服务器,编辑my.cnf或my.ini文件,在[mysqld]选项下添加log-bin及server-id选项,例如:
注意事项:
1 如果我们忽略了server ID选项或明确指定其值为默认值0,master主机将拒绝来自slave从机的任何连接。
2 对于Innodb事务,为了提高数据的持久性及连续性,我们应该在my.cnf里面设置
已经提交的数据。
sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
3 确保master主机上skip-networking选项是禁用的,否则master主机数据库只允许通过本地mysql.sock文件进行连接,slave从机将无法联系到主机。
log-slave-updates:从库更新也写binlog,主要用于链式复制,从库作为另一个库的主库,或者HA架构中,从库可升级为主库。
skip_slave_start:阻止从库崩溃后,自动启动复制
replicate_wild_ignore_table:
replicate_wild_ignore_db:解决主从架构mysql跨库更新问题, 使用replicate_do_db和replicate_ignore_db时有一个隐患,跨库更新时会出错。
如在Master(主)服务器上设置 replicate_do_db=test
use mysql;
update test.table1 set ......
那么Slave(从)服务器上第二句将不会被执行
如Master设置 replicate_ignore_db=mysql
use mysql;
update test.table1 set ......
那么Slave上第二句会被忽略执行
原因是设置replicate_do_db或replicate_ignore_db后,MySQL执行sql前检查的是当前默认数据库,所以跨库更新语句在Slave上会被忽略。
可以
mysql复制的原理现阶段都是一样的,master将操作记录到bin-log中,slave的一个线程去master读取bin-log,并将他们保存到relay-log中,slave的另外一个线程去重放relay-log中的操作来实现和master数据同步。
基本介绍可参考我的文章:【 http://blog.csdn.net/jesseyoung/article/details/41942467】
2 主机配置信息
2.1 相关配置介绍
开启二进制日志,建立主机唯一server ID。
在主机上开启二进制日志是因为它是master向slave复制变化数据的基础。
对一个复制组里的主机建立唯一server ID是为了将一组内的数据库服务器区分开来,server ID的取值范围为1至2^32-1之间任意值。
配置binlog及server ID时需要关闭mysql服务器,编辑my.cnf或my.ini文件,在[mysqld]选项下添加log-bin及server-id选项,例如:
[mysqld]
log-bin=mysql-bin
server-id=1
更改完后重启mysql服务器。
注意事项:
1 如果我们忽略了server ID选项或明确指定其值为默认值0,master主机将拒绝来自slave从机的任何连接。
2 对于Innodb事务,为了提高数据的持久性及连续性,我们应该在my.cnf里面设置
[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1
innodb_flush_log_at_trx_commit = 1:这也是Innodb 的默认设置。我们每次事务的结束都会触发Log Thread 将log buffer 中的数据写入文件并通知文件系统同步文件。这个设置是最安全的设置,能够保证不论是MySQL Crash 还是OS Crash 或者是主机断电都不会丢失任何
已经提交的数据。
sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
3 确保master主机上skip-networking选项是禁用的,否则master主机数据库只允许通过本地mysql.sock文件进行连接,slave从机将无法联系到主机。
[mysqld]
#skip-networking
2.2复制相关配置模板(master)
[mysqld]
server_id = 123
binlog_format = mixed
log-bin = mysql-bin
relay-log = mysql-relay-bin
log-slave-updates = 1
#skip_slave_start = 1
#replicate_wild_ignore_table = mysql.****_%
read_only = 0
####性能相关####
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
####复制方式相关####
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
####复制错误相关####
#replicate-ignore-table = mysql.***
slave-skip-errors = ddl_exist_errors
####复制信息相关####
relay-log-info-repository = TABLE
relay_log_recovery = 1
master_info_repository = TABLE
####GTID相关####
gtid-mode = ON
enforce-gtid-consistency = 1
相关参数解释:log-slave-updates:从库更新也写binlog,主要用于链式复制,从库作为另一个库的主库,或者HA架构中,从库可升级为主库。
skip_slave_start:阻止从库崩溃后,自动启动复制
replicate_wild_ignore_table:
replicate_wild_ignore_db:解决主从架构mysql跨库更新问题, 使用replicate_do_db和replicate_ignore_db时有一个隐患,跨库更新时会出错。
如在Master(主)服务器上设置 replicate_do_db=test
use mysql;
update test.table1 set ......
那么Slave(从)服务器上第二句将不会被执行
如Master设置 replicate_ignore_db=mysql
use mysql;
update test.table1 set ......
那么Slave上第二句会被忽略执行
原因是设置replicate_do_db或replicate_ignore_db后,MySQL执行sql前检查的是当前默认数据库,所以跨库更新语句在Slave上会被忽略。
可以