mysql主主复制汇总整理
mysql主主复制汇总整理
一、Mysql主主、主从复制主要思路:
1、mysql复制实质:
就是其他的MySQL数据库服务器将这个数据变更的二进制日志在本机上再执行一遍,因此非常重要的一点是mysql数据库中必须要开启二进制日志;
2、Mysql主从复制:
就是A为主数据库,B为从数据库,B将A中数据变更的二进制日志在它数据库中重新执行一遍;(B只会随着A改变,A不会随着B改变)
3、Mysql主主复制:
就是A数据库、B数据库互相同步数据,A与B都将彼此的数据变更的二进制日志在自身数据库中重新执行一遍,就是两个主从复制的整合;(A与B互相跟随彼此进行改变)
二、Mysql主主复制操作步骤:
假定A库、B库要实现主主复制:
1、在主库中创建从库登录的账号、密码,并对账号进行授权:
创建账号:
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
授权:
2、修改mysql配置文件:一般Linux中的MySQL配置文件都在/etc/my.cnf(windows中的配置文件为mysql.ini)
A库配置文件增加以下配置信息:(信息见mysql_copy_update_info.txt文件)
#注意在mysql配置文件中填写一下信息的位置,必须为此位置,即[mysqld]标签下面 [mysqld] #任意自然数n,只要保证两台MySQL主机不重复就可以了 server-id=1 #起始值。一般填第n台主MySQL。此时为第一台主MySQL auto_increment_offset=1 #步进值auto_imcrement。一般有n台主MySQL就填n auto_increment_increment=2 #开启二进制日志 log-bin=mysql-bin log-error=/mysqldata/mysqld.log pid-file=/mysqldata/mysqld.pid #与此从库相对应的主库的ip地址 master-host=192.168.15.185 #在相对应的主库中,此库可登录的账号 master-user=backup #在相对应的主库中,此库可登录的密码 master-password=123456 #在相对应的主库中登录的端口号 master-port=3306 #要同步的数据库,默认所有库,指定多个库添加新行就可以 replicate-do-db=phpcmsv9 #不要同步的数据库,指定多个库添加新行就可以 replicate-ignore-db=mysql master-connect-retry=60
B库配置文件增加的配置信息与A库中增加信息完全一致,除了server-id与auto_increment_offset不同外;
3、设置编码格式(否则中文容易出现乱码):
增加的配置信息如下圈出信息,如果有些标签[]中在mysql配置文件中默认没有的,自己手动添加(详情见character_encoding_info.txt文件)
[mysql] default-character-set=utf8 [mysqld] default-character-set = utf8 character_set_server = utf8 [mysqld_safe] default-character-set = utf8 [mysql.server] default-character-set = utf8 [client] default-character-set = utf8
4、重新启动mysql数据库:
Mysql命令:service mysqld restart;
5、查看相对应的主库的二进制文件名及其位置:
在主库中用mysql命令:show master status;
6、在本库中告知相对应主库二进制文件名及其位置的信息:
A为主库,B为从库时,在B库中执行mysql命令:(详细信息请见文件change_master_to_info.txt文件)
change master to master_host='172.20.109.14',master_user='mysql913',master_password='123456',master_log_file='mysql-bin.000056',master_log_pos=151744220;
B为主库,A为从库,在A库中执行同上命令,参数进行适当修改;
7、分别启动各自的slave:
分别在各自库中执行mysql命令:slave start;
8、查看slave启动后的状态:
分别在各自库中执行mysql命令:SHOW SLAVE STATUS\G;
主要是观察:
(1)红圈的两个参数是否都是YES,如果不是,那么就是出现了异常,查看第一行的错误提示,进行异常处理,对于常见的异常处理见四中进行解决;
(2)红线为复制的数据库,查看是否是自己需要复制的数据库,如果不正确,那么久需要修改mysql的配置文件中的信息,重新从头执行一遍;
9、完成主主复制配置,进行数据测试:
三、Mysql主从复制操作步骤:
与上述主主复制步骤类似,只是主主复制对两个库都进行操作,主从复制只需要对从库进行change master to操作,对主库只需要配置开启二进制、server-id即可,对从库配置信息同上;
四、如何在现有主主上添加库:
1、在使用的mysql上先根据需要创建库,并创建需要的表添加数据;
2、在另一台mysql上同样创建对应的库,并将对应库中的数据copy过来;
3、分别修改mysql的配置文件中的replicate-do-db新增加一行,值就是要新添加的库,然后重新启动mysql服务;
4、然后通过linux命令进入mysql,查看slave是否正确启动,如果启动有异常进行处理,确保正常启动;
5、新添加的库就到了主主复制链中,进行测试即可;
五、如何在现有主主上去掉某个库:
1、分别修改mysql对应的配置文件,将需要去掉的库的replicate-do-db注释掉或者删掉;
2、重新启动mysql服务;
3、进去mysql中,分别查看mysql的日志文件信息:change master status;
4、分别重新执命令行start slave until MASTER_LOG_FILE="mysql-bin.000075", MASTER_LOG_POS=216,将从库中读取二进制日志信息位置切换到对应主库现有位置中去;
5、完成对某个库的去掉功能;
六、Mysql主主和主从复制常见异常处理:
1、Slave_IO_State: Waiting to reconnect after a failed registration on master异常:
解决方法:
在对应主库上从新对对应账号执行授权命令
grant replication slave on *.* to "repl'@'%' identified by 'sangfordb';
FLUSH PRIVILEGES;
然后重新stop slave 和start slave就可以
2、Slave_IO_State:connecting to master
解决方法:
原因是此账号无法连接主库,查看账号远程登录?Linux防火墙端口开放?
3、slave_sql_running:NO异常:
解决方法:
跳过执行报错的sql就好了,在从库中执行mysql命令:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1(等号后为几看自己有几个错误了,不知道的就尝试,直到SHOW SLAVE STATUS查看结果该异常解决掉为止)
4、Slave启动正常,就是不同步数据:
原因:出现此情况的原因就是,从库中获取主库的二进制信息的文件名和位置与主库中最新数据位置不一致;
解决方法:查看主库的二进制文件名和信息:change master status;然后在从库中执行:start slave until MASTER_LOG_FILE="mysql-bin.000075", MASTER_LOG_POS=216;命令,将从库中获取主库二进制文件信息更新到主库现有状态,如果是主主复制那就在两台mysql中分别执行即可;
七、Mysql主主和主从复制服务器异常停止后处理思路:
(1)mysql或slave出现异常管理员如何获知:
1、slave异常获知:编写一个shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主主或主从出问题了,发短信警报;
(2)管理员手动处理异常的步骤:
直接将出现异常的那台服务器或mysql重新启动就好了,另一台数据库中改动的数据会自动同步到重新启动的mysql库中;
八、Mysql主主复制中某个库或某个表因为数据原因不能同步异常:
1、将该库或该表未同步的数据导出.sql文件,通过命令:
mysqldump -uroot -p --master-data --single-transaction -R --databases zzcp03 > zzcp03.sql
2、在导出的sql里面查找当前的日志文件以及位置(change master to …)
3、将另外对应的数据库中slave stop了,然后让salve从sql文件中的位置处开始,通过命令实现:
start slave until MASTER_LOG_FILE="mysql-bin.000075", MASTER_LOG_POS=769;
4、然后让salve start起来;
5、查看两台mysql中的slave是否正常启动,不是不正常进行处理,确保正常启动,这样就可以完成该表的数据同步了;
附两个功能代码:
导出某个库或表在slave不同步信息期间的增、删、修数据信息,并且带有二进制文件信息:
mysqldump -uroot -p --master-data --single-transaction -R --databases zzcp03 > zzcp03.sql
让slave获取的master二进制信息从指定的位置处开始:
start slave until MASTER_LOG_FILE="mysql-bin.000075", MASTER_LOG_POS=769;