postgresql技術(shù)大講堂 - 第39講:數(shù)據(jù)庫完全恢復(fù)
最新學(xué)訊:近期OCP認(rèn)證正在報(bào)名中,因考試人員較多請(qǐng)盡快報(bào)名獲取最近考試時(shí)間,報(bào)名費(fèi)用請(qǐng)聯(lián)系在線老師,甲骨文官方認(rèn)證,報(bào)名從速!
我要咨詢
PostgreSQL從小白到專家,是從入門逐漸能力提升的一個(gè)系列教程,內(nèi)容包括對(duì)PG基礎(chǔ)的認(rèn)知、包括安裝使用、包括角色權(quán)限、包括維護(hù)管理、、等內(nèi)容,希望對(duì)熱愛PG、學(xué)習(xí)PG的同學(xué)們有幫助,歡迎持續(xù)關(guān)注CUUG PG技術(shù)大講堂。
第39講:數(shù)據(jù)庫完全恢復(fù)
PostgreSQL第39講:12月23日(周六)19:30,釘釘群(35822460)& 視頻號(hào)(數(shù)據(jù)庫老陳)直播
內(nèi)容1:描述介質(zhì)恢復(fù)
內(nèi)容2:執(zhí)行非歸檔模式下恢復(fù)
內(nèi)容3:執(zhí)行歸檔模式下完全恢復(fù)
內(nèi)容4:執(zhí)行基于表空間的完全恢復(fù)
內(nèi)容5:執(zhí)行只讀數(shù)據(jù)庫恢復(fù)
介質(zhì)恢復(fù)
用于恢復(fù)丟失或損壞的當(dāng)前數(shù)據(jù)文件或控制文件
需要顯式調(diào)用
操作如下:
從備份中恢復(fù)文件
恢復(fù)的文件會(huì)應(yīng)用歸檔日志和在線重做日志進(jìn)行數(shù)據(jù)重構(gòu)
恢復(fù)步驟

執(zhí)行數(shù)據(jù)文件轉(zhuǎn)儲(chǔ)和恢復(fù)
使用操作系統(tǒng)命令tar/cp轉(zhuǎn)儲(chǔ)數(shù)據(jù)文件
使用pg_ctl start對(duì)數(shù)據(jù)文件進(jìn)行恢復(fù)
非歸檔模式恢復(fù)
在非歸檔模式下,必須恢復(fù)數(shù)據(jù)目錄下所有的文件和目錄:
所有$PGDATA目錄下的子目錄 base、global、pg_wal...
所有$PGDATA目錄下的文件 postgresql.conf、pg_hba.conf...
非歸檔模式恢復(fù)優(yōu)缺點(diǎn)
優(yōu)勢
易于執(zhí)行,出錯(cuò)風(fēng)險(xiǎn)低
恢復(fù)時(shí)間是轉(zhuǎn)儲(chǔ)所有文件所需的時(shí)間
缺點(diǎn)
數(shù)據(jù)丟失,必須手動(dòng)重新應(yīng)用
整個(gè)數(shù)據(jù)庫將恢復(fù)到上一次完整關(guān)閉備份的位置
非歸檔模式恢復(fù)
歸檔模式恢復(fù)
完全恢復(fù)
使用wal數(shù)據(jù)或增量備份
將數(shù)據(jù)庫更新到最新的時(shí)間點(diǎn)
應(yīng)用所有wal日志記錄的更改
不完全恢復(fù)
使用備份和wal日志生成數(shù)據(jù)庫的非當(dāng)前版本
完全恢復(fù)
確認(rèn)數(shù)據(jù)庫關(guān)閉
恢復(fù)數(shù)據(jù)文件
如果是全庫備份,哪怕是損壞了一個(gè)數(shù)據(jù)文件,也要轉(zhuǎn)儲(chǔ)備份的所有數(shù)據(jù)文件
如果是單獨(dú)表空間(除了global)備份,哪怕?lián)p壞了表空間下的一個(gè)數(shù)據(jù)文件,也要轉(zhuǎn)儲(chǔ)備份的所有數(shù)據(jù)文件
修改postgresql.conf文件
生成recovery.signal空文件
啟動(dòng)數(shù)據(jù)庫(recovery)
歸檔模式完全恢復(fù)優(yōu)缺點(diǎn)
優(yōu)勢
將所有數(shù)據(jù)恢復(fù)到最新點(diǎn)(故障點(diǎn))
恢復(fù)時(shí)間是轉(zhuǎn)儲(chǔ)數(shù)據(jù)文件和應(yīng)用所有歸檔日志文件所需的時(shí)間
缺點(diǎn)
必須具有自您要從中恢復(fù)的備份以來的所有歸檔日志文件
執(zhí)行一個(gè)基于數(shù)據(jù)庫備份的完全恢復(fù)
示例(恢復(fù)前備份pg_wal目錄下所有文件)
1、使用tar包進(jìn)行恢復(fù)
tar -zvxf /backup/base.tar.gz -C $PGDATA
2、修改postgresql.conf文件
restore_command = 'cp /home/postgres/archives/%f %p'
recovery_target_timeline = 'latest'
3、生成recovery.signal空文件
touch recovery.signal
4、啟動(dòng)數(shù)據(jù)庫
pg_ctl start
時(shí)間線和時(shí)間線歷史文件
timelineId(時(shí)間線)
每當(dāng)做了一次完全或者不完全恢復(fù)后,數(shù)據(jù)庫的時(shí)間線就會(huì)發(fā)生變化,意味著從失敗點(diǎn)后重新開始新的生命軌跡,同時(shí)用時(shí)間線歷史文件來記錄。
timelineId 和 wal文件名關(guān)系
時(shí)間線的改變導(dǎo)致wal名字發(fā)生變化
當(dāng)完成對(duì)數(shù)據(jù)庫的恢復(fù)后,會(huì)產(chǎn)生新的wal文件,其命名規(guī)則為在原來的段文件名字中用新的時(shí)間線替換原來的時(shí)間線,其它不變。
時(shí)間線和時(shí)間線歷史文件
Timeline History File
歷史文件會(huì)在pg_wal中生成,同時(shí)復(fù)制到歸檔目錄下,命名規(guī)則如下所示:
“8-digit new timelineId”.history 比如:00000002.history
時(shí)間線歷史記錄文件至少包含一行,每行由以下三項(xiàng)組成:
timelineId –用于恢復(fù)的歸檔日志的timelineId。
LSN –發(fā)生WAL段切換的LSN位置
reason –人類可讀的時(shí)間線為什么改變的解釋。
比如:postgres> cat /home/postgres/archivelogs/00000002.history
0/A000198before 2020-4-28 12:05:00.861324+00
注意上面1是行號(hào),也代表數(shù)據(jù)庫恢復(fù)過的次數(shù)。這個(gè)文件不要?jiǎng)h除,否則會(huì)影響數(shù)據(jù)庫恢復(fù)。
執(zhí)行一個(gè)基于表空間備份的完全恢復(fù)
PG支持基于表空間(除了pg_global之外)級(jí)別的完全恢復(fù),因?yàn)閜g_global表空間比較特殊,其中包括控制文件,而控制文件不能使用備份的進(jìn)行恢復(fù)。
1、轉(zhuǎn)儲(chǔ)備份的表空間目錄到目標(biāo)位置
cp -rf /backup/PG_12_201909212 /home/postgres/tblspc/
2、轉(zhuǎn)儲(chǔ)backup_lable文件到$PGDATA目錄下
cp /backup/backup_lable $PGDATA
3、創(chuàng)建recovery.signal
4、修改postgresql.conf文件
restore_command = 'cp /home/postgres/archives/%f %p'
recovery_target_timeline = 'latest'
5、啟動(dòng)數(shù)據(jù)庫,表空間所包含的表能夠?qū)崿F(xiàn)完全恢復(fù)
pg_ctl start
只讀數(shù)據(jù)庫的恢復(fù)
執(zhí)行一個(gè)只讀數(shù)據(jù)庫的恢復(fù)
1、把數(shù)據(jù)庫變成只讀狀態(tài)
ALTER DATABASE new_db1 SET default_transaction_read_only=on;
2、單獨(dú)備份new_db1數(shù)據(jù)庫目錄
3、如果new_db1數(shù)據(jù)庫目錄損壞,關(guān)閉數(shù)據(jù)庫,轉(zhuǎn)儲(chǔ)備份的目錄到目標(biāo)位置
4、打開數(shù)據(jù)庫
*PG不支持單個(gè)數(shù)據(jù)庫完全恢復(fù)。
?
CUUG PostgreSQL技術(shù)大講堂系列公開課,往期視頻及文檔,請(qǐng)聯(lián)系CUUG客服。
- 冉乃綱-老師CUUG金牌講師
- 冉老師 CUUG金牌講師 Oracle及RedHat高級(jí)講師、Unix/Linux 資深專家...[詳細(xì)了解老師]

- 陳衛(wèi)星-老師CUUG金牌講師
- 陳老師 CUUG金牌講師 精通Oracle管理、備份恢復(fù)、性能優(yōu)化 11年Ora...[詳細(xì)了解老師]
