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
这样您至少可以备份其余的数据库。
接下来您应该做的是停止数据库并对所有文件进行冷备份。这样,如果你搞砸了,你就有办法回去了。
继续的关键点是找出有问题的行的 ctid
s(物理地址)。然后你可以用它来删除行。
您可以通过 运行 查询
来解决这个问题
SELECT create_date FROM account_bank_statement_line
WHERE ctid < '(42,0)';
并尝试找到出现错误的 ctid
s。一旦找到以下内容所在的行:
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。
然后数据库备份运行像往常一样顺利。
希望这对像我们一样深陷困境的人有所帮助。干杯!
我们公司几天前由于硬件原因发生了一次数据库崩溃。我们从中恢复过来,但从那时起,每次我们尝试备份我们的数据库时,我们都会遇到以下错误。
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
这样您至少可以备份其余的数据库。
接下来您应该做的是停止数据库并对所有文件进行冷备份。这样,如果你搞砸了,你就有办法回去了。
继续的关键点是找出有问题的行的 ctid
s(物理地址)。然后你可以用它来删除行。
您可以通过 运行 查询
来解决这个问题SELECT create_date FROM account_bank_statement_line
WHERE ctid < '(42,0)';
并尝试找到出现错误的 ctid
s。一旦找到以下内容所在的行:
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。
然后数据库备份运行像往常一样顺利。
希望这对像我们一样深陷困境的人有所帮助。干杯!