全部產品
Search
文件中心

:使用pg_dump和pg_restore將自建PostgreSQL資料庫遷移至RDS PostgreSQL

更新時間:Nov 28, 2024

如果您準備將自建PostgreSQL資料庫的指定資料庫遷移到RDS PostgreSQL執行個體,同時您已經熟悉pg_dump和pg_restore工具,暫時不希望瞭解和使用阿里雲提供的其他遷移服務(RDS PostgreSQL一鍵上雲功能或資料轉送DTS服務)時,您可以參考本文檔完成資料庫遷移工作。

前提條件

  • 已建立與自建PostgreSQL大版本相同的RDS PostgreSQL執行個體,具體操作,請參見建立RDS PostgreSQL執行個體

    說明
    • 使用pg_dump和pg_restore遷移資料庫時,建議自建PostgreSQL與RDS PostgreSQL執行個體的大版本相同,以避免相容問題。

    • 您可以在自建PostgreSQL資料庫所在的伺服器中,使用psql --version命令查詢自建資料庫的版本。

    • 如果您需要升級大版本,可以在遷移完成後,使用大版本升級功能進行升級,更多資訊,請參見升級資料庫大版本

    • 如果自建的PostgreSQL資料庫伺服器位於阿里雲ECS,建議在與ECS相同的地區和VPC中建立RDS PostgreSQL執行個體。使用內網串連進行資料移轉將更快速且更安全。

  • RDS PostgreSQL執行個體已配置白名單,允許自建PostgreSQL資料庫所在伺服器訪問,具體操作,請參見設定白名單

  • RDS PostgreSQL執行個體已建立高許可權帳號,具體操作,請參見建立帳號

  • 已擷取RDS PostgreSQL執行個體的串連地址和連接埠,具體操作,請參見查看或修改串連地址和連接埠

    說明

    如果自建PostgreSQL資料庫的伺服器是阿里雲ECS,且與RDS PostgreSQL在同一地區同一VPC,則擷取RDS PostgreSQL執行個體的內網串連地址和連接埠,否則,擷取外網地址和連接埠。

  • 自建PostgreSQL資料庫已建立superuser許可權的管理員帳號。

  • 自建PostgreSQL資料庫所在伺服器已安裝pg_dump和pg_restore。

    說明

    在本地安裝自建PostgreSQL時,預設安裝pg_dump和pg_restore。您可以通過pg_dump --versionpg_restore --version命令查詢。

操作步驟

本方案適合於單庫遷移。如果需要遷移多個庫或整個自建PostgreSQL資料庫,請參照如下方案處理。

  • 將自建PostgreSQL資料庫中的部分庫一次性遷移到RDS PostgreSQL時,建議使用資料庫傳輸DTS進行遷移,更多資訊,請參見使用DTS將自建PostgreSQL遷移至RDS PostgreSQL

  • 將整個自建PostgreSQL資料庫遷移上雲時,建議使用RDS PostgreSQL提供的一鍵上雲功能,更多資訊,請參見一鍵上雲

步驟一:確認待遷移資料庫的相關資訊

串連自建PostgreSQL資料庫,在psql命令列中,使用\l查詢資料庫列表資訊,確認待遷移資料庫的OwnerEncodingCollateCtype資訊。

本文以遷移testdb資料庫為例,OwnertestuserEncodingUTF8Collateen_US.UTF-8Ctypeen_US.UTF-8

                                                 List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    | ICU Locale | Locale Provider |   Access privileges
-----------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =Tc/postgres         +
           |          |          |             |             |            |                 | postgres=CTc/postgres
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/postgres          +
           |          |          |             |             |            |                 | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/postgres          +
           |          |          |             |             |            |                 | postgres=CTc/postgres
 testdb    | testuser | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |
(4 rows)

步驟二:遷移使用者

  1. 串連自建PostgreSQL資料庫所在的伺服器,使用如下命令匯出待遷移資料庫的Owner使用者testuser

    pg_dumpall -g -h 127.0.0.1 -p 5432 -U testuser

    返回結果樣本:

    說明

    在返回結果中的Roles部分,即可看到匯出使用者testuser的相關許可權語句。

    --
    -- PostgreSQL database cluster dump
    --
    
    SET default_transaction_read_only = off;
    
    SET client_encoding = 'UTF8';
    SET standard_conforming_strings = on;
    
    --
    -- Roles
    --
    
    CREATE ROLE postgres;
    ALTER ROLE postgres WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS;
    CREATE ROLE testuser;
    ALTER ROLE testuser WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS PASSWORD 'SCRAM-SHA-256$4096:0IEvNqWupQsGcaoDS3SX****3U=';
    
    --
    -- User Configurations
    --
    
    --
    -- PostgreSQL database cluster dump complete
    --
  2. 使用高許可權帳號串連RDS PostgreSQL執行個體,具體操作,請參見串連PostgreSQL執行個體

  3. 修改擷取的testuser使用者的相關許可權SQL語句(將SUPERUSER修改為rds_SUPERUSER),在RDS PostgreSQL執行個體中建立與自建PostgreSQL許可權相同的帳號。

    CREATE ROLE testuser;
    ALTER ROLE testuser WITH rds_SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS PASSWORD 'SCRAM-SHA-256$4096:0IEvNqWupQsGcaoDS3SX****3U=';

步驟三:在RDS PostgreSQL中建立目標資料庫

  1. 使用高許可權帳號串連RDS PostgreSQL執行個體。

  2. 使用如下SQL語句,建立目標資料庫,需要確保與自建PostgreSQL中待遷移資料庫具有相同字元集、Collate和Ctype。例如步驟一中擷取的EncodingUTF8Collateen_US.UTF-8Ctypeen_US.UTF-8

    CREATE DATABASE <目標資料庫的名稱> WITH OWNER <資料庫Owner名稱> TEMPLATE template0 ENCODING 'UTF8' LC_CTYPE 'en_US.UTF-8' LC_COLLATE 'en_US.UTF-8';
    說明
    • 目標資料庫名稱可以與自建PostgreSQL中待遷移資料庫名稱不同。

    • 目標資料庫的Owner必須與自建PostgreSQL中遷移資料庫Owner相同。

步驟四:資料移轉

本文提供如下資料移轉方案,任選其一即可。

  • 如果您的自建PostgreSQL資料庫所在伺服器可以直接連接RDS PostgreSQL資料庫,則推薦使用線上遷移方式。

  • 如果您的自建PostgreSQL資料庫所在伺服器無法直接連接RDS PostgreSQL資料庫,則推薦使用離線遷移方式,先使用pg_dump匯出檔案,然後將檔案拷貝到能串連RDS PostgreSQL的主機,最後使用pg_restore匯入。

線上遷移

  1. 配置密碼檔案。更多資訊,請參見The Password File

    1. 在自建PostgreSQL資料庫所在伺服器執行如下命令建立並編輯.pgpass檔案,用於儲存密碼。

      vi ~/.pgpass
    2. i進入編輯模式,輸入如下密碼相關內容。

      說明
      • 格式為host:port:dbname:username:password

      • dbname和username必須小寫,因為PostgreSQL中繼資料預設使用小寫字母儲存, 除非您的資料庫和使用者在建立時使用雙引號包括並且大寫。

      RDS PostgreSQL串連地址:5432:目標資料庫名:目標資料庫Owner使用者名稱:密碼
      127.0.0.1:5432:自建PostgreSQL待遷移資料庫名:superuser使用者名稱:密碼
    3. Esc,輸入:wq退出編輯模式。

    4. 修改.pgpass檔案許可權。

      chmod 700 ~/.pgpass
  2. 在自建PostgreSQL資料庫所在伺服器執行如下命令遷移資料。

    nohup pg_dump -F p -h 127.0.0.1 -p 5432 -U <自建資料庫superuser使用者> -d <待遷移資料庫> --no-tablespaces | time psql -h <RDS PostgreSQL執行個體串連地址> -p 5432 -U <目標資料庫Owner使用者名稱> --single-transaction <目標資料庫> > ./pg.dump.log 2>&1 & 
    說明
    • 您可以查看pg.dump.log檔案檢查是否存在錯誤記錄檔,如果該檔案為空白,則表示遷移成功,可以前往RDS PostgreSQL執行個體查看遷移後的資料。

    • 上述命令中設定了--single-transaction選項,在恢複資料庫時將所有操作封裝在一個事務中,確保恢複操作要麼全部成功,要麼全部失敗,因此解決報錯後可以直接重新匯入。

離線遷移

  1. 在自建PostgreSQL資料庫所在伺服器執行如下命令匯出檔案。

    nohup pg_dump -F c -h 127.0.0.1 -p 5432 -U <自建資料庫superuser使用者> -d <待遷移資料庫> --no-tablespaces -f ./pg.dump > ./pg.dump.log 2>&1 &
    說明

    等待匯出完成,檢查pg.dump.log檔案,確認沒有報錯。

  2. pg.dump檔案拷貝到可以串連RDS PostgreSQL執行個體的主機上,執行如下命令匯入檔案。

    說明

    使用此方案時,需要為RDS PostgreSQL執行個體配置白名單,允許該主機訪問RDS PostgreSQL,具體操作,請參見設定白名單

    • 單線程匯入。

      pg_restore -h <RDS PostgreSQL串連地址> -p 5432 -U <目標資料庫Owner使用者名稱> -d <目標資料庫> --no-tablespaces --single-transaction  pg.dump  >./pg.restore.log
      說明
      • 耐心等待匯入結束,您可以查看pg.restore.log檔案檢查是否存在錯誤記錄檔,如果該檔案為空白,則表示遷移成功,可以前往RDS PostgreSQL執行個體查看遷移後的資料。

      • 上述命令中設定了--single-transaction選項,在恢複資料庫時將所有操作封裝在一個事務中,確保恢複操作要麼全部成功,要麼全部失敗,因此解決報錯後可以直接重新匯入。

    • 多線程並行匯入。

      pg_restore -h <RDS PostgreSQL串連地址> -p 5432 -U <目標資料庫Owner使用者名稱> -d <目標資料庫> --no-tablespaces -j <並行線程數> pg.dump  >./pg.restore.log 2>&1 &
      說明
      • 並行參數-j--single-transaction參數不能同時使用。

      • 參數-j的取值範圍為正整數,但推薦的最大值為系統CPU核心數的兩倍或四倍。這樣可以確保充分利用系統資源,同時避免過多的並行任務導致資源競爭和效能下降。

      • 因為此方式未使用--single-transaction參數進行事務封裝,因此一旦恢複過程中報錯,則在解決報錯後,需要在RDS PostgreSQL側清空目標資料庫下的所有表,再重新開始匯入,以確保資料一致性。

相關文檔

本文涉及的命令均可根據業務需求配置更多相關參數,具體詳見如下官方文檔:

本方案適合於單庫遷移。如果需要遷移多個庫或整個自建PostgreSQL資料庫,請參照如下方案處理。

  • 將自建PostgreSQL資料庫中的部分庫一次性遷移到RDS PostgreSQL時,建議使用資料庫傳輸DTS進行遷移,更多資訊,請參見使用DTS將自建PostgreSQL遷移至RDS PostgreSQL

  • 將整個自建PostgreSQL資料庫遷移上雲時,建議使用RDS PostgreSQL提供的一鍵上雲功能,更多資訊,請參見一鍵上雲