本文介紹RDS PostgreSQL一鍵上雲時上雲評估報告的內容詳情、常見報錯以及處理方式。
- Check rds empty(檢查RDS PostgreSQL資料庫是否是空庫)
- Check source connectivity(檢查自建PostgreSQL的連通性)
- Check source version(檢查自建PostgreSQL的大版本)
- Check source glibc version(檢查自建PostgreSQL的GLIBC版本)
- Check disk size(檢查磁碟大小是否充足)
- Check wal keep size(檢查wal_keep_size大小)
- Check spec params(檢查規格參數)
- Check rds user(檢查RDS系統帳號是否在源端執行個體上被佔用)
- Check extensions(檢查外掛程式相容性)
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設定了防火牆,未設定資料庫連接埠允許被訪問。
解決辦法- 修改自建PostgreSQL的postgresql.conf檔案,配置
listen_addresses = '*'
。具體操作請參見配置postgresql.conf檔案。 - 設定防火牆,開放5432連接埠,或上雲前關閉防火牆。具體操作請參見設定管理員防火牆。
- 檢查內容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
說明
解決辦法
- 檢查表排序。
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(檢查磁碟大小是否充足)
檢查內容
Check disk size enough
error:source_db_size > disk_size * 0.95
說明
自建PostgreSQL資料庫的大小大於RDS PostgreSQL執行個體磁碟大小的95%,儲存空間不足。
解決辦法
- 使用如下命令查看自建PostgreSQL的儲存空間。
SELECT SUM(pg_database_size(pg_database.datname))/1024/1024 AS size FROM pg_database;
說明 該命令查詢結果單位為MB。 - 計算遷移上雲的RDS PostgreSQL執行個體需要的儲存空間大小。
例如:查詢自建PostgreSQL的儲存空間為100 GB,那麼,RDS PostgreSQL的儲存空間至少應調整為110 GB。
- 對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_size或wal_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倍,可能導致搭建複製鏈路過程中雲上執行個體無法啟動。
解決辦法
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的aurora
、replicator
和pgxxx
帳號將會被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。
解決辦法
無需處理,遷移上雲後,將會自動升級外掛程式版本。