需求:
三个业务系统A,B,C分别对应三个数据库实例。根据业务需要,A中的某几张表要实时同步到C中,B中的某几张表也要实时同步到C中。
现状:
数据库环境:mysql社区版5.5
三个子系统都在运行状态,且都有从库。
方案:
将A中的表同步到B中,再从B同步到C。这样A和B的数据都按照需要同步到C了。
在修改完配置文件后,需要导出数据初始化和重启B,C两个从库使配置生效(好像在5.7中就不需要了change replication filter....)
配置文件中如何实现table level的复制:
replicate_wild_do_table=xxx.tb\_%
replicate_wild_ignore_table=xxx.tblog_%
replicate_wild_ignore_table=xxx.tblog_%
为了减少停机维护时间,先建立B和C的主从关系,导出B的表到C中,再建立A和B的关系,导出A的表到B中(会自动导入到C,因为B和C已经是主从关系)
另外,导出数据都在从库上做,不影响主库上的业务。
步骤:
先建立B和C之间的数据同步
step 1:导出B的2张表
mysqldump -uroot -S /opt/dbdata/mysql_3307/mysql.sock -p --databases XXX--tables tb1 tb2 > 2_tables.sql
step 2:导入到3309数据库
mysql -uroot -S /opt/dbdata/mysql_3309/mysql.sock -p XXX< 2_tables.sql
step 3:重启3309数据库,使MIS和GSSC的主从生效
mysqladmin -uroot -S /opt/dbdata/mysql_3309/mysql.sock -p shutdown
mysqld_multi start 3
实际操作中 产生个故障
启动start slave报错如下
ERROR 1201 (HY000): Could not initialize master info structure; more error m
解决办法
change master to master_host='127.0.0.1',master_port=3307,master_user='XXX',master_password='XXX',master_log_file='mysql-bin.000035',master_log_pos=205154026;
建立A和B之间的数据同步
step 4:导出计费的表【从库】
mysql -uroot -S /opt/dbdata/mysql_3306/mysql.sock -p
stop slave;
flush tables with read lock;
show slave status \G;
记录下Relay_Master_Log_File Exec_Master_Log_Pos
mysql-bin.000032 243832422
step 5:导出表(大小5G)
mysqldump -uroot -S /opt/dbdata/mysql_3306/mysql.sock -p --databases XXX--tables XXX >XXX.sql
耗时:<1分钟
step 6:CP数据
scp XXX.sql root@17.22.22.22:/root/
step 7:重启B数据库
mysqladmin -uroot -S /opt/dbdata/mysql_3307/mysql.sock -p shutdown
mysqld_multi start 1
stop slave;
step 8:在B中导入数据
mysql -uroot -S /opt/dbdata/mysql_3307/mysql.sock -p xxx <xxx.sql
导入的数据相当于一主三从,耗时:大概15MIN
step 9:改变同步位置 以下俩值参考step 4
change master to master_log_file='mysql-bin.000032',master_log_pos=243832422;
show slave status \G;
start slave;
完成!
replicate_wild_ignore_table=xxx.tb_log_%
这2中配置是互相排斥的!为什么?看完官方的复制图解就明白了。怎么解决?
step 1:导出B的2张表
mysqldump -uroot -S /opt/dbdata/mysql_3307/mysql.sock -p --databases XXX--tables tb1 tb2 > 2_tables.sql
step 2:导入到3309数据库
mysql -uroot -S /opt/dbdata/mysql_3309/mysql.sock -p XXX< 2_tables.sql
step 3:重启3309数据库,使MIS和GSSC的主从生效
mysqladmin -uroot -S /opt/dbdata/mysql_3309/mysql.sock -p shutdown
mysqld_multi start 3
实际操作中 产生个故障
启动start slave报错如下
ERROR 1201 (HY000): Could not initialize master info structure; more error m
解决办法
change master to master_host='127.0.0.1',master_port=3307,master_user='XXX',master_password='XXX',master_log_file='mysql-bin.000035',master_log_pos=205154026;
建立A和B之间的数据同步
step 4:导出计费的表【从库】
mysql -uroot -S /opt/dbdata/mysql_3306/mysql.sock -p
stop slave;
flush tables with read lock;
show slave status \G;
记录下Relay_Master_Log_File Exec_Master_Log_Pos
mysql-bin.000032 243832422
step 5:导出表(大小5G)
mysqldump -uroot -S /opt/dbdata/mysql_3306/mysql.sock -p --databases XXX--tables XXX >XXX.sql
耗时:<1分钟
step 6:CP数据
scp XXX.sql root@17.22.22.22:/root/
step 7:重启B数据库
mysqladmin -uroot -S /opt/dbdata/mysql_3307/mysql.sock -p shutdown
mysqld_multi start 1
stop slave;
step 8:在B中导入数据
mysql -uroot -S /opt/dbdata/mysql_3307/mysql.sock -p xxx <xxx.sql
导入的数据相当于一主三从,耗时:大概15MIN
step 9:改变同步位置 以下俩值参考step 4
change master to master_log_file='mysql-bin.000032',master_log_pos=243832422;
show slave status \G;
start slave;
完成!
一个值得讨论的问题:
replicate_wild_do_table=xxx.tb\_%replicate_wild_ignore_table=xxx.tb_log_%
这2中配置是互相排斥的!为什么?看完官方的复制图解就明白了。怎么解决?