本文介绍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 = '*'。具体操作请参见监听远程连接
    • 设置防火墙,开放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部分字符排序规则变化,版本不兼容时,数据排序规则不同,存在排序结果不符合预期的风险。

解决办法

按照如下步骤检查。
  1. 检查表排序。
    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:进行下一步检查。
  2. 检查库Collation。
    SELECT datname,datcollate FROM pg_database where datcollate NOT IN ('C', 'POSIX');
    返回结果:
    • 返回为空:结束,上云无风险。
    • 返回非空:进行下一步检查。
  3. 在所有库下检查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%,存储空间不足。

解决办法

  1. 使用如下命令查看自建PostgreSQL的存储空间。
    SELECT SUM(pg_database_size(pg_database.datname))/1024/1024 AS size FROM pg_database;
    说明 该命令查询结果单位为MB。
  2. 计算迁移上云的RDS PostgreSQL实例需要的存储空间大小。

    例如:查询自建PostgreSQL的存储空间为100 GB,那么,RDS PostgreSQL的存储空间至少应调整为110 GB。

  3. 对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_sizewal_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_connectionsmax_prepared_transaction的取值。
说明 max_connectionsmax_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的aurorareplicatorpgxxx账号将会被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 triggers(检查触发器是否兼容)

检查内容

Check triggers compatible

常见报错
Check triggers compatible XXX

说明

当前检查项仅做检查,不会报错。

解决办法

不涉及。

Check user functions(检查用户自定义函数)

检查内容

Check user functions compatible

常见报错
Check user functions compatible XXX

说明

当前检查项仅做检查,不会报错。

解决办法

不涉及。