背景
由于考虑在不影响线上环境的情况下,将线上数据库(RDS)的数据备份到我本地Windows数据库中,好排查数据库异常和方便做相应查询统计功能,所以就不使用传输数据的方式来做(线上库的数据很大,几百G的数据量),使用下载备份实例的方式还原某天的数据;废话不多说,一起来看下;
过程
开始的时候会根据RDS提供的数据恢复方法恢复,我感觉有点麻烦,就直接不用了,感兴趣的朋友可以去看下官网的文档;
https://help.aliyun.com/knowledge_detail/41817.html?spm=a2c4g.11186623.6.758.27d61c12Oc1TXD
于是网上百度了一下,看下其他人的解决方案,整理了一下:
方法一(推荐):
https://blog.csdn.net/leigelg/article/details/84825094
- 进入阿里云控制台备份实例
2.实例备份好过后,到备份恢复中找到刚才备份的实例点击下载
3.下载后的文件是一个hins6021863_data_20181204062825.tar,将文件解压 解压过后得到hins6021863_data_20181204062825 我们给这个文件加一个后缀.zip 变成了hins6021863_data_20181204062825.zip.继续解压,解压后得到数据库的文件
4.cmd进入数据库
查看数据库储存数据的位置,然后将文件夹拖入到储存数据的文件夹中就可以了
5.使用navicat就可以看到刚才导入的数据库了
到此,会存在一个问题,就是 每张表打开都报错:doesn't exist
解决这个问题也很简单,
1、拷贝RDS备份实例中data文件夹中ibdata1至自建库的data文件夹中(原本自建库的ibdata1备份一下,否则后面自建库的其他数据库表会出错);
2、停掉mysql服务,在配置表my.ini中添加/修改
innodb_force_recovery = 6
innodb_purge_threads = 1
3、重启mysql服务就可以了;
可以参照这篇文章
https://www.jianshu.com/p/1c0a8dc21e1d?utm_campaign=shakespeare
方法二:
https://www.cnblogs.com/101key/p/11593699.html
一、本地mysql数据库创建与备份库一致的数据库名,如testdb;
二、本地创建与备份库一致的数据库表,记得设置ALTER TABLE tableName1 ROW_FORMAT = compact;
三、停止mysql服务,在数据库的配置文件my.conf或my-default.ini中添加innodb_force_recovery=1 后再启动mysql服务;
四、将表结构和空间脱离
打开DOS命令窗口,依次执行以下命令:
> cd C:\Program Files\MySQL\MySQL Server 5.7\bin\
> mysql -hlocalhost -uroot -p123456
mysql > use testdb;
mysql > alter table tableName1 discard tablespace;
五、用winRAR解压类似“hins6413187_data_20190925065809”文件
六、在解压的数据库名文件夹下找到并复制tableName1.ibd到tableName1.frm同目录下
七、将表结构和空间建立关系
mysql > alter table tableName1 import tablespace;
搞定!
但有个问题是,这种操作很麻烦,只能单表操作,如果数据库表很多,那就凉凉
并且ALTER TABLE tableName1 ROW_FORMAT = compact;中的compact要根据RDS表的结构来,如果是 Dynamic就Dynamic,不一定按compact来;