
# 恢复到自建MySQL数据库
#### 操作场景
本章节介绍将下载的华为云RDS for MySQL全量备份文件恢复到自建MySQL数据库的操作步骤。
如果您希望在本地重新建立一个同样体量MySQL数据库，并且将华为云RDS for MySQL数据全部迁移，可以使用本章节操作将下载的.qp文件在本地进行重建。
#### 操作流程
1. 下载华为云RDS for MySQL实例中对应时间点的全备文件。
2. 将全备文件上传到本地用以重建数据库。
3. 使用qpress工具将全备文件解压。
4. 通过Xtrabackup工具将全备文件恢复到数据库的data目录中，并将数据库原数据保留到data_back文件中。
5. 重启数据库，数据重建成功。
 
#### 约束限制
- 本章节仅使用从华为云RDS for MySQL 5.6、5.7、8.0版本实例下载的全量备份文件在本地恢复到对应版本自建数据库，不包括增量备份的恢复操作。
- **5.6、5.7自建MySQL数据库** **内核小版本需与华为云RDS for MySQL** **版本号一致。** 8.0自建MySQL内核小版本需不低于**华为云RDS for MySQL** **版本。** 通过**mysql -V** 或**mysqld --version**命令，可以查看MySQL内核版本。
- 仅支持恢复到本地为Linux操作系统的数据库。
- 由于开源备份工具目前仅支持x86包，不支持ARM，因此，不支持ARM的ECS自建库使用本章操作进行备份文件恢复。您可以使用DRS迁移或数据导出导入的方式，具体请参见[迁移方案总览](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0001_03.html)。
- 全量备份文件恢复到自建数据库将使用以下三个软件：
  - MySQL数据库
  
  - qpress工具
  
  - Percona XtraBackup工具
   
- 请使用对应版本工具，否则将无法恢复成功。
  表1版本对应关系 
  | 数据库                 | qpress   | Percona XtraBackup    |
  |:---|:---|:---|
  | MySQL 8.0           | qpress 7 | XtraBackup 8.0.0及以上版本 |
  | MySQL 5.7、MySQL 5.6 | qpress 7 | XtraBackup 2.4.9及以上版本 |
     
  
- 在进行恢复阶段请勿在本地自建数据库运行其他业务。
 
#### 步骤一：在华为云RDS for MySQL下载全量备份文件
RDS for MySQL实例会在固定时间进行自动全备任务，也可以由您指定时间进行手动全备任务，其生成的.qp文件支持下载以及在本地进行恢复自建数据库。
1. 您可以在RDS界面单击实例名称，选择"备份恢复 \> 全量备份 \> 下载"，下载全量备份文件。
   图1下载全量备份   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002212063620.png "点击放大") 
2. 通过文件传输工具（例如WinSCP）将全备文件上传到本地MySQL库所在的Linux设备。
 
#### 步骤二：在本地MySQL安装qpress和XtraBackup
- [方式一：手动安装]
  1. 下载正确版本的qpress和XtraBackup，也可以根据[表2]进行下载。下载完成后将安装包上传到本地MySQL库所在的Linux设备。
     - 下载MySQL：<https://downloads.mysql.com/archives/community/>
     
     - 下载qpress工具：<https://repo.percona.com/yum/release/>
     
     - 下载Percona XtraBackup工具：
       - 对于MySQL 5.6和5.7版本，下载[XtraBackup 2.4.9](https://www.percona.com/downloads/)及其以上版本。
       
       - 对于MySQL 8.0版本，下载[XtraBackup 8.0](https://www.percona.com/downloads/)及其以上版本。
        
     
     
      表2下载示例 
     | 工具                 | 下载示例                                                                                                        |
     |:---|:---|
     | MySQL 5.6          | mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz                                                                  |
     | MySQL 5.7          | mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz                                                                  |
     | MySQL 8.0          | mysql-8.0.26-linux-glibc2.12-x86_64.tar                                                                     |
     | qpress             | [qpress-11-1.el7.x86_64.rpm](https://repo.percona.com/yum/release/7/RPMS/x86_64/qpress-11-1.el7.x86_64.rpm) |
     | Percona XtraBackup | [XtraBackup 2.4.9](https://www.percona.com/downloads/)（MySQL 5.6、5.7）                                       |
     | Percona XtraBackup | [XtraBackup 8.0](https://www.percona.com/downloads/)（MySQL 8.0）                                             |
        
     
  
  2. 安装qpress rpm包。以Enterprise Linux 7（CentOS 7, RHEL 7, Rocky Linux 7, AlmaLinux 7）操作系统为例。
     ```
     rpm -ivh  qpress-11-1.el7.x86_64.rpm
     ```
     
  
  3. 解压Xtrabackup包，并改名为"xtrabackup"。
     ```
     tar -zxvf percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz
     mv percona-xtrabackup-2.4.9-Linux-x86_64 xtrabackup
     ```
     
  
  4. xtrabackup添加到环境变量。
     ```
     echo  "export  PATH=$PATH:/usr/local/xtrabackup/bin"  >> /etc/profile
     mv xtrabackup/ /usr/local/
     source  /etc/profile
     ```
     
   
- [方式二：wget安装]
  1. 安装[qpress rpm包](https://repo.percona.com/yum/release/7/RPMS/x86_64/qpress-11-1.el7.x86_64.rpm)。
     ```
     wget https://repo.percona.com/yum/release/7/RPMS/x86_64/qpress-11-1.el7.x86_64.rpm
     rpm -ivh qpress-11-1.el7.x86_64.rpm
     ```
     
  
  2. 安装Percona XtraBackup。
     - MySQL 5.6、5.7，以下载并安装Percona XtraBackup 2.4.9为例
       ```
       wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
       rpm -ivh percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm --nodeps --force
       ```
       
     
     - MySQL 8.0，以下载并安装Percona XtraBackup 8.0为例
       ```
       wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.32-26/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.32-26.1.el7.x86_64.rpm
       rpm -ivh percona-xtrabackup-80-8.0.32-26.1.el7.x86_64.rpm --nodeps --force
       ```
       
      
   
#### 步骤三：使用备份文件恢复数据到自建MySQL
1. 创建一个临时目录"backupdir"。
   ```
   mkdir backupdir
   ```
   
2. 解压全备文件。
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
   解压全备文件到临时目录"backupdir"前，需要保证临时目录下为空，再进行解压，避免恢复异常。
   请确保解压目标路径下磁盘空间充足，防止磁盘满导致解压失败。
   - MySQL 5.6、5.7
     ```
     xbstream  -x --parallel 4 < ./全备文件.qp -C ./backupdir/
     innobackupex --parallel 4 --decompress ./backupdir
     ```
     
   
   
   
   - MySQL 8.0
     ```
     xbstream  -x --parallel 4 < ./全备文件.qp -C ./backupdir/
     xtrabackup --parallel 4 --decompress --target-dir=./backupdir
     ```
     
    
3. 删除qp文件。
   ```
   find ./backupdir/  -name '*.qp' | xargs rm -f
   ```
   
4. 应用redo日志。
   - MySQL 5.6、5.7
     ```
     innobackupex --apply-log ./backupdir
     ```
     
   
   
   
   - MySQL 8.0
     ```
     xtrabackup --prepare --target-dir=./backupdir
     ```
     
    
5. 备份数据。
   1. 停止MySQL数据库服务。
      ```
      service mysql stop
      ```
      如果是MySQL 5.7，需执行如下命令停止MySQL数据库服务：
      ```
      /bin/systemctl stop mysqld.service
      ```
      
   
   2. 备份原来的数据库目录。
      ```
      mv /usr/local/mysql/data  /usr/local/mysql/data_bak
      mkdir /usr/local/mysql/data
      ```
      
   
   3. 创建新的数据库目录并修改目录权限。
      ```
      chown mysql:mysql /usr/local/mysql/data
      ```
      
    
6. 恢复数据到自建库，并修改目录权限。 执行该步骤前，需要清空自建库的"data"目录，参考[5.b]。
   - MySQL 5.6、5.7
     ```
     innobackupex --defaults-file=/etc/my.cnf --copy-back ./backupdir
     chown -R mysql:mysql /usr/local/mysql/data
     ```
     
   
   
   
   - MySQL 8.0
     ```
     xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=./backupdir
     chown -R mysql:mysql /usr/local/mysql/data
     ```
     
   
   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
   - 命令中的相对路径（./backupdir）可替换成绝对路径。
   
   - "**--defaults-file**"为MySQL配置文件位置，您可以根据实际情况进行修改。
     
7. 启动数据库。
   ```
   service mysql start
   ```
   如果是MySQL 5.7，需执行如下命令启动数据库：
   ```
   /bin/systemctl start mysqld.service
   ```
   
8. 登录数据库，查看数据恢复结果。
   ```
   show databases
   ```
   
 
