一、物理备份与Xtrabackup介绍
通常将直接复制数据文件作为备份手段的方式称为物理备份,相比逻辑备份而言速度更快、服务器负载也更低,并且备份期间不会锁表(MyISAM引擎依然存在FTWRL),备份期间不用间断业务,如果备份期间数据发生变化也会通过redolog保持数据一致,并且支持增量备份。只不过在进行单表备份和恢复时非常麻烦,这种场景建议用逻辑备份。
二、Xtrabackup安装
Xtrabackup是由Percona所发布的MySQL物理热备工具,包含xtrabackup和innobackup两个备份工具。xtrabackup主要针对innodb表来做备份,而innobackupex还可以对非innod表做备份。由于现版本已淘汰MyIsam表,所以innobackupex其实也是xtrabackup的软连接,它会自动调用xtrabackup。
1、Percona官网推荐使用Yum方式安装,只需要配置好仓库地址即可
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm yum install percona-xtrabackup-24.x86_64 #mysql 8以前都是使用该版本
2、如果是下载的rpm包手动安装,如果出现“ libev.so.4()(64bit) is needed by percona-xtrabackup-2.3.4-1.el7.x86_64”这样的报错,只需要配置好EPEL的yum源,再安装libev即可,如图:
3、安装好xtrabackup后有2个命令可以用来备份,一个是针对innodb表的xtrabackup;另一个是非innod表的innobackupex,在文章开头已经提到了两者的区别,查看innobackupex也会发现它是xtrabackup的软连接,用innobackup备份innodb表时会自动调用xtrabackup。
三、innobackupex工具选项介绍
· --defaults-file=:指定my.cnf配置文件路径,如/etc/my.cnf。该选项必须是第一个选项,它会根据配置文件查找数据路径
· --user=:执行备份操作的MySQL用户(非系统用户),该用户需要有MySQL的相关权限
· --password=:MySQL用户的密码
· --databases:指定要备份的数据库,多个数据库以空格隔开,如"db1 db2",在指定某数据库时也可以只指定其中的某张表(MySQL需要配置innodb_file_per_table = 1)
· --no-timestamp:使用这个选项后,备份时不会创建一个以时间戳命名的目录
· --compress:压缩备份数据,可以达到好几十倍的压缩率。恢复时需在apply-log之前增加--decompress解压步骤
· --compress-threads=8:启用压缩备份时开启的压缩线程数
· --stream=xbstream:使用流式备份,通常用它实现本机不落盘的异地备份
· --parallel=4:备份所用的线程数
· --slave-info :在从库进行备份时加上该参数后会在备份目录下生成xtrabackup_slave_info文件,该文件记录了主库binlog日志位置点。在进行数据恢复或者新的从库搭建时需要这个文件
· --safe-slave-backup:检测从库在备份期间是否有打开临时表(保证数据一致性),如果没有打开临时表就stop SQL thread开始备份,备份完后再start SQL thread。如果有打开的临时表就会等待--safe-slave-backup-timeout超时
· --safe-slave-backup-timeout:默认300秒,每3s进行一次重试检查
四、innobackupex备份与还原
1、innobackupex备份命令示例
· 使用innobackupex全量备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password='123456' /data/backup/
· 使用innobackupex备份指定库,需要注意的是MySQL系统库也要一同备份,否则还原会出问题
innobackupex --defaults-file=/etc/my.cnf --user=root --password='123456' --databases="db1 db2" /data/backup
· 使用innobackupex流备份,实现本地不落盘直接推送到远程备份节点,恢复的时候需要先对备份压缩包解压(实际也可以边备份边解压)
#流备份到远程服务器 xtrabackup --defaults-file=/etc/my.cnf --backup --user=root--password=123456 --host=192.168.38.53 --port=3306 --stream=xbstream |lz4 -B4 |ssh -p24 10.3.0.226 "cat - > /data2/logbak01/bi1/mysqlfull_2021_01_21_full.xbstream.lz4" #解压lz4,得到xbstream lz4_decompress mysqlfull_2021_01_21_full.xbstream.lz4 mysqlfull_2021_01_21_full.xbstream #解压xbstream xbstream -x < mysqlfull_2021_01_21_full.xbstream -C /data/mysql_restore/xtrabackup/ #一边备份一边推送一边解压 xtrabackup --defaults-file=/etc/my.cnf --backup --user=dba --password=Hzdba666#@888 --host=192.168.38.53 --port=3306 --stream=xbstream |lz4 -B4 |ssh -p24 192.168.38.60 "cat - | lz4 -d -B4 |xbstream -x -C /data/backup"
· innobackupex加密备份
openssl rand -base64 24 #得到一串加密码 echo -n "pxT5aEDWzasNZw==" > /data/backup/key innobackupex --default-file=/etc/my.cnf --user=dba --password=123456 --encrypy=AES256 --encrypt-key-file=/data/backup/key #加密备份 xtrabackup --decrypy=AES256 --encrypt-key="pxT5aEDWzasNZw==" --target-dir=/data/backup/fullback --remove-original#解密,之后再用innobackup apply-log和--copy-back
3、备份后的日志位置点
执行备份命令后屏幕会输出一系列的复制操作,备份期间如果有新数据产生会被记录在innobackup_log文件中。在指定的备份目录中除了MySQL数据文件还有2个文件需要关注,分别是记录备份时刻binlog位置信息的xtrabackup_binlog_info和记录了用于增量备份的LSN信息的xtrabackup_checkpoint,LSN记录了每一次备份时的起始点和结束点,通常上一次的结束点和下一次的起始点是连续的(如果开启了GTID的话会有9的误差)。如图:
4、innobackupex数据还原步骤
· apply-log:前滚与回滚事务
由于备份过程中记录了redo log中的数据,redo log包含有尚未提交的事务。为避免数据不一致,在进行数据恢复前需要将这些未提交的事务进行回滚。
innobackupex --defaults-file=/etc/my.cnf --apply-log --user-memory=2G /backup/2016-03-29_17-28-37/ # --defaults-file:指定数据库配置文件,该选项必须放第一个 # --user-memory:执行整理操作时只用2G内存
· 恢复备份前需要先停止MySQL服务并让数据目录为空
systemctl stop mysqld rm -rf /var/lib/mysql/*
· --copy-back | --move-back 拷贝数据到datadir,move的方式会更快
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/2016-03-29_17-28-37/
· 修改权限为mysql用户后启动服务
chown -R mysql.mysql /data mysqld_safe --defaults-file=/etc/my.cnf &
四、innobackupex增量备份与恢复(在实际工作中不建议使用增量备份,而是采用全备+binlog的形式)
1、增量备份
innobackupex --incremental /data/backup --incremental-basedir=/data/backup/2018-11-11_17-28-37 #指定了对哪个完整备份进行增量 innobackupex --incremental /data/backup --incremental-basedir=/data/backup/2018-11-12_17-28-37 #第二次增量备份时basedir就是第一次增量备份后产生的目录
2、恢复增量备份:
示例中的BASE-DIR指的是完整备份的目录;incremental-dir-1指的是第一次增量备份的目录,--incremental-dir-2指的是第二个增量备份目录,以此类推。特别注意的是--redo-only选项,即只用redo日志恢复数据而不用undo日志回滚未提交的事件,因为有可能一个事件在第一次备份时并没有提交完成而是在第二次备份时才执行完成,所以为了防止事件被回滚,除了最后一次增量数据外,其他都要加上--redo-only选项:
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 --copy-back BASE-DIR #使用合并后的完整备份目录进行--copy-back即可 chown -R mysql.mysql /mysqldata
3、通过binlog日志恢复未备份的数据,只要在恢复了全量数据后查看下xtrabackup_binlog_info文件就可以得知需要从哪儿开始恢复
cat xtrabackup_binlog_info #假设这里记录到了binlog.000001的23874这个位置 mysqlbinlog --start-position=23874 binlog.000001 binlog.00002 binlog.00003 | mysql -uroot -p #将23874之后的数据恢复,也可以先重定向到一个文本中检查后再手动导入
五、xtrabackup备份与还原(和innobackupex选项大多相同,按照备份--准备--还原的顺序操作即可)
1、xtrabackup备份示例
· 使用xtrabackup全库备份
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --backup --target-dir=/data/backup #backup代表开始备份;target-dir指定备份存放路径
· 使用xtrabackup备份指定库
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --backup --databases="database1 database2 database3" #备份指定库 xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --backup --databases="database1.table1 database1.table2" #备份指定表
2、xtrabackup恢复示例
#准备阶段 xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/backup #还原阶段 rsync -avrP /data/backup /data/mysql/data/ #官方推荐用rsync还原 # xtrabackup --defaults-file=/etc/my.cnf --move-back --target-dir=/data/backup #数据量多推荐使用move方式
3、xtrabackup的增量备份
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --backup --target-dir=/data/full_backup xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --backup --target-dir=/data/full_backup --incremental-basedir=/data/incremental01_backup xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --backup --target-dir=/data/incremental01_backup --incremental-basedir=/data/incremental02_backup
4、xtrabackup的压缩备份
#tar形式备份与解压 xtrabackup --defaults-file=/etc/my.cnf --user=dba --password=123456 --backup --stream=tar --target-dir=/data/backup | gzip > /data/backup/backup.tar.gz tar izxvf /data/backup/backup.tar.gz #流格式备份与解压 xtrabackup --defaults-file=/etc/my.cnf --user=dba --password=123456 --backup --stream=xbstream --target-dir=/data/backup 1 > /data/backup/backup.xbstream xbstream -x < /data/backup/backup.xbstream -C /data/backup #将流备份文件解压到指定目录
发表评论: