百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

利用 mysql 多源复制实现数据迁移

bigegpt 2024-10-24 09:00 7 浏览

由于 centos7 停止维护,公司需要把原先运行在 centos7 上的 mysql 服务迁移到 ubuntu。运行在 centos7 上的 mysql 服务有多套,有些是单实例,有些是主从方式。评估公司数据量,实际可以替换为一套主从 mysql。即我们需要把多套运行在 centos7 上的 mysql 数据迁移到一套运行在 ubuntu 上的 mysql。

备注:下文中 {{}} 括起来的变量是我们实际执行时需要替换的变量。

迁移策略

  1. 把 centos mysql 数据导出,然后导入 ubuntu mysql。
  2. 建立 mysql 多源复制,master 节点是 centos mysql,slave 节点是 unbuntu mysql
  3. 把 mysql 域名指向 ubuntu mysql,重启连接 mysql 的服务使其指向 ubuntu mysql。

执行前两步时不影响 centos mysql 和 连接 mysql 服务的正常执行,第三步会造成连接mysql 服务短暂不可用。

迁移数据前准备

  • 确认 centos mysql 开启了二进制日志
  • ubuntu mysql server_id 要与 centos mysql server_id 不同

server_id 作用: 在主从复制拓扑中,server_id 用于标记二进制日志事件的源实例。当从库发现日志中的 server_id 与自身相同时,会跳过该事件,从而避免循环复制。

  • 修改或添加 ubuntu mysql 配置文件 my.cnf,并重启 ubuntu mysql。
# max_allowed_packet 参数是指mysql服务器端和客户端在一次传送数据包的过程当中接收的最大允许数据包大小
# 详见 https://louishust.gitbooks.io/understand-mysql/content/max_allowed_packet.html
max_allowed_packet = 1024m                      

# slave-skip-errors 参数用于指定在从库上遇到特定错误码时,复制线程不应停止,而是应该跳过这些错误继续执行
slave-skip-errors=1062,1032          

# replicate-ignore-db 参数作用是指定一些数据库,使得这些数据库的数据将不会被复制到从服务器
replicate-ignore-db = mysql                             
replicate-ignore-db = information_schema      
replicate-ignore-db = performance_schema    
replicate-ignore-db = sys               


master_info_repository = TABLE     # 把主服务器连接信息、复制状态记录于表 mysql.slave_master_info                     
relay_log_info_repository = TABLE  # 把中继日志信息记录于表 mysql.slave_relay_info
  • 给 centos mysql 添加 dump 和主从复制用户。
# 添加 mysql_dump_user 用户用于 mysql dump
mysql -h127.0.0.1 -uroot -p"{{ root_user_password }}" -e "grant all on *.* to 'mysql_dump_user'@'%' identified by '{{ dump_user_password }}';flush privileges;"
# 添加 replica_user 用户用于主从复制
mysql -h127.0.0.1 -uroot -p"{{ root_user_password }}" -e "GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%' IDENTIFIED BY '{{ replica_user_password }}';flush privileges;"

使用 mysqldump 导出 centos mysql 数据并导入 ubuntu mysql

使用 mysqldump 可以把 centos mysql 中当前数据导出并导入到 ubuntu mysql,可以解决直接使用 mysql 多源复制遇到的问题:

  • 若 centos mysql 之前没有开启二进制日志或二进制日志有删除或丢失,则不能使用 mysql 多源复制同步所有数据
  • 若centos mysql 之前开启了二进制日志,但是已经运行时间太长,也会导致 mysql 多源复制耗费时间非常长

在 ubuntu mysql 主机上执行命令将 centos mysql 数据库导出到一个 sql 文件。

# 获取需要 dump 的库
DATABASES=$(mysql -h{{ centos_mysql }} -umysql_dump_user -p{{ dump_user_password }} -e "show databases;" | grep -v "Database\|information_schema\|mysql\|performance_schema\|sys\|undolog" | awk '{ print $1}')

# --max_allowed_packet=1024M 设置 mysqldump 接收的 packet 最大为1G。
# --single-transaction 导出数据库时避免锁表,启动一个单一的事务,以确保数据的一致性和完整性。
# --master-data=2 导出数据库时将主服务器的二进制日志信息(文件名和位置)写入到导出文件中,但以注释的形式记录。
# --triggers 导出数据库时包含所有的触发器定义
# --events 导出数据库时包含所有的事件调度器定义
# --routines 导出数据库时包含所有的存储过程和存储函数定义
/opt/mysqldump -h{{ centos_mysql }} -umysql_dump_user -p{{ dump_user_password }} --max_allowed_packet=1024M --single-transaction --master-data=2  --triggers --events --routines --databases $DATABASES > /data1/mysql/dump/full_backup-{{ centos_mysql }}.sql

检查 dump sql 文件末尾是否有 "Dump completed" 关键字,若包含此字段,表示 dump 成功。"Dump completed" 关键字举例如下。

/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2024-10-15 22:34:38

在 ubuntu mysql 主机导入 dump sql 文件。

mysql -h127.0.0.1 -uroot -p{{ root_user_password }} -e "source /data1/mysql/dump/full_backup-{{ centos_mysql }}.sql

设置多源复制

从 dump sql 文件获取主服务器二进制日志文件名和位置信息,举例如下图所示,文件名为mysql-bin.000305,位置34905648。

。。。省略其他不相关信息。。。

-- Position to start replication or point-in-time recovery from 
--

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000305', MASTER_LOG_POS=34905648;

--
-- Current Database: `activemq`
--
。。。省略其他不相关信息。。。

在 ubuntu mysql 主机设置多源复制

# {{ master_log_file }}   主服务器二进制日志文件名
# {{ master_log_pos }}  主服务器二进制日志文件位置
mysql -h 127.0.0.1 -uroot -p{{ root_user_password }} -e "change master to master_host='{{ centos_mysql }}',master_user='replica_user',master_password='{{ replica_user_password }}',master_log_file='{{ master_log_file }}',master_log_pos={{ master_log_pos }} for channel 'channel-{{ centos_mysql }}';"
mysql -h 127.0.0.1 -uroot -p{{ root_user_password }} -e "start slave;"

重复执行”使用 mysqldump 导出 centos mysql 数据并导入 ubuntu mysql”和”设置多源复制“ 步骤,把多个 centos mysql 都设置为 ubuntu mysql 的 master 。在 ubuntu mysql 主机查看多源复制状态,举例如下(这里把部分非重要信息省略了)。

*************************** 1. row ***************************
                       Slave_IO_State: Waiting for master to send event
                          Master_Host: 10.66.10.152
                          Master_User: replica_user
                           Master_Port: 3306
                       Connect_Retry: 60
                    Master_Log_File: mysql-bin.000009
           Read_Master_Log_Pos: 1568
                       Relay_Log_File: mysql-relay-bin-channel@002d10@002e66@002e10@002e152.000002
                       Relay_Log_Pos: 620
           Relay_Master_Log_File: mysql-bin.000009
                  Slave_IO_Running: Yes
               Slave_SQL_Running: Yes
              Replicate_Ignore_DB: mysql,information_schema,performance_schema,sys
             Exec_Master_Log_Pos: 1568
                    Relay_Log_Space: 864
                          Last_IO_Error:
                        Last_SQL_Error:
                    Master_Server_Id: 101
                          Master_UUID: 74c1cfc1-884b-11ef-88e4-0242ac120002
                     Master_Info_File: mysql.slave_master_info
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                       Channel_Name: channel-10.66.10.152
*************************** 2. row ***************************
                      Slave_IO_State: Waiting for master to send event
                         Master_Host: 10.66.10.153
                         Master_User: replica_user
                          Master_Port: 3306
                      Connect_Retry: 60
                   Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 4424
                      Relay_Log_File: mysql-relay-bin-channel@002d10@002e66@002e10@002e153.000002
                      Relay_Log_Pos: 1232
          Relay_Master_Log_File: mysql-bin.000003
                 Slave_IO_Running: Yes
              Slave_SQL_Running: Yes
             Replicate_Ignore_DB: mysql,information_schema,performance_schema,sys
            Exec_Master_Log_Pos: 4424
                   Relay_Log_Space: 1476
                          Last_IO_Error:
                        Last_SQL_Error:
                   Master_Server_Id: 101
                         Master_UUID: 6821082c-8a9f-11ef-98bc-0242ac120002
                    Master_Info_File: mysql.slave_master_info
     Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
              Master_Retry_Count: 86400
                      Channel_Name: channel-10.66.10.153

其中 Slave_IO_Running 值为 Yes 时表示slave mysql I/O 线程正在正常执行,并且已经或正在将 master mysql 的二进制日志写入到中继日志中。Slave_SQL_Running 值为 Yes 时表示 slave mysql SQL 线程正在正常执行,并且已经或正在读取中继日志中的事件并执行。

若 Slave_IO_Running 或 Slave_SQL_Running 值不是 Yes,查看 Last_IO_Error 或 Last_SQL_Error 显示的问题,解决完问题后,重新执行设置主从复制。

重启连接 mysql 服务

设置 centos mysql 为只读,连接 centos mysql 服务不能写入数据,通过多源复制,最新的 centos mysql 数据也已经同步到 ubuntu mysql。在 centos mysql 执行下面指令设置只读。

mysql -h127.0.0.1 -uroot -p{{ root_user_password }} -e "SET GLOBAL read_only = ON;"

切换 mysql 域名指向 ubuntu mysql 并且重启连接 mysql 的服务后,查看 centos mysql 是否还有服务链接?若有的话,需要单独处理。可能的原因: 服务连接 centos mysql 时使用了 ip,而不是域名。譬如下面例子在 centos mysql 执行 "show processlist;" 显示,已经没有服务连接此 mysql。

 # mysql -h 127.0.0.1 -uroot -p{{ root_user_password }} -e "show processlist;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+------+-----------------+------+---------+------+----------+------------------+
| Id | User | Host            | db   | Command | Time | State    | Info             |
+----+------+-----------------+------+---------+------+----------+------------------+
| 26 | root | localhost:37488 | NULL | Query   |    0 | starting | show processlist |
+----+------+-----------------+------+---------+------+----------+------------------+

最终在 ubuntu mysql 清除主从复制,因为此时 centos mysql 数据已经同步到 ubuntu mysql,连接 mysql 的服务也已经指向 ubuntu mysql。在 ubuntu mysql 执行下面命令清除主从复制

mysql -h 127.0.0.1 -uroot -p{{ root_user_password }} -e "stop slave;"
mysql -h 127.0.0.1 -uroot -p{{ root_user_password }} -e "reset slave all;"



本文使用 mysql 多源复制实践了把多套 mysql 迁移到一套方案,另外也介绍了 mysqldump 的使用方式,希望对大家有所帮助。

相关推荐

Docker篇(二):Docker实战,命令解析

大家好,我是杰哥上周我们通过几个问题,让大家对于Docker有了一个全局的认识。然而,说跟练往往是两个概念。从学习的角度来说,理论知识的学习,往往只是第一步,只有经过实战,才能真正掌握一门技术所以,本...

docker学习笔记——安装和基本操作

今天学习了docker的基本知识,记录一下docker的安装步骤和基本命令(以CentOS7.x为例)一、安装docker的步骤:1.yuminstall-yyum-utils2.yum-con...

不可错过的Docker完整笔记(dockerhib)

简介一、Docker简介Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,...

扔掉运营商的 IPTV 机顶盒,全屋全设备畅看 IPTV!

其实现在看电视节目的需求确实大大降低了,折腾也只是为了单纯的让它实现,享受这个过程带来的快乐而已,哈哈!预期构想家里所有设备直接接入网络随时接收并播放IPTV直播(电信点播的节目不是太多,但好在非常稳...

第五节 Docker 入门实践:从 Hello World 到容器操作

一、Docker容器基础运行(一)单次命令执行通过dockerrun命令可以直接在容器中执行指定命令,这是体验Docker最快捷的方式:#在ubuntu:15.10容器中执行ech...

替代Docker build的Buildah简单介绍

Buildah是用于通过较低级别的coreutils接口构建OCI兼容镜像的工具。与Podman相似,Buildah不依赖于Docker或CRI-O之类的守护程序,并且不需要root特权。Builda...

Docker 命令大全(docker命令大全记录表)

容器生命周期管理run-创建并启动一个新的容器。start/stop/restart-这些命令主要用于启动、停止和重启容器。kill-立即终止一个或多个正在运行的容器rm-于删除一个或...

docker常用指令及安装rabbitMQ(docker安装rabbitmq配置环境)

一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...

使用Docker快速部署Storm环境(docker部署confluence)

Storm的部署虽然不是特别麻烦,但是在生产环境中,为了提高部署效率,方便管理维护,使用Docker来统一管理部署是一个不错的选择。下面是我开源的一个新的项目,一个配置好了storm与mono环境的D...

Docker Desktop安装使用指南:零基础教程

在之前的文章中,我多次提到使用Docker来安装各类软件,尤其是开源软件应用。鉴于不少读者对此有需求,我决定专门制作一期关于Docker安装与使用的详细教程。我主要以Macbook(Mac平台)为例进...

Linux如何成功地离线安装docker(linux离线安装httpd)

系统环境:Redhat7.2和Centos7.4实测成功近期因项目需要用docker,所以记录一些相关知识,由于生产环境是不能直接连接互联网,尝试在linux中离线安装docker。步骤1.下载...

Docker 类面试题(常见问题)(docker面试题目)

Docker常见问题汇总镜像相关1、如何批量清理临时镜像文件?可以使用sudodockerrmi$(sudodockerimages-q-fdanging=true)命令2、如何查看...

面试官:你知道Dubbo怎么优雅上下线的吗?你:优雅上下线是啥?

最近无论是校招还是社招,都进行的如火如荼,我也承担了很多的面试工作,在一次面试过程中,和候选人聊了一些关于Dubbo的知识。Dubbo是一个比较著名的RPC框架,很多人对于他的一些网络通信、通信协议、...

【Docker 新手入门指南】第五章:Hello Word

适合人群:完全零基础新手|学习目标:30分钟掌握Docker核心操作一、准备工作:先确认是否安装成功打开终端(Windows用户用PowerShell或GitBash),输入:docker--...

松勤软件测试:详解Docker,如何用portainer管理Docker容器

镜像管理搜索镜像dockersearch镜像名称拉取镜像dockerpullname[:tag]列出镜像dockerimages删除镜像dockerrmiimage名称或id删除...