物理备份本地恢复实践
更新时间:2023-08-24
概览
本篇说明如何将公有云上已产生的备份文件下载并恢复到自建数据库中。
环境准备
操作系统
版本:Linux系统,具体Linux发行版不限,最好为市面上当前主流的Linux版本。
Mysql
- 确认您要恢复的MySQL版本,并安装对应的社区版MySQL实例,不要求您准备的版本与公有云上原实例的版本号完全一致,但至少前两位版本号一致(5.5,5.6,5.7,8.0)。
- 规划MySQL数据文件路径:datadir。
- datadir所在磁盘剩余空间必须大于原始数据文件大小(注意:不是备份文件大小,因为RDS上产生的备份文件开启了压缩,若您不知道原始数据文件大小,也可以用备份文件大小粗略预估,通常备份文件和原始文件的压缩比为1:2 ~ 1:4之间)。
xtrabackup(MySQL物理备份恢复工具)
按照如下对应关系,选择并下载对应的xtrabackup工具:
数据库版本 | Linux - General 下载链接 | 下载库永久链接 |
---|---|---|
MySQL 5.5 | xtrabackup 2.4 \ xtrabackup 8.0 | xtrabackup 2.4 \ xtrabackup 8.0 |
MySQL 5.6 | 同上 | 同上 |
MySQL 5.7 | 同上 | 同上 |
MySQL 8.0 | xtrabackup 8.0 | xtrabackup 8.0 |
其中【Linux - General 下载链接】适用大部分市面上流行的linux发行版,可以做到开箱即用,下载完成并解包工具后,可以执行如下命令检验工具是否可用:
path-to-xtrabackup/bin/xtrabackup --help
若该命令可以正常输出结果说明您下载的xtrabackup可用 若无法正常使用,可能您下载的版本与您准备的操作系统环境不兼容,可以从【下载库永久链接】中下载对应操作系统的安装包安装。
注意:MySQL 5.x 和 MySQL 8.0 都需要下载xtrabackup 8.0.5及以上版本,因为只有xtrabackup 8.0.5及以上版本 软件包中的xbstream 可以用于流式解压解包备份文件,流式解压解包备份文件可以尽可能缩短您的恢复时间,并确保即使本地磁盘空间不是很充裕(1倍原始数据文件大小 < 本地磁盘剩余空间 < 2倍原始数据文件大小)的情况下也能恢复成功。
恢复步骤
一、获取备份下载链接
- 登录RDS管理控制台。
- 在控制台页面左上角,选择实例所在地域,进入“云数据库 RDS列表”页面。
- 找到目标实例,点击实例名称,进入实例详情页面。
- 点击左侧导航的备份管理按钮,进入备份管理页面。
- 在备份管理页面,点击相应备份操作列中的下载。
- 点击复制链接或下载按钮,获取备份下载链接。
二、流式恢复数据到本地:下载 -> 解包解压 -> 写入本地
# 预设变量:
tmp_datadir="/path-to-extract-and-decompress-dir" # 解压解包备份文件的临时路径
download_url="https://download_url" # 在上一步中获取到的下载链接
path_to_xtrabackup80="/path-to-xtrabackup80" # 包含xbstream 8.0.5及以上版本的xtrabackup路径
# 下载并解压解包备份:无论是MySQL5.x还是MySQL8.x的备份,都使用xtrabackup 8.0.5及以上版本 中的xbstream 流式解压解包备份文件,因为只有xbstream 8.0.5及以上版本 才支持流式解包并同时解压数据文件,这样可以最大限度的节省本地磁盘空间和恢复时间
## 根据您donwload_url中文件的后缀选择如下两种恢复方式中的一种(确保您本地操作系统已经安装了wget和gzip这两种常用工具):
## 1. 若您的备份文件后缀是tar.gz或qp.xb,用下面的命令进行下载和解包解压
mkdir -p ${tmp_datadir} && wget "${download_url}" --no-check-certificate -O - | ${path_to_xtrabackup80}/bin/xbstream --extract --decompress --decompress-threads=4 --parallel=4 --directory=${tmp_datadir}
## 2. 若您的备份文件后缀是xb.gz,用下面的命令进行下载和解包解压
mkdir -p ${tmp_datadir} && wget "${download_url}" --no-check-certificate -O - | gzip -d -c | ${path_to_xtrabackup80}/bin/xbstream --extract --decompress --parallel=4 --directory=${tmp_datadir}
三、准备数据文件
# 预设变量:
path_to_xtrabackup="/path-to-xtrabackup" # 与MySQL版本对应的xtrabackup目录
# 准备数据文件:让解压解包后的备份数据转化为MySQL可用的数据文件
${path_to_xtrabackup}/bin/xtrabackup --prepare --target-dir=${tmp_datadir}
四、替换数据文件目录
# 预设变量:
mysql_datadir="/path-to-mysql-datadir" # MySQL数据文件目录
# 备份或删除原始datadir:若mysql_datadir已经存在则备份该路径,或者确定不需要了也可以直接删除
[[ -d "${mysql_datadir}" ]] && mv "${mysql_datadir}" "${mysql_datadir}_$(date '+%Y%m%d_%H%M%S')"
# 替换数据文件路径:将步骤【三】准备完成的数据文件目录替换MySQL的datadir路径
mv -v "${tmp_datadir}" "${mysql_datadir}"
五、启用数据库实例
# 预设变量:
## MySQL服务器变量
mysqld_path="/path-to-mysqld" # MySQL Server二进制文件路径
mysql_cnf_path="/path-to-mysql-cnf" # MySQL Server配置文件路径
## MySQL客户端变量
mysql_client_path="/path-to-mysql-client" # MySQL 客户端路径
mysql_socket="/path-to-mysql-socket" # MySQL socket文件路径
mysql_root_user="mysql-root-user" # 新的root用户名
mysql_root_password="mysql-root-password" # 新的root密码
# 授权管理员账号:
## 用--skip-grant-tables参数启动MySQL Server
${mysqld_path} --defaults-file=${mysql_cnf_path} --skip-grant-tables &
## 连接数据库用以上变量中新的用户名密码进行授权
${mysql_client_path} --socket=${mysql_socket} -e "flush privileges; grant all on *.* to '${mysql_root_user}'@localhost identified by '${mysql_root_password}'"
# 重启MySQL Server后数据库恢复完成。