使用pg_basebackup對Postgre進行備份與恢復的實現
postgres 版本9.4.23
暫時在Windows下對postgres進行備份恢復。
在進行備份之前,在認證檔案中增加一行,否則無法進行備份
host replication postgres 127.0.0.1/24 md5
開始使用pg_basebackup命令進行備份。當pgbak資料夾不存在的時候,備份的過程中會自動建立該資料夾。
關於pg_basebackup的命令,可以參考文件
C:\PostgreSQL\9.4\bin>pg_basebackup -h 127.0.0.1 -U postgres -D C:\pgbak -Ft -R -z -v --checkpoint=fast 口令: pg_basebackup: initiating base backup,waiting for checkpoint to complete pg_basebackup: checkpoint completed 已複製 1 個檔案。 已複製 1 個檔案。 已複製 1 個檔案。 NOTICE: pg_stop_backup complete,all required WAL segments have been archived pg_basebackup: base backup completed
進行模擬破壞。停掉庫。 刪除掉data目錄(注意wal日誌以.backup結尾及以後的檔案不要刪除,因為這些檔案沒有備份,恢復的時候要使用)。把備份好的tar.gz檔案解壓到data。
在恢復之前,修改加壓後的tar.gz裡面的recovery.conf檔案(其實是指定歸檔的位置,這樣就會進行恢復)。否則無法啟動資料庫。修改後的內容如下(#遮蔽掉了備份生成的命令):
#standby_mode = 'on' #primary_conninfo = 'user=postgres password=postgres host=127.0.0.1 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres' restore_command = 'C:\\PostgreSQL\\9.4\\data\\pg_xlog\\archive_status\\%f'
啟動postgres資料庫
C:\PostgreSQL\9.4\bin>pg_ctl start -D C:\PostgreSQL\9.4\data 正在啟動伺服器程序 C:\PostgreSQL\9.4\bin>2019-08-06 21:22:29 HKT 日誌: 日誌輸出重定向到日誌收集進 程 2019-08-06 21:22:29 HKT 提示: 後續的日誌輸出將出現在目錄 "pg_log"中. 已複製 1 個檔案。 已複製 1 個檔案。 C:\PostgreSQL\9.4\bin>
這樣資料庫就起來了。恢復正常。
下面是恢復後的wal日誌檔案情況。
恢復的時候,碰到的一些問題
問題1 。這個原因,是因為在recovery.conf中沒有指定restore_command。是按照replicate來進行復制了。所以出錯。
2019-08-06 21:20:25 HKT LOG: database system was shut down in recovery at 2019-08-06 21:15:46 HKT 2019-08-06 21:20:25 HKT LOG: could not open tablespace directory "pg_tblspc/16419/PG_9.4_201409291": No such file or directory 2019-08-06 21:20:25 HKT LOG: could not open tablespace directory "pg_tblspc/16577/PG_9.4_201409291": No such file or directory 2019-08-06 21:20:25 HKT LOG: starting archive recovery 'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\0000000100000000000000D6' 不是內部或外部命令,也不是可執行的程式 或批處理檔案。 2019-08-06 21:20:25 HKT LOG: invalid checkpoint record 2019-08-06 21:20:25 HKT FATAL: could not locate required checkpoint record 2019-08-06 21:20:25 HKT HINT: If you are not restoring from a backup,try removing the file "C:/PostgreSQL/9.4/data/backup_label". 2019-08-06 21:20:25 HKT 日誌: 啟動程序 (PID 544) 已退出,退出程式碼 1 2019-08-06 21:20:25 HKT 日誌: 由於啟動程序失敗,終止啟動
問題2,這樣原因,是因為在恢復的時候,tar.gz資料夾裡面,包含有自己建立的表空間。而在模擬故障的是時候,表空間沒有被刪除,也就是說,沒有使用tar.gz裡面的表空間檔案覆蓋原來的表空間。覆蓋後OK。
2019-08-06 21:22:29 HKT LOG: database system was shut down in recovery at 2019-08-06 21:15:46 HKT 2019-08-06 21:22:29 HKT LOG: could not open tablespace directory "pg_tblspc/16419/PG_9.4_201409291": No such file or directory 2019-08-06 21:22:29 HKT LOG: could not open tablespace directory "pg_tblspc/16577/PG_9.4_201409291": No such file or directory 2019-08-06 21:22:29 HKT LOG: starting archive recovery 'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\0000000100000000000000D6' 不是內部或外部命令,也不是可執行的程式 或批處理檔案。 2019-08-06 21:22:29 HKT LOG: redo starts at 0/D6000090 2019-08-06 21:22:29 HKT LOG: consistent recovery state reached at 0/D60000B8 'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\0000000100000000000000D7' 不是內部或外部命令,也不是可執行的程式 或批處理檔案。 2019-08-06 21:22:29 HKT LOG: record with zero length at 0/D7000090 2019-08-06 21:22:29 HKT LOG: redo done at 0/D7000028 'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\0000000100000000000000D7' 不是內部或外部命令,也不是可執行的程式 或批處理檔案。 'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\00000002.history' 不是內部或外部命令,也不是可執行的程式 或批處理檔案。 2019-08-06 21:22:29 HKT LOG: selected new timeline ID: 2 'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\00000001.history' 不是內部或外部命令,也不是可執行的程式 或批處理檔案。 2019-08-06 21:22:29 HKT FATAL: the database system is starting up 2019-08-06 21:22:29 HKT LOG: archive recovery complete 2019-08-06 21:22:29 HKT LOG: MultiXact member wraparound protections are now enabled 2019-08-06 21:22:29 HKT 日誌: 資料庫系統準備接受連線 2019-08-06 21:22:29 HKT LOG: autovacuum launcher started 2019-08-06 21:22:30 HKT LOG: statement: SET DateStyle=ISO; SET client_min_messages=notice; SELECT set_config('bytea_output','escape',false) FROM pg_settings WHERE name = 'bytea_output'; SET client_encoding='UNICODE'; 2019-08-06 21:22:30 HKT LOG: statement: SELECT db.oid as did,db.datname,db.datallowconn,pg_encoding_to_char(db.encoding) AS serverencoding,has_database_privilege(db.oid,'CREATE') as cancreate,datlastsysoid FROM pg_database db WHERE db.datname = current_database() 2019-08-06 21:22:30 HKT LOG: statement: SELECT oid as id,rolname as name,rolsuper as is_superuser,rolcreaterole as can_create_role,rolcreatedb as can_create_db FROM pg_catalog.pg_roles WHERE rolname = current_user 2019-08-06 21:22:30 HKT LOG: statement: /*pga4dash*/
補充:pgsql的pg_basebackup
pg_basebackup:
是從pgsql提供的一個方便基礎備份的工具。經常用來搭建流複製環境
屬於物理備份。pgsql的邏輯備份是pg_dump工具。
引數說明(pg_basebackup --help 詳細檢視):
-h 指定連線的資料庫的主機名或IP地址,這裡就是主庫的ip。
-U 指定連線的使用者名稱,專門負責流複製的repl使用者。
-F 指定了輸出的格式,支援p(原樣輸出)或者t(tar格式輸出)。
-x 表示備份開始後,啟動另一個流複製連線從主庫接收WAL日誌。
-P 表示允許在備份過程中實時的列印備份的進度。
-R 表示會在備份結束後自動生成recovery.conf檔案,這樣也就避免了手動建立。(12.0有差異)
-D 指定把備份寫到哪個目錄,這裡尤其要注意一點就是做基礎備份之前從庫的資料目錄(比如:/usr/local/postgresql/data)目錄需要手動清空。
-l 表示指定一個備份的標識
如:pg_basebackup -h 192.168.23.193 -p 3012 -U testacc -F p -P -X s -R -D /data -r 50M -l label_1576225683"
注意:
12 版本pg_basebackup 命令的 -R 引數的效果和之前不同,主要體現在:
命令執行後在 $PGDATA 目錄建立 standby.signal 標識檔案,檔案內容為空
命令執行後在 $PGDATA 目錄的 postgresql.auto.conf 檔案中新增 primary_conninfo 引數資訊
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。