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

    解決辦法

    無需處理,遷移上云后,將會自動升級插件版本。