记一次线上主从全库恢复
恢复一张表数据差异,结果酿成整个库数据不一致,导致主从需要重新做一次同步。
innobackupex 恢复
安装
依赖库:yum install libaio perl-devel perl-CPAN
直接下载二进制包,不编译,编译需要和MySQL源码包配合。
wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.9/binary/Linux/x86_64/percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz
tar zxvf percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz
cp percona-xtrabackup-2.1.9-Linux-x86_64/bin/innobackupex-1.5.1 /usr/bin/innobackupex
cp percona-xtrabackup-2.1.9-Linux-x86_64/bin/xtrabackup_55 /usr/bin/xtrabackup
cp percona-xtrabackup-2.1.9-Linux-x86_64/bin/xtrabackup_56 /usr/bin/xtrabackup_56
主服务器备份
主服务器上执行备份操作,直接通过ssh传输到备服务器:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=*** --stream=tar /data/backup/ | ssh -p 22 root@192.168.31.141 "cat -> /tmp/all_databases.tar "
innobackupex --defaults-file=/etc/my.cnf --user=root --password=*** --stream=xbstream ./ | ssh -p 22 root@192.168.31.141 "/usr/bin/xbstream -x -C /disk2/tmp/"
从服务器恢复数据
在恢复时,需要指定备份目录,--copy-back在数据恢复时将备份数据文件拷贝到MySQL服务器的datadir,datadir需要为空才能恢复成功,因此如果该目录中有其他文件需要事先备份。
/etc/init.d/mysqld stop
mv /data/database/mysql3306 /data/database/mysql3306.bak
mkdir /data/database/mysql3306
cd /tmp/
mkdir `date +%F"_"%H"-"%M"-"%S`
tar -ixf all_databases.tar -C 2017-10-26_14-24-27/ #解压缩参数-i是必须的
innobackupex --defaults-file=/etc/my.cnf --apply-log 2017-10-26_14-24-27/
innobackupex --defaults-file=/etc/my.cnf --copy-back 2017-10-26_14-24-27/
chown -R mysql:mysql -R /data/database/mysql3306
/etc/init.d/mysqld start
从服务器恢复同步
恢复后,数据目录下有个xtrabackup_info文件,里面记录了binlog 文件和pos点,可以直接使用它恢复同步
cd /data/database/mysql3306
cat xtrabackup_info
***
binlog_pos = filename 'mysql-bin.000067', position 843
***
补充一点
用过 xtrabackup 工具的 innobackupex 脚本备份数据的人可能会注意到,–apply-log 处理过的备份数据里有两个文件(xtrabackup_binlog_info和xtrabackup_binlog_pos_innodb)说明该备份数据对应的 binlog 的文件名和位置。但有时这俩文件说明的位置可能会不同。
1 对于纯 InnoDB 操作,备份出来的数据中上述两个文件的内容是一致的
2 对于 InnoDB 和非事务存储引擎混合操作,xtrabackup_binlog_info 中所示的 position 应该会比xtrabackup_binlog_pos_innodb所示的数值大。此时应以 xtrabackup_binlog_info 为准;而xtrabackup_binlog_pos_innodb和 apply-log 时 InnoDB recovery log 中显示的内容是一致的,只针对 InnoDB 这部分数据
mysqldump 恢复
数据导出导入
在从服务器上直接dump下来,主MySQL需要对从服务器授权
mysqldump -uroot -p -h 192.168.31.170 --single-transaction --master-data --flush-logs --all-databases > all-databases.sql
mysql -uroot -p < all-databases.sql # 从库会被覆盖更新,这时候数据就和主库上的在导出数据时间点之前的数据一致了。
恢复主从
直接从导出的文件中查看主库的binlog 文件和pos点,可以直接使用它恢复同步
head -50 all-databases.sql
***
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000068', MASTER_LOG_POS=107;
***