如果您準備將自建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 --version
和pg_restore --version
命令查詢。
操作步驟
本方案適合於單庫遷移。如果需要遷移多個庫或整個自建PostgreSQL資料庫,請參照如下方案處理。
將自建PostgreSQL資料庫中的部分庫一次性遷移到RDS PostgreSQL時,建議使用資料庫傳輸DTS進行遷移,更多資訊,請參見使用DTS將自建PostgreSQL遷移至RDS PostgreSQL。
將整個自建PostgreSQL資料庫遷移上雲時,建議使用RDS PostgreSQL提供的一鍵上雲功能,更多資訊,請參見一鍵上雲。
步驟一:確認待遷移資料庫的相關資訊
串連自建PostgreSQL資料庫,在psql命令列中,使用\l
查詢資料庫列表資訊,確認待遷移資料庫的Owner、Encoding、Collate和Ctype資訊。
本文以遷移testdb
資料庫為例,Owner為testuser
、Encoding為UTF8
、Collate為en_US.UTF-8
、Ctype為en_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)
步驟二:遷移使用者
串連自建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 --
使用高許可權帳號串連RDS PostgreSQL執行個體,具體操作,請參見串連PostgreSQL執行個體。
修改擷取的
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中建立目標資料庫
使用高許可權帳號串連RDS PostgreSQL執行個體。
使用如下SQL語句,建立目標資料庫,需要確保與自建PostgreSQL中待遷移資料庫具有相同字元集、Collate和Ctype。例如步驟一中擷取的Encoding為
UTF8
、Collate為en_US.UTF-8
、Ctype為en_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匯入。
線上遷移
配置密碼檔案。更多資訊,請參見The Password File。
在自建PostgreSQL資料庫所在伺服器執行如下命令建立並編輯.pgpass檔案,用於儲存密碼。
vi ~/.pgpass
按
i
進入編輯模式,輸入如下密碼相關內容。說明格式為
host:port:dbname:username:password
。dbname和username必須小寫,因為PostgreSQL中繼資料預設使用小寫字母儲存, 除非您的資料庫和使用者在建立時使用雙引號包括並且大寫。
RDS PostgreSQL串連地址:5432:目標資料庫名:目標資料庫Owner使用者名稱:密碼 127.0.0.1:5432:自建PostgreSQL待遷移資料庫名:superuser使用者名稱:密碼
按
Esc
,輸入:wq
退出編輯模式。修改
.pgpass
檔案許可權。chmod 700 ~/.pgpass
在自建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
選項,在恢複資料庫時將所有操作封裝在一個事務中,確保恢複操作要麼全部成功,要麼全部失敗,因此解決報錯後可以直接重新匯入。
離線遷移
在自建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檔案,確認沒有報錯。
將
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提供的一鍵上雲功能,更多資訊,請參見一鍵上雲。