MySQL数据迁移

参考性文档
目标主机上的数据库安装及配置不再展示,注意版本即可
原主机指的是需要迁移数据库所在主机
目标主机指的是数据库需要迁往的主机

由于数据量较大,在参考多种方式之后选择使用XtraBackup进行备份。主要步骤大概为:

  • 在对应主机安装Percona XtraBackup
  • 在原主机执行全量备份,并打包传输到目标主机
  • 选择合适时间进行增量备份,并打包传输到目标主机
  • 在目标主机整理并恢复数据
  • 原主机停机,目标主机更换IP为原主机IP

安装Percona XtraBackup

官网提供了几种安装方式,建议使用源安装,好处是不用安装令人头疼的依赖问题。根据系统以及MySQL版本选择对应的软件版本。

请注意8.x版本对应MySQL8.x,2.x对应的为MySQL5.x,务必注意。
这里是CentOS7.6、MySQL5.7版本对应的安装指南:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html

  1. sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

  2. yum repolist && yum install -y percona-xtrabackup-24.x86_64

在原主机和目标主机分别安装,完成之后进行备份。

备份并打包传输到目标主机

全量备份

新版本已经不再使用innobackupex进行备份,全量备份可以参考官方文档:https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/full_backup.html

虽然xtrabackup是热备,但依然建议尽可能在使用人数少的情况下操作。
如果有大量事务操作,备份最后阶段可能会长时间阻塞,资源消耗也会飙升

xtrabackup --backup --target-dir=/mnt/bak/ --user=root --password=123456

--backup表示备份

--target-dir表示备份路径

--user备份所使用的用户(MySQL的用户)

--password对应的MySQL用户的密码

备份速度根据数据量和数据库活跃程度有较大差别,出现下面的信息就表示没问题了:

...
MySQL binlog position: filename 'mysql-bin.000042', position '50070078'
210322 19:10:12 [00] Writing /mnt/bak/backup-my.cnf
210322 19:10:12 [00]        ...done
210322 19:10:12 [00] Writing /mnt/bak/xtrabackup_info
210322 19:10:12 [00]        ...done
xtrabackup: Transaction log of lsn (353906050821) to (353912743968) was copied.
210322 19:10:12 completed OK!

之后的打包和传输就比较简单了。(免密登录和相关解析自行配置)

cd /mnt/
tar cvfz bak.tar.gz bak
scp bak.tar.gz root@nt:/mnt

增量备份

官网同样有对应示例:https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/incremental_backup.html

xtrabackup基于一个叫lsn的序列号记录位置,可以在备份目录下的xtrabackup_checkpoints中查看,比如:

[root@localhost mnt]# cat bak/xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 353912743949
last_lsn = 353912743968
compact = 0
recover_binlog_info = 0
flushed_lsn = 353906061663

执行下面的命令基于第一次全量备份进行第一次增量备份:

xtrabackup --backup --user=root --password=123456 --target-dir=/mnt/bakinc1 --incremental-basedir=/mnt/bak

和全量备份类似,增加了一个--incremental-basedir用来指定基于那个备份进行增量。出现下面的信息即表示成功:

...
210322 20:36:24 All tables unlocked
210322 20:36:24 [00] Copying ib_buffer_pool to /mnt/bakinc1/ib_buffer_pool
210322 20:36:24 [00]        ...done
210322 20:36:24 Backup created in directory '/mnt/bakinc1/'
MySQL binlog position: filename 'mysql-bin.000042', position '57104262'
210322 20:36:24 [00] Writing /mnt/bakinc1/backup-my.cnf
210322 20:36:24 [00]        ...done
210322 20:36:24 [00] Writing /mnt/bakinc1/xtrabackup_info
210322 20:36:24 [00]        ...done
xtrabackup: Transaction log of lsn (353917484598) to (353917505331) was copied.
210322 20:36:24 completed OK!

然后,同样的,打包传输:

cd /mnt/
tar cvfz bakinc1.tar.gz bakinc1
scp bakinc1.tar.gz root@nt:/mnt

根据实际情况判断是否需要更多增量备份,如果不需要,即可以关闭数据库开始恢复工作,关闭数据库的原因在于降低新数据的写入可能,以尽量减少数据不一致的情况发生。如果需要更快速的切换时间,可以在恢复数据库之后做主从。通过主从切换机制来降低切换时间。

整理并还原数据

整理备份数据

登录到目标主机,将传输过来的数据解压:

cd /mnt
tar -ixvf bak.tar.gz
tar -ixvf bakinc1.tar.gz

然后预恢复全量备份

xtrabackup --prepare --apply-log-only --target-dir=/mnt/bak

--prepare:表示还原,即恢复

--apply-log-only:表示不回滚事务,因为后面有基于全备的增量备份,所以不需要回滚,如果没有则去掉该参数

下面的显示则表示预恢复成功

...
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 353912748002
InnoDB: Number of pools: 1
210322 20:26:04 completed OK!

将第一次增备加载至全备中

xtrabackup --prepare --apply-log-only --target-dir=/mnt/bak --incremental-dir=/mnt/bakinc1

成功之后同样会输出completed OK! (如果这是恢复前最后一次备份,请去掉--apply-log-only选项。)

恢复数据

首先在目标主机停掉MySQL进程

然后执行下面的命令恢复:

xtrabackup --copy-back --target-dir=/mnt/bak --datadir=/var/lib/mysql
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld

--datadir指的是数据库目录,可以在/etc/my.cnf或其他配置文件中查看

--target-dir表示备份数据所在目录,指定为全备目录

启动成功之后就可以确认数据是否一致。

额外操作:

由于需要将原主机IP地址更换到目标主机上,所以还需要将原主机下线,然后在目标主机网卡配置中配置静态地址,路径一般为/etc/sysconfig/network-script/ifcfg-ensxx,具体配置参考:

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens192"
UUID="99ffdec6-0313-404b-9937-2d9cd3976f2e"
DEVICE="ens192"
ONBOOT="yes"

## 需要添加的静态配置信息
IPADDR=192.168.4.103
PREFIX=23
GATEWAY=192.168.5.254
DNS1=192.168.5.254

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!