适用场景:
数据量比较大,通常以G计算,常规sql导入导出数据庞大容易出错。要将其他地方的mysql迁移到我司弹性云服务器,这时候就可以考虑使用innobackupex来备份迁移。
先决条件:
linux系统服务器,原数据库服务器支持ssh登陆,拥有控制管理权限。原数据库服务器和现在服务器都需要安装innobackupex。
注意:
以下示例来源于网上,路径均为示例,具体以实际路径为准,请充分了解并有相关备份再操作。
安装:
wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.21/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL #安装依赖包 rpm -ivh percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm --nodeps --force
innobackupex常用选项:
--host 指定主机
--user 指定用户名
--password 指定密码
--port 指定端口
--databases 指定数据库
--incremental 创建增量备份
--incremental-basedir 指定包含完全备份的目录
--incremental-dir 指定包含增量备份的目录,增量备份目录
--apply-log 对备份进行预处理操作,一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
--redo-only 不回滚未提交事务
--copy-back 恢复备份目录
一些常用的其他可选参数:
--lock-wait-query-type 该参数允许用户指定,哪类的SQL语句是需要Flush table with read lock等待的
--lock-wait-threshold 运行超过这个时间的查询才算长查询
--lock-wait-timeout 等待长查询多少时间后再尝试FTWRL,一旦Flush table with read lock被阻塞超过预定时间,则XtraBackup出错返回退出,参数允许用户指定了超过该阈值时间的查询会被Kill,同时也允许用户指定Kill
使
全量备份:
innobackupex --user=root --password=xxxx --datadir=/var/lib/mysql /mysql_bkup/
#datadir是mysql数据data存储路径,可以到my.cnf里面查看。mysql_bkup备份存放路径。默认会以时间命名备份目录。
#合并数据,使数据文件处于一致性的状态:
innobackupex --apply-log /mysql_bkup/2022-08-03_21-14-37/
异机恢复准备:
1、使用scp命令将/mysql_bkup/2022-08-03_21-14-37/转移到目标新服务器数据库。
2、新服务器mysql服务关停。将datadir数据存储目录下的数据删除。这里建议改名,然后再新建一个(datadir路径可从my.cnf配置文件里面查看)。
恢复数据:
按上面做好了恢复准备,使用命令恢复。
innobackupex --copy-back /mysql_bkup/2022-08-03_21-14-37/
或者:
innobackupex --copy-back --datadir=/var/lib/mysql /mysql_bkup/2022-08-03_21-14-37/
恢复以后注意使用chown重置目录权限,然后将mysql服务重新启动。
如果数据库迁移过程是在运行的,数据有更新,就需要增量备份。
增量备份:
--incremental 创建增量备份
--incremental-basedir 指定包含完全备份的目录
--incremental-dir 指定包含增量备份的目录
#合并全备数据目录,确保数据的一致性
innobackupex --apply-log --redo-only /mysql_bkup/2022-08-03_21-14-37/
#创建增量备份
innobackupex --user=root --password=xxx --incremental /mysql_bkup_add/ --incremental-basedir=/mysql_bkup/2022-08-03_21-14-37/
#将增量备份数据合并到全备数据目录当中
innobackupex --apply-log /mysql_bkup/2022-08-03_21-14-37/ --incremental-dir=/mysql_bkup_add/增量备份/
#数据一致性
innobackupex --apply-log /mysql_bkup/2022-08-03_21-14-37
#恢复数据:
innobackupex --copy-back /mysql_bkup/2022-08-03_21-14-37
#恢复到异地也是需要scp迁移到新服务器,按上面说明先停止服务,删除data数据再操作。
增量备份可以是多次,以下是多次增量备份示例:
#进行第一次全备
[root@ebs~]#innobackupex --datadir=/var/lib/mysql --user=root --password=xxx ./bkup
#进行第一次增备,基于上次的全备
[root@ebs ~]#innobackupex --datadir=/var/lib/mysql --user=root --password=xxx --incremental ./bkup/incer1 --incremental-basedir=./bkup/2022-04-23_11-39-31
#进行第二次全备,基于第一次增备
[root@ebs ~]#innobackupex --datadir=/var/lib/mysql --user=root --password=xxx --incremental ./bkup/incer2 --incremental-basedir=./bkup/incer1/2022-04-23_11-47-10
--incremental 创建增量备份
--incremental-basedir 指定包含完全备份的目录
--incremental-dir 指定包含增量备份的目录
##########################恢复时进行数据整合####################################################
#对整合的开始备份集——全备集应用日志,并指定"--redo-only"表示开始进入日志追加
innobackupex --apply-log --redo-only ./bkup/2022-04-23_11-39-31/
#对第一个增备集进行"准备",将其追加到全备集中
innobackupex --apply-log --redo-only ./bkup/2022-04-23_11-39-31/ --incremental-dir=./bkup/incer1/2022-04-23_11-47-10/
#对第二个增备集进行"准备",将其追加到全备集中,但是不再应用"--redo-only",表示整合的结束点
innobackupex --apply-log ./bkup/2022-04-23_11-39-31/ --incremental-dir=./bkup/incer2/2022-04-23_11-53-19/
#对整合完成的全备集进行一次整体的"准备"
innobackupex --apply-log ./bkup/2022-04-23_11-39-31/
###################进行数据的恢复#############################
innobackupex --copy-back --datadir=/var/lib/mysql ./bkup/2022-04-23_11-39-31/
#如果是异地恢复,需要scp迁移过去再执行。
###############修改目录权限并启动mysql###########
chown mysql:mysql -R /usr/local/mysql/data && systemctl start mysqld
官方文档给出的恢复步骤:
innobackupex --apply-log --redo-only BASE-DIR
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
innobackupex --apply-log BASE-DIR
innobackupex --copy-back BASE-DIR