全部产品
Search
文档中心

云数据库 RDS:解读上云评估报告

更新时间:Nov 29, 2024

本文介绍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。

    解决办法

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

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记录了不同用户在各个数据库中的默认权限设置。

    解决办法

    1. 在源实例中执行以下语句,清空系统表pg_parameter_acl和pg_db_role_setting:

      DELETE FROM pg_parameter_acl;
      DELETE FROM pg_db_role_setting;
    2. 在完成一键上云切换后,需要在目标实例中重新配置不同用户在各个数据库下的默认权限。

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";