時間:2024-02-03 17:42作者:下載吧人氣:24
作者:張連壯 PostgreSQL 研發(fā)負責(zé)人
從事多年 PostgreSQL 數(shù)據(jù)庫內(nèi)核開發(fā),對 Citus 有非常深入的研究。
PostgreSQL 本身不具備數(shù)據(jù)閃回和數(shù)據(jù)誤刪除保護功能,但在不同場景下也有對應(yīng)的解決方案。本文由作者在 2021 PCC 大會的演講主題《PostgreSQL 數(shù)據(jù)找回》整理而來,介紹了常見 數(shù)據(jù)恢復(fù)和 預(yù)防數(shù)據(jù)丟失的相關(guān)工具實現(xiàn)原理及使用示例。
在盤點數(shù)據(jù)恢復(fù)方案之前,先簡單了解一下數(shù)據(jù)丟失的原因。
數(shù)據(jù)丟失通常是由 DDL 與 DML 兩種操作引起。
在 PostgreSQL 數(shù)據(jù)庫中,表以文件的形式,采用 OID 命名規(guī)則存儲于 PGDATA/base/DatabaseId/relfilenode
目錄中。當進行 DROP TABLE 操作時,會將文件整體刪除。
由于在操作系統(tǒng)中表文件已經(jīng)不存在,所以只能采用恢復(fù)磁盤的方法進行數(shù)據(jù)恢復(fù)。但這種方式找回數(shù)據(jù)的概率非常小,尤其是云數(shù)據(jù)庫,恢復(fù)磁盤數(shù)據(jù)幾乎不可能。
DML 包含 UPDATE、DELETE 操作。根據(jù) MVCC 的實現(xiàn),DML 操作并不是在操作系統(tǒng)磁盤中將數(shù)據(jù)刪除,因此數(shù)據(jù)可以通過參數(shù)vacuum_defer_cleanup_age
來調(diào)整 Dead 元組在數(shù)據(jù)庫中的數(shù)量,以便恢復(fù)誤操作的數(shù)據(jù)。
pg_resetwal[1] 是 PostgreSQL 自帶的工具(9.6 及以前版本叫 pg_resetxlog)。可清除預(yù)寫式日志(WAL)并且可以重置 pg_control 文件中的一些信息。也可以修改當前事務(wù) ID,從而使數(shù)據(jù)庫可以訪問到未被 Vacuum 掉的 Dead 元組。
pg_resetwal 通過設(shè)置事務(wù)號的方式來恢復(fù)數(shù)據(jù),因此必須提前獲取待恢復(fù)數(shù)據(jù)的事務(wù)號。
1. 查看當前 lsn 位置
— 在線查詢— 離線查詢
./pg_controldata -D dj | grep ‘checkpoint location’
網(wǎng)友評論