HMS*_*HMS 5 sql postgresql pg-dump postgresql-11
我们在系统上设置了数据库 postgresql 11。大约有8张桌子。这几天我们就面临这个问题
ERROR: invalid page in block 9698 of relation base/16385/16560 SQL state: XX001
Run Code Online (Sandbox Code Playgroud)
根据我的研究,我们应该着手set zero_damaged_pages=on;解决这个问题。我们设置并执行了一些运行良好的选择查询。然后我们决定通过 pg_dump 备份该数据库。此作业未成功完成,但复制了所有记录。
现在,在新系统上,我们导入了备份,我们发现由于发生了数据重复,数据库模式未正确复制到此处。我们用另一个没问题的数据库重复了这个操作。一切正常,包括恢复。
最后,我得出的结论是,由于页面块中的错误,数据库没有正确备份。是否有任何类似set zero_damaged_pages=on;pg_dump 中的选项来忽略错误页面但完成后面或任何其他解决方案。
这不是“修复”损坏数据的解决方案,只是一种转储剩余数据的方法。
我绝不是 postgres 专家,但我认为这个问题是有效的,至少值得某种形式的答案。因为我自己只是用它来转储数据库中的数据,该数据库在磁盘已满且没有可用空间的机器上运行了几个小时,所以我知道它可以让您进行转储,前提是您了解某些数据丢失了:
从错误描述中查找表名称 - 例如在pg_dump: The command was: COPY foo.some_table (col1, col2, col3) TO stdout;它的foo.some_table
在您尝试转储的数据库上以 pgadmin 身份运行psql(假设它是my_cool_db):
$ sudo su - postgres
psql my_cool_db
Run Code Online (Sandbox Code Playgroud)
“修复”损坏的页面:
my_cool_db=# SET zero_damaged_pages = on;
SET
my_cool_db=# VACUUM FULL foo.some_table;
WARNING: invalid page in block 54809 of relation base/48461770/48462009; zeroing out page
WARNING: invalid page in block 54810 of relation base/48461770/48462009; zeroing out page
...
VACUUM
my_cool_db=# REINDEX TABLE foo.some_table;
Run Code Online (Sandbox Code Playgroud)
注销 psql 并注销 pgadmin
转储您的数据库(或对其他损坏的表重复)
| 归档时间: |
|
| 查看次数: |
6080 次 |
| 最近记录: |