本文介绍RDS PostgreSQL一键上云时上云评估报告的内容详情、常见报错以及处理方式。
- Check rds empty(检查RDS PostgreSQL数据库是否是空库)
- Check source connectivity(检查自建PostgreSQL的连通性)
- Check source version(检查自建PostgreSQL的大版本)
- Check source glibc version(检查自建PostgreSQL的GLIBC版本)
- Check disk size(检查磁盘大小是否充足)
- Check wal keep size(检查wal_keep_size大小)
- Check spec params(检查规格参数)
- Check rds user(检查RDS系统账号是否在源端实例上被占用)
- Check extensions(检查插件兼容性)
Check rds empty(检查RDS PostgreSQL数据库是否是空库)
检查内容
Check rds databases
error:postgres not empty, check if any table exists
说明
RDS PostgreSQL实例创建了数据库并有数据。
解决办法
清空RDS PostgreSQL实例的数据库,仅保留template0、template1和postgres,并且,postgres需要清理除了ha_health_check以外的表。
Check source connectivity(检查自建PostgreSQL的连通性)
- 检查内容1
Check ip connectable
常见报错error:XX.XX.XX.XX is unapproachable
说明
自建PostgreSQL所在服务器IP或DNS无法ping通。
解决办法- ECS自建PostgreSQL一键上云场景,配置ECS实例的私网IP。获取方法请参见查看IP地址。
- IDC自建PostgreSQL一键上云场景,配置为DNS的IP。
- 检查内容2
Check port connectable
常见报错error:5432 is unapproachable
说明
- 自建PostgreSQL未开启远程端口监听。
- 自建PostgreSQL设置了防火墙,未设置数据库端口允许被访问。
解决办法- 修改自建PostgreSQL的postgresql.conf文件,配置
listen_addresses = '*'
。具体操作请参见配置postgresql.conf文件。 - 设置防火墙,开放5432端口,或上云前关闭防火墙。具体操作请参见配置服务器防火墙。
- 检查内容3
Check database connectable
常见报错error:cannot connect to source database by migratetest:123456
说明
- 用户密码不正确。
- 自建PostgreSQL的pg_hba.conf配置不正确。
解决办法- 确认用户名密码是否能连接自建PostgreSQL,无法连接时,可更新用户密码。以migratetest账号为例,命令示例如下:
ALTER USER migratetest WITH PASSWORD '123456';
- 修改自建PostgreSQL的pg_hba.conf文件,以migratetest账号为例,配置如下内容:
host all migratetest <RDS PostgreSQL VPC网段> md5
说明 具体操作请参见更新pg_hba.conf文件。
- 检查内容4
Check account replication privilege
常见报错error:migratetest has no replication privilege
说明
- 用户没有REPLICATION权限。
- 自建PostgreSQL的pg_hba.conf配置不正确。
解决办法
- 以migratetest账号为例,执行如下命令,为账号添加REPLICATION权限:
ALTER ROLE migratetest REPLICATION;
- 修改自建PostgreSQL的pg_hba.conf文件,以migratetest账号为例,配置如下内容:
host replication migratetest <RDS PostgreSQL VPC网段> md5
说明 具体操作请参见更新pg_hba.conf文件。
- 检查内容5
Check account createrole privilege
常见报错error:migratetest has no createrole privilege
说明
用户没有CREATEROLE权限。
解决办法
以migratetest账号为例,执行如下命令:ALTER ROLE migratetest CREATEROLE;
- 检查内容6
Check account monitor privilege
常见报错error:migratetest should be a member of pg_monitor to monitor replication status
说明
用户没有pg_monitor权限。说明 该权限能够查询pg_stat_replication和pg_stat_wal_receiver等系统视图,以便于得到复制链路信息。解决办法
以migratetest账号为例,为账号授权:GRANT pg_monitor TO migratetest;
Check source version(检查自建PostgreSQL的大版本)
检查内容
Check major version consistent
error:version mismatch, source version:10, current version:13.0
说明
自建PostgreSQL版本与RDS PostgreSQL实例大版本不一致。
解决办法
购买与自建PostgreSQL大版本一致的RDS PostgreSQL实例。
Check source glibc version(检查自建PostgreSQL的GLIBC版本)
检查内容
Check source glibc version compatible
warning:source glibc version is not compatible with rds pg
说明
解决办法
- 检查表排序。
begin; create temp table testcollation(id varchar(20) collate "en_US.utf8") on commit drop; insert into testcollation values('-1'),('1'); select id='1' from testcollation order by id limit 1; rollback;
返回结果:- true:结束,上云无风险。
- false:进行下一步检查。
- 检查库Collation。
SELECT datname,datcollate FROM pg_database where datcollate NOT IN ('C', 'POSIX');
返回结果:- 返回为空:结束,上云无风险。
- 返回非空:进行下一步检查。
- 在所有库下检查Collation不是
C
或者POSIX
的索引。WITH result AS ( WITH defcoll AS ( SELECT datcollate AS coll FROM pg_database WHERE datname = current_database() ) SELECT indrelid::regclass::text relname, indexrelid::regclass::text indexname, CASE WHEN c.collname = 'default' THEN defcoll.coll ELSE c.collname END AS collation FROM (SELECT indexrelid, indrelid, indcollation[i] coll FROM pg_index, generate_subscripts(indcollation, 1) g(i)) s JOIN pg_collation c ON coll=c.oid CROSS JOIN defcoll WHERE collprovider IN ('d', 'c') AND collname NOT IN ('C', 'POSIX') ) SELECT result.relname, result.indexname, result.collation FROM result WHERE result.collation NOT IN ('C', 'POSIX');
返回结果:- 返回为空:结束,上云无风险。
- 返回非空:上云存在风险。
Check disk size(检查磁盘大小是否充足)
检查内容
Check disk size enough
error:source_db_size > disk_size * 0.95
说明
自建PostgreSQL数据库的大小大于RDS PostgreSQL实例磁盘大小的95%,存储空间不足。
解决办法
- 使用如下命令查看自建PostgreSQL的存储空间。
SELECT SUM(pg_database_size(pg_database.datname))/1024/1024 AS size FROM pg_database;
说明 该命令查询结果单位为MB。 - 计算迁移上云的RDS PostgreSQL实例需要的存储空间大小。
例如:查询自建PostgreSQL的存储空间为100 GB,那么,RDS PostgreSQL的存储空间至少应调整为110 GB。
- 对RDS PostgreSQL实例进行变更配置,扩容存储空间。具体请参见变更配置。
Check wal keep size(检查wal_keep_size大小)
检查内容
Check wal keep size large enough
warning:wal_keep_size X MB is too small. Try to set wal_keep_segments or wal_keep_size large enough ensure pg_basebackup success
说明
wal_keep_size或wal_keep_segments参数设置过小,需要调整。
解决办法
- 自建PostgreSQL版本大于等于13:调大RDS PostgreSQL实例的wal_keep_size参数取值,增加上云过程中全量备份和增量备份的成功率。
- 自建PostgreSQL版本小于13:调大RDS PostgreSQL实例的wal_keep_segments参数值,增加上云过程中全量备份和增量备份的成功率。
说明 PostgreSQL版本小于13,wal_keep_size = wal_keep_segments * wal_segment_size。
Check spec params(检查规格参数)
检查内容
Check if spec params too large
error:max_connections too large, value=XXX
error:max_prepared_transactions too large, value=XXX
说明
自建PostgreSQL的max_connections和max_prepared_transactions参数设置过大,大于RDS PostgreSQL的100倍,可能导致搭建复制链路过程中云上实例无法启动。
解决办法
Check rds user(检查RDS系统账号是否在源端实例上被占用)
检查内容
Check if rds system user is occupied
常见报错
warning:Check if rds system user is occupied ...XXX will be reused in rds
说明
自建PostgreSQL的aurora
、replicator
和pgxxx
账号将会被RDS PostgreSQL占用,请不要使用这三个账号作为业务账号。
解决办法
请确认不要使用warning中的账号作为业务账号。
Check extensions(检查插件兼容性)
- 检查内容1
Check source supported extensions
常见报错error:Check source supported extensions XXX not supported
说明
RDS PostgreSQL实例插件与自建PostgreSQL不兼容。
解决办法
在自建PostgreSQL中删除不兼容的插件。
- 检查内容2
Check source extensions with higher version
常见报错error:Check source extensions with higher version XXX
说明
自建PostgreSQL插件版本高于RDS PostgreSQL。
解决办法
自建PostgreSQL安装低版本插件,使插件版本与RDS PostgreSQL版本一致。
- 检查内容3
Check source extensions with lower version
常见报错warning:Check source extensions with lower version XXX
说明
自建PostgreSQL插件版本低于RDS PostgreSQL。
解决办法
无需处理,迁移上云后,将会自动升级插件版本。