【运维七点整】MySQL 跨数据库复制传输
运维七点整,晚七点为大家提供运维相关资讯,在这里关注运维、关注新技术、关注中小企业运维痛点,结合多年的客户服务经验,跟大家一起交流分享在管理、应用、数据库、监控、安全、日志、自动化、成本控制等运维知识。
xuning
立维运维工程师
大家好!欢迎来到“运维七点整”,我是xuning~【运维七点整】今天又准时跟大家见面了~作为一名数据库运维工程师,自然想跟大家聊一聊数据库方面的知识了,正巧最近客户需求要进行跨数据库名的方式来复制传输,今天就拿出来和大家交流分享一下,也当做是我的一次复盘了,大家如有什么建议和想法也欢迎提出~
需求:MySQL数据库主从复制中需要将主库所需要的一些表,过滤复制到从库的另一个数据库中。简单说,是以主从的方式复制a服务器的b库,到c服务器的d库,以跨数据库名的方式进行复制传输。
具体需求:
- 192.168.2.125主机的 DEV_DB 数据库同步 192.168.2.54主机的DEV_NEW_DB 的表1、表2、表3、表4、表5、表6、表7、表8、表9、表10。
- 192.168.2.125 主机的QA_DB 数据库同步 192.168.2.54 主机的QA_NEW_DB的表1、表2、表3、表4、表5、表6、表7、表8、表9、表10。
解决思路:这需要用到mysql主从复制中Replicate_Rewrite_DB这个参数,由于192.168.2.125数据库已经存在QA_NEW_DB单库的复制过滤所以不太好实现,a到a,再复制一遍到c的形式。
重新选择其他的机器192.168.2.134重新做一个从库。
192.168.2.54 主库
192.168.2.134 从库
下面是复制过滤和跨库复制的详细演示步骤(省去2.134安装数据库的步骤):
1
#命令:
mysqldump -uroot -p******** --master-data=2 --single-transaction --databases DEV_DB QA_DB > /tmp/rewrite.sql
虽然只是复制两个库,每个库复制十张表,但是由于要添加--master-data=2
参数来记录binlog信息来拉从库使用,所以没有找到一个命令dump出两个数据库,每个数据库备份十张表的形式。
有一种办法是采用参数--ignore-table
过滤掉其他不要的表,但我看每个数据库一百多张表,这样操作起来也挺麻烦的,所以直接备份了两个数据库。
两个数据库没想到那么大,再加上客户的磁盘效率并不是很好。所以备份花了大半个多小时的时间,备份出来的文件大小有11G。
2
因为复制到其他数据库已经更换了名字,所以需要对传输过来的rewrite.sql
文件做一些替换工作
DEV_DB ——> DEV_NEW_DB
QA_DB ——> QA_NEW_DB
备份文件一个库名大概出现过三次,第一次是创建数据库,还有开始时候和文件结尾时候的两个use 数据库。
保险起见先用cat -n rewrite.sql |grep db_name
确定没有其他的库名,避免替换出错。
sed -i 's/DEV_DB/DEV_NEW_DB/g' /tmp/rewrite.sql
sed -i 's/QA_DB/QA_NEW_DB/g' /tmp/rewrite.sql
替换完成后再对替换前后的数据库名进行检查,避免出错
确认无误后,最好关闭掉从库的binlog,因为是做从库,所以binlog并没有什么作用,导入数据的时候还会拖慢导入的速度和占用磁盘的空间。
导入的命令直接放入screen里面去导入
mysql -uroot -p******** < /tmp/rewrite.sql
3
停止192.168.2.134数据库
修改配置文件,增加以下参数
##复制过滤参数
replicate_wild_do_table='DEV_NEW_DB.T_TEST1'
replicate_wild_do_table='DEV_NEW_DB.T_TEST2'
replicate_wild_do_table='DEV_NEW_DB.T_TEST3'
replicate_wild_do_table='DEV_NEW_DB.T_TEST4'
replicate_wild_do_table='DEV_NEW_DB.T_TEST5'
replicate_wild_do_table='DEV_NEW_DB.T_TEST6'
replicate_wild_do_table='DEV_NEW_DB.T_TEST7'
replicate_wild_do_table='DEV_NEW_DB.T_TEST8'
replicate_wild_do_table='DEV_NEW_DB.T_TEST9'
replicate_wild_do_table='DEV_NEW_DB.T_TEST10'
replicate_wild_do_table='QA_NEW_DB.T_TEST1'
replicate_wild_do_table='QA_NEW_DB.T_TEST2'
replicate_wild_do_table='QA_NEW_DB.T_TEST3'
replicate_wild_do_table='QA_NEW_DB.T_TEST4'
replicate_wild_do_table='QA_NEW_DB.T_TEST5'
replicate_wild_do_table='QA_NEW_DB.T_TEST6'
replicate_wild_do_table='QA_NEW_DB.T_TEST7'
replicate_wild_do_table='QA_NEW_DB.T_TEST8'
replicate_wild_do_table='QA_NEW_DB.T_TEST9'
replicate_wild_do_table='QA_NEW_DB.T_TEST10'
##参数左边的是主库上的数据库,右边的是从库上的数据库
replicate-rewrite-db = DEV_DB -> DEV_NEW_DB
replicate-rewrite-db = QA_DB -> QA_NEW_DB
启动数据库,配置主从链接
##主库创建repl账户,授予replication slave权限
grant replication slave on *.* to repl@'192.168.2.134' identified by '******';
##从库配置主从参数,binlog日志文件和pos在备份/tmp/rewrite.sql文件中获取
CHANGE MASTER TO master_host='192.168.2.54',master_user='repl',master_password='********',master_port=3306,MASTER_LOG_FILE='binlog.000038', MASTER_LOG_POS=598783827;
start slave;
show slave status\G
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.54
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000038
Read_Master_Log_Pos: 642243473
Relay_Log_File: beideng-nj-static-test-01-relay-bin.000003
Relay_Log_Pos: 43459963
Relay_Master_Log_File: binlog.000038
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB: information_schema,mysql,performance_schema
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table: DEV_NEW_DB.T_TEST1,DEV_NEW_DB.T_TEST2,DEV_NEW_DB.T_TEST3,DEV_NEW_DB.T_TEST4,DEV_NEW_DB.T_TEST5,DEV_NEW_DB.T_TEST6,DEV_NEW_DB.T_TEST7,DEV_NEW_DB.T_TEST8,DEV_NEW_DB.T_TEST9,DEV_NEW_DB.T_TEST10,QA_NEW_DB.T_TEST1,QA_NEW_DB.T_TEST2,QA_NEW_DB.T_TEST3,QA_NEW_DB.T_TEST4,QA_NEW_DB.T_TEST5,QA_NEW_DB.T_TEST6,QA_NEW_DB.T_TEST7,QA_NEW_DB.T_TEST8,QA_NEW_DB.T_TEST9,QA_NEW_DB.T_TEST10
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 642243473
Relay_Log_Space: 43460190
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 27ef7f83-2fd6-11e7-b829-000c29405f7a
Master_Info_File: /data/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB: (DEV_DB,DEV_NEW_DB,(QA_DB,QA_NEW_DB)
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
测试数据,更改主库后从库是否有过更改。
测试数据,更改过滤器之外的表数据库,从库是否有做更改。
测试无误,把修改的数据还原。
后台回复“3021”加群
解决运维难题分享运维经验
喜欢本文就给点个“在看”呗~
点一下你会更好看耶