當RDS PostgreSQL容災搭建的可行性評估報告狀態為失敗時,您可以單擊評估工作清單中對應任務的操作列的查看報告,查看詳細內容。本文介紹RDS PostgreSQL容災搭建可行性評估報告的內容詳情、常見報錯以及解決方案。
檢查項
容災搭建可行性評估報告包含以下內容。
源執行個體:需要進行容災的執行個體。
目標執行個體:災備執行個體,即RDS PostgreSQL。
檢查項 | 說明 | 報錯時解決方案 |
檢查項 | 說明 | 報錯時解決方案 |
Check rds empty | 檢查目標執行個體是否是空庫,防止資料覆蓋。 | |
Check source connectivity |
| |
Check major version | 檢查源執行個體和目標執行個體的大版本是否一致。 | |
Check glibc version | 檢查源執行個體和目標執行個體的glibc版本是否相容。 該檢查項不通過時, 觸發warning層級的報錯。 | |
Check disk size | 檢查目標執行個體磁碟空間是否充足。 當前要求源執行個體資料量不超過目標執行個體磁碟容量的80%。 | |
Check wal keep size | 檢查源執行個體 源執行個體
| |
Check spec param | 檢查目標執行個體的規格參數 | |
Check rds user | 檢查源執行個體是否存在名為 若源執行個體為阿里雲RDS PostgreSQL執行個體,則無需進行檢查。 | |
Check extensions | 檢查外掛程式相容性。檢查源執行個體:
| |
Check logical replication slot | 檢查邏輯複製槽。 該檢查項不通過時, 觸發warning層級的報錯。 | |
Check local cross db access | 檢查本地跨庫訪問。檢查源執行個體是否使用了 該檢查項不通過時, 觸發warning層級的報錯。 | |
Check Postgres system catalogs | 檢查PostgreSQL的系統catalogs:
| |
Check reserved role permission | 檢查預留角色許可權。 |
解決方案
Check rds empty(檢查目標執行個體是否是空庫)
檢查內容
檢查目標執行個體是否存在非空的資料庫,防止目標執行個體原有資料被覆蓋。
常見報錯
error:xxx not empty, check if any table exists
說明
目標執行個體中存在包含資料的資料庫。
解決方案
清空目標執行個體中包含資料的資料庫,或直接刪除包含資料的資料庫,但要保留資料庫template0、template1和postgres。
Check source connectivity(檢查網路連通性和同步帳號許可權)
檢查內容1
檢查源執行個體IP是否可以連通。
常見報錯
error:xxx.xxx.xxx.xxx is unapproachable
說明
目標執行個體網路環境下,源執行個體的IP或網域名稱無法連通。
解決方案
配置網路環境,查看網路設定是否存在未完成的待辦事項。
檢查內容2
檢查源執行個體連接埠是否可以連通。
常見報錯
error:5432 is unapproachable
說明
目標執行個體網路環境下,源執行個體的連接埠無法連通。
解決方案
修改源執行個體的設定檔postgresql.conf,設定
listen_address = '*'
,並重啟源執行個體。設定源執行個體防火牆,開放指定連接埠。
檢查內容3
檢查源執行個體PostgreSQL資料庫服務是否可以串連。
常見報錯
error:cannot connect to source database by replicatoraccount:replicatorPassword
說明
同步帳號的密碼不正確。同步帳號指的是源執行個體和目標執行個體之間資料同步使用的帳號。
源執行個體設定檔pg_hba.conf配置錯誤。
解決方案
確認是否可以使用同步帳號串連到源執行個體。無法串連時,嘗試更新密碼。假設同步帳號是replicatoraccount,樣本如下:
ALTER ROLE replicatoraccount WITH PASSWORD 'replicatorPassword';
修改源執行個體的pg_hba.conf設定檔,添加放開同步帳號的條目。假設同步帳號是replicatoraccount,樣本如下:
host all replicatoraccount <目標執行個體VPC網段> md5
檢查內容4
檢查同步帳號是否具有REPLICATION許可權,以完成資料同步等操作。
常見報錯
error:replicatoraccount has no replication privilege
說明
同步帳號沒有REPLICATION許可權。
源執行個體設定檔pg_hba.conf配置不正確。
解決方案
為同步帳號添加REPLICATION許可權。假設同步帳號是replicatoraccount,樣本如下:
ALTER ROLE replicatoraccount REPLICATION;
修改源執行個體的pg_hba.conf設定檔,添加條目允許同步帳號發起replication串連。假設同步帳號是replicatoraccount,樣本如下:
host replication replicatoraccount <目標執行個體VPC網段> md5
檢查內容5
檢查同步帳號是否具有CREATEROLE許可權。
常見報錯
error:replicatoraccount has no createrole privilege
說明
同步帳號沒有CREATEROLE許可權。
解決方案
為同步帳號添加CREATEROLE許可權。假設同步帳號是replicatoraccount,樣本如下:
ALTER ROLE replicatoraccount CREATEROLE;
檢查內容6
檢查同步帳號是否具備pg_monitor許可權,以便查詢pg_stat_replication和pg_stat_wal_receive等系統檢視表,從而擷取資料同步狀態。
常見報錯
error: replicatoraccount should be a member of pg_monitor to monitor replication status
說明
同步帳號沒有pg_monitor許可權。
解決方案
將同步帳號添加到pg_monitor。假設同步帳號是replicatoraccount,樣本如下:
GRANT pg_monitor TO replicatoraccount
Check major version(檢查大版本是否一致)
檢查內容
檢查源執行個體和目標執行個體的大版本是否一致。
常見報錯
version mismatch, source version:15, current version:16
說明
源執行個體和目標執行個體的大版本不一致。
解決方案
使用與源執行個體大版本一致的RDS PostgreSQL執行個體作為目標執行個體。
Check glibc version(檢查glibc版本相容性)
檢查內容
檢查源執行個體和目標執行個體的glib 版本是否相容。
常見報錯
warning:source glibc version is not compatible with rds pg
說明
源執行個體所依賴的glibc版本與RDS PostgreSQL執行個體所依賴的glibc版本存在不相容問題。glibc 2.28版本對UTF-8部分字元的定序進行了變更,在版本不相容的情況下,資料的定序可能不同,因此存在排序結果不符合預期的風險。
解決方案
檢查表排序。
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:進行下一步檢查。
檢查庫Collation。
SELECT datname,datcollate FROM pg_database where datcollate NOT IN ('C', 'POSIX');
返回結果:
返回為空白:結束,無風險。
返回非空:進行下一步檢查。
在所有庫下檢查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(檢查磁碟空間是否充足)
檢查內容
檢查目標執行個體磁碟空間是否充足.
常見報錯
error:source_db_size > disk_size * 0.8
說明
源執行個體資料量已超過目標執行個體磁碟空間的80%,導致磁碟空間不足。
解決方案
使用以下命令估算源執行個體的資料量大小,單位為MB。.
SELECT sum(pg_database_size(datname))/1024/1024 AS size FROM pg_database;
計算目標執行個體需要多大的磁碟空間,進行擴容。詳情請參見變更配置。
Check wal keep size(檢查源執行個體wal_keep_size大小)
檢查內容
檢查源執行個體的wal_keep_size是否足夠大,以避免目標執行個體所需的WAL日誌被刪除。
常見報錯
wal_keep_size xxMB is too small. Try to set wal_keep_segments or wal_keep_size large enough ensure pg_basebackup success
說明
源執行個體核心參數wal_keep_size或wal_keep_segments設定過小,需要調整。
解決方案
如源執行個體大版本大於或等於13,則增大核心參數wal_keep_size的取值。
如源執行個體大版本小於13,增大核心參數wal_keep_segments的取值。
Check spec param(檢查規格參數)
檢查內容
檢查目標執行個體的規格參數max_connections、max_prepared_transactions
等取值是否大於源執行個體。
常見報錯
error:max_connections too large, value=xxx; max_prepared_transactions too large, value=xxx
說明
為了在源執行個體與目標執行個體之間建立主備複製關係,要求源執行個體的max_connections、max_prepared_transactions
等規格參數不得超過目標執行個體的相應值。
解決方案
減少源執行個體核心參數max_connections、max_prepared_transactions
的取值,並重啟源執行個體。
Check rds user(檢查源執行個體是否存在目標執行個體所需系統帳號)
檢查內容
檢查源執行個體是否存在帳號alicloud_rds_admin、aurora、replicator,這些帳號會作為目標執行個體的系統帳號。
常見報錯
error:xxx will be reused in rds
說明
源執行個體存在的alicloud_rds_admin、aurora、replicator等帳號,這些帳號會作為目標執行個體的系統帳號。
解決方案
在源執行個體中刪除報錯提到的帳號。
Check extensions(檢查外掛程式相容性)
檢查內容1
檢查源執行個體是否存在目標執行個體不支援的外掛程式。
常見報錯
error:Check source supported extensions xxx not supported
說明
源執行個體存在目標執行個體不支援的外掛程式。
解決方案
源執行個體刪除不支援的外掛程式。
檢查內容2
檢查源執行個體是否存在版本比目標執行個體支援的版本更高的外掛程式。
常見報錯
error:Check source extensions with higher version xxx
說明
源執行個體存在版本高於目標執行個體支援的外掛程式。
解決方案
源執行個體安裝外掛程式的低版本,與目標執行個體支援的版本的一致。或直接刪除不支援的外掛程式。
檢查內容3
檢查源執行個體是否存在版本低於目標執行個體支援的版本的外掛程式。
常見報錯
warning:Check source extensions with lower version xxx
說明
源執行個體存在版本低於的目標執行個體支援的外掛程式。
解決方案
無需處理,搭建容災關係過程中將會自動升級外掛程式版本。
Check logical replication slot(檢查邏輯複製槽)
檢查內容
檢查源執行個體是否存在邏輯複製槽。
常見報錯
warning:The logical replication slots: xxx will be lost on target instance
說明
源執行個體中存在的邏輯複製槽將不會同步至目標執行個體,因此在目標執行個體被提升為主庫後,邏輯複製的下遊將無法找到相應的邏輯複製槽進行消費。
解決方案
使用者需明確理解,邏輯複製槽不會同步至目標執行個體的這一事實,以及由此可能引發的風險。
Check local cross db access(檢查本地跨庫訪問)
檢查內容
檢查源執行個體是否使用了postgres_fdw或dblink等外掛程式進行本地跨庫訪問。
常見報錯
warning:Foreign servers for local cross-database access exist
說明
如果源執行個體存在本地跨庫訪問的行為,由於目標執行個體PostgreSQL服務在本地固定監聽於5432連接埠,這與源執行個體服務在本地監聽的連接埠可能不一致。連接埠的變化將導致目標執行個體在提升為主庫後,原有的本地跨庫訪問失效。
解決方案
無需解決,但使用者需明確源執行個體和目標執行個體服務的本地監聽連接埠可能存在不一致的情況。如果存在本地跨庫訪問,使用者在提升目標執行個體後需重新設定用於本地跨庫訪問連接埠。
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不支援大對象,源執行個體中存在的大對象無法在目標RDS PostgreSQL執行個體上使用。
部分早期遷移上雲的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記錄了不同使用者在各個資料庫中的預設使用權限設定。
解決辦法
在源執行個體中執行以下語句,清空系統資料表pg_parameter_acl和pg_db_role_setting:
DELETE FROM pg_parameter_acl; DELETE FROM pg_db_role_setting;
在完成容災搭建後,需要在目標執行個體中重新設定不同使用者在各個資料庫下的預設許可權。
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";
。