
# 本地MySQL同步到GaussDB分布式版
#### 场景描述
本实践使用DRS的实时同步功能将本地MySQL数据库实时迁移至华为云GaussDB。通过全量+增量同步，实现源数据库MySQL和目标数据库GaussDB的数据长期同步。
#### 解决问题
- 企业业务高速发展，传统数据库扩容性差，迫切需要分布式化改造。
- 传统数据库需要自购并安装服务器、系统、数据库等软件，运维成本高、难度大。
- 传统数据库性能瓶颈问题，复杂查询性能较差。
- 如何不中断业务并且平滑地实现数据迁移。
 
#### 业务架构图
![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896851026.png)
#### 迁移原理
本次实践使用全量+增量同步功能，原理如下：
1. 全量同步阶段，先进行结构迁移，例如表、主键、唯一键的迁移。
2. 结构迁移完成后，启动增量数据抽取，以确保全量数据同步期间的增量数据完整的抽取到DRS实例。
3. 启动全量迁移任务。
4. 全量迁移完成后自动进入增量同步，从全量迁移开始抽取的位点开始回放。
5. 当增量回放全部完成后，启动比对任务进行一致性检查，支持实时比对。
6. 实时比对数据一致时，可以启动业务割接。
![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001937370641.png)
#### 服务列表
- 虚拟私有云 VPC
- 云数据库 GaussDB
- 数据复制服务 DRS
- 数据管理服务 DAS
 
#### 使用说明
- 本实践的资源规划仅作为演示，实际业务场景资源以用户实际需求为准。
- 本实践端到端的数据为测试数据，仅供参考。
- 全量同步可以实现数据迁移；增量同步可以实现实时同步源端和目标端两个库之间的数据。
 
#### 前提条件
- 拥有华为云实名认证账号。
- 账户余额大于等于0元。
- 如果测试使用，需要自行在本地搭建MySQL数据库。
- 已知待同步MySQL数据库的IP地址，端口，账户和密码。
 
#### 资源规划
表1资源规划 
| 类别                                                                                             | 子类       | 规划                       | 备注                                                                         |
|:---|:---|:---|:---|
| VPC                                                                                            | VPC名称    | vpc-src-172              | 自定义，易理解可识别。                                                                |
| VPC                                                                                            | 所属Region | 测试Region                 | 现网实际选择时建议选择和自己业务区最近的Region，减少网络时延。                                         |
| VPC                                                                                            | 可用区      | 可用区3                     | -                                                                          |
| VPC                                                                                            | 子网网段     | 172.16.0.0/16            | 子网选择时建议预留足够的网络资源。                                                          |
| VPC                                                                                            | 子网名称     | subnet-src-172           | 自定义，易理解可识别。                                                                |
| 本地MySQL数据库                                                                                     | 数据库版本    | 5.7.38                   | -                                                                          |
| 本地MySQL数据库                                                                                     | 数据库用户    | test_info                | 可以自定义用户，但是迁移时最小权限为：SELECT、LOCK TABLES、REPLICATION SLAVE、REPLICATION CLIENT |
| GaussDB                                                                                        | 实例名      | Auto-drs-gaussdbv5-tar-1 | 自定义，易理解可识别。                                                                |
| GaussDB                                                                                        | 数据库版本    | GaussDB1.3企业版            | -                                                                          |
| GaussDB                                                                                        | 实例类型     | 分布式版，1CN，3DN，3副本         | 本示例中为分布式实例。                                                                |
| GaussDB                                                                                        | 部署形态     | 独立部署                     | -                                                                          |
| GaussDB                                                                                        | 事务一致性    | 强一致性                     | -                                                                          |
| GaussDB                                                                                        | 分片数量     | 3                        | -                                                                          |
| GaussDB                                                                                        | 协调节点数量   | 3                        | -                                                                          |
| GaussDB                                                                                        | 存储类型     | 超高IO                     | -                                                                          |
| GaussDB                                                                                        | 可用区      | 可用区2                     | 本示例中选择了单可用区，实际建议选择多可用区，以提高实例的高可用性。                                         |
| GaussDB                                                                                        | 性能规格     | 通用增强Ⅱ型 8 vCPUs \| 64GB   | 本示例中为测试实例，选择较小的测试规格，实际选择规格以业务诉求为准。                                         |
| GaussDB                                                                                        | 存储空间     | 480G                     | 本示例中为测试实例，选择较小的存储空间，实际选择存储空间大小以业务诉求为准。                                     |
| GaussDB                                                                                        | 加密磁盘     | 不加密                      | 本示例中选择磁盘不加密，选择加密后会提高数据安全性，但对数据库读写性能有少量影响，实际请按照业务使用策略进行选择。                  |
| DAS登录数据库     | 数据库引擎    | GaussDB                  | -                                                                          |
| DAS登录数据库     | 数据库来源    | GaussDB                  | 勾选本示例中创建的GaussDB实例                                                         |
| DAS登录数据库     | 数据库名称    | postgres                 | -                                                                          |
| DAS登录数据库     | 登录用户名    | root                     | -                                                                          |
| DAS登录数据库     | 密码       | -                        | 本示例中创建的GaussDB实例root用户密码                                                   |
| DRS迁移任务                                                                                        | 迁移任务名    | DRS-test-info            | 自定义。                                                                       |
| DRS迁移任务                                                                                        | 目标库名称    | test_database_info       | 自定义，易理解可识别，但是需要确保兼容模式为MySQL模式。                                             |
| DRS迁移任务                                                                                        | 源数据库引擎   | MySQL                    | -                                                                          |
| DRS迁移任务                                                                                        | 目标数据库引擎  | GaussDB                  | -                                                                          |
| DRS迁移任务                                                                                        | 网络类型     | 公网网络                     | 本示例中采用公网网络。                                                                |
   
#### 操作流程
本实践的主要任务流程如[图1]所示：
图1操作流程   
![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001897078322.png)
 #### 创建VPC
创建VPC，为创建GaussDB实例准备网络资源。
1. 登录[华为云控制台](https://console.huaweicloud.com)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001168744206.png)，选择区域。
3. 单击左侧的服务列表图标，选择"网络 \> 虚拟私有云 VPC"。 
   进入虚拟私有云信息页面。
   
   
4. 单击"创建虚拟私有云"购买VPC。 
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002386837705.png)
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002353077350.png)
   
   
   
5. 单击"立即创建"。
6. 返回VPC列表，查看创建VPC是否创建完成。 
   当VPC列表的VPC状态为"可用"时，表示VPC创建完成。
   
   
 
 #### 创建安全组
创安全组，为创建GaussDB实例准备安全组。
1. 登录[华为云控制台](https://console.huaweicloud.com)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001168744206.png)，选择区域。
3. 单击左侧的服务列表图标，选择"网络 \> 虚拟私有云 VPC"。 
   进入虚拟私有云信息页面。
   
   
4. 选择"访问控制 \> 安全组"。
5. 单击"创建安全组"。
6. 填写安全组名称等信息。 
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002386837709.png)
   
   
   
7. 单击"确定"。
8. 返回安全组列表，单击安全组名称"sg-01"。
9. 选择"入方向规则"，单击"添加规则"。
10. 配置入方向规则，添加源库的IP地址。 
    ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002353077354.png)
    
    
    
 
#### 创建GaussDB分布式实例
本章节介绍创建GaussDB分布式实例，作为同步任务目标库。
1. 登录[华为云控制台](https://console.huaweicloud.com)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896884864.png)，选择区域。
3. 单击左侧的服务列表图标，选择"数据库 \> 云数据库 GaussDB"。
4. 单击"购买数据库实例"。
5. 配置实例基本信息。 
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002109170186.png)
   
   
6. 选择实例规格。 
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896884868.png)
   
   本示例中为测试实例，选择较小的测试规格，实际可选规格以界面为准。
   
   
7. 选择实例所属的VPC和安全组（[创建VPC]和[创建安全组]），配置数据库端口。
   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001937404505.png)
   
   
8. 配置实例密码等信息。 
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896724964.png)
   
   
9. 单击"立即购买"，确认信息并提交。
10. 返回实例列表。 
    当实例运行状态为"正常"时，表示实例创建完成。
    
    
 
#### 同步前构造数据
同步前需要在源库构造一些数据类型，供同步完成后验证数据。
DRS支持的数据类型可参考[MySQL-\>GaussDB数据映射关系](https://support.huaweicloud.com/productdesc-drs/drs_01_0326.html)。
执行如下步骤在源库构造数据：
1. 根据本地的MySQL数据库的IP地址，通过数据库连接工具连接数据库。
2. 根据DRS支持的数据类型，在源库执行语句构造数据。 
   1. 创建一个测试用的用户。 **create user** *test_info* **identified by** *xxx* **;**
      test_info为本次实践创建的用户，xxx为用户的密码，请根据实际情况替换。
      
   
   2. 在当前用户下创建一个数据库test_info。 **CREATE DATABASE** test_info;
      
   
   3. 在test_info库下创建一个表。 **CREATE TABLE** \`test_info\`.\`test_table\`**(**
      **\`id\` int NOT NULL,**
      **\`c1\` char(10) DEFAULT NULL,**
      **\`c2\` varchar(10) DEFAULT NULL,**
      **\`c3\` binary(10) DEFAULT NULL,**
      **\`c4\` varbinary(10) DEFAULT NULL,**
      **\`c5\` tinyblob,**
      **\`c6\` mediumblob,**
      **\`c7\` longblob,**
      **\`c8\` tinytext,**
      **\`c9\` text,**
      **\`c10\` mediumtext,**
      **\`c11\` longtext,**
      **\`c12\` enum('1','2','3') DEFAULT NULL,**
      **\`c13\` set('1','2','3') DEFAULT NULL,**
      **\`c14\` tinyint DEFAULT NULL,**
      **\`c15\` smallint DEFAULT NULL,**
      **\`c16\` mediumint DEFAULT NULL,**
      **\`c17\` bigint DEFAULT NULL,**
      **\`c18\` float DEFAULT NULL,**
      **\`c19\` double DEFAULT NULL,**
      **\`c20\` date DEFAULT NULL,**
      **\`c21\` datetime DEFAULT NULL,**
      **\`c22\` timestamp,**
      **\`c23\` time DEFAULT NULL,**
      **\`c24\` year DEFAULT NULL,**
      **\`c25\` bit(10) DEFAULT NULL,**
      **\`c26\` json DEFAULT NULL,**
      **\`c27\` decimal(10,0) DEFAULT NULL,**
      **\`c28\` decimal(10,0) DEFAULT NULL,**
      **PRIMARY KEY (\`id\`)**
      **);**
      
   
   4. 给用户赋权。 **GRANT SELECT** **, LOCK TABLES ON \<database\>.\<table\> to** test_info**;**
      **GRANT REPLICATION SLAVE** **, REPLICATION CLIENT ON \*.\* to** test_info**;**
      test_info为本次实践创建的用户，\<database\>为需要数据同步的库名，\<table\>为要数据同步的表名，请根据实际情况替换。
      
   
   5. 在表中插入两行数据。 **insert into test_info.test_table values (1,'a','b','111','111','tinyblob','mediumblob','longblob','tinytext','text','mediumtext','longtext','1','3',1,2,3,4,1.123,1.1234,'2024-03-08','2024-03-08 08:00:00','2024-03-08 08:00:00','08:00:00','2024','1010','{"a":"b"}',1.23,1.234);**
      **insert into test_info.test_table values (2,'a','b','111','111','tinyblob','mediumblob','longblob','tinytext','text','mediumtext','longtext','1','3',1,2,3,4,1.123,1.1234,'2024-03-08','2024-03-08 08:00:00','2024-03-08 08:00:00','08:00:00','2024','1010','{"a":"b"}',1.23,1.234);**
      
   
   
   
   
3. 在目标端创建库。 
   1. 登录[华为云控制台](https://console.huaweicloud.com)。
   
   2. 单击管理控制台左上角的![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001214847275.png)，选择区域。
   
   3. 单击左侧的服务列表图标，选择"数据库 \> 数据管理服务 DAS"。
   
   4. 在数据管理服务DAS左侧导航栏，单击"开发工具"，进入开发工具数据库登录列表页面。
   
   5. 单击"新增数据库实例登录"，打开新增数据库实例登录窗口。
   
   6. 选择"数据库引擎"、"数据库来源"，填写登录用户名、密码以及描述（非必填项）信息，开启定时采集、SQL执行记录功能。 如开启"定时采集"，需勾选"记住密码"。
      
      
   
   
   
   7. 单击"测试连接"测试连接是否成功。 如测试连接成功，将提示"连接成功"，您可继续新增操作。如测试连接失败，将提示连接失败原因，您需根据提示信息进行修改，以便新增数据库登录成功。
      
   
   8. 设置完登录信息，单击"立即新增"。
   
   9. 新增完成后，单击新增登录的"登录"，登录当前数据库。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001214727301.png)
      
   
   10. 选择"SQL操作"\> "SQL查询"进入SQL查询页面。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001214847415.png)
       
   
   11. 执行如下语句创建兼容MySQL的数据库。
       此例中为：test_database_info，请根据实际情况选择。
       ```
       CREATE DATABASE test_database_info DBCOMPATIBILITY 'mysql';
       ```
       
   
   
   
   
 
#### 同步前检查
在创建任务前，需要针对同步条件进行手工自检，以确保您的同步任务更加顺畅。
在同步前，您需要参考[入云使用须知](https://support.huaweicloud.com/realtimesyn-drs/drs_04_0104.html)获取同步相关说明。
#### 创建DRS同步任务
本章节介绍创建DRS实例，将本地MySQL上的**test_info** 数据库同步到GaussDB实例中**test_database_info**数据库中。
1. 登录[华为云控制台](https://console.huaweicloud.com)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896884872.png)，选择区域。
   
   选择目标实例所在的区域。
   
   
3. 单击左侧的服务列表图标，选择"数据库 \> 数据复制服务 DRS"。
4. 左侧导航栏选择"实时同步管理"，单击"创建同步任务"。
5. 配置同步实例信息。 
   1. 选择区域、项目，填写任务名称。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001937404509.png)
      
      
   
   2. 配置同步实例信息，选择"数据流动方向"、"源数据库引擎"、"目标数据库引擎"、"网络类型"、"DRS任务类型"、"目标数据库实例"、"同步实例所在子网"（非必选）、"同步模式"，选择"规格类型"和"可用区"，选填"标签"。 
      ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896884876.png)
      
   
   3. 单击"开始创建"。
   
   
   
   
6. 配置源库及目标库信息。 
   1. 填写源库的IP、端口、用户、密码等信息。 填写完成后，需要单击"测试连接"，测试连接信息是否正确。
      ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001937404513.png)
      
   
   2. 填写目标库的账户和密码。 填写完成后，需要单击"测试连接"，测试连接信息是否正确。
      ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896724976.png)
      
   
   3. 单击"下一步"，仔细阅读提示内容后，单击"同意，并继续"。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896884880.png)
      
   
   
   
   
7. 设置同步。 
   1. 选择全量同步对象类型，如果要同步的表结构还未在目标库创建好，就勾选同步表结构（表结构包含主键和唯一键），反之则不勾。同步索引选项按实际需求视情况勾选。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001937404521.png)
      
   
   2. 选择增量冲突策略。
      - 忽略：当同步数据与目标库已有数据冲突时（主键/唯一键重复等），DRS将忽略源库的冲突数据，并保留目标库中的冲突数据，继续进行后续同步。选择忽略可能导致源库与目标库数据不一致。
      
      - 报错：当同步数据与目标库已有数据冲突时（主键/唯一键重复等），同步任务将失败并立即中止。可在同步日志中查看详细信息。
      
      - 覆盖：当同步数据与目标库已有数据冲突时（主键/唯一键重复等），将覆盖原来的冲突数据。
      
      
      ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896724980.png)
      
   
   3. 在源库选择需要迁移的数据库和表。本次实践中选择"**test_info"** 中的**"test_table"** 表。
      ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896884884.png)
      
   
   4. 选择完成后，可以设置迁移后是否重新命名库名和表名。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001937404525.png)
      
   
   5. 本次实践将表名重新命名为"**DATATYPELIST** **_After** "。
      注意重新命名时不要使用特殊符号，否则会导致迁移后执行SQL语句报错。
      ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896724984.png)
      
   
   6. 确认重命名设置内容，单击"下一步"。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896884888.png)
      
   
   
   
   
8. 高级设置。 
   本页面内容仅做确认，无法修改，确认完成后单击"下一步"。
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001937404529.png)
   
   
9. 数据加工。 
   在该页面可以对迁移的表进行加工。包括选择迁移的列，重新命名迁移后的列名，本次实践将"**c1** "重新命名为"**new-line** "。
   1. 选择需要加工的表。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896724988.png)
      
   
   2. 编辑"c1"列。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896884892.png)
      
   
   3. 将"c1"重新命名为"new-line"，单击"确定"。
   
   4. 单击"下一步"。
    
   
   
10. 预检查。 
    1. 所有配置完成后，进行预检查，确保迁移成功。
    
    2. 对于未通过的项目，根据检查结果中的提示信息修复，修复完成后，单击"重新校验"，直到预检查通过率为100%。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001937404533.png)
       
    
    3. 预检查全部通过后，单击"下一步"。
    
    
    
    
11. 任务确定。 
    1. 检查所有配置项是否正确。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896724992.png)
       
    
    2. 单击"启动任务"，仔细阅读提示后，勾选"我已阅读启动前须知"。
    
    3. 单击"启动任务"，完成任务创建。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896884896.png)
       
    
    
    
    
12. 任务创建成功。 
    任务创建成功后，返回任务列表查看创建的任务状态。
    
    
 
#### 同步后数据校验
当任务状态变为"增量同步"，说明全量同步已经完成，全量同步完成后，登录GaussDB查看数据迁移结果。
1. 等待迁移任务状态变为"增量同步"。 
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001937404537.png)
   
   
2. 单击任务名称，进入任务详情页。
3. 验证数据一致性。 
   1. 在"同步对比 \> 对象级对比"页面，查看库和表的迁移结果。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896724996.png)
      
   
   2. 在"同步对比 \> 数据级对比"页面，创建对比任务，查看表中行的迁移结果。 ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000001896884900.png)
      
   
   
   
   
4. 通过DAS连接GaussDB的目标库"**test_database_info** "。
   
   DAS连接实例的方法请参考[《新增数据库登录》](https://support.huaweicloud.com/usermanual-das/das_03_0002.html)。
   
   
5. 执行如下语句，查询全量同步结果。 
   ```
   SELECT * FROM test_info.datatypelist_after;
   ```
   MySQL数据库中的模式迁移完成后，会在GaussDB库中作为Schema，所以查询语句中添加Schema精确查询。
   可查询表中的各个数据类型都迁移成功，并且数据正确无误。
   
   
6. 验证增量同步。 
   由于本次实践为"全量+增量"同步模式，全量同步完成后，如果在创建任务后有数据写入，这些写入的数据会一直同步至目标库中，直到任务结束。下面模拟写入另外的数据。
   1. 根据本地的MySQL数据库的IP和地址，通过数据库连接工具连接数据库。
   
   2. 执行如下语句，在源库插入一条数据。 插入一条"id"为3的数据。
      ```
      insert into test_info.test_table values (3,'a','b','111','111','tinyblob','mediumblob','longblob','tinytext','text','mediumtext','longtext','1','3',1,2,3,4,1.123,1.1234,'2024-03-08','2024-03-08 08:00:00','2024-03-08 08:00:00','08:00:00','2024','1010','{"a":"b"}',1.23,1.234);
      ```
      
   
   3. 在目标库执行如下语句查询结果。
      ```
      SELECT * FROM test_info.datatypelist_after;
      ```
      可看到在源库新增的数据，可以实时同步至目标库。
      
    
   
   
7. 结束迁移任务。 
   根据业务情况，待业务完全迁移至目标库，可以结束当前任务。
   1. 单击"操作"列的"结束"。
   
   2. 仔细阅读提示后，单击"是"，结束任务。
    
   
   
 
