Odoo 10 不备份 PostgreSQL 9.5 中的数据库。显示 "SQL state: 22008. Timestamp out of range on account_bank_statement_line."

Odoo 10 is not backing up DB in PostgreSQL 9.5. Shows "SQL state: 22008. Timestamp out of range on account_bank_statement_line."

我们公司几天前由于硬件原因发生了一次数据库崩溃。我们从中恢复过来,但从那时起,每次我们尝试备份我们的数据库时,我们都会遇到以下错误。

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" table,我们创建了 5 行,只有 'create_date' 列的日期是 4855 年(!!!!),其余的的列具有空值,甚至是 id(主键)。我们甚至无法使用 pgAdmin 4 或 PostgreSQL 终端删除或更新这些行。

我们现在正处于一个非常危险的阶段,没有几天的零售销售支持。至少任何提示将不胜感激。

首先,如果数据很重要,请聘请专家。

其次,运行 您的 pg_dump 选项 --exclude-table=account_bank_statement_line 这样您至少可以备份其余的数据库。

接下来您应该做的是停止数据库并对所有文件进行冷备份。这样,如果你搞砸了,你就有办法回去了。

继续的关键点是找出有问题的行的 ctids(物理地址)。然后你可以用它来删除行。

您可以通过 运行 查询

来解决这个问题
SELECT create_date FROM account_bank_statement_line
WHERE ctid < '(42,0)';

并尝试找到出现错误的 ctids。一旦找到以下内容所在的行:

SELECT * FROM account_bank_statement_line
WHERE ctid = '(42,14)';

您可以删除行 ctid

完成后,获取数据库集群的 pg_dumpall,创建一个新集群并恢复转储。继续使用已发生损坏的集群是很危险的,因为损坏可能会不为人知地传播开来。

我知道我们所做的可能不是技术上最先进的,但它解决了我们的问题。我们咨询了几位专家,我们所做的是:

  • 将所有数据迁移到新的 table (account_bank_statement_line2),此 t运行 转移了所有具有有效数据的行。
  • 然后我们删除了"account_bank_statement_line"table和

  • 将新 table 重命名为 "account_bank_statement_line"。

  • 之后我们可以删除 table。

然后数据库备份运行像往常一样顺利。

希望这对像我们一样深陷困境的人有所帮助。干杯!