本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 PostgreSQL 資料庫做為 AWS Database Migration Service的目標
您可以使用來自其他 PostgreSQL 資料庫或其他支援的資料庫之一 AWS DMS,將資料移轉至 PostgreSQL 資料庫。
如需有關 AWS DMS 支援做為目標之 PostgreSQL 版本的資訊,請參閱。的目標 AWS DMS
注意
-
Amazon Aurora 無伺服器可作為具有 PostgreSQL 相容性的 Amazon Aurora 的目標使用。如需亞馬遜 Aurora 無伺服器的詳細資訊,請參閱 Amazon Aurora 使用者指南中的使用 Amazon Aurora 無伺服器 v2。
-
您只能從 Amazon VPC 存取 Aurora Serverless 資料庫叢集,且此類叢集無法使用公有 IP 地址。因此,如果您打算將複寫執行個體放在與 Aurora PostgreSQL Serverless 不同的區域,則必須設定 vpc 對等互連。否則,請檢查 Aurora PostgreSQL Serverless 區域的可用性,並決定 Aurora PostgreSQL Serverless 和複寫執行個體要共同使用其中的哪一個區域。
-
Babelfish 功能內建於 Amazon Aurora 之中,不會產生額外費用。如需詳細資訊,請參閱使用 Babelfish for Aurora PostgreSQL 作為 AWS Database Migration Service的目標。
AWS DMS 在「滿載」階段將資料從來源移轉至目標時,會採用一 table-by-table 種方法。完全載入階段無法保證資料表的順序。資料表在完全載入階段不同步,同時會套用個別資料表的快取交易。因此,作用中的參考完整性限制條件會導致完全載入階段的任務失敗。
在 PostgreSQL 中,使用觸發實作外部索引鍵 (參考完整性限制條件)。在滿載階段,每次 AWS DMS 載入一個表格。我們強烈建議您使用下列方法之一,在完全載入階段停用外部索引鍵限制條件:
-
暫時停用執行個體的所有觸發,並完成完全載入。
-
在 PostgreSQL 中使用
session_replication_role
參數。
在任何指定的時間,觸發可為下列狀態之一:origin
、replica
、always
或 disabled
。當 session_replication_role
參數設為 replica
時,只有狀能為 replica
的觸發為作用中,只要呼叫就會觸發。否則,觸發會保持非作用中。
PostgreSQL 有故障安全防護裝置機制,即使設定了 session_replication_role
,也能防止資料表被截斷。您可以用此替代方法停用觸發,以利完成完全載入執行。若要執行此作業,請將目標資料表準備模式設定為 DO_NOTHING
。否則,當有外部索引鍵限制條件時,DROP 和 TRUNCATE 操作會失敗。
在 Amazon RDS 中,您可以控制使用參數群組設定此參數。針對在 Amazon EC2 上執行的 PostgreSQL 執行個體,您可以直接設定參數。
如需使用 PostgreSQL 資料庫做為目標的其他詳細資訊 AWS DMS,請參閱下列各節:
主題
使用 PostgreSQL 作為目標的限制 AWS Database Migration Service
使用 PostgreSQL 資料庫做為 AWS DMS目標時有下列限制:
-
對於異質遷移,JSON 資料類型會在內部轉換為原生 CLOB 資料類型。
-
在甲骨文到 PostgreSQL 的遷移中,如果甲骨文中的列包含一個空字符(十六進制值 U+0000),則將空字符 AWS DMS 轉換為空格(十六進制值 U+0020)。這是因 PostgreSQL 限制所致。
-
AWS DMS 不支持複製到具有使用 coalesce 函數創建的唯一索引的表。
-
如果您的資料表使用序列,請在停止來源資料庫複寫之後,更新目標資料庫中每個序列的值。
NEXTVAL
AWS DMS 複製來源資料庫中的資料,但不會在進行中的複寫期間將序列移轉至目標。
使用 PostgreSQL 資料庫做為目標時的安全性需求 AWS Database Migration Service
基於安全考量,用於資料遷移的使用者帳戶必須是您做為目標使用之任何 PostgreSQL 資料庫的註冊使用者。
您的 PostgreSQL 目標端點需要最低使用者權限才能執行 AWS DMS 移轉,請參閱下列範例。
CREATE USER newuser WITH PASSWORD 'your-password'; ALTER SCHEMA schema_name OWNER TO newuser;
或者
GRANT USAGE ON SCHEMA schema_name TO myuser; GRANT CONNECT ON DATABASE postgres to myuser; GRANT CREATE ON DATABASE postgres TO myuser; GRANT CREATE ON SCHEMA schema_name TO myuser; GRANT UPDATE, INSERT, SELECT, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA schema_name TO myuser; GRANT TRUNCATE ON schema_name."BasicFeed" TO myuser;
使用 PostgreSQL 做為目標時的端點設定和額外連線屬性 (ECA) AWS DMS
您可以使用端點設定和額外連線屬性 (ECA) 來設定 PostgreSQL 目標資料庫。
您可以在使用 AWS DMS 主控台建立目標端點時指定設定,或使用中的create-endpoint
命令以 --postgre-sql-settings '{"
JSON 語法指定設定。AWS CLIEndpointSetting
":
"value"
, ...
}'
您可以使用端點的ExtraConnectionAttributes
參數指定 ECA。
下列資料表顯示您可搭配 PostgreSQL 做為目標使用的端點設定。
名稱 | 描述 |
---|---|
|
針對用於將資料傳輸到 PostgreSQL 的任何 .csv 檔案,指定其大小上限 (KB)。 預設值:32,768 KB (32 MB) 有效值:1–1,048,576 KB (最多 1.1 GB) 範例: |
|
設定 PostgreSQL 執行個體的用戶端陳述式逾時,以秒為單位。預設值為 60 秒。 範例: |
|
此屬性具有 AWS DMS 略過外部索引鍵和使用者觸發程序,以減少大量載入資料所需的時間。 |
|
此參數會將具有無界限 NUMERIC 資料類型的資料欄視為 STRING,以便在不遺失數值精確度的情況下成功遷移。此參數僅適用於從 PostgreSQL 來源複寫到 PostgreSQL 目標,或是具有 PostgreSQL 相容性的資料庫。 預設值:false 有效值:false/true 範例: 由於使用此參數會進行從數值到字串再回到數值的轉換,因此可能會導致某些複寫效能降低。DMS 3.4.4 及更新版本支援此參數 注意
在 CDC 期間,在來源 PostgreSQL 端點上使用 請勿將 |
|
使用此「額外連線屬性」(ECA) 可使用\ COPY 命令傳輸完整載入作業的資料。 預設值: 有效值:true/false ECA 範例: 備註:將此 ECA 設定為 false 可能會因為直接執行 INSERT 而導致某些複寫效能降低。 |
|
使用此屬性可變更複寫對 Postgreql 相容端點的預設處理行為,這些端點需要一些額外的設定,例如 Babel fish 端點。 預設值: 有效值: 範例: |
|
使用此屬性可指定作為遷移目標的 Babelfish T-SQL 資料庫名稱。如果 範例: |
PostgreSQL 的目標資料類型
用於 AWS DMS 支援大多數 PostgreSQL 資料庫資料類型的 PostgreSQL 資料庫端點。下表顯示使用時所支援的 PostgreSQL 資料庫目標資料類型,以 AWS DMS 及來自 AWS DMS 資料類型的預設對應。
如需有關資 AWS DMS 料類型的其他資訊,請參閱AWS Database Migration Service 的資料類型。
AWS DMS 資料類型 |
PostgreSQL 資料類型 |
---|---|
BOOLEAN |
BOOLEAN |
BLOB |
BYTEA |
BYTES |
BYTEA |
DATE |
DATE |
TIME |
TIME |
DATETIME |
如果擴展是從 0 到 6,則使用 TIMESTAMP。 如果擴展是從 7 到 9,則使用 VARCHAR (37)。 |
INT1 |
SMALLINT |
INT2 |
SMALLINT |
INT4 |
INTEGER |
INT8 |
BIGINT |
NUMERIC |
DECIMAL (P,S) |
REAL4 |
FLOAT4 |
REAL8 |
FLOAT8 |
STRING |
如果長度是從 1 到 21,845,則使用 VARCHAR (長度為位元組)。 如果長度是從 21,846 到 2,147,483,647,則使用 VARCHAR (65535)。 |
UINT1 |
SMALLINT |
UINT2 |
INTEGER |
UINT4 |
BIGINT |
UINT8 |
BIGINT |
WSTRING |
如果長度是從 1 到 21,845,則使用 VARCHAR (長度為位元組)。 如果長度是從 21,846 到 2,147,483,647,則使用 VARCHAR (65535)。 |
NCLOB |
TEXT |
CLOB |
TEXT |
注意
從 PostgreSQL 來源複寫時,除了具有使用者定義資料類型的資料行以外,所有資料行都使用相同的資料類型 AWS DMS 建立目標資料表。在這種情況下,此資料類型在目標中會建立為「字元不相同」。
將巴貝魚用於 Aurora PostgreSQL 作為目標 AWS Database Migration Service
您可以使用 AWS Database Migration Service將 SQL 伺服器來源資料表遷移到 Babelfish for Amazon Aurora PostgreSQL 目標。透過 Babelfish,Aurora PostgreSQL 便可理解 T-SQL、Microsoft SQL 服務器的專有 SQL 方言,並支援相同的通訊協議。因此,針對 SQL Server 撰寫的應用程式現在只需較少的程式碼變更即可使用 Aurora。Babelfish 功能內建於 Amazon Aurora 之中,不會產生額外費用。您可以從 Amazon RDS 主控台啟用 Amazon Aurora 叢集上的 Babelfish。
使用 AWS DMS 主控台、API 或 CLI 命令建立 AWS DMS 目標端點時,請將目標引擎指定為 Amazon Aurora PostgreSQL,然後將資料庫命名為 babelfish_db。在端點設定區段中,新增設定以將 DatabaseMode
設定為 Babelfish
,並將 BabelfishDatabaseName
設定為目標 Babelfish T-SQL 資料庫的名稱。
將轉換規則新增至遷移任務
當您定義 Babelfish 目標的遷移任務時,必須納入轉換規則,才能確保 DMS 使用目標資料庫中預先建立的 T-SQL Babelfish 資料表。
首先,將轉換規則新增至您的遷移任務,使所有資料表名稱都變成小寫。Babelfish 會將您使用 T-SQL 建立的資料表名稱以小寫格式儲存在 PostgreSQL pg_class
目錄中。不過,當您有混合大小寫名稱的 SQL Server 資料表時,DMS 會使用 PostgreSQL 原生資料類型來建立資料表,而不是與 T-SQL 相容的資料類型。因此,請務必新增將所有資料表名稱都轉為小寫的轉換規則。請注意,欄名不應轉換為小寫。
接下來,如果您在定義叢集時使用了多資料庫遷移模式,請新增重新命名原始 SQL Server 結構描述的轉換規則。請務必重新命名 SQL Server 結構描述名稱,以便包含 T-SQL 資料庫的名稱。例如,如果原始 SQL Server 結構描述名稱為 dbo
,而您的 T-SQL 資料庫名稱為 mydb
,請使用轉換規則將結構描述重新命名為 mydb_dbo
。
如果您使用單一資料庫模式,則不需要轉換規則來重新命名結構描述名稱。結構描述名稱與巴貝魚中的目標 T-SQL 資料庫有一個 one-to-one 對應。
下列範例轉換規則會將所有資料表名稱設為小寫,並將原始 SQL Server 結構描述名稱從 dbo
重新命名為 mydb_dbo
。
{ "rules": [ { "rule-type": "transformation", "rule-id": "566251737", "rule-name": "566251737", "rule-target": "schema", "object-locator": { "schema-name": "dbo" }, "rule-action": "rename", "value": "mydb_dbo", "old-value": null }, { "rule-type": "transformation", "rule-id": "566139410", "rule-name": "566139410", "rule-target": "table", "object-locator": { "schema-name": "%", "table-name": "%" }, "rule-action": "convert-lowercase", "value": null, "old-value": null }, { "rule-type": "selection", "rule-id": "566111704", "rule-name": "566111704", "object-locator": { "schema-name": "dbo", "table-name": "%" }, "rule-action": "include", "filters": [] } ] }
將 PostgreSQL 目標端點與 Babelfish 資料表搭配使用的限制
將 PostgreSQL 目標端點與 Babelfish 資料表搭配使用時,將適用下列限制:
-
對於目標資料表準備模式,請僅使用不執行任何操作或截斷模式。請勿使用刪除目標中的資料表模式。在該模式下,DMS 會將資料表建立為 T-SQL 可能無法辨識的 PostgreSQL 資料表。
AWS DMS 不支援 sql_variant 資料類型。
-
Babelfish 不支援
HEIRARCHYID
、GEOMETRY
和GEOGRAPHY
資料類型。若要遷移這些資料類型,您可以新增轉換規則以將資料類型轉換為wstring(250)
。 -
Babelfish 僅支援使用
BYTEA
資料類型來遷移BINARY
、VARBINARY
和IMAGE
資料類型。對於舊版的 Aurora PostgreSQL,您可以使用 DMS 將這些資料表遷移到 Babelfish 目標端點。您不必指定BYTEA
資料類型的長度,如下列範例所示。[Picture] [VARBINARY](max) NULL
將先前的 T-SQL 資料類型變更為 T-SQL 支援的
BYTEA
資料類型。[Picture] BYTEA NULL
-
對於舊版的 Aurora PostgreSQL Babelfish,如果您使用 PostgreSQL 目標端點建立遷移任務,以從 SQL 伺服器進行中複寫到 Babelfish,則需要將
SERIAL
資料類型指派給任何使用IDENTITY
欄的資料表。從 Aurora PostgreSQL (版本 15.3/14.8 及更新版本) 和 Babelfish (3.2.0 及更新版本) 開始可支援身分資料欄,並且不再需要指派 SERIAL 資料類型。如需詳細資訊,請參閱《SQL Server 至 Aurora PostgreSQL 遷移操作手冊》中「序列和身分」一節中的「SERIAL 使用方法」。然後,當您在 Babelfish 中建立資料表時,請從以下內容更改資料欄定義。[IDCol] [INT] IDENTITY(1,1) NOT NULL PRIMARY KEY
將先前內容變更為下列內容。
[IDCol] SERIAL PRIMARY KEY
與 Babelfish 相容的 Aurora PostgreSQL 會使用預設組態建立序列,並將
NOT NULL
限制條件新增至資料欄。新建立的序列行為類似於一般序列 (以 1 遞增),且沒有複合SERIAL
選項。 -
遷移包含使用
IDENTITY
資料欄或SERIAL
資料類型的資料表資料後,請根據資料欄的最大值重設 PostgreSQL 型序列物件。執行資料表的完全載入後,請使用下列 T-SQL 查詢產生陳述式以植入相關聯的序列物件。DECLARE @schema_prefix NVARCHAR(200) = '' IF current_setting('babelfishpg_tsql.migration_mode') = 'multi-db' SET @schema_prefix = db_name() + '_' SELECT 'SELECT setval(pg_get_serial_sequence(''' + @schema_prefix + schema_name(tables.schema_id) + '.' + tables.name + ''', ''' + columns.name + ''') ,(select max(' + columns.name + ') from ' + schema_name(tables.schema_id) + '.' + tables.name + '));' FROM sys.tables tables JOIN sys.columns columns ON tables.object_id = columns.object_id WHERE columns.is_identity = 1 UNION ALL SELECT 'SELECT setval(pg_get_serial_sequence(''' + @schema_prefix + table_schema + '.' + table_name + ''', ''' + column_name + '''),(select max(' + column_name + ') from ' + table_schema + '.' + table_name + '));' FROM information_schema.columns WHERE column_default LIKE 'nextval(%';
查詢會產生一系列 SELECT 陳述式,您可以執行這些陳述式來更新 IDENTITY 值和 SERIAL 值的上限。
-
對於 3.2 版本之前的 Babelfish,完整 LOB 模式可能會導致資料表錯誤。如果發生這種情況,請為無法載入的資料表建立個別任務。接著使用有限 LOB 模式,為 LOB 大小上限 (KB) 指定適當的值。另一個選項是設定 SQL Server 端點連線屬性設定
ForceFullLob=True
。 -
對於 3.2 版本之前的 Babelfish,透過非使用整數型主索引鍵的 Babelfish 資料表執行資料驗證會產生一則訊息,表示找不到合適的唯一索引鍵。從 Aurora PostgreSQL (版本 15.3/14.8 及更新版本) 和 Babelfish (版本 3.2.0 及更新版本) 開始,支援非整數型主索引鍵的資料驗證。
-
由於秒的小數位數精確度差異,DMS 會針對使用
DATETIME
資料類型的 Babelfish 資料表報告資料驗證失敗。若要隱藏這些失敗,您可以針對DATETIME
資料類型新增下列驗證規則類型。{ "rule-type": "validation", "rule-id": "3", "rule-name": "3", "rule-target": "column", "object-locator": { "schema-name": "dbo", "table-name": "%", "column-name": "%", "data-type": "datetime" }, "rule-action": "override-validation-function", "source-function": "case when ${column-name} is NULL then NULL else 0 end", "target-function": "case when ${column-name} is NULL then NULL else 0 end" }