Postgresql

pg_dump 中的一個模式缺少數據

  • July 27, 2021

我有一個帶有多個模式的 Postgres 9.6 數據庫,並且該數據庫的定期備份是使用類似的命令完成的

pg_dump -h localhost -d db -U postgres -Fc -f file.dump

當我恢復備份時,我得到了意想不到的結果,即其中一個模式的內容完全失去,只有表在那裡,但是是空的。這會影響該架構中的所有表。從該備份恢復時,其他模式包含所有預期數據。

為了確認數據不在備份中,我使用以下命令創建二進制數據庫轉儲的可讀文本版本:

pg_restore mydb.dump > mydb.sql

我尋找應該填寫行的條目並發現如下內容:

--
-- Data for Name: some_table; Type: TABLE DATA; Schema: schema1; Owner: postgres
--

COPY schema1.some_table (column1, column2, column3, column4) FROM stdin;
\.

此處根本沒有使用 COPY 命令插入數據,並且該條目對於此特定模式中的每個表看起來都相似。當我查看其他模式時,正如我所期望的那樣,COPY 命令中會插入單獨的行。

這些模式都有相同的表,但有一個差異可能與問題的根源有關。備份中缺少數據的模式歸 postgres 所有,而所有其他模式歸其他角色所有。每個模式都應該由一個特定的角色擁有,每個模式一個角色。有問題的架構歸 postgres 所有意味著存在導致錯誤所有權的早期錯誤或問題,但我的理解是,當我作為 postgres 超級使用者進行備份時,僅憑錯誤的所有權無法解釋失去的數據在備份中。

我現在想弄清楚這裡發生了什麼,以及為什麼數據失去了。現在,當轉儲本身成功時,我沒有任何解釋如何在數據庫轉儲中失去這些特定數據。

  • 我轉換二進制轉儲的方式是否有效,我對明文轉儲的觀察是否意味著轉儲中沒有此表的數據?
  • 將 pg_dump 作為具有 SUPERUSER 權限的角色執行時,所有權是否會影響轉儲中包含的數據?
  • 轉儲整個數據庫時,僅一個特定模式的缺失內容有哪些可能的解釋?

如果你沒有所需的權限,pg_dump會給你一個錯誤資訊而不是一個空COPY語句。此外,權限不適用於超級使用者。

您應該驗證從原始表中選擇時所使用的數據庫使用者所pg_dump看到的內容。

我能想到的唯一解釋是:

  • 有人從表中刪除了所有行。
  • 您經歷了數據損壞,以某種方式使表的文件清零。

嘗試以下方法來查找文件:

SELECT oid FROM pg_database
WHERE datname = 'db';

SELECT relfilenode FROM pg_class
WHERE oid = 'schema1.some_table'::regclass;

如果返回的數字是12345678,請檢查base/1234/5678數據目錄中的文件:它有多大,它包含什麼?

引用自:https://dba.stackexchange.com/questions/257768