云数据库MySQL导入云数据仓库PostgreSQL最佳实践

举报
岳涛 发表于 2026/10/21 15:08:48 2026/10/21
【摘要】 帮助用户在业务不停服的前提下轻松完成数据库迁移上云,利用实时同步通道轻松构建高可用的数据库容灾架构……

帮助用户在业务不停服的前提下轻松完成数据库迁移上云,利用实时同步通道轻松构建高可用的数据库容灾架构,通过数据订阅来满足商业数据挖掘、业务异步解耦等场景需求。

背景

帮助用户在业务不停服的前提下轻松完成数据库迁移上云,利用实时同步通道轻松构建高可用的数据库容灾架构,通过数据订阅来满足商业数据挖掘、业务异步解耦等场景需求。

构建Mysql基础数据

创建测试库及基础表

MySQL [(none)]> CREATE DATABASE dts_demo;
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> USE dts_demo;
Database changed
MySQL [dts_demo]> CREATE TABLE `user_info` (
    ->   `id` int(11) NOT NULL AUTO_INCREMENT,
    ->   `c_user_id` varchar(36) NOT NULL DEFAULT '',
    ->   `c_name` varchar(22) NOT NULL DEFAULT '',
    ->   `c_province_id` int(11) NOT NULL,
    ->   `c_city_id` int(11) NOT NULL,
    ->   `create_time` datetime NOT NULL,
    ->   PRIMARY KEY (`id`),
    ->   KEY `idx_user_id` (`c_user_id`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)

构建测试数据

这里我们快速构建一份测试数据,用来模拟实际生产中量级在100万的一张数据表,参考 快速构建Mysql百万级测试数据。

创建专用于数据同步的账号

创建Mysql同步账号

根据 DTS官方文档的要求,需要在源端 MySQL 实例中创建迁移帐号,需要的帐号权限如下:

MySQL [dts_demo]> GRANT SHOW VIEW,PROCESS,RELOAD,LOCK TABLES,REPLICATION CLIENT,REPLICATION SLAVE,SELECT ON *.* TO 'dts_user'@'%' IDENTIFIED BY 'dts_admin';
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [dts_demo]> GRANT ALL PRIVILEGES ON `__dts_meta__`.* TO 'dts_user'@'%';
Query OK, 0 rows affected (0.00 sec)

MySQL [dts_demo]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

这里使用了超级用户创建了一个mysql普通用户"dts_user",设置了密码为"dts_admin",允许所有主机来源登录,并赋予了相应的权限。

其中"dts_meta"是DTS所需要用到的用户,这条授权不能省略,最后不要忘记刷新权限。

创建CDWPG同步账号及目标数据库

根据 DTS官方文档的要求,目标端 CDWPG 实例中创建迁移帐号,需要的帐号权限如下:

[root@VM-5-48-centos ~]# psql -d postgres -U cdwadmin -h 10.0.5.18 -p 5436 
Password for user cdwadmin: 
psql (9.5.25, server 9.4.24)
Type "help" for help.

postgres=> CREATE USER dts_user WITH PASSWORD 'dts_admin';
CREATE ROLE
postgres=> CREATE DATABASE dts_demo;
CREATE DATABASE
postgres=> \c dts_demo
You are now connected to database "dts_demo" as user "cdwadmin".
dts_demo=> ALTER database dts_demo SET search_path TO dts_demo;
ALTER DATABASE
dts_demo=> GRANT ALL PRIVILEGES ON DATABASE dts_demo TO dts_user;
GRANT
dts_demo=> GRANT Delete, Truncate, Insert, References, Select, Update, TRIGGER ON all tables in schema public TO dts_user;
GRANT

这里使用了超级用户创建了一个mysql普通用户"dts_user",设置了密码为"dts_admin",并赋予了相应的权限。另外由于Mysql和CDWPG的关系是Mysql的DB对应CDWPG的SCHEMA,所以这里是先创建了目标数据库"dts_demo"并将数据库默认SCHEMA设置为"dts_demo"。

创建CDWPG目标表

字段类型对照表

创建CDWPG表需要根据Postgresql的字段类型来匹配源表字段类型,否则会出现字段类型不对应的问题。

Mysql字段类型 Postgresql字段类型 是否支持
INTMDEIUMINT INTEGER 支持
SMALLINT/TINYINT SMALLINT 支持
BIGINT BIGINT 支持
TINYINT UNSIGNED SMALLINT 支持
SMALLINT UNSIGNED INTEGER 支持
MEDIUMINT UNSIGNED INTEGER 支持
INT UNSIGNED BIGINT 支持
BIGINT UNSIGNED NUMERIC 支持
BOOLEAN BOOLEAN 不支持
FLOAT(UNSIGNED) REAL 支持
DOUBLE(UNSIGNED) DOUBLE PRECISION 支持
DECIMAL NUMERIC 支持
CHAR CHARACTER 支持
VARCHAR TEXT VARCHAR 支持
DATE DATE 支持
TIME time without time zone 支持
DATETIME timestamp without time zone 支持
TIMESTAMP timestamp without time zone 支持
LONGTEXTMEDIUMTEXT/TINYTEXT/TEXT TEXT 支持
LONGTEXTMEDIUMTEXT/TINYTEXT/TEXT JSON(不推荐) 仅限字符串是json类型
BLOB/MEDIUMBLOB/TINYBLOB/BINARYNARBINARYALONGBLOB BYTEA 支持
ENUM CHAR或者VARCHAR 支持
YEAR SMALLINT 支持

创建目标表

使用普通用户"dts_user"创建SCHEMA,并创建目标表"user_info"。

[root@VM-5-48-centos ~]# psql -d dts_demo -U dts_user -h 10.0.5.18 -p 5436 
Password for user dts_user: 
psql (9.5.25, server 9.4.24)
Type "help" for help.

dts_demo=> CREATE SCHEMA dts_demo;
CREATE SCHEMA
dts_demo=> CREATE TABLE user_info (
dts_demo(>     id integer NOT NULL,
dts_demo(>     c_user_id varchar NOT NULL,
dts_demo(>     c_name varchar NOT NULL,
dts_demo(>     c_province_id integer NOT NULL,
dts_demo(>     c_city_id integer NOT NULL,
dts_demo(>     create_time timestamp without time zone NOT NULL
dts_demo(> );
CREATE TABLE
dts_demo=> \d
            List of relations
  Schema  |   Name    | Type  |  Owner   
----------+-----------+-------+----------
 dts_demo | user_info | table | dts_user
(1 row)

创建DTS数据同步任务

特别注意

  • 云Mysql、DTS数据同步产品、CDWPG云数据仓库,这三个实例都需要购买在同于VPC下,否则网络不通,无法做数据同步。
  • 配置云数据库 MySQL 到 CDWPG 数据同步任务,在任务启动前,需要进行前置检查,主要检查内容和检查点如下:
检查内容 检查点
校验目标数据库 schema 和 table是否存在 schema 和 table 必须提前创建好,如果没有创建好,则会报错
校验当前用户是否拥有目标数据表权限 针对要同步的表,首先判断当前用户是否是该表的 owner(owner 拥有所有权限),如果不是,则查看 information_schema.table_privilege 表中的授权信息,必须保证拥有:Delete、Truncate、Insert、References、Select、Update、TRIGGER 的授权权限,否则会报错
校验目标端磁盘空间是否充足 目标库的可用空间和源端需要的空间进行对比
校验源端数据库权限 对源实例检查是否有权限:Reload、LockTable、ReplClient、ReplSlave、Select、REPLICATION CLIENT
校验源端 MySQL connect_timeout 参数 校验 MySQL 侧的 connect_timeout 参数是否小于10,如果小于则会报错
校验源端和目标端数据库连接 校验 MySQL 和 CDWPG 是否能正确连接
校验源端数据库版本 MySQL 版本须是 MySQL 5.6或 MySQL 5.7
校验源端优化参数 innodb_stats_on_metadata 指标需要关闭
校验源端 binlog 参数 binlog_format 须为 ROW;binlog_row_image 须为 FULL;log_bin 须为 ON;gtid_mode 须为ON
校验主键约束 源端需要同步的表必须有主键
校验源数据库编码 源端必须是 utf8 或 utf8mb4
校验 MySQL 表名大小写配置是否配置正确 校验 lower_case_table_names 参数是否为0,如果为0则配置不正确
校验 MySQL 数据库表名和列名是否含有" CDWPG 不支持"作为列名

创建数据同步任务

配置同步任务

测试Mysql连通性

测试CDWPG连通性

可以看到,CDWPG连通性测试不通过。这是由于DTS数据同步工具也是一个访问端,他在对CDWPG访问时也需要在CDWPG端授权相应的白名单访问权限。这里需要移步CDWPG集群实例页面,点击"配置"标签,新建一个访问白名单,其中所需要授权的IP白名单即为上图所示的IP段:

白名单配置完成

再次尝试测试连通性

至此,连通性测试全部完成。

这里简单选择一下需要同步的库表即可。

在校验检测中,遇到一个Mysql参数问题,这个需要移步Mysql实例端,修改一下对应参数。

再次校验检测。

校验全部通过,可以进行数据同步了。

数据同步

同步任务第一步是导出源数据到DTS。

同步任务第二步是导入数据到目标表。

dts_demo=> SELECT COUNT(1) FROM user_info;
 count  
--------
 206000
(1 row)

dts_demo=> SELECT COUNT(1) FROM user_info;
 count  
--------
 601500
(1 row)

dts_demo=> SELECT COUNT(1) FROM user_info;
  count  
---------
 1000000
(1 row)

dts_demo=> SELECT * FROM user_info ORDER BY id LIMIT 20;
 id |              c_user_id               |        c_name        | c_province_id | c_city_id |     create_time     
----+--------------------------------------+----------------------+---------------+-----------+---------------------
  1 | 1afd2630-88bc-11eb-9c30-0c42a125994e | oxlXASuDAQhIAEmDVAZ4 |             8 |        33 | 2022-03-19 22:05:05
  2 | 1afd300e-88bc-11eb-9c30-0c42a125994e | Nj27hTrqAwIQUPiO0qXo |           727 |        95 | 2028-03-19 22:05:05
  3 | 1afd4041-88bc-11eb-9c30-0c42a125994e | J9rzo41MCC2dM5Whp4Zy |           482 |        22 | 2026-03-19 22:05:05
  4 | 1afd4562-88bc-11eb-9c30-0c42a125994e | RX3eSuFHkqXmNJ8hSoas |           517 |        67 | 2023-03-19 22:05:05
  5 | 1afd4a49-88bc-11eb-9c30-0c42a125994e | YcVRm6gPdssI6cxUMZs9 |            54 |        31 | 2023-03-19 22:05:05
  6 | 1afd4ebd-88bc-11eb-9c30-0c42a125994e | ydfrgRm1VlPX8FLFSeo5 |           968 |         3 | 2027-03-19 22:05:05
  7 | 1afd530c-88bc-11eb-9c30-0c42a125994e | rsMpwgyPk0TiBXO2AFr3 |           585 |        25 | 2027-03-19 22:05:05
  8 | 1afd574a-88bc-11eb-9c30-0c42a125994e | H5aqu0qT4xgB06i1341J |           293 |        73 | 2027-03-19 22:05:05
  9 | 1afd5cf9-88bc-11eb-9c30-0c42a125994e | Y10PZgc4AzTDjxyY5ke0 |            31 |        60 | 2025-03-19 22:05:05
 10 | 1afd61a8-88bc-11eb-9c30-0c42a125994e | 761DXGqU7GUjHpKns2E0 |           732 |        12 | 2022-03-19 22:05:05
 11 | 1afd662c-88bc-11eb-9c30-0c42a125994e | AVIBJG21NLi00PX8HS7O |           384 |        97 | 2022-03-19 22:05:05
 12 | 1afd6ace-88bc-11eb-9c30-0c42a125994e | RK0E38ooDO0r1CSn6dz6 |           474 |        53 | 2022-03-19 22:05:05
 13 | 1afd6f01-88bc-11eb-9c30-0c42a125994e | pNCyKUaVYVyQqowgB3kl |           370 |        31 | 2028-03-19 22:05:05
 14 | 1afd7332-88bc-11eb-9c30-0c42a125994e | CvwX2bCq4VhshQeuy9Yf |           960 |        55 | 2024-03-19 22:05:05
 15 | 1afd775f-88bc-11eb-9c30-0c42a125994e | 3YzKT2oEXGmAIDRdo9on |           383 |        26 | 2024-03-19 22:05:05
 16 | 1afd7bcf-88bc-11eb-9c30-0c42a125994e | j8zjGigivtHUhwDq2OK9 |           172 |        90 | 2025-03-19 22:05:05
 17 | 1afd800c-88bc-11eb-9c30-0c42a125994e | 9pqJfSuEE8AlMKdHHeTD |           130 |        24 | 2025-03-19 22:05:05
 18 | 1afd842c-88bc-11eb-9c30-0c42a125994e | 0DZUqdFwtEGifda3AA4p |           480 |        67 | 2028-03-19 22:05:05
 19 | 1afd886b-88bc-11eb-9c30-0c42a125994e | 6SRyZ7v0mCP981zBaSIL |           374 |         5 | 2022-03-19 22:05:05
 20 | 1afd8c9f-88bc-11eb-9c30-0c42a125994e | jKFUparzjJAyRrv4DMST |           530 |        43 | 2024-03-19 22:05:05
(20 rows)

在同步的过程,可以看到数据量在不断增加,最后简单核对了一下数据量和记录。

再看一下数据同步任务,发现已经完成了,整体使用下来还是很方便的。

更多方案

使用py-mysql2pgsql同步Mysql数据至Greenplum

使用rds_dbsync同步Mysql数据至Greenplum

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。