MySQL-Xtrabackup备份还原
前言
通常我们都是使用xtrabackup工具来备份数据库,它是一个专业的备份工具,先来简单介绍下它。
Xtrabackup
percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库,它的增量备份不是基于二进制日志文件来还原数据的,是基于mysql数据块。
特点:
- 备份还原过程快速、可靠
- 备份过程不会打断正在执行的事务
- 能够基于压缩等功能节约磁盘空间和流量
- 自动实现备份检验
- 开源,免费
Xtrabackup用法
备份时选项
xtrabackup --backup
--user:该选项表示备份账号
--password:该选项表示备份的密码
--host:该选项表示备份数据库的地址
--databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表
--defaults-file:该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置
--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir
--incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
--incremental-dir:该选项表示还原时增量备份的目录
--include=name:指定表名,格式:databasename.tablename
Prepare于准备选项
prepare
--apply-log:此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
--use-memory:该选项表示和--apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G
--export:表示开启可导出单独的表之后再导入其他Mysql中
--redo-only:此选项在prepare base full backup,往其中merge增量备份时候使用
还原时选项
--copy-back:复制
--move-back:移动
备份生产的相关文件
1)xtrabackup_info:innobackupex工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN,BINLOG的位置
2)xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的
3)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复
4)backup-my.cnf:备份命令用到的配置选项信息
5)xtrabackup_logfile:备份生成的日志文件
还原注意事项
1.datadir目录必须为空。除非指定innobackupex --force-non-emptydirectorires选项指定,否则--copy-backup选项不会覆盖
2.restore还原之前,必须shutdown停止 MySQL服务,不能将一个运行中的实例restore到datadir目录中
3.修改恢复文件的权限为mysql
4.最后一次增量备份还原要回滚事务
5.二进制安装的mysql要是出现停止不了服务就用killall –9 mysqld 杀掉进程进而实现停止服务
实战
规划
1、两台主机17和37,其中17当主mysql服务器,37用来还原的主机,
2、目录,1个存放完整备份的目录,N个存放增量备份的目录
说明:
full目录: 存放完全备份
inc1目录:存放第一次的增量备份
inc2目录:存放第二次的增量备份
备份阶段
1、完全备份数据库
xtrabackup -pcentos --backup --target-dir=/backups/full/ # --backup表示备份 # --target-dir=填写备份到哪里
2、往表中增加数据
mysql -pcentos hellodb -e "insert students (name,age) values('gaodao01',20)"
xtrabackup –pcentos --backup --target-dir=/backups/inc1/ --incremental-basedir=/backups/full # --incremental-basedir表示基于谁的增量备份,写上上一次的备份路径 #
4、再次修改数据表
mysql -pcentos hellodb -e "insert students (name,age) values('gaodao02',21)"
5、第二次增量备份
xtrabackup -pcentos --backup --target-dir=/backups/inc2/ --incremental-basedir=/backups/inc1/
还原阶段
说明:还原的时候我们要考虑到前几次不要回滚,最后一次还原要回滚,还原主机要安装xtrabackup工具
1、把备份的目录传送到要还原的主机上
scp -r /backups/ 192.168.43.37:/
2、停服务并清空mysql数据
systemctl stop mysqld rm -rf /app/mysql/*
3、完全备份的预处理
xtrabackup --prepare --apply-log-only --target-dir=/backups/full
# --prepare 表示还原 # --apply-log-only 表示不回滚
4、第一次增量备份预处理
xtrabackup --prepare --apply-log-only --target-dir=/backups/full --incremental-dir=/backups/inc1
# 同样不回滚
5、第二次增量备份预处理
xtrabackup --prepare --target-dir=/backups/full --incremental-dir=/backups/inc2 # 这是最后一次,所以要回滚不完整的事务
6、复制处理好的数据到真正的存放数据库目录下
xtrabackup --copy-back --target-dir=/backups/full # 它会根据你的配置文件my.cnf来读取存放位置
7、修改数据库文件权限
chown -R mysql.mysql /app/mysql/
以上还原到了备份时的状态,我们备份完二次增量后又加了条记录,还没来得急三次增量备份就宕机了,所以再次利用二进制日志文件还原到最新状态
8、通过二进制文件还原到最新状态
1)以下图中文件记录了还原到的位置
2)从原主机导出二进制文件日志
mysqlbinlog --start-position=1039 /app/logs/mysql-bin.000003 >/app/binlog.sql
3)scp传送到目标主机来还原
- 首先在配置文件中加入禁止所有人访问选项
skip-networking
- 启动服务
systemctl start mysqld
- 导入二进制日志
mysql -pcentos <binlog.sql
4)进入数据库验证
5)OK 恢复完成,删除配置文件中的skip-networking并重启服务
systemctl restart mysqld
更多精彩内容请移步