作者:admin 日期:2023-10-11 瀏覽: 次
如何破壞你的PostgreSQL數(shù)據(jù)庫(kù)?
當(dāng)然,大多數(shù)人不想破壞他們的數(shù)據(jù)庫(kù)。這些人將從避免本文中使用的技術(shù)中受益。但對(duì)于某些人來(lái)說(shuō),損壞數(shù)據(jù)庫(kù)可能很有用,例如,如果您想測(cè)試將用于檢測(cè)或修復(fù)數(shù)據(jù)損壞的工具或過(guò)程。
先決條件
我們需要一個(gè)包含一些數(shù)據(jù)的數(shù)據(jù)庫(kù),對(duì)于我們的一些實(shí)驗(yàn),我們需要進(jìn)行一些持續(xù)的活動(dòng)。為此我們可以使用內(nèi)置的: PostgreSQL benchmark pgbench。我們使用比例因子 100,因此最大的表包含 1000 萬(wàn)行:
將使用 5 個(gè)并發(fā)客戶端會(huì)話生成負(fù)載:
通過(guò)設(shè)置fsync = off創(chuàng)建一個(gè)損壞的數(shù)據(jù)庫(kù)
讓我們?cè)趐ostgresql.conf中設(shè)置fsync = off,并在服務(wù)器處于負(fù)載狀態(tài)時(shí)關(guān)閉服務(wù)器。
南通數(shù)據(jù)恢復(fù)經(jīng)過(guò)幾次嘗試,我們可以用amcheck擴(kuò)展檢測(cè)數(shù)據(jù)損壞:
發(fā)生了什么事?數(shù)據(jù)不再按正確的順序刷新到磁盤,因此數(shù)據(jù)修改可以在WAL之前到達(dá)磁盤。這將導(dǎo)致崩潰恢復(fù)期間的數(shù)據(jù)損壞。
從備份中創(chuàng)建損壞的數(shù)據(jù)庫(kù)
當(dāng)pgbench運(yùn)行時(shí),我們創(chuàng)建一個(gè)基本備份:
注意,由于我使用的是PostgreSQL v15,
所以啟動(dòng)備份模式的函數(shù)是:pg_backup_start()而不是pg_start_backup()。
這是因?yàn)樽訮ostgreSQL 9.6以來(lái)就被棄用的獨(dú)占備份API最終在v15中被刪除了。
讓我們找出數(shù)據(jù)庫(kù)和pgbench_accounts主鍵索引的對(duì)象id:
我們通過(guò)復(fù)制數(shù)據(jù)目錄來(lái)創(chuàng)建備份。然后,我們?cè)俅螐?fù)制pgbench_accounts的主鍵索引和提交日志,以確保它們比其他的更近:
關(guān)鍵部分:不要?jiǎng)?chuàng)造backup_label
現(xiàn)在我們退出備份模式。
但是忽略pg_backup_stop()返回的backup_label文件的內(nèi)容
然后,讓我們確??刂莆募械淖詈笠粋€(gè)檢查點(diǎn)不同:
讓我們啟動(dòng)服務(wù)器:
現(xiàn)在索引掃描pgbench_accounts失敗了,因?yàn)樗饕缺砀嗟淖钚聰?shù)據(jù):
發(fā)生了什么事?通過(guò)從備份中省略backup_label文件,我們從錯(cuò)誤的檢查點(diǎn)恢復(fù),因此表中的數(shù)據(jù)及其索引不再一致。注意,沒(méi)有pg_backup_start()和pg_backup_stop()也能得到同樣的效果,我只是想強(qiáng)調(diào)backup_label的重要性。
使用pg_resetwal創(chuàng)建一個(gè)損壞的數(shù)據(jù)庫(kù)
當(dāng)數(shù)據(jù)庫(kù)在pgbench負(fù)載下時(shí),我們使用
然后我們運(yùn)行pg_resetwal:
然后我們啟動(dòng)服務(wù)器并用amcheck像以前一樣使用來(lái)檢查索引的完整性:
發(fā)生了什么事?Pg_resetwal只在干凈關(guān)閉的集群上使用是安全的。選項(xiàng)-f只在作為啟動(dòng)損壞的服務(wù)器和搶救一些數(shù)據(jù)的最后努力。只有專家才應(yīng)該使用它。
使用pg_upgrade——link創(chuàng)建一個(gè)損壞的數(shù)據(jù)庫(kù)
我們創(chuàng)建第二個(gè)集群initdb:
然后我們編輯postgresql.conf并選擇一個(gè)不同的端口號(hào)。關(guān)閉原始集群后,我們以鏈接模式運(yùn)行“升級(jí)”:
pg_upgrade重命名舊集群的控制文件,以免誤啟動(dòng)。我們將撤消它:
現(xiàn)在我們可以啟動(dòng)兩個(gè)集群并pgbench在兩者上運(yùn)行。很快我們就會(huì)看到類似的錯(cuò)誤信息
發(fā)生了什么?由于兩個(gè)集群共享相同的數(shù)據(jù)文件,我們?cè)O(shè)法在相同的數(shù)據(jù)文件上啟動(dòng)了兩臺(tái)服務(wù)器。這會(huì)導(dǎo)致數(shù)據(jù)損壞。

通過(guò)操作數(shù)據(jù)文件創(chuàng)建一個(gè)損壞的數(shù)據(jù)庫(kù)
為此,我們找出屬于pgbench_accounts表的文件名:
現(xiàn)在我們停止服務(wù)器并將一些垃圾寫入第一個(gè)數(shù)據(jù)塊:
然后我們啟動(dòng)服務(wù)器并嘗試從表中選擇:
發(fā)生了什么?我們篡改了數(shù)據(jù)文件,因此表?yè)p壞也就不足為奇了。
用目錄修改創(chuàng)建一個(gè)損壞的數(shù)據(jù)庫(kù)
誰(shuí)需要ALTER TABLE來(lái)刪除表列?我們可以直接運(yùn)行
之后,再查詢這張表就會(huì)報(bào)錯(cuò):
發(fā)生了什么事?我們忽略了在pg_attribute中刪除一列會(huì)將attisdrop設(shè)置為TRUE,而不是實(shí)際刪除條目。此外,我們沒(méi)有檢查pg_depend中的依賴關(guān)系,也沒(méi)有正確地鎖定表以防止并發(fā)訪問(wèn)。不支持修改編目表,如果它破壞了數(shù)據(jù)庫(kù),則必須保留這兩部分。
結(jié)論
揚(yáng)州數(shù)據(jù)恢復(fù)我們已經(jīng)看到了幾種破壞PostgreSQL數(shù)據(jù)庫(kù)的方式。其中一些是顯而易見的,一些可能會(huì)讓初學(xué)者感到驚訝。如果你不想數(shù)據(jù)庫(kù)損壞,
常州數(shù)據(jù)恢復(fù)不要打亂系統(tǒng)目錄
永遠(yuǎn)不要修改數(shù)據(jù)目錄中的任何內(nèi)容(配置文件除外)
不要使用fsync = off運(yùn)行
不要在崩潰的服務(wù)器上調(diào)用pg_resetwal -f
使用pg_upgrade——link進(jìn)行升級(jí)后移除舊集群
不要?jiǎng)h除或省略backup_label
運(yùn)行支持的PostgreSQL版本以避免已知的軟件錯(cuò)誤
在可靠的硬件上運(yùn)行
原文鏈接:https://www.cybertec-postgresql.com/en/how-to-corrupt-your-postgresql-database/
PG考試咨詢
2022年中國(guó)PostgreSQL考試認(rèn)證開班計(jì)劃PGCCC,公眾號(hào):PostgreSQL考試認(rèn)證中心通知:2022年中國(guó)PostgreSQL考試認(rèn)證計(jì)劃
2022新春限時(shí)特價(jià)PGCCC,公眾號(hào):PostgreSQL考試認(rèn)證中心通知:2022新春限時(shí)特價(jià)
冬奧會(huì)紀(jì)念幣(每套20枚裝)免費(fèi)領(lǐng)取中...PGCCC,公眾號(hào):PostgreSQL考試認(rèn)證中心冬奧會(huì)紀(jì)念幣(每套20枚裝)免費(fèi)領(lǐng)取中...
永遠(yuǎn)都不晚:PostgreSQL認(rèn)證專家(培訓(xùn)考試-廣州站)PGCCC,公眾號(hào):PostgreSQL考試認(rèn)證中心永遠(yuǎn)都不晚:PostgreSQL認(rèn)證專家(培訓(xùn)考試-廣州站)開班通知-PCP認(rèn)證專家(上海站)培訓(xùn)開班1106PGCCC,公眾號(hào):PostgreSQL考試認(rèn)證中心開班通知-PCP認(rèn)證專家(上海站)培訓(xùn)開班1106
PostgreSQL-PCP認(rèn)證專家-北京站-精彩花絮PGCCC,公眾號(hào):PostgreSQL考試認(rèn)證中心PostgreSQL認(rèn)證專家考試(培訓(xùn))(10月16日北京站)精彩花絮
PostgreSQL-PCP認(rèn)證專家-成都站公眾號(hào):PostgreSQL考試認(rèn)證中心開班通知-PCP認(rèn)證專家(成都站)培訓(xùn)開班1016
PostgreSQL-PCP認(rèn)證專家考試-北京站-考試風(fēng)采PGCCC,公眾號(hào):PostgreSQL考試認(rèn)證中心PostgreSQL認(rèn)證專家考試(培訓(xùn))-北京站-成功舉辦
PostgreSQL-PCA認(rèn)證考試-貴陽(yáng)站-考試風(fēng)采PGCCC,公眾號(hào):PostgreSQL考試認(rèn)證中心PostgreSQL PCA+PCP認(rèn)證考試在貴陽(yáng)成功舉辦
PostgreSQL-PCP認(rèn)證專家考試-上海站-考試風(fēng)采PGCCC,公眾號(hào):PostgreSQL考試認(rèn)證中心PostgreSQL PCP認(rèn)證考試(上海站)成功舉辦
PostgreSQL認(rèn)證專家考試-學(xué)員考試總結(jié)薛曉剛,公眾號(hào):PostgreSQL考試認(rèn)證中心難考的PostgreSQL認(rèn)證考試
PostgreSQL-PCM認(rèn)證大師考試-天津站-考試風(fēng)采PGCCC,公眾號(hào):PostgreSQL考試認(rèn)證中心PostgreSQL-PCM認(rèn)證大師考試(天津站)成功舉辦
如何在工業(yè)和信息化部教育與考試中心官網(wǎng)查詢證書PG考試認(rèn)證中心,公眾號(hào):PostgreSQL考試認(rèn)證中心如何在工業(yè)和信息化部教育與考試中心查詢PostgreSQL證書
中國(guó)PostgreSQL考試認(rèn)證體系PG考試認(rèn)證中心,公眾號(hào):PostgreSQL考試認(rèn)證中心中國(guó)PostgreSQL考試認(rèn)證體系