2018/05/03

阿里云 RDS-Mysql 数据还原到指定时间点


阿里云 RDS-Mysql 数据备份与还原到指定时间点

阿里云RDS后台-备份恢复 里进行查看数据备份和日志备份(binlog) 001.png

数据备份标签页,显示的是物理备份的数据,阿里云备份使用的工具是 Xtrabackup

日志备份标签页,可查看已上传到OSS的binlog日志,注意,查看到的是已上传到OSS的日志,不是实时最新的,每6个小时上传一次日志到OSS。

恢复数据到指定时间点,我们的业务通常只会用在对单库和单表的情况下,而阿里云提供恢复的方式基本都是基于购买它的克隆实例或临时实例来进行操作的,而且都是全库恢复,这边不采用它这种做法,而是用自己的一种方式进行:

  • 1.选择最近一次全备数据下载到本地。
  • 2.使用 Xtrabackup 将全备数据恢复到本地mysql中。
  • 3.根据全备数据对应的 备份所在实例编号 ,在日志备份里下载全备数据时间点开始,到需要还原到哪个时间的日志。
  • 4.使用mysqlbinlog对binlog日志进行条件检索出sql文件
  • 5.进入mysql终端导入sql文件完成时间点恢复
  • 6.本地校验没问题后导出sql文件
  • 7.在RDS mysql终端删除需要还原的数据库,然后执行sql文件重新导入即可
  • 8.校验结果

实例

需求:这边需要将数据库 cabbage_server 的数据恢复到2018-05-02 22:30:00的数据

1、下载最近一次全备数据到本地,查看阿里云后台最近一次全备数据是 2018-05-02 04:52/2018-05-02 04:55,下载回来后解压到 /vagrant_sync/backup/full 目录下。 002.png

2、下载binlog日志到本地,查看啊里云后台 日志备份 标签,查看对应 BINLOG所在实例编号 的内容,此处需要下载
2018-05-02 03:41:29 至 2018-05-02 09:41:33
2018-05-02 09:41:30 至 2018-05-02 15:41:37
2018-05-02 15:41:34 至 2018-05-02 21:41:38
这3份的binlog文件到本地,解压到 /vagrant_sync/backup/binlog 目录下。 003.png

3、还原全备数据

/usr/local/xtrabackup/bin/xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/vagrant_sync/backup/full

/etc/init.d/mysql stop

mv /usr/local/mysql/var /usr/local/mysql/var.bak

cp -fr /vagrant_sync/backup/full /usr/local/mysql/var

chown -R mysql:mysql var

阿里云不提供root权限,所以还原全备完毕后,需要重置root密码,用以下命令启动MySQL,以不检查权限的方式启动;

mysqld_safe --skip-grant-tables &

然后用空密码方式使用root用户登录mysql,一个root用户,密码为123456,可访问所有权限,不限登陆主机。
注意要先执行一波 flush privileges; 才进行添加用户,不然会出现报错

mysql -uroot

mysql> flush privileges;
mysql> grant all privileges on *.* to 'root'@'%' identified by "123456" with grant option;
mysql> flush privileges;
mysql> quit

4、还原binlog数据 通过全备的 xtrabackup_binlog_info 文件可以知道全备对应的binlog日志pos位置,基于此pos位置进行导出增量sql语句

/usr/local/mysql/bin/mysqlbinlog --start-position 156731 mysql-bin.000079 > inc_001.sql
/usr/local/mysql/bin/mysqlbinlog mysql-bin.000080 > inc_002.sql
/usr/local/mysql/bin/mysqlbinlog mysql-bin.000081 > inc_003.sql

# 导入数据库
mysql> source /opt/inc_001.sql;
mysql> source /opt/inc_002.sql;
mysql> source /opt/inc_003.sql;

从后台可以看到可下载的binlog最新只能到21:41:38,需求是需要还原数据到22:30点,还差1个小时的binlog数据,这部分数据就需要通过 链接到mysql终端来获取

/usr/local/mysql/bin/mysqlbinlog  -u xxx -p -h xxx --read-from-remote-server --start-datetime="2018-05-02 21:41:38" --stop-datetime="2018-05-02 22:30:00" mysql-bin.000082 > inc_remote.sql

#将这部分sql导入到数据库中
mysql> source /opt/inc_remote.sql;

5、检查数据无误即可进行导出需要还原的数据库

/usr/local/mysql/bin/mysqldump -uroot -p123456 --single-transaction --flush-logs --master-data=2 cabbage_server > cabbage_server.sql

注意:在进行数据还原回本地数据库时,本地的mysql版本跟线上的mysql版本要保持一致,防止出现版本差异引起的问题


参考文档

RDS备份 https://help.aliyun.com/document_detail/26206.html?spm=a2c4g.11186623.6.731.MjEtVN
怎样恢复误删除的数据 https://help.aliyun.com/knowledge_detail/51989.html?spm=a2c4g.11186623.4.5.38XuYg
通过克隆实例恢复到主实例 https://help.aliyun.com/document_detail/26207.html?spm=a2c4g.11186623.3.4.pkk8d1
迁移 RDS for MySQL 数据到本地 MySQL https://help.aliyun.com/document_detail/26212.html?spm=a2c4g.11186623.4.4.qeQoQG
RDS for MySQL 本地时间点恢复 https://help.aliyun.com/knowledge_detail/41738.html?spm=a2c4g.11186623.4.3.38XuYg