本文介绍RDS PostgreSQL一键上云时上云评估报告的内容详情、常见报错以及处理方式。
如果RDS PostgreSQL一键上云的上云评估报告的状态为失败,您可以单击上云评估任务对应操作列的查看报告,查看详细内容,上云评估报告包含以下内容。
RDS PostgreSQL一键上云的更多信息,请参见一键上云。
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
说明
自建PostgreSQL的GLIBC版本与RDS PostgreSQL实例的GLIBC版本不兼容。
GLIBC 2.28版本UTF8部分字符排序规则变化,版本不兼容时,数据排序规则不同,存在排序结果不符合预期的风险。
解决办法
按照如下步骤检查。
检查表排序。
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倍,可能导致搭建复制链路过程中云上实例无法启动。
解决办法
调小自建PostgreSQL的max_connections和max_prepared_transaction的取值。
max_connections和max_prepared_transaction参数变更,需要重启自建PostgreSQL。
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。
解决办法
无需处理,迁移上云后,将会自动升级插件版本。
Check Postgres system catalogs(检查PostgreSQL的系统catalogs)
检查内容1
检查源实例是否存在目标实例不支持的语言(pg_language)。
常见报错
error: disallowed language exist in databases [xxx, xxx], the languages allowed are [c, internal, sql, plpgsql, pltcl, plperl].
说明
RDS PostgreSQL仅支持C、internal、SQL、PL/pgSQL、PL/Tcl和PL/Perl等语言。源实例中存在的不支持的语言,无法在目标实例上使用。
解决办法
在源实例中删除不支持的语言。
检查内容2
检查源实例是否存在大对象(Large Object)。
常见报错
error: large object exist in databases [xxx, xxx].
说明
由于RDS PostgreSQL不支持大对象,因此源实例中存在的大对象无法在目标实例上使用。
解决办法
在源实例中删除已存在的大对象。
检查内容3
检查源实例是否已通过
ALTER DEFAULT PRIVILEGES ... GRANT ...
命令设置了默认权限。即检查源实例中是否存在系统表pg_catalog.pg_default_acl不为空的数据库。常见报错
error: default acl settings exist in databases [xxx, xxx].
说明
如果源实例在某个数据库下执行过
ALTER DEFAULT PRIVILEGES ... GRANT ...
语句,则该数据库下的系统表pg_catalog.pg_default_acl将非空。解决办法
需要先在源实例相应的数据库中,执行
ALTER DEFAULT PRIVILEGES ... REVOKE ...
语句,以确保所有数据库下的系统表pg_default_acl为空。在完成一键上云切换后,再重新执行ALTER DEFAULT PRIVILEGES ... GRANT ...
语句,以恢复原先的默认权限设置。检查内容4
检查源实例系统表pg_parameter_acl和pg_db_role_setting是否不为空。
常见报错
warning: Invalid system tables: [pg_parameter_acl, pg_db_role_setting], these system tables should be empty.
说明
系统表pg_parameter_acl记录用户对内核参数的访问权限,RDS PostgreSQL不支持用户对这些权限进行修改。系统表pg_db_role_setting记录了不同用户在各个数据库中的默认权限设置。
解决办法
在源实例中执行以下语句,清空系统表pg_parameter_acl和pg_db_role_setting:
DELETE FROM pg_parameter_acl; DELETE FROM pg_db_role_setting;
在完成一键上云切换后,需要在目标实例中重新配置不同用户在各个数据库下的默认权限。
Check reserved role permission(检查预留角色权限)
检查内容
检查源实例是否向某些账号授予了目标实例不允许的预留角色权限。
常见报错
error: some disallowed reserved roles [pg_write_server_files] are granted to user. you should revoke these roles from their members
说明
RDS PostgreSQL不支持账户拥有pg_write_server_files等预留角色的权限。如果源实例曾执行过GRANT pg_write_server_files TO "user";
等授权语句,则需要执行REVOKE
语句以收回这些权限。
解决办法
在源实例中,执行REVOKE
语句回收相应的权限,如REVOKE pg_write_server_files FROM "user";
。