全部產品
Search
文件中心

ApsaraDB RDS:解讀上雲評估報告

更新時間:Nov 30, 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";