本章節介紹了一鍵升級RDS PostgreSQL至PolarDB PostgreSQL版的方案簡介、升級方式及其優勢、升級前提條件、使用限制、收費規則等。
升級方案概述
PolarDB支援將RDS PostgreSQL一鍵升級至PolarDB PostgreSQL版,升級後的PolarDB叢集包含源RDS執行個體的帳號資訊、資料庫、IP白名單。
您可以將RDS PostgreSQL遷移至相同或不同版本的PolarDB PostgreSQL版。如RDS PostgreSQL 11一鍵升級至PolarDB PostgreSQL版 14。
RDS PostgreSQL一鍵升級至PolarDB PostgreSQL版通過邏輯遷移(DTS資料同步)方式實現。
邏輯遷移(DTS資料同步)
通過Data Transmission Service,建立資料同步任務,將源RDS PostgreSQL執行個體的庫表結構和全量資料同步至建立的PolarDB PostgreSQL版叢集中,然後保持增量資料同步。
升級方案優勢
一鍵升級功能具有如下優勢:
可保留資料庫原串連地址,無需應用程式修改任何串連配置即可切換至PolarDB。
遷移完全免費,僅收取目標PolarDB叢集的費用。
遷移過程資料0丟失。
支援增量遷移,停機時間小於10分鐘。
支援線上熱遷移,遷移過程僅閃斷一次(即當業務從RDS切換至PolarDB時)。
支援復原,遷移失敗可以在10分鐘內恢複。
前提條件
一鍵升級僅支援源RDS PostgreSQL小於或等於目標PolarDB叢集版本。
如果源RDS建立了觸發器,請先刪除RDS的觸發器,再繼續遷移,或者手動去DTS控制台頁面建立遷移任務。具體可參見RDS PostgreSQL同步至PolarDB PostgreSQL版。
如果源RDS的串連地址開啟了SSL或TDE,則不允許一鍵升級到PolarDB。
若您的源RDS執行個體有其他不符合一鍵升級條件的問題,將會展示在PolarDB一鍵升級的售賣頁面上。樣本如下:
RDS PostgreSQL執行個體不可以為空白庫。
RDS PostgreSQL執行個體中不允許有帳號名為PolarDB PostgreSQL版不支援的格式。
必須存在名為AliyunServiceRoleForPolarDB的服務關聯角色。
max_replication_slots參數必須大於資料庫數量,即需要搭建的DTS雙向鏈路數量。max_wal_senders參數必須大於資料庫數量,即需要搭建的DTS雙向鏈路數量。資料庫數量必須小於等於30,即最多建立30條DTS雙向同步鏈路。
核心參數
wal_level必須為logical。
使用限制
僅支援將RDS PostgreSQL一鍵升級至相同版本或更高版本的PolarDB PostgreSQL版,不支援降版本升級。例如,不支援從RDS PostgreSQL 14版本一鍵升級至PolarDB PostgreSQL 11版本。
一鍵遷移任務將在目標PolarDB叢集自動建立一個格式為
dts_clone%的遷移帳號,密碼隨機產生。遷移期間,請勿修改帳號密碼或刪除帳號,否則將導致DTS同步失敗。完成遷移後您可以按需修改帳號密碼或者刪除帳號。一鍵升級的使用限制如下:
暫不支援跨地區遷移。
遷移期間不允許對源RDS執行個體執行參數設定的操作。
對源庫有如下限制:
類型
說明
源庫限制
待同步的表需具備主鍵或唯一約束,且欄位具有唯一性,否則可能會導致目標資料庫中出現重複資料。
若同步對象為表層級,且需進行編輯(如表列名映射),單次同步任務的表數量超過5000時,建議您拆分待同步的表,分批配置多個任務,或者配置整庫的同步任務,否則任務提交後可能會顯示請求報錯。
WAL日誌:
需開啟,即設定
wal_level參數的值為logical。如為增量同步處理任務,DTS要求來源資料庫的WAL日誌儲存24小時以上,如為全量同步和增量同步處理任務,DTS要求來源資料庫的WAL日誌至少保留7天以上(您可在全量同步完成後將WAL日誌儲存時間設定為24小時以上),否則DTS可能因無法擷取WAL日誌而導致任務失敗,極端情況下甚至可能會導致資料不一致或丟失。由於您所設定的WAL日誌儲存時間低於DTS要求的時間進而導致的問題,不在DTS的SLA保障範圍內。
同步期間,請勿修改RDS PostgreSQL的串連地址和可用性區域,否則會導致同步失敗。
若源庫有長事務,且執行個體包含增量同步處理任務,則可能會導致源庫長事務提交前的預寫記錄檔WAL(Write-Ahead Logging)無法清理而堆積,從而造成源庫磁碟空間不足。
SQL語句限制:
操作類型
SQL語句
DML
INSERT、UPDATE、DELETE
DDL
同步任務支援如下DDL,且來源資料庫帳號需為高許可權帳號,RDS PostgreSQL的核心小版本需大於或等於20210228,小版本的升級方式,請參見升級核心小版本。
CREATE TABLE、DROP TABLE
ALTER TABLE(包括RENAME TABLE、ADD COLUMN、ADD COLUMN DEFAULT、ALTER COLUMN TYPE、DROP COLUMN、ADD CONSTRAINT、ADD CONSTRAINT CHECK、ALTER COLUMN DROP DEFAULT)
TRUNCATE TABLE(源庫PostgreSQL為PostgreSQL 11及以上版本)
CREATE INDEX ON TABLE
重要不支援同步DDL中包含的附加資訊,如CASCADE或RESTRICT等。
不支援同步使用
SET session_replication_role = replica命令的會話中的DDL。若源庫單次提交的多條SQL中同時包含DML和DDL,則該DDL不會被同步。
若源庫單次提交的多條SQL中包含非同步對象的DDL,則該DDL不會被同步。
其他限制:
類型
說明
其他限制
單個資料同步任務只能同步一個資料庫,如需同步多個資料庫,一鍵遷移會為每個資料庫配置資料同步任務。
同步期間,如果同步對象的選擇粒度為Schema,在待同步的Schema中建立了新的表或使用
RENAME命令重建了待同步的表,您需要在對該表寫入資料前執行ALTER TABLE schema.table REPLICA IDENTITY FULL;命令,以保障該表資料同步的一致性。執行該命令期間,建議您不要有鎖表操作,否則會導致表鎖死。說明實際操作時,請將上述命令中的schema和table替換成真實的Schema名和表名。
建議您在業務低峰期進行操作。
DTS會在源庫中建立以下暫存資料表,用於擷取增量資料的DDL、增量表的結構、心跳資訊等。在同步期間,請勿刪除源庫中的暫存資料表,否則會導致DTS任務異常。暫存資料表會在DTS執行個體釋放後自動刪除。
public.dts_pg_class、public.dts_pg_attribute、public.dts_pg_type、public.dts_pg_enum、public.dts_postgres_heartbeat、public.dts_ddl_command、public.dts_args_session為保障同步延遲時間展示的準確性,DTS會在源庫中新增一個名為
dts_postgres_heartbeat的心跳錶。同步期間,DTS會在源庫中建立首碼為
dts_sync_的replication slot用於複製資料。DTS會每隔120分鐘自動清理一次歷史replication slot,避免其持續累積佔用磁碟空間。說明DTS釋放執行個體後會主動刪除該replication slot,如果您在同步期間修改了資料庫密碼,或者刪除了DTS的訪問IP白名單,則會導致該replication slot無法自動刪除,此時需要您在源庫中手動刪除,避免其持續累積佔用磁碟空間導致RDS PostgreSQL執行個體不可用。
當釋放同步任務或同步失敗時,DTS會主動清理該replication slot;如果PostgreSQL發生了主備切換,則需要您登入備庫來手動清理。
執行資料同步前需評估源庫和目標庫的效能,同時建議業務低峰期執行資料同步。否則全量資料初始化時將佔用源庫和目標庫一定的讀寫資源,可能會導致資料庫的負載上升。
全量初始化會並發執行
INSERT操作,導致目標資料庫的表產生片段,因此全量初始化完成後目標執行個體的資料表空間比源執行個體的資料表空間大。對於表層級的資料同步,如果除DTS以外的資料沒有寫入目標庫,您可以使用Data Management(Data Management)來執行線上DDL變更,請參見通過無鎖變更工單實現無鎖結構變更。
在DTS同步期間,不允許有除DTS外的資料寫入目標庫,否則會導致源庫與目標庫資料不一致。例如,有除DTS外的資料寫入目標庫時,使用DMS執行線上DDL變更,可能引起目標庫資料丟失。
DTS的校正對象為資料內容,暫不支援Sequence等中繼資料的校正,您需要自行校正。
由於業務切換到目標端後,新寫入的Sequence不會按照源庫的Sequence最大值作為初始值去遞增,您需要在業務切換前,在源庫中查詢對應Sequence的最大值,然後在目標庫中將其作為對應Sequence的初始值。查詢源庫Sequence值的相關命令如下:
do language plpgsql $$ declare nsp name; rel name; val int8; begin for nsp,rel in select nspname,relname from pg_class t2 , pg_namespace t3 where t2.relnamespace=t3.oid and t2.relkind='S' loop execute format($_$select last_value from %I.%I$_$, nsp, rel) into val; raise notice '%', format($_$select setval('%I.%I'::regclass, %s);$_$, nsp, rel, val+1); end loop; end; $$;
收費規則
一鍵升級的收費規則如下:
您除了需承擔購買PolarDB叢集的費用之外,還需承擔DTS所建立的同步任務產生的費用。但現階段該功能處於試用階段,建立的同步任務30天內不收取任何費用。具體如下:
遷移對象 | 費用 |
庫表結構同步和全量資料同步 | 建立同步任務後,30天內不收取任何費用。 超過30天后,將會取消建立的同步任務,因此也不會產生費用。 說明 您可以登入PolarDB控制台,在基本資料頁面的RDS遷移功能地區查看同步任務的剩餘時間。 |
增量資料同步 |
帶地址切換
一鍵升級RDS至PolarDB時支援帶地址切換,系統會自動交換RDS和PolarDB上的串連地址,您無需在應用程式端修改任何配置即可自動連接到PolarDB。選擇該切換方式後,RDS串連地址對應的PolarDB串連地址如下圖所示。
使用帶地址切換功能時,需注意以下幾點:
帶地址切換隻會切換RDS和PolarDB的網域名稱,Vswitch、Vip等配置不會切換。
僅當源RDS和目標PolarDB叢集同時存在的串連地址才支援相互切換,預設情況下僅私網主地址支援帶地址切換。
帶地址切換時,RDS和PolarDB的主地址一定會切換,RDS的獨享Proxy 位址及唯讀地址可以和PolarDB的預設叢集地址及自訂地址切換,可以選擇不切換或切換多組。由於PolarDB最多可以建立7個叢集地址,因此最多隻支援7組RDS獨享Proxy 位址及唯讀地址的切換。
如需切換其他串連地址,您需在切換前建立好對應的串連地址,否則不會切換。關於如何為PolarDB叢集和RDS執行個體建立串連地址,請參見管理串連地址和設定串連地址。
帶地址切換不會切換連接埠,一鍵升級時建立的PolarDB叢集,除自訂地址連接埠外,其他連接埠均與RDS對應地址的連接埠一致,如需修改連接埠,請參見查看和管理執行個體串連地址和連接埠。
切換網域名稱後,可能會存在DNS解析緩衝問題,在緩衝到期時間內可能會出現串連不上資料庫或資料庫只支援讀操作無法執行寫入操作等情況,建議您重新整理一下伺服器的DNS緩衝。
切換網域名稱後,如果您需要使用DMS登入PolarDB資料庫,必須使用新版本的DMS並且使用叢集ID來進行登入,串連串無法登入。