恢复数据库快照xb文件到新实例

背景

背景就是我把线上某张表的某个字段给清空了。用的是腾讯云的数据库实例,运维配置的快照是每天早上备份一次,因此可以通过快照文件恢复数据。直接恢复到线上实例是不现实的,所以想法是将快照恢复到本地实例,然后用脚本/工具把数据导出来,再写入线上实例。当时恢复过程比较曲折,这里记录下比较好的操作步骤。

获取xb文件

从云服务商或你自行备份的xb文件中获取。腾讯云 这里 可找到备份列表

安装xbstream和qpress工具

腾讯云使用qpress压缩文件,再通过xbsteam打包为xb文件。[参考腾讯云文章]

安装xbstream

  • 下载并安装 XtraBackup 工具。
    下载地址请参见 Percona XtraBackup 官网,请选择 Percona XtraBackup 2.4.6 及以上的版本,安装介绍请参见 Percona XtraBackup 2.4
  • 支持的实例版本:MySQL 5.5、5.6、5.7 高可用版和金融版。
  • 启用数据加密功能的实例,不支持使用物理备份恢复数据库。

我使用的是mac,使用brew进行安装 brew install percona-xtrabackup

安装qpress

 

quicklz下载编译好的二进制文件。

我的mac无法直接使用linux的可执行文件,所以从上面网站下载源码,编译安装。

mac编译qpress时报错

qpress.cpp:1040:18: error: use of undeclared identifier 'isatty'
    tty_stderr = isatty(fileno(stderr));
                 ^
1 error generated.
make: *** [g++] Error 1

qpress.cpp 添加头文件 #include <unistd.h>

重新编译成功。将编译好的qpress拷贝到 /usr/local/bin 。必须放到该目录下,因为xbstream工具调用qpress是用的绝对路径(为啥这样设计 ̄□ ̄||)

对xb文件进行解包&解压缩

xbstream -x -C /tmp/新建的目录 < ~/你的xb文件.xb # 使用 xbstream 命令将备份文件解包到目标目录
xtrabackup --decompress --target-dir=/tmp/新建的目录 # 将目标目录下所有以.qp结尾的文件都解压出来

将解压出来的frm、ibd文件附到本地mysql实例

腾讯云的方法

腾讯云文档的方法是起一个mysqld_safe实例将data配置为刚刚那个新建的目录

步骤4:Prepare 备份文件

备份解压出来之后,执行如下命令进行 apply log 操作。

xtrabackup –prepare –target-dir=/data

执行后若结果中包含如下输出,则表示 prepare 成功。
prepare.png

步骤5:修改配置文件

  1. 执行如下命令打开backup-my.cnf文件。
     vi /data/backup-my.cnf
    说明:

    本文以目标目录/data为例,您可以根据实际情况将其替换成实际路径。

  2. 由于存在的版本问题,请将解压文件backup-my.cnf中如下参数进行注释。
    • innodb_checksum_algorithm
    • innodb_log_checksum_algorithm
    • innodb_fast_checksum
    • innodb_page_size
    • innodb_log_block_size
    • redo_log_version

步骤6:修改文件属性

修改文件属性,并检查文件所属为 mysql 用户。

 chown -R mysql:mysql /data

步骤7:启动 mysqld 进程并登录验证

  1. 启动 mysqld 进程。
     mysqld_safe –defaults-file=/data/backup-my.cnf –user=mysql –datadir=/data &
  2. 客户端登录 mysql 验证。
     mysql -uroot

我的方法

为什么我不用腾讯云的方法呢。因为现在整理写博客时才看到。盆友们可以试试吧,如果行不通的话,可以用我的方法。ps.平时从别的实例拷贝.ibd/.frm到新实例也可以用该方法

  • 在你的实例新建一个同名数据库
  • 在刚创建的数据库里创建需要恢复的table
  • 删除对应表的.ibd文件:ALTER TABLE 你的表名 DISCARD TABLESPACE;
  • 将上面解压的.ibd文件拷贝到mysql实例加载的data/数据库名/ 目录下
  • 将新的.ibd文件加载到新表:ALTER TABLE 你的表名 IMPORT TABLESPACE;

以上方法参考自mysql官方文档

自此数据恢复到新实例,可以操作数据了~

 

评论

  1. code
    Macintosh Chrome
    3月前
    2020-8-05 17:55:28

    brew install percona-xtrabackup大佬 这个下到最新的是8.0的,不支持解压5.7数据库。你有遇到这个问题吗

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇