【发布时间】:2014-08-09 20:41:13
【问题描述】:
我正在尝试使用 xlog 和 pg_xlogdump 工具检索因错误更新查询而丢失的数据。
查询如下:
update table set column1 =21 where column2 > column3 (错过了 1 个条件,因此更新了更多行)
如下所示的 1 条更新记录的示例。它以 1 个更新行和 5 个插入行开始。 我想知道有什么方法可以找到替换为 21 的数字吗?
1) 第一行 (更新) rel 1663/5880305/5880686 准确地显示了我正在寻找的表(数据库的 5880305 oid 和表的 5880686 oid) 另外,我有旧的备份和带有元组 47275/8 的行,有更新的同一行,更新版本中有新的元组(新 tid:293804/16)
2) 第 4 行显示 column1 更新(11996103 是该列的 oid),但我不知道 如何找到元组 302/164 以及如何找回丢失的号码
提前致谢。
rmgr: Heap len (rec/tot): 163/ 8391, tx: 692554090, lsn: 115/73F1D288, prev 115/73F1D240, bkp: 1000, desc: update: rel 1663/5880305/5880686; tid 47275/8 xmax 692554090 ; new tid 293804/16 xmax 0
backup bkp #0; rel 1663/5880305/5880686; fork: main; block: 47275; hole: offset: 228, length: 20
rmgr: Btree len (rec/tot): 34/ 66, tx: 692554090, lsn: 115/73F1F368, prev 115/73F1D288, bkp: 0000, desc: insert: rel 1663/5880305/11995979; tid 6587/293
rmgr: Btree len (rec/tot): 34/ 66, tx: 692554090, lsn: 115/73F1F3B0, prev 115/73F1F368, bkp: 0000, desc: insert: rel 1663/5880305/11996093; tid 6587/292
rmgr: Btree len (rec/tot): 34/ 66, tx: 692554090, lsn: 115/73F1F3F8, prev 115/73F1F3B0, bkp: 0000, desc: insert: rel 1663/5880305/11996103; tid 302/164
rmgr: Btree len (rec/tot): 34/ 66, tx: 692554090, lsn: 115/73F1F440, prev 115/73F1F3F8, bkp: 0000, desc: insert: rel 1663/5880305/11996135; tid 43502/2
rmgr: Btree len (rec/tot): 34/ 66, tx: 692554090, lsn: 115/73F1F488, prev 115/73F1F440, bkp: 0000, desc: insert: rel 1663/5880305/11996136; tid 1/2
【问题讨论】:
-
在做任何其他事情之前,请遵循此处的建议:wiki.postgresql.org/wiki/Corruption
-
然后查看
pg_dirtyread,是的,pg_xlogdump。如果你幸运的话,你有一个很高的wal_level,并且在 xlogs 中有一个完整的页面写入图像。 -
您正在归档日志文件吗?