[在我们公司,由于硬件原因,几天前数据库崩溃。我们从中恢复过来,但是从那时起,每次尝试备份数据库时都会遇到以下错误。
pg_dump: ERROR: timestamp out of range
pg_dump: SQL command to dump the contents of table "account_bank_statement_line"
错误是在“ account_bank_statement_line”表中,在该表中,我们创建了5行,其中只有“ create_date”列的日期为4855年(!!!!),其余列的值为空,甚至ID(首要的关键)。我们甚至无法使用pgAdmin 4或PostgreSQL终端删除或更新这些行。
我们目前处于非常危险的阶段,没有几天的零售额支持。至少任何提示都将受到高度赞赏。
首先,如果数据很重要,请聘请专家。
其次,使用选项pg_dump
运行--exclude-table=account_bank_statement_line
,以便至少拥有数据库其余部分的备份。
下一步,您应该停止数据库并对所有文件进行冷备份。这样一来,如果您搞砸了,就可以回去。
关键是找出有问题的行的ctid
(物理地址)。然后,您可以使用它来删除行。
您可以通过运行类似的查询来解决这个问题>
SELECT create_date FROM account_bank_statement_line WHERE ctid < '(42,0)';
并尝试找到出现错误的
ctid
。找到一行后,将覆盖以下内容:
SELECT * FROM account_bank_statement_line WHERE ctid = '(42,14)';
您可以通过
ctid
删除该行。
完成后,获取数据库集群的pg_dumpall
,创建一个新集群,然后还原转储。继续与遭受损坏的群集一起工作是危险的,因为损坏可能保持不可见和扩散状态。
我知道我们所做的可能不是技术上最先进的,但是它解决了我们的问题。我们咨询了一些专家,然后做的是: