
# 通过自定义脚本实现MySQL一致性备份
本章节以SuSE 11 SP3操作系统下MySQL 5.5单机版为例，介绍如何通过自定义脚本来冻结、解冻MySQL数据库，以实现对于MySQL数据库的数据库备份。
#### 场景介绍
某企业购买了云服务器，并在云服务器中安装了MySQL 5.5数据库用于存放业务数据。随着数据量的增加，之前的崩溃一致性保护已经满足不了RTO、RPO的要求，决定采用应用一致性备份，减小RTO与RPO。
#### 数据准备
表1数据准备 
| 准备项      | 说明                | 示例               |
|:---|:---|:---|
| MySQL用户名 | 连接MySQL数据库时使用的用户名 | root             |
| MySQL密码  | 连接MySQL数据库时使用的密码  | \*\*\*\*\*\*\*\* |
   
#### 详细步骤
1. 加密MySQL密码，供自定义脚本使用
   
   1. 登录MySQL服务器，输入**cd /opt/cloudprotector/cbragent/bin/** ，进入Agent目录。
      ![](https://support.huaweicloud.com/bestpractice-cbr/public_sys-resources/note_3.0-zh-cn.png)
      由于当前部分区域暂未切换至新命令，如命令不正确，请使用**cd /home/rdadmin/Agent/bin/**进入Agent目录。
      
   
   2. 执行**/opt/cloudprotector/cbragent/bin/agentcli encpwd** ，回显如下：
      ```
      Enter password:
      ```
      输入MySQL密码，并按"Enter"，屏幕上就会打印出加密后的密码，将其复制到剪贴板中。
      ![](https://support.huaweicloud.com/bestpractice-cbr/public_sys-resources/note_3.0-zh-cn.png)
      如果命令不正确，请使用**/home/rdadmin/Agent/bin/agentcli encpwd**。
      冻结解冻脚本中配置的明文密码长度不超过16位，否则配置后密码会被截断，应用一致性备份会失败。
      
   
   
   
   
2. 执行**cd /opt/cloudprotector/cbragent/bin/thirdparty/ebk_user** ，进入自定义脚本目录，然后执行**vi mysql_freeze.sh** ，打开MySQL示例冻结脚本。
   
   将下图所示的**MYSQL_USER** 与**MYSQL_PASSWORD** 修改为实际值，其中**MYSQL_PASSWORD** 为[步骤1]的屏幕输出。
   ![](https://support.huaweicloud.com/bestpractice-cbr/public_sys-resources/note_3.0-zh-cn.png)
   如果命令**cd /opt/cloudprotector/cbragent/bin/thirdparty/ebk_user** 不正确，请使用命令**cd /home/rdadmin/Agent/bin/thirdparty/ebk_user**。
   ![](https://support.huaweicloud.com/bestpractice-cbr/zh-cn_image_0000001912890920.png)
   也可以使用sed命令来直接进行修改：
   **sed -i 's/\^MYSQL_PASSWORD=.\*/MYSQL_PASSWORD="** ***XXX*** **"/'** **mysql_freeze.sh** **mysql_unfreeze.sh** ，其中***XXX***为步骤1中打印出的密码。
   此操作会同时修改冻结解冻脚本，所以无需再执行[步骤3]。
   
   
3. 执行**vi mysql_unfreeze.sh** ，打开MySQL示例解冻脚本，修改此脚本中的用户名和密码。
   
   **mysql_unfreeze.sh** 与**mysql_freeze.sh** 脚本实现了基本的数据库冻结与解冻操作，如果您在冻结、解冻时有其它额外步骤需要执行，可以自行在其中进行修改。详细说明请参见 [通过自定义脚本实现其它Linux应用的一致性备份](https://support.huaweicloud.com/bestpractice-cbr/cbr_07_0009.html)。
   ![](https://support.huaweicloud.com/bestpractice-cbr/public_sys-resources/caution_3.0-zh-cn.png)
   MySQL的冻结是通过FLUSH TABLES WITH READ LOCK指令来实现的，该指令需在指定时间内（10s）获取全局读锁和刷新缓存到磁盘；如果数据库业务繁忙时执行，该指令可能执行超时，一致性备份失败，严重时可能会导致数据库上层业务操作失败等问题。
   此指令不会触发bin log刷盘操作，如果开启了bin log，且sync_binlog参数不为1，则可能出现保存的备份映像中部分SQL操作未记录到bin log的情况，如果bin log也需要完整保护，请设置sync_binlog=1。
   
   
 
