作者:admin 日期:2023-10-11 瀏覽: 次
如何破壞你的PostgreSQL數據庫?
當然,大多數人不想破壞他們的數據庫。這些人將從避免本文中使用的技術中受益。但對于某些人來說,損壞數據庫可能很有用,例如,如果您想測試將用于檢測或修復數據損壞的工具或過程。
先決條件
我們需要一個包含一些數據的數據庫,對于我們的一些實驗,我們需要進行一些持續的活動。為此我們可以使用內置的: PostgreSQL benchmark pgbench。我們使用比例因子 100,因此最大的表包含 1000 萬行:
將使用 5 個并發客戶端會話生成負載:
通過設置fsync = off創建一個損壞的數據庫
讓我們在postgresql.conf中設置fsync = off,并在服務器處于負載狀態時關閉服務器。
南通數據恢復經過幾次嘗試,我們可以用amcheck擴展檢測數據損壞:
發生了什么事?數據不再按正確的順序刷新到磁盤,因此數據修改可以在WAL之前到達磁盤。這將導致崩潰恢復期間的數據損壞。
從備份中創建損壞的數據庫
當pgbench運行時,我們創建一個基本備份:
注意,由于我使用的是PostgreSQL v15,
所以啟動備份模式的函數是:pg_backup_start()而不是pg_start_backup()。
這是因為自PostgreSQL 9.6以來就被棄用的獨占備份API最終在v15中被刪除了。
讓我們找出數據庫和pgbench_accounts主鍵索引的對象id:
我們通過復制數據目錄來創建備份。然后,我們再次復制pgbench_accounts的主鍵索引和提交日志,以確保它們比其他的更近:
關鍵部分:不要創造backup_label
現在我們退出備份模式。
但是忽略pg_backup_stop()返回的backup_label文件的內容
然后,讓我們確??刂莆募械淖詈笠粋€檢查點不同:
讓我們啟動服務器:
現在索引掃描pgbench_accounts失敗了,因為索引包含比表更多的最新數據:
發生了什么事?通過從備份中省略backup_label文件,我們從錯誤的檢查點恢復,因此表中的數據及其索引不再一致。注意,沒有pg_backup_start()和pg_backup_stop()也能得到同樣的效果,我只是想強調backup_label的重要性。
使用pg_resetwal創建一個損壞的數據庫
當數據庫在pgbench負載下時,我們使用
然后我們運行pg_resetwal:
然后我們啟動服務器并用amcheck像以前一樣使用來檢查索引的完整性:
發生了什么事?Pg_resetwal只在干凈關閉的集群上使用是安全的。選項-f只在作為啟動損壞的服務器和搶救一些數據的最后努力。只有專家才應該使用它。
使用pg_upgrade——link創建一個損壞的數據庫
我們創建第二個集群initdb:
然后我們編輯postgresql.conf并選擇一個不同的端口號。關閉原始集群后,我們以鏈接模式運行“升級”:
pg_upgrade重命名舊集群的控制文件,以免誤啟動。我們將撤消它:
現在我們可以啟動兩個集群并pgbench在兩者上運行。很快我們就會看到類似的錯誤信息
發生了什么?由于兩個集群共享相同的數據文件,我們設法在相同的數據文件上啟動了兩臺服務器。這會導致數據損壞。
通過操作數據文件創建一個損壞的數據庫
為此,我們找出屬于pgbench_accounts表的文件名:
現在我們停止服務器并將一些垃圾寫入第一個數據塊:
然后我們啟動服務器并嘗試從表中選擇:
發生了什么?我們篡改了數據文件,因此表損壞也就不足為奇了。
用目錄修改創建一個損壞的數據庫
誰需要ALTER TABLE來刪除表列?我們可以直接運行
之后,再查詢這張表就會報錯:
發生了什么事?我們忽略了在pg_attribute中刪除一列會將attisdrop設置為TRUE,而不是實際刪除條目。此外,我們沒有檢查pg_depend中的依賴關系,也沒有正確地鎖定表以防止并發訪問。不支持修改編目表,如果它破壞了數據庫,則必須保留這兩部分。
結論
揚州數據恢復我們已經看到了幾種破壞PostgreSQL數據庫的方式。其中一些是顯而易見的,一些可能會讓初學者感到驚訝。如果你不想數據庫損壞,
常州數據恢復不要打亂系統目錄
永遠不要修改數據目錄中的任何內容(配置文件除外)
不要使用fsync = off運行
不要在崩潰的服務器上調用pg_resetwal -f
使用pg_upgrade——link進行升級后移除舊集群
不要刪除或省略backup_label
運行支持的PostgreSQL版本以避免已知的軟件錯誤
在可靠的硬件上運行
原文鏈接:https://www.cybertec-postgresql.com/en/how-to-corrupt-your-postgresql-database/
PG考試咨詢
2022年中國PostgreSQL考試認證開班計劃PGCCC,公眾號:PostgreSQL考試認證中心通知:2022年中國PostgreSQL考試認證計劃
2022新春限時特價PGCCC,公眾號:PostgreSQL考試認證中心通知:2022新春限時特價
冬奧會紀念幣(每套20枚裝)免費領取中...PGCCC,公眾號:PostgreSQL考試認證中心冬奧會紀念幣(每套20枚裝)免費領取中...
永遠都不晚:PostgreSQL認證專家(培訓考試-廣州站)PGCCC,公眾號:PostgreSQL考試認證中心永遠都不晚:PostgreSQL認證專家(培訓考試-廣州站)開班通知-PCP認證專家(上海站)培訓開班1106PGCCC,公眾號:PostgreSQL考試認證中心開班通知-PCP認證專家(上海站)培訓開班1106
PostgreSQL-PCP認證專家-北京站-精彩花絮PGCCC,公眾號:PostgreSQL考試認證中心PostgreSQL認證專家考試(培訓)(10月16日北京站)精彩花絮
PostgreSQL-PCP認證專家-成都站公眾號:PostgreSQL考試認證中心開班通知-PCP認證專家(成都站)培訓開班1016
PostgreSQL-PCP認證專家考試-北京站-考試風采PGCCC,公眾號:PostgreSQL考試認證中心PostgreSQL認證專家考試(培訓)-北京站-成功舉辦
PostgreSQL-PCA認證考試-貴陽站-考試風采PGCCC,公眾號:PostgreSQL考試認證中心PostgreSQL PCA+PCP認證考試在貴陽成功舉辦
PostgreSQL-PCP認證專家考試-上海站-考試風采PGCCC,公眾號:PostgreSQL考試認證中心PostgreSQL PCP認證考試(上海站)成功舉辦
PostgreSQL認證專家考試-學員考試總結薛曉剛,公眾號:PostgreSQL考試認證中心難考的PostgreSQL認證考試
PostgreSQL-PCM認證大師考試-天津站-考試風采PGCCC,公眾號:PostgreSQL考試認證中心PostgreSQL-PCM認證大師考試(天津站)成功舉辦
如何在工業和信息化部教育與考試中心官網查詢證書PG考試認證中心,公眾號:PostgreSQL考試認證中心如何在工業和信息化部教育與考試中心查詢PostgreSQL證書
中國PostgreSQL考試認證體系PG考試認證中心,公眾號:PostgreSQL考試認證中心中國PostgreSQL考試認證體系