国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PostgreSQL物理備份與恢復

IT那活兒 / 3746人閱讀
PostgreSQL物理備份與恢復

點擊上方“IT那活兒”,關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了!!!





基礎(chǔ)備份和PITR



本文主要介紹PostgreSQL的基礎(chǔ)備份和基于時間點PITR(Point-in-Time Recovery)的恢復方法。
如果數(shù)據(jù)庫在運行過程中發(fā)生故障,需要恢復到故障發(fā)生前的某個時間點,或者在使用過程中由于誤操作導致刪除了重要數(shù)據(jù),需要將數(shù)據(jù)還原到誤操作前的某個時間點的狀態(tài),則可以借助基礎(chǔ)備份來實施恢復。





準備工作



1.檢查配置信息,版本信息
postgres=# select name,setting,unit from pg_settings where category=Preset Options;
postgres=# select version();
2. 在開始備份前,需要配置一些參數(shù)
1)調(diào)整wal日志級別
  • minimal --不能通過基礎(chǔ)備份和wal日志恢復數(shù)據(jù)庫。
  • replica = 9.6版本以前的archive和hot_standby  --該級別支持wal歸檔和復制。
  • logical --在replica級別的基礎(chǔ)上添加了支持邏輯解碼所需的信息。
查看當前數(shù)據(jù)庫的wal level。
$ pg_controldata -D /pgsql |grep wal_level
或者
cat postgresql.conf |grep wal_level
2)開啟歸檔模式
vi postgresql.conf
archive_mode = on
如果原來是off,調(diào)整為on, 需要重啟數(shù)據(jù)庫生效。
cat postgresql.conf |grep archive_mode
3)配置歸檔命令
首先要創(chuàng)建用于存放wal歸檔文件目錄, 數(shù)據(jù)庫啟動用戶需要寫權(quán)限。
$ mkdir archive
配置postgresql.conf中的歸檔命令。
vi postgresql.conf
archive_command = cp %p /pgsql/data/archive/%f
修改完后reload配置文件即可。
pg_ctl -D /pgsql/data/ reload
4)建議設(shè)置work process,sender進程數(shù),這樣才可以通過pg_basebackup使用流復制協(xié)議進行備份。必須設(shè)置大于0,每個流復制連接需要一個wal sender進程。
max_worker_processes = 16
max_wal_senders = 8
5)建議設(shè)置wal_keep_segments,確保大型的數(shù)據(jù)庫在比較長的備份時間周期內(nèi)wal日志不被覆蓋。注意配置之后,pg_wal至少會占用wal_keep_segments * wal文件大小 的空間。需要預留好空間。
wal_keep_segments = 1024
3. 配置的參數(shù)如下
cd /pgsql/data
mv postgresql.conf postgresql.conf.bak20220227

vi postgresql.conf

listen_addresses = *
port = 5432
superuser_reserved_connections = 20
wal_level = archive
archive_mode = on
archive_command = cp %p /pgsql/data/archive/%f
unix_socket_directories = /var/lib/postgres/
unix_socket_permissions = 0700
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 10
vacuum_cost_delay = 10
bgwriter_delay = 10ms
synchronous_commit = off
wal_writer_delay = 10ms
log_destination = csvlog
logging_collector = on
log_directory = pg_log
log_filename =postgresql-%Y-%m-%d_%H%M%S.log
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
log_timezone = PRC
datestyle = iso, mdy
timezone = PRC
default_text_search_config = pg_catalog.english
max_worker_processes = 16
max_wal_senders = 8
wal_keep_segments = 1024
檢查歸檔是否正常完成。
PostgreSQL提供pg_switch_wal()函數(shù)可以手工切換WAL日志,執(zhí)行pg_switch_wal()后,WAL會切換到新的日志,這時會將WAL日志歸檔到配置的歸檔路徑。
查看生成的歸檔文件。





基礎(chǔ)備份



完成上述準備工作后, 就可以開始進行基礎(chǔ)備份了,我們使用pg_basebackup工具來完成備份。
pg_basebackup備份操作不會影響連接到該數(shù)據(jù)庫的其他客戶端,并且可以被用于基于時間點的恢復。pg_basebackup創(chuàng)建的是整個數(shù)據(jù)庫集群文件的一份二進制副本,不能備份單個數(shù)據(jù)庫或數(shù)據(jù)庫對象。
pg_basebackup的主要參數(shù)選項如下:
    pg_basebackup [option…]
-D directory 保存?zhèn)浞輸?shù)據(jù)的本地目錄。
    --pgdata=directory
-F format 備份文件格式p和t。
    --format=format plain|tar
-r rate 從該服務(wù)器傳輸數(shù)據(jù)的最大傳輸速率。
    --max-rate=rate
-R 在輸出目錄中寫入一個最小的recovery.conf恢復配置文件。
    --write-recovery-conf
-S slotanme 該選項需要和-X stream一起使用。它導致WAL流使用指定復制槽。
    --slot=slotname
-X stream 如果為none,則備份不會包含日志,如果fetch,在備份末尾收集日志文件,如果為stream,在備份的同時備份日志。
    --wal-method = none | stream | fetch
使用pg_basebackup備份數(shù)據(jù)庫必須由超級用戶或者具有REPLICATION權(quán)限的用戶發(fā)起。
$ psql
psql.bin (10.12)
Type "help" for help.
pg_basebackup使用replication協(xié)議連接到數(shù)據(jù)庫實例上,所以pg_hba.conf必須允許replication連接。
$ cp pg_hba.conf pg_hba.conf.bak20200920
$ vi pg_hba.conf
重新加載配置。
注意:能通過pg_ctl reload方式生效的參數(shù),不需要重啟數(shù)據(jù)庫;需要通過重啟來生效的,則無法通過pg_ctl reload方式生效。
記錄當前xid,在數(shù)據(jù)庫中以超級用戶執(zhí)行如下命令:
創(chuàng)建一個備份標簽:
我們可以使用pg_start_backup()函數(shù)在$PGDATA目錄中創(chuàng)建一個關(guān)于備份信息的備份標簽文件,也被稱為backup_label,其中包括了開始時間和標簽字符串。該函數(shù)也會在$PGDATA目錄中創(chuàng)建一個 名為tablespace_map的表空間映射文件,如果在pg_tblspc/中有一個或者多個表空間符號鏈接存在,該文件會包含它們的信息。如果你需要從備份中恢復,這兩個文件對于備份的 完整性都至關(guān)重要。
使用一個具有運行 pg_start_backup 權(quán)利的用戶(超級用戶,或者被授予在該 函數(shù)上 EXECUTE 的用戶)連接到服務(wù)器(不在乎是哪個數(shù)據(jù)庫)并且發(fā)出命令:
默認情況下,pg_start_backup會花費很長時間來完成。
這是因為它會執(zhí)行一個檢查點,而檢查點所需要的I/O在相當一段時間內(nèi)將會被傳播,默認情況下這段時間是內(nèi)部檢查點間隔的一半(參見配置參數(shù)checkpoint_completion_target)。這通常是你所希望的,因為它能將對查詢處理的影響最小化。
如果你要盡快開始備份,可使用:
SELECT pg_start_backup(label, true);
這會使檢查點盡可能快地被完成。
注意,如果服務(wù)器在備份期間崩潰,必須從$PGDATA 目錄手動刪除backup_label文件,才能重新啟動。
查看備份標簽文件的內(nèi)容:
創(chuàng)建數(shù)據(jù)庫服務(wù)器的一個基礎(chǔ)備份并將它存儲在本地目錄/pgsql/data/backup。
pg_basebackup -h ***.***.223.128 -D /pgsql/data/backup
備份目錄文件信息:
要使用備份來恢復數(shù)據(jù),你需要保留所有在備份期間以及之后生成的WAL段文件。
為了更方便地進行這些工作,基礎(chǔ)備份過程中會創(chuàng)建一個備份歷史文件,它將被立刻存儲到WAL歸檔目錄。該文件以備份中你需要的第一個WAL段文件命名。
例如:
如果開始的WAL文件是000000010000000000000059,則備份歷史文件將被命名為000000010000000000000059. 00000060.backup.(文件名的第二部分表明WAL文件中的一個準確位置,一般可以被忽略)。一旦你已經(jīng)安全地歸檔了備份和在備份過程中被使用的WAL段文件(如備份歷史文件中所指定的) ,所有名字在數(shù)字上低于備份歷史文件中記錄值的已歸檔WAL段對于恢復文件系統(tǒng)備份就不再需要了,可以將它們刪除。
備份歷史文件是一個很小的文本文件。它包含你指定給pg_basebackup的標簽字符串,以及備份的起止時間以及起止WAL段。
如果你使用該標簽來標識相關(guān)備份文件,則已歸檔的歷史文件可以說明需要哪個備份文件進行恢復。
備份完成后,在pg_wal目錄下生成了一個000000010000000000000059.00000060.backup文件。





模擬數(shù)據(jù)庫恢復



接下來,我們將演示如何實現(xiàn)以及如何設(shè)計一個恢復方案。
要恢復到任意時間點,我們就必須告訴恢復進程一個點,這個點可以是時間,字符串,或者xid。
  • 時間點,恢復到這個時間點之后的WAL中的第一個事務(wù)結(jié)束位置。
  • 字符串,這個是需要通過pg_create_restore_point函數(shù)來創(chuàng)建的一個還原點,需要超級用戶調(diào)用這個函數(shù)。
  • xid,就是恢復到指定事務(wù)的結(jié)束位置。
既然我們已經(jīng)知道了數(shù)據(jù)庫可以恢復到指定的位置,接下來我們模擬的就是當數(shù)據(jù)被誤刪除后,借助更早時候的基礎(chǔ)備份和WAL歸檔日志來將數(shù)據(jù)恢復到誤操作前的某個時間點。
1. 創(chuàng)建測試數(shù)據(jù)
創(chuàng)建測試表ttt并生成測試數(shù)據(jù)。
記錄當前時間T1:
記錄當前xid:
這個文件可能還沒有歸檔,我們可以主動觸發(fā)歸檔切換wal日志:
記錄當前哈希值,用于恢復后的比對。
2. 模擬誤刪除操作
刪除表ttt中的部分數(shù)據(jù),PostgreSQL默認是自動提交,因此DML語句不需要commit。
記錄第一次刪除數(shù)據(jù)后的時間T2:
記錄第一次刪除數(shù)據(jù)后的xid:
這個文件可能還沒有歸檔,我們可以主動觸發(fā)歸檔:
繼續(xù)刪除表ttt數(shù)據(jù):
記錄第二次刪除數(shù)據(jù)后的xid:
手動切換wal日志:
備份文件和歸檔文件如下:
3. 恢復到指定XID
將基礎(chǔ)備份和歸檔wal日志拷貝到***.***.***.129這臺服務(wù)器。
基礎(chǔ)備份選擇將要恢復的時間點之前的一個備份,歸檔則選擇在此之后的所有歸檔文件。
配置recovery.conf,指定將數(shù)據(jù)恢復到xid:562。
$ vi recovery.conf
啟動數(shù)據(jù)庫。
$ pg_ctl -D /pgsql/data start
這時候數(shù)據(jù)庫還是read only模式,recovery還沒有結(jié)束,如果不執(zhí)行select pg_wal_replay_resume();開啟新事務(wù)將會報錯:
postgres=# select txid_current();
ERROR: cannot execute txid_current() during recovery
postgres
=#
postgres=# select pg_wal_replay_resume();
pg_wal_replay_resume
----------------------
(1 row)
檢查數(shù)據(jù)已經(jīng)恢復到 delete from ttt where relacl is null 之后的狀態(tài)。
postgres=# select count(*) from ttt;
recovery.conf已被自動重命名為recovery.done。
如果你還要執(zhí)行其他后續(xù)的恢復操作,recovery.conf必須被重置。另外可以根據(jù)時間點來進行恢復,在recovery.conf文件里面配置recovery_target_time即可。


本文作者:湯 杰

本文來源:IT那活兒(上海新炬王翦團隊)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/129592.html

相關(guān)文章

  • 新書推薦 |《PostgreSQL實戰(zhàn)》出版(提供樣章下載)

    摘要:作者譚峰張文升出版日期年月頁數(shù)頁定價元本書特色中國開源軟件推進聯(lián)盟分會特聘專家撰寫,國內(nèi)多位開源數(shù)據(jù)庫專家鼎力推薦。張文升中國開源軟件推進聯(lián)盟分會核心成員之一。 很高興《PostgreSQL實戰(zhàn)》一書終于出版,本書大體上系統(tǒng)總結(jié)了筆者 PostgreSQL DBA 職業(yè)生涯的經(jīng)驗總結(jié),本書的另一位作者張文升擁有豐富的PostgreSQL運維經(jīng)驗,目前就職于探探科技任首席PostgreS...

    Martin91 評論0 收藏0
  • Postgresql 備份恢復

    摘要:指定要用于查找的口令文件的名稱。前四個字段可以是確定的字面值,也可以使用通配符匹配所有。利用環(huán)境變量引用的文件權(quán)限也要滿足這個要求,否則同樣會被忽略。在上,該文件被假定存儲在一個安全的目錄中,因此不會進行特別的權(quán)限檢查。 pg_dump pg_dump 把一個數(shù)據(jù)庫轉(zhuǎn)儲為純文本文件或者是其它格式. 用法: pg_dump [選項]... [數(shù)據(jù)庫名字] 一般選項: -f, --fi...

    阿羅 評論0 收藏0

發(fā)表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<