MySQL数据库

6个成员

MySQL双向同步

发表于 2016-12-24 7626 次查看

在Red Hat Enterprise Linux平台,利用MySQL主从同步原理,实现MySQL双向同步
MySQL版本:5.5.28
操作系统:RHEL 5.8 32bit

Server1:192.168.1.1
配置:my.cnf

server-id = 1
binlog-do-db = testdb
binlog-ignore-db = mysql
log-slave-updates
replicate-do-db = testdb
replicate-ignore-db = mysql
同步testdb数据库,这里不对mysql数据库进行同步
新增同步用户:

grant replication slave on *.* to slaveuser@192.168.1.2 identified by '123456'; 
启动Sever1;

service mysql start
查看MySQL同步binlog文件名以及pos值:

show master status;


Server2:192.168.1.2
配置:my.cnf

server-id = 2
binlog-do-db = testdb
binlog-ignore-db = mysql
log-slave-updates
replicate-do-db = testdb
replicate-ignore-db = mysql
与Sever1配置基本相同,只是server-id不同,而且不能相同,另外记得在[mysqld]配置区域里配置开启二进制日志记录:log-bin = mysql-bin
新增同步用户:

grant replication slave on *.* to slaveuser@192.168.1.1 identified by '123456';
启动Server2:

service mysql start
配置同步:

mysql>change master to master_host='192.168.1.1',
mysql>master_user='slaveuser',
mysql>master_password='123456',
mysql>master_log_file='mysql-bin.000020',
mysql>master_log_pos=107;
mysql>slave start;
mysql>show slave status\G;

MySQL的5.5版本已经不支持在my.cnf中配置同步的主机信息了,即master-host等字段,否则MySQL会启不动,这点要注意下,网上也有很多教程,留意下不同版本的区别。

查看下状态:

 

标识为红色的部分都为yes则表示正常。如果出现Slave_SQL_Running:connecting,可能是没有对同步用户进行授权,到Server1检查下授权用户是否正常。

手动同步命令:

mysql>load data from master
到这里就是配置主从同步了,再到Server1上,以Server2为主,Server1为从进行同步,就实现双向同步了。过程一样的,不再详细说明了。

测试说明:

1.主要测试的是对同步数据库的读写测试,分别在两台机器上读写,看是否同步;

2.测试完了读写同步,可以模拟下故障测试。比如说关闭掉其中一个数据库,再到另一个正常的数据上写入数据,然后再开启模拟的故障数据库,看是否会更新数据。


mysql主从同步常见异常及恢复方法

 

1. 一般的异常只需要跳过一步即可恢复

>slave stop;

>SET GLOBAL sql_slave_skip_counter = 1;

>slave start;

 

2.断电导致主从不能同步时,通主库的最后一个bin-log日志进行恢复

在主库服务器上,mysqlbinlog mysql-bin.xxxx > binxxxx.txt

tail -n 100000  binxxxx.txt > tail-binxxxx.txt

vim tail-binxxxx.txt 打开tail-binxxxx.txt文件找到最后一个postion值

然后在从库上,change host to 相应正确的值

>slave stop;

>change master to master_host='ip', master_user='username', master_password='password', master_log_file='mysql-bin.xxxx', master_log_pos=xxxx;

>slave start;

>show slave status\G;

 

 

3.主键冲突、表已存在等错误代码如1062,1032,1060等,可以在mysql主配置文件指定

略过此类异常并继续下条sql同步,这样也可以避免很多主从同步的异常中断

[mysqld]

slave-skip-errors = 1062,1032,1060


合本次故障:
table_id: 32795 (productinfo.abnorpd_info_prodesc_1)   
table_id: 32795 flags: STMT_END_F                      
确实是同样的id,所以就会造成主从crash.


同时还要记录一下,主从同步虽然可以slave-skip-errors=all,但是并不能跳过所有DDL所引起的主从,
还是详细参考官网吧:

mysql 官网也详细的给出了,具体跳过错误的3种形式,再次记录一下,下次千万不要挑这个坑了。

--slave-skip-errors=[err_code1,err_code2,...|all|ddl_exist_errors]

Command-Line Format    --slave-skip-errors=name
Option-File Format    slave-skip-errors
System Variable Name    slave_skip_errors
Variable Scope    Global
Dynamic Variable    No
     Permitted Values
Type    string
Default    OFF
Valid Values    OFF
[list of error codes]
all
ddl_exist_errors

MySQL 5.6 as well as MySQL Cluster NDB 7.3 support an additional shorthand value 
ddl_exist_errors, which is equivalent to the error code list 1007,1008,1050,1051,
1054,1060,1061,1068,1094,1146.
Examples:


--slave-skip-errors=1062,1053
--slave-skip-errors=all
--slave-skip-errors=ddl_exist_errors

发表回复
你还没有登录,请先登录注册