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

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

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

背景

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

构建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

目录
相关文章
|
19天前
|
人工智能 API 开发工具
把 API 包成 MCP server:怎么做、值不值、坑在哪
本文讲API服务商最实际的问题:手上的API要不要包一层MCP?给出三个判断标准,三条实现路线(官方SDK手写/FastMCP从OpenAPI生成/云厂商工具集),以及上线前必须处理的5个细节——工具描述、参数校验、入站鉴权、字段投影、可观测。附首版验收4条标准与投入产出账。
294 2
|
20天前
|
运维 Java 编译器
【保姆级】JDK下载+安装+环境变量配置教程(所有版本汇总,2026最新版)
本文详解JDK安装与配置,以最新LTS版JDK 25为例,涵盖版本选择(优先LTS)、官网下载、图文安装步骤、环境变量配置(Path添加bin路径)及基础编译运行验证,新手可快速上手。
1162 1
|
20天前
|
人工智能 JavaScript 前端开发
AGENTS.md 实战指南:如何让 AI 编程助手真正遵循项目规范
本文介绍 `AGENTS.md`——一份专为AI编程助手设计的项目规范指南。它通过Markdown统一记录技术栈、目录结构、编码约定、禁止事项等,帮助Cursor、Claude Code等工具生成更符合项目实际的代码,减少类型滥用、路径错乱、违规调用等问题,提升AI辅助开发的准确性与工程可控性。(239字)
|
18天前
|
存储 安全 数据挖掘
在线教育系统源码与定制开发:企业搭建网校平台的技术方案解析
企业如何搭建属于自己的在线教育平台?本文从软件开发角度,解析在线教育系统源码与定制开发的区别,介绍课程管理、直播教学、学员管理、在线支付及学习数据分析等核心功能,并探讨视频播放、系统安全、性能扩展和项目实施流程,为教育培训机构、企业培训部门及知识付费平台规划网校系统提供参考。
|
20天前
|
SQL Shell
通过psql脚本返回值判断Greenplum任务是否执行成功
通过psql脚本返回值判断Greenplum任务是否执行成功
85 1
|
20天前
|
人工智能 调度 决策智能
拆解太早会错,拆解太晚会慢:分层任务网络让多智能体编排既灵活又有结构
多智能体编排面临“灵活vs结构”两难:动态调度易重复、预定义流程太僵化。HTN-Orchestrate提出分层任务网络——Planner延迟拆解、显式建模依赖;Orchestrator本地调度、结果逐层上传,实现动态适配与结构可控的统一。(239字)
117 4
|
18天前
|
人工智能 编解码 并行计算
Stable Diffusion文生图:本地 AI 绘画事实标准入门
Stable Diffusion 是本地AI绘画事实标准,4GB显存即可运行。本文从版本选择(SD1.5/XL)、首图生成到LoRA换风格,一站式打通新手卡点,涵盖部署、参数调优与故障排查。(239字)
|
18天前
|
机器学习/深度学习 人工智能 安全
Qwen3.8抢先体验!大家要有心理准备了,正式版即将发布并开源?!
阿里通义实验室发布Qwen3.8抢先体验版,宣布正式版将全面开源!新模型具备动态MoE、Sparse-Tiled Attention、CoT++自验证、UMT多模态融合及高性价比Flash版本,已开源Qwen3.8-27B与Flash。
260 1
|
19天前
|
JSON 前端开发 API
Flash 模型 Bechmark 横评
对轻量模型的能力做一些横评
228 1
|
18天前
|
弹性计算 人工智能 API
阿里云服务器与AI活动汇总:轻量38元、ECS 云服务器99元、GPU 四折、百炼免费Token一篇讲透
2026年,阿里云的优惠已经从单纯的"新用户首年低价"升级为一套覆盖计算、算力、AI的完整体系。轻量应用服务器、ECS云服务器、GPU云服务器、大模型服务平台(百炼)这四类产品,各自都有对应的活动玩法与省钱路径。本文结合全网公开资料,把这四类产品的活动入口、价格档位、参与方式和避坑要点一次性整理清楚,帮你把钱花在刀刃。
201 1

热门文章

最新文章