本文章给出了从阿里云数据库 RDS PostgreSQL 版迁移到 AWS RDS for PostgreSQL 的步骤。由于 AWS 的 PostgreSQL 从 10.4 版本才开始支持原生的逻辑复制,本文以 AWS RDS for PostgreSQL 10.4 版本为例。
准备阿里云 PostgreSQL 环境
-
进入阿里云 RDS 控制台,点击「创建实例」,类型选择「PostgreSQL 10 」,点击「下一步:实例配置」,「下一步:确认订单」,「去支付」
-
在控制台实例列表中,等待运行状态为「运行中」,选择「操作 - 管理」
-
在左侧选择「账号管理 - 创建账号」,数据库账号:
aws
,账号类型「高权限账号」,密码:Awsaws@123
,点击「创建」
-
在左侧选择「数据安全性 - 白名单设置 - 添加白名单分组」,分组名称:
aws
,组内白名单:0.0.0.0/0
,点击「确定」
-
在左侧选择「数据库连接 - 申请外网地址」,点击「确定」
-
在左侧选择「参数设置」,修改参数 wal_level 的运行参数值为
logical
,点击「提交参数」,点击「确认」(注意本步骤操作会重启数据库,生产环境请在维护时间段操作)
安装 PostgreSQL 客户端:
Mac:
brew doctor
brew update
brew install libpq
brew link --force libpq
Ubuntu、Debian:
sudo apt-get update
sudo apt-get install postgresql-client
Windows:https://www.postgresql.org/download/windows/
连接数据库:
psql -h <步骤6里的外网地址> -p 1921 -U <步骤4里的用户名> -W -d postgres
执行以下命令创建测试数据:
# 创建测试数据库,名称:aliyun
CREATE DATABASE aliyun;
\c aliyun;
# 创建两张测试表格
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
full_name TEXT
);
CREATE TABLE orders (
order_id SERIAL,
dish_name TEXT,
customer_id INTEGER REFERENCES customers (id)
);
# 插入测试数据
INSERT INTO customers (id, full_name) VALUES (1, 'Andy');
INSERT INTO orders (order_id, dish_name, customer_id) VALUES (1, 'Andy_Dish', 1);
# 确认数据结果
SELECT * FROM customers;
SELECT * FROM orders;
准备 Amazon RDS for PostgreSQL 环境
-
登录 Amazon RDS 控制台,选择「参数组」,点击「创建参数组」,参数组系列 选择 「postgres10」,组名:
aliyun-aws
, 描述:aliyun-aws
, 点击「创建」
-
点击创建好的参数组,修改参数 rds.logical_replication 值为 1,点击「保存修改」
-
选择左侧 「数据库」,点击「创建数据库」
-
选择「标准创建」,引擎类型「PostgreSQL」,版本「PostgreSQL 10.4-R1」,数据库实例标识符:
ali-aws
,主用户名:aws
,密码:Awsaws-123
,初始数据库名称:aliyun
,数据库参数:ali-aws
,「公开访问」选择「是」,其它配置参考下图或保持默认,点击「创建数据库」
-
修改数据库VPC安全组,允许数据库的
5432
端口访问
-
连接数据库:
psql -h <终端节点> -p 5432 -U <步骤5里的主户名> -W -d <步骤5里的初始数据库名称>
创建数据表:
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
full_name TEXT
);
CREATE TABLE orders (
order_id SERIAL,
dish_name TEXT,
customer_id INTEGER REFERENCES customers (id)
);
运行逻辑复制进行数据迁移
登录阿里云数据库:
psql -h <阿里云数据库外网地址> -p 1921 -U <数据库用户名> -W -d aliyun
设置阿里云数据库 PUBLICATION:
CREATE PUBLICATION pub_orders FOR TABLE orders;
CREATE PUBLICATION pub_customers FOR TABLE customers;
登录AWS数据库:
psql -h <AWS数据库终端节点> -p 5432 -U <数据库用户名> -W -d aliyun
设置 AWS 数据库 SUBSCRIPTION:
CREATE SUBSCRIPTION sub_orders CONNECTION 'host=<阿里云数据库外网地址> port=1921 user=<数据库用户名> dbname=aliyun password=<数据库密码>' PUBLICATION pub_orders;
CREATE SUBSCRIPTION sub_customers CONNECTION 'host=<阿里云数据库外网地址> port=1921 user=<数据库用户名> dbname=aliyun password=<数据库密码>' PUBLICATION pub_customers;
对迁移后的数据进行验证
登录AWS数据库:
psql -h <AWS数据库终端节点> -p 5432 -U <数据库用户名> -W -d aliyun
执行命令查询表数据是否跟阿里云数据中保持一致:
SELECT * FROM customers;
SELECT * FROM orders;