ERROR: invalid page header in block 27073 of relation base/21078/45300926

在数据库经历UPS断电导致主机重启后,主从不同步,出现错误'ERROR: invalid page header'。通过设置zero_damaged_pages,对受损表进行vacuum full和reindex操作,解决了部分问题。但插入数据时仍报错,怀疑是文件系统损坏。最终通过磁盘检查和格式化,结合从库备份恢复,成功解决数据库异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

突然断网,检查后通知我们UPS断电,db所在主机重启 
1、连上后,发现pg主从不同步,主不向从传日志,从报错: 
FATAL: could not connect to the primary server: could not connect to server: 
发现从先启动成功,而主是后启动的,因此我们将从再次重启 
service postgresql restart 
开始正常传日志 

2、过了一会,研发反应部分表的使用出现问题,主再次不传输日志,且无sender进程。 
查看主库日志,发现报错: 
ERROR:  invalid page header in block 27073 of relation base/21078/45300926 
查看从库日志,发现类似报错 
ERROR:insert_t_black:invalid page head in block 27073 of relation base/21078/45300926 

21078是tm_samples库的id号 
通过查询: 
select * from pg_class where relfilenode='45300926';—t_black 
应该是停电的时候,正好在进行数据的写入等操作,造成了数据损坏。 

此时,我们进行了如下操作: 
set  zero_damaged_pages = on;   --当这个参数为on的时候,会忽略所有数据有损坏的页面 
vacuum full t_black; 
tm_samples=# select count(*) from t_black; 
WARNING: invalid page header in block 27069 of relation base/21078/45300926; zeroing out page 
WARNING: invalid page header in block 27070 of relation base/21078/45300926; zeroing out page 
WARNING: invalid page header in block 27071 of relation base/21078/45300926; zeroing out page 
WARNING: invalid page header in block 27072 of relation base/21078/45300926; zeroing out page 
WARNING: invalid page header in block 27073 of relation base/21078/45300926; zeroing out page 
count 
--------- 
3066302 
(1 row) 
reindex table t_black; 
再次select count(*) from t_black;  --正常 
再重启pg主从的服务,发现主从开始同步,后台没有再报刚刚那个错误 

3、研发测试验证,发现插入部分hash值的时候,依然会刚刚那个错误 
insert into t_black  (sample_hash, sample_crc32, sample_sha1, virusname, avl_m, software_english,file_size, conditions_type, 
sample_type, description,record_time, getname_time, developers, last_record_time, last_changename_time, source_id, ss_id, cps,level,keyhash, 
sensitive_strings, behavior_info, relation_info,version,ratio,"AVL_Embed", "AVL_Adware", program_name, versionname, record_time_int ) SELECT sample_hash, sample_crc32, sample_sha1, virusname, avl_m, software_english,file_size, conditions_type, 
sample_type, description,record_time, getname_time, developers, last_record_time, last_changename_time, source_id, ss_id, cps,level,keyhash, 
sensitive_strings, behavior_info, relation_info,version,ratio,"AVL_Embed", "AVL_Adware", program_name, versionname, record_time_int 
  FROM t_white where sample_hash ='1E0CB07CDC71B2F994F5D3EB51050E3A'; 

程序报错:DatabaseError: invalid page header in block 27073 of relation base/21078/45300926 
只插入部分字段就没问题,但完整插入就不行。 

这时,我们想到可能是文件系统损坏了,当有数据往刚刚那个坏块里面写的时候,就会触发报错。 
同时,我们查到一共有4张表出现了坏块,分别是: 
t_black 
t_white 
t_batch_sample 
t_derivative 
我们决定先对所有的表做一次vacuum,然后进行磁盘的检查------后面的操作都是娟姐做的,待她回来后补充,但她反应检查后依然不行,最后的方法是磁盘格式化,然后用从库的备份进行了覆盖恢复。 

网页上有一些介绍的方法: 
1)根据错误提示 ERROR: invalid page header in block 1 of relation base/34780/34781 我们可以找到相应的文件, 文件的路径为: 数据目录/base/34780/34781,只要用工具手动把上面提示的坏块清除即可。 
在Linux下面可以用dd工具把相应的页面清除: 
$dd if=/dev/zero of=/home/postgres/data/base/34780/42995 bs=8192 seek=1 count=1 conv=notrunc 

2)数据库暂时恢复使用了,但这是临时的,如果是磁盘文件系统故障,不久还是会重现这个问题,临了再修复了一下 
1.reboot进入单用户模式 
2.umount出现
### 问题分析 在 Docker 构建过程中,出现 `failed to solve: failed to register layer: archive/tar: invalid tar header` 错误通常是由于以下原因之一导致的: 1. 文件系统损坏或不完整。 2. 源代码或依赖项中存在损坏的文件。 3. 使用了不兼容的 Dockerfile 指令或语法[^1]。 4. 网络问题导致某些层下载不完整。 以下是针对该错误的详细解决方案。 --- ### 解决方案 #### 1. 清理 Docker 缓存 Docker 在构建镜像时会缓存中间层。如果这些层中的文件损坏,可能会导致上述错误。可以通过清理缓存来解决此问题。 ```bash docker builder prune -f ``` 此命令将删除所有未使用的构建缓存,从而避免因缓存损坏而导致的错误[^2]。 #### 2. 检查源代码和依赖项 确保项目中的文件没有损坏。特别是当使用 `COPY` 或 `ADD` 指令时,目标文件可能存在问题。可以尝试重新下载或重新生成这些文件。 例如,如果使用了压缩包,确保其完整性: ```bash tar -tvf your-file.tar.gz ``` 如果发现压缩包损坏,则需要重新获取或修复它。 #### 3. 更新 Docker 和相关工具 确保 Docker 版本是最新的。旧版本可能存在 bug 或不支持某些功能,这可能导致构建失败。 更新 Docker 的命令如下: ```bash sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io ``` 此外,检查是否使用了实验性语法(如 `RUN --security=insecure`),并确保 Dockerfile 基于支持该语法的 Docker 版本[^1]。 #### 4. 避免网络问题 网络不稳定可能导致某些层下载不完整,从而引发 `invalid tar header` 错误。可以在构建时添加 `--no-cache` 参数以禁用缓存,并确保所有层都重新拉取。 ```bash docker build --no-cache -t your-image-name . ``` #### 5. 检查基础镜像 如果错误发生在从远程仓库拉取基础镜像时,可能是基础镜像本身存在问题。尝试更换为其他稳定的基础镜像。 例如,将以下内容替换为最新的官方镜像: ```dockerfile FROM ubuntu:latest ``` #### 6. 调试构建过程 通过启用详细日志记录来调试构建过程,找出具体哪一层导致了问题。 ```bash export DOCKER_BUILDKIT=1 docker build --progress=plain -t your-image-name . ``` 此方法可以帮助定位问题所在。 --- ### 示例 Dockerfile 修正 以下是一个经过优化的 Dockerfile 示例,避免了可能导致 `invalid tar header` 错误的常见问题: ```dockerfile # 使用稳定的官方镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制必要的文件并安装依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 运行应用 CMD ["python", "app.py"] ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值