通过外表导入RDS MySQL数据
您可以将RDS for MySQL的数据导入云原生数据仓库 AnalyticDB MySQL 版,在AnalyticDB for MySQL中完成多源数据整合和复杂查询分析,也可以将经过汇总的关键指标写入RDS for MySQL。
前提条件
RDS for MySQL实例与AnalyticDB for MySQL集群位于同一VPC。
已将AnalyticDB for MySQL的VPC网段加入RDS for MySQL实例的白名单中。
AnalyticDB for MySQL企业版、基础版、湖仓版或数仓版弹性模式已在AnalyticDB for MySQL控制台集群信息页面的网络信息区域开启ENI网络开关。
重要开启和关闭ENI网络会导致数据库连接中断大约2分钟,无法读写。请谨慎评估影响后再开启或关闭ENI网络。
数据准备
本文示例的RDS for MySQL数据库名为test_adb
,并在该库中创建了一张名为person
的表,示例如下:
CREATE TABLE goods (
goods_id bigint(20) NOT NULL,
price double NOT NULL,
class bigint(20) NOT NULL,
name varchar(32) NOT NULL,
update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (goods_id)
);
向person
表中插入数据,示例如下:
INSERT INTO test_adb.goods
VALUES
(1, 50, 1, 'Book', '2024-08-07 09:56:53'),
(2, 80, 2, 'Basketball', '2024-08-08 10:00:55'),
(3, 150, 3, 'Watch', '2024-08-06 11:00:25'),
(4, 30, 1, 'Magazine', '2024-08-08 12:25:55'),
(5, 80, 2, 'Football', '2024-08-07 08:50:35'),
(6, 25, 4, 'Tea', '2024-08-05 09:25:30'),
(7, 30, 4, 'Coffee', '2024-08-07 10:20:40'),
(8, 300, 3, 'Computer', '2024-08-06 10:55:35'),
(9, 100, 2, 'Baseball', '2024-08-08 11:35:50'),
(10, 200, 3, 'Phone', '2024-08-07 11:30:25');
操作步骤
企业版、基础版及湖仓版
进入SQL开发编辑器。
登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,然后单击目标集群ID。
在左侧导航栏,单击
。
引擎选择XIHE,资源组选择Interactive型资源组。
执行以下语句,创建外部数据库。示例如下:
CREATE EXTERNAL DATABASE adb_external_db;
执行以下语句,创建外表。示例如下:
说明AnalyticDB for MySQL外表和RDS MySQL中表的列名称、数量、顺序、字段类型需要相同。
AnalyticDB for MySQL外表的参数说明,请参见CREATE EXTERNAL TABLE。
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_db.goods ( goods_id bigint(20) NOT NULL, price double NOT NULL, class bigint(20) NOT NULL, name varchar(32) NOT NULL, update_time timestamp, PRIMARY KEY (goods_id) )ENGINE = 'MYSQL' TABLE_PROPERTIES = '{ "url":"jdbc:mysql://mysql-address:3306/test_adb", "tablename":"person", "username":"mysql-user-name", "password":"mysql-user-password", "charset":"utf8" }';
查询数据。
外表创建成功后,您可以在AnalyticDB for MySQL中通过SELECT查询RDS MySQL中
person
表的数据。SELECT * FROM adb_external_db.goods;
返回结果如下:
+----------+-------+-------+------------+---------------------+ | goods_id | price | class | name | update_time | +----------+-------+-------+------------+---------------------+ | 2 | 80.0 | 2 | Basketball | 2024-08-08 10:00:55 | | 10 | 200.0 | 3 | Phone | 2024-08-07 11:30:25 | | 1 | 50.0 | 1 | Book | 2024-08-07 09:56:53 | | 6 | 25.0 | 4 | Tea | 2024-08-05 09:25:30 | | 9 | 100.0 | 2 | Baseball | 2024-08-08 11:35:50 | | 3 | 150.0 | 3 | Watch | 2024-08-06 11:00:25 | | 5 | 80.0 | 2 | Football | 2024-08-07 08:50:35 | | 7 | 30.0 | 4 | Coffee | 2024-08-07 10:20:40 | | 8 | 300.0 | 3 | Computer | 2024-08-06 10:55:35 | | 4 | 30.0 | 1 | Magazine | 2024-08-08 12:25:55 | +----------+-------+-------+------------+---------------------+
执行以下语句,创建目标数据库。
CREATE DATABASE adb_demo;
执行以下语句,在目标数据库
adb_demo
中创建一张名为mysql_import_test
的目标表,用于存储从RDS MySQL导入的数据。CREATE TABLE IF NOT EXISTS mysql_import_test ( goods_id bigint(20) NOT NULL, price double NOT NULL, class bigint(20) NOT NULL, name varchar(32) NOT NULL, update_time timestamp, PRIMARY KEY (goods_id) ) DISTRIBUTED BY HASH(goods_id);
执行以下语句,将RDS for MySQL实例中的数据导入至目标AnalyticDB for MySQL集群中。
INSERT INTO mysql_import_test SELECT * FROM adb_external_db.goods;
执行以下语句,查询AnalyticDB for MySQL表
mysql_import_test
数据。SELECT * FROM mysql_import_test;
返回结果如下:
+----------+-------+-------+------------+---------------------+ | goods_id | price | class | name | update_time | +----------+-------+-------+------------+---------------------+ | 2 | 80.0 | 2 | Basketball | 2024-08-08 10:00:55 | | 10 | 200.0 | 3 | Phone | 2024-08-07 11:30:25 | | 1 | 50.0 | 1 | Book | 2024-08-07 09:56:53 | | 6 | 25.0 | 4 | Tea | 2024-08-05 09:25:30 | | 9 | 100.0 | 2 | Baseball | 2024-08-08 11:35:50 | | 3 | 150.0 | 3 | Watch | 2024-08-06 11:00:25 | | 5 | 80.0 | 2 | Football | 2024-08-07 08:50:35 | | 7 | 30.0 | 4 | Coffee | 2024-08-07 10:20:40 | | 8 | 300.0 | 3 | Computer | 2024-08-06 10:55:35 | | 4 | 30.0 | 1 | Magazine | 2024-08-08 12:25:55 | +----------+-------+-------+------------+---------------------+
数仓版
连接目标AnalyticDB for MySQL集群。详细操作步骤,请参见连接集群。
创建目标数据库。详细操作步骤,请参见创建数据库。
本示例中,AnalyticDB for MySQL集群的目标库名为
adb_demo
。创建外表。
使用以下命令在目标库
adb_demo
中创建一张名为goods_external_table
的外表。CREATE TABLE IF NOT EXISTS goods_external_table ( goods_id bigint(20) NOT NULL, price double NOT NULL, class bigint(20) NOT NULL, name varchar(32) NOT NULL, update_time timestamp, PRIMARY KEY (goods_id) ) ENGINE='mysql' TABLE_PROPERTIES='{ "url":"jdbc:mysql://mysql-vpc-address:3306/test_adb", "tablename":"goods", "username":"mysql-user-name", "password":"mysql-user-password", "charset":"utf8" }';
参数
说明
ENGINE='mysql'
外部表的存储引擎说明,本文使用的是MySQL。
TABLE_PROPERTIES
AnalyticDB for MySQL访问RDS for MySQL数据的访问方式。
url
RDS for MySQL实例中的内网地址(即VPC连接地址)和源库名(本文示例中为
test_adb
)。RDS for MySQL地址信息的查看方法,请参见查看或修改内外网地址和端口。格式:
"jdbc:mysql://mysql-vpc-address:3306/rds-database-name"
。示例:
jdbc:mysql://rm-bp1hem632****.mysql.rds.aliyuncs.com:3306/test_adb
。tablename
RDS for MySQL中源表名,本文示例中为
goods
。username
RDS for MySQL数据库账号。
password
RDS for MySQL数据库账号的密码。
charset
MySQL字符集,取值说明:
gbk
utf8(默认值)
utf8mb4
创建目标表。
使用以下命令在目标数据库
adb_demo
中创建一张名为mysql_import_test
的目标表,用于存储从RDS for MySQL导入的数据。CREATE TABLE IF NOT EXISTS mysql_import_test ( goods_id bigint(20) NOT NULL, price double NOT NULL, class bigint(20) NOT NULL, name varchar(32) NOT NULL, update_time timestamp, PRIMARY KEY (goods_id) ) DISTRIBUTED BY HASH(goods_id);
将源RDS MySQL实例中的数据导入至目标AnalyticDB for MySQL集群中。
REPLACE INTO mysql_import_test SELECT * FROM goods_external_table;
导入完成后,您可以登录AnalyticDB for MySQL的目标库
adb_demo
中,执行如下命令查看并验证源表数据是否成功导入至目标mysql_import_test
表中:SELECT * FROM mysql_import_test LIMIT 100;
返回结果如下:
+----------+-------+-------+------------+---------------------+ | goods_id | price | class | name | update_time | +----------+-------+-------+------------+---------------------+ | 2 | 80.0 | 2 | Basketball | 2024-08-08 10:00:55 | | 10 | 200.0 | 3 | Phone | 2024-08-07 11:30:25 | | 1 | 50.0 | 1 | Book | 2024-08-07 09:56:53 | | 6 | 25.0 | 4 | Tea | 2024-08-05 09:25:30 | | 9 | 100.0 | 2 | Baseball | 2024-08-08 11:35:50 | | 3 | 150.0 | 3 | Watch | 2024-08-06 11:00:25 | | 5 | 80.0 | 2 | Football | 2024-08-07 08:50:35 | | 7 | 30.0 | 4 | Coffee | 2024-08-07 10:20:40 | | 8 | 300.0 | 3 | Computer | 2024-08-06 10:55:35 | | 4 | 30.0 | 1 | Magazine | 2024-08-08 12:25:55 | +----------+-------+-------+------------+---------------------+