xtrabackup使用
1、备份原理
xtrabackup 在备份 InnoDB 相关数据时,有2条线程,1条是 redo 拷贝线程,负责拷贝 redo 文件,1条是 ibd 拷贝线程,负责拷贝 ibd 文件;redo 拷贝线程只有一个,在 ibd 拷贝线程之前启动,在 ibd 线程结束后结束。xtrabackup 进程开始执行后,先启动 redo 拷贝线程,从最新的 checkpoint 点开始顺序拷贝 redo 日志;然后再启动 ibd 数据拷贝线程。
注意:在备份过程中有ddl操作会导致备份失败:ddl操作不会纪录到redo log中,当执行了ddl语句修改表结构后再往该表写入数据,redo log会记录这些数据,在将这些数据导入数据文件时,会发现和数据文件中的表结构冲突。
2、备份操作
// 全局备份,备份加密的话加上--compress参数,使用备份时也需要先--decompress解密
xtrabackup --defaults-file=/etc/my.cnf --backup --user=root --password=‘123456’ socket=/tmp/mysql.sock target-dir=/backup/2019_12_12(一般用日期当作备份名)
3、备份恢复
3.1、全恢复
// 解密备份文件
xtrabackup --decompress --target-dir=/backup/2019_12_12
// 准备一个备份
xtrabackup --prepare --target-dir=/backup/2019_12_12
// 恢复备份
xtrabackup --copy-back --target-dir=/backup/2019_12_12
3. 2、恢复单库单表
恢复单库或指定几个库的话,只需要将备份文件下的其他库移出去就好
恢复单表:
1、创建表(忘记表结构可以使用mysqlfrm解析备份里的frm文件 mysqlfrm —diagnostic ~/*.frm)
2、删除表空间 alter table yourtable discard tablespace(实际效果是删除该库对应表的.ibd文件)
3、将备份中对应的.ibd(数据文件)拷贝至所属数据库文件下,修改文件所属为mysql:mysql
注意:主从结构不要忘了将这步操作在从库上也执行一遍
4、导入表空间 alter table yourtable import tablespace
3.3、恢复到指定时间点
1、找到需要恢复的备份文件
2、如果是加密的备份,使用xtrabackup --decompress --target-dir=/backup/2019_06_10 来解密
(若报错:sh:qpress:command not found,需要安装qpress工具http://www.quicklz.com上可下载)
xtrabackup —prepare —target-dir=/backup/2019_06_10 准备一个备份
chown -R mysql:mysql 2019_06_10修改文件,后面直接会使用这个数据文件启动数据库检查是否恢复正确
3、解密完成后,进入文件夹,cat xtrabackup_info文件,得到备份的信息
4、使用mysqlbinlog --start-position=“备份结束的位置节点” --stop-datetime=“需要恢复的时间节点" /app/mysql/log/binlog/bin-log.002206 > /tmp/test.sql将全备结束和需恢复点之间的binlog转存为sql文件(若2个节点之间的内容包含了多个binlog,可以这样写bin-log.00220[5-6]*,表示002205和002206两个binlog文件)
5、用mysqld --user=mysql --no-defaults --basedir=/app/mysql/dist --datadir=/backup/ -P3307来启动mysql
no-defaults:不读取配置文件(my.cnf)
basedir:mysql的配置目录
datadir:mysql的数据目录
-P:自定义端口,不要与原有数据库端口重复
6、mysql -h127.0.0.1 -uadmin -ppassword -P3307登陆数据库,再source得到的sql文件,可能会报GTID的错误,可以忽略,数据还是能成功插入的(注意:登入后show databases查看是否为备份数据库的数据)