本文介绍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设置了防火墙,未设置数据库端口允许被访问。
    解决办法
  • 检查内容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。

    解决办法

    无需处理,迁移上云后,将会自动升级插件版本。