vlambda博客
学习文章列表

【运维七点整】MySQL 跨数据库复制传输

写 · 在 · 前 · 面


运维七点整,晚七点为大家提供运维相关资讯,在这里关注运维、关注新技术、关注中小企业运维痛点,结合多年的客户服务经验,跟大家一起交流分享在管理、应用、数据库、监控、安全、日志、自动化、成本控制等运维知识。


【运维七点整】MySQL 跨数据库复制传输

xuning

立维运维工程师



大家好!欢迎来到“运维七点整”,我是xuning~【运维七点整】今天又准时跟大家见面了~作为一名数据库运维工程师,自然想跟大家聊一聊数据库方面的知识了,正巧最近客户需求要进行跨数据库名的方式来复制传输,今天就拿出来和大家交流分享一下,也当做是我的一次复盘了,大家如有什么建议和想法也欢迎提出~

【运维七点整】MySQL 跨数据库复制传输

需求: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

备份192.168.2.54的两个数据库
#命令:
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)

测试数据,更改主库后从库是否有过更改。
测试数据,更改过滤器之外的表数据库,从库是否有做更改。
测试无误,把修改的数据还原。【运维七点整】MySQL 跨数据库复制传输【运维七点整】MySQL 跨数据库复制传输

            

                   后台回复“3021”加群

                 解决运维难题分享运维经验


喜欢本文就给点个“在看”呗~

点一下你会更好看耶