本章節介紹將下載的RDS for PostgreSQL全量備份文件恢復到自建PostgreSQL數據庫的操作步驟。
如果您希望在本地重新建立一個同樣體量PostgreSQL數據庫,并且將RDS for PostgreSQL數據全部遷移,可以使用本章節操作將下載的.tar.gz文件在本地進行重建。
操作流程
1. 下載RDS for PostgreSQL實例中對應時間點的全備文件。
2. 將全備文件上傳到本地用以重建數據庫。
3. 使用tar解壓工具將全備文件解壓。
4. 保留自建數據庫相關配置文件并通過os命令將解壓的全備文件覆蓋到自建數據庫的data目錄中。
5. 重啟數據庫,等待數據庫恢復完成。
約束限制
本章節僅使用從RDS for PostgreSQL所有版本實例下載的全量備份文件在本地恢復到對應版本自建數據庫,不包括增量備份的恢復操作。
自建PostgreSQL數據庫內核小版本需與RDS for PostgreSQL版本號一致。
通過psql -V或psql --version命令,可以查看PostgreSQL內核版本。
僅支持恢復到本地為Linux操作系統的數據庫,系統上需要安裝tar解壓工具。
通過sudo yum install tar命令安裝tar解壓工具。
在進行恢復階段請勿在本地自建數據庫運行其他業務或保留業務數據。
RDS for PostgreSQL有部分增強特性(如Failover Slot等),使用云上的物理備份恢復到開源自建數據庫時執行部分SQL報錯,需要將用到的增強特性刪除,詳見常見問題。
本地自建數據庫的操作系統與云數據庫的操作系統可能不一致,而PostgreSQL數據庫部分索引的排序規則依賴操作系統,恢復到自建數據庫后需要重建索引,需要重建的索引排查方法見。
步驟一:在RDS for PostgreSQL下載全量備份文件
RDS for PostgreSQL實例會在固定時間進行自動全備任務,也可以由您指定時間進行手動全備任務,其生成的.tar.gz文件支持下載以及在本地進行恢復自建數據庫。
1. 您可以在RDS界面單擊實例名稱,選擇“備份恢復 > 全量備份 > 下載”,詳見下載實例級備份文件。
2. 通過文件傳輸工具(例如WinSCP)將全備文件上傳到本地PostgreSQL庫所在的Linux設備。
步驟二:使用備份文件恢復數據到自建PostgreSQL
使用說明
以下步驟請根據實際情況修改:
1. RDS for PostgreSQL備份文件解壓前后建議存放在不同目錄下。
? 解壓前文件:/home/postgres/全備文件.tar.gz
? 解壓后目錄:/home/postgres/backuprds
2. “/home/postgres/backuplocal”目錄存放本地PostgreSQL數據庫“data”目錄下的兩個配置文件“postgresql.conf”和“pg_hba.conf”。
3. 使用postgres用戶作為本地PostgreSQL數據庫的安裝用戶。
4. 使用$PGDATA代替本地PostgreSQL數據庫“data”目錄,執行以下命令獲取本地PostgreSQL數據庫“data”目錄。
su - postgres
psql --host=localhost --port=<DB_PORT> --dbname=postgres --username=postgres -c "show data_directory;"
DB_PORT為本地自建數據庫實例的端口,默認值為5432,請以實際配置為準。
操作步驟
1. 切換至postgres用戶并創建一個臨時目錄“backuprds”,以下所有步驟使用postgres用戶執行。
su - postgres
mkdir /home/postgres/backuprds
2. 停止本地PostgreSQL數據庫服務。
pg_ctl stop -D $PGDATA
3. 創建臨時目錄保存本地PostgreSQL數據庫data目錄下的兩個配置文件(“postgresql.conf”、“pg_hba.conf”)。
mkdir /home/postgres/backuplocal
cp $PGDATA/pg_hba.conf $PGDATA/postgresql.conf /home/postgres/backuplocal
4. 清空本地數據庫的“data”目錄。
注意
操作前請確保“$PGDATA/”目錄下的數據已經不再需要,請謹慎操作。
執行ls -l $PGDATA查看“$PGDATA/”目錄下的文件。
rm -rf $PGDATA/*
5. 執行如下命令,將備份解壓到1中準備的目錄。
說明
若使用root用戶上傳RDS for PostgreSQL備份文件到“/home/postgres/全備文件.tar.gz”,該文件會存在權限問題,需要修改該文件屬主。
1. 執行sudo su切換至root用戶。
2. 執行chown -R postgres:postgres /home/postgres/全備文件.tar.gz修改該文件屬主為postgres用戶。
3. 執行su - postgres切換回postgres用戶。
tar -zxf /home/postgres/全備文件.tar.gz -C /home/postgres/backuprds
解壓后會在“/home/postgres/backuprds”目錄下產生以下目錄:
? 一個“base”目錄,存放全量文件。
? 一個“pg_wal”目錄,為增量文件目錄。如果PostgreSQL版本為9.x,則為“pg_xlog”目錄。
? N個以數字命名的表空間目錄(如果原備份存在表空間文件)。
6. 將5和3中的文件按順序拷貝到本地數據庫指定目錄下。
a. 將解壓出來的“base”目錄下的文件,全部拷貝到本地數據庫“data”目錄,然后用3中保存的配置文件,覆蓋本地數據庫“data”目錄下的兩個文件。
cp -r /home/postgres/backuprds/base/* $PGDATA
cp -r /home/postgres/backuplocal/* $PGDATA
b. 將解壓出來的“pg_wal”目錄(如果PostgreSQL版本為9.x,則為“pg_xlog”目錄)下的文件,拷貝到本地數據庫“data”下的“pg_wal”目錄(如果PostgreSQL版本為9.x,則為“pg_xlog”目錄)。
cp -r /home/postgres/backuprds/pg_wal/* $PGDATA/pg_wal
c. (可選)如果原備份存在表空間文件,修改“data/tablespace_map”文件中對應的表空間軟鏈接信息:
復制表空間文件到“/tmp/tblspc/”目錄下。
若解壓文件中存在多個表空間目錄,請多次執行cp -r /home/postgres/backuprds/$table_space /tmp/tblspc命令,確保所有表空間復制到“/tmp/tblspc”目錄。
mkdir /tmp/tblspc
cp -r /home/postgres/backuprds/$table_space /tmp/tblspc
$table_space為5中解壓出的以數字命名的表空間名稱。
刪除本地數據庫“data”目錄“/tablespace_map”文件。
rm -rf $PGDATA/tablespace_map
添加本地數據庫“data”目錄“/tablespace_map”文件的配置信息,若解壓文件中存在多個表空間目錄請多次執行以下命令,確保表空間軟鏈接信息配置完整。
echo "$table_space /tmp/tblspc/$table_space" >> $PGDATA/tablespace_map
7. 重新啟動數據庫,等待數據庫恢復完成。
pg_ctl start -D $PGDATA
說明
如果備份期間云數據庫有較大的寫業務,“pg_wal”目錄下會有較多的WAL日志,數據庫啟動時回放WAL的時間可能較長,啟動命令可能會超時失敗。
執行ps uxwwf | grep 'startup'命令查看startup進程的狀態來判斷當前恢復的進度。
常見問題
恢復數據
Q:如果沒有備份該如何恢復數據?
A:通過DRS遷移數據,詳見將PostgreSQL同步到PostgreSQL。
備份恢復操作
Q1:使用云數據庫備份文件恢復自建數據庫,數據庫啟動失敗,報錯信息“replication slot file xxx has corrupted length xxx”,如何處理?
A:手動刪除“pg_replslot”目錄下的所有文件和文件夾,刪除完成后啟動數據庫。
Q2:常見報錯“could not locate a valid checkpoint record”的原因,以及如何處理?
A:該錯誤通常表示數據庫中的檢查點記錄已損壞或丟失,導致無法恢復數據庫。一般情況下是wal日志沒有被正常加載,建議參考6.b中的處理重新執行該命令。
RDS for PostgreSQL11版本恢復數據
Q1:RDS for PostgreSQL 11恢復到本地PostgreSQL 11時int4到text的類型轉換時出現報錯信息 “ERROR: internal function "int4_text" is not in internal lookup table”時,如何處理?
A:使用postgres用戶連接本地PostgreSQL 11數據庫執行如下命令刪除該類型轉換規則,需要super user執行。
delete from pg_cast where castsource = 'int4'::regtype and casttarget = 'text':: regtype;
Q2:RDS for PostgreSQL 11恢復到本地PostgreSQL 11時多個類型轉換函數報錯,如何排查和處理?
A:分別在本地PostgreSQL 11和RDS for PostgreSQL 11執行如下SQL,并對比結果。
select oid, * from pg_cast order by 1;
對于RDS for PostgreSQL 11新增的類型轉換規則,在本地PostgreSQL 11執行如下SQL全部刪除。
delete from pg_cast where castsource = xxx and casttarget = xxx;