簡體   English   中英

PostgreSQL 使用 AWS DMS 遷移后主鍵序列丟失

[英]PostgreSQL Primary Key sequence lost after migration using AWS DMS

我最近使用 AWS 遷移服務將一個自托管的 Postgres 數據庫遷移到 AWS RDS。
Postgres 版本:10.6

我注意到我所有的主鍵不再設置為“序列”,當我嘗試手動添加一個序列時,它從 1 開始,而不是繼續已經設置的計數。

我在數據庫中使用 Rails,所以我的 sql 技能很低。 我通常可以找到插入和更新的方法,但這不是我有很多經驗的 realm。

我的問題有兩部分:

  1. 如何修復單個表? 在繼續之前,我想了解並測試我在做什么。
  2. 有沒有一種方法可以將此修復程序應用到我擁有的每個表而無需手動修改每個表?

在@a_horse_with_no_name指向正確的方向並與AWS聊天之后,我能夠回答我自己的問題,至少在您使用AWS數據庫遷移服務(DMS)時。

問題是,DMS只關注數據本身,而不是模式(這對我來說似乎是一個主要的疏忽,特別是如果你使用相同的數據庫技術但這是另一個問題)。 因此,架構本身不會遷移。 文檔並沒有真正說明這一點。

要解決此問題:

  1. 停止(如果它仍然存在)現有的AWS DMS遷移
  2. 刪除現有的遷移數據庫,並創建要使用的新空模式
  3. 按照https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Installing.html中的步驟安裝和設置Amazon Schema Conversation Tool(SCT)
  4. 一旦連接到兩個數據庫,請按照此處的步驟https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Converting.html “轉換”您的架構(我為此完成了整個“公共”架構數據庫,以確保涵蓋所有內容
  5. 創建或修改AWS DMS遷移,確保目標表准備模式=“TRUNCATE”並禁用目標數據庫上的外鍵。 如果修改,請確保在被要求“恢復”時不恢復

我尚未測試的是如何處理我正在遷移實時數據庫的事實。 因此,遷移完成后,目標數據庫上的序列可能已過時。 我相信我可以稍后進入SCT並只遷移序列,但我還沒有測試過。

除非你錯過了什么和遷移可以處理一次(使用不同的參數?我從來沒有使用AWS遷移服務,但我相信它應該保持serial的列-iness ......),你就需要重新創建序列也是。


我大約一年前遇到過類似的情況,並在SO上寫下了這個答案

這是它的要點:

CREATE SEQUENCE foo_a_seq OWNED BY foo.a;
SELECT setval('foo_a_seq', coalesce(max(a), 0)) FROM foo;
ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq'); 

這將創建一個序列foo_a_seq ,其nextvalfoo.amax1如果沒有foo記錄, foo.a 1 )。

我還繼續設置一個Function來快速應用於所有需要的表/列:

CREATE OR REPLACE FUNCTION make_into_serial(table_name TEXT, column_name TEXT) RETURNS INTEGER AS $$
DECLARE
    start_with INTEGER;
    sequence_name TEXT;
BEGIN
    sequence_name := table_name || '_' || column_name || '_seq';
    EXECUTE 'SELECT coalesce(max(' || column_name || '), 0) + 1 FROM ' || table_name
            INTO start_with;
    EXECUTE 'CREATE SEQUENCE ' || sequence_name ||
            ' START WITH ' || start_with ||
            ' OWNED BY ' || table_name || '.' || column_name;
    EXECUTE 'ALTER TABLE ' || table_name || ' ALTER COLUMN ' || column_name ||
            ' SET DEFAULT nextVal(''' || sequence_name || ''')';
    RETURN start_with;
END;
$$ LANGUAGE plpgsql VOLATILE;

像這樣使用它:

SELECT make_into_serial('foo', 'a');

Sequence、Index 和 Constraint 沒有遷移,AWS 官方文檔中提到了。

你可以使用這個來源 這將幫助您一次遷移序列、索引和約束。

對於使用 macOS 且無法使用上述答案之一中建議的 SchemaConversionTool 的任何人,請按照以下步驟操作:

  1. 清空目標數據庫中的模式以重新開始

    刪除架構公開;

  2. 生成一個 SQL 腳本,其中包含來自源數據庫模式的所有 DDL 語句。 如果您使用 dbeaver 然后右鍵單擊模式名稱並單擊生成 SQL 生成sql

  3. 在目標數據庫中運行步驟 2 生成的 SQL 腳本中的命令,以便模式現在彼此同步

  4. Go 到 AWS DMS 並啟動目標表准備模式設置為截斷的任務

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM