速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

PostgreSQL 物理坏块和文件损坏案例分享

  • 2019-08-29
  • 本文字数:2649 字

    阅读完需:约 9 分钟

PostgreSQL 物理坏块和文件损坏案例分享

本文经授权转载自 PostgreSQL 中文社区


笔者最近发现很多朋友经常遇到 PostgreSQL 坏块或者数据混乱的情况,网上中文资料比较少,于是笔者整理了一下遇到的各种各样报错以及解决方案。

案例一:物理坏块

逻辑备份时报错


pg_dump: Dumping the contents of table "xxxx" failed: PQgetResult() failed.pg_dump: Error message from server: ERROR: invalid memory alloc request size 18446744073709551613pg_dump: The command was: COPY xxxxxx (id, active_flag, bkd, blk, go_show, grs, lss, lsv, lt, no_show, value, wl, inv_seg_cabin_id, ind) TO stdout;pg_dump: [parallel archiver] a worker process died unexpectedly
复制代码


原因:数据库产生坏行(可能是硬件损坏,可能是一个 bug(piece of memory gets overwritten by random data pg9.2 之前版本),也有可能是不正确的硬件配置)


首先笔者考虑了 pg 自带参数 zero_damaged_pages,将这个参数修改为 true,但发现仍然是报错,看了下官方文档,这种方法不会对物理文件作修改,只是把内存上,损坏页面的缓存变为 0。如果这个方法解决了报错,请将这表备份出来重新恢复,或者 select 到另一张表。


解决方式:删除损坏行


create extension hstore;(过程省略)


1、定义函数:


CREATE OR REPLACE FUNCTIONfind_bad_row(tableName TEXT)RETURNS tidas $find_bad_row$DECLAREresult tid;curs REFCURSOR;row1 RECORD;row2 RECORD;tabName TEXT;count BIGINT := 0;BEGINSELECT reverse(split_part(reverse($1), '.', 1)) INTO tabName;OPEN curs FOR EXECUTE 'SELECT ctid FROM ' || tableName;count := 1;FETCH curs INTO row1; WHILE row1.ctid IS NOT NULL LOOPresult = row1.ctid;count := count + 1;FETCH curs INTO row1; EXECUTE 'SELECT (each(hstore(' || tabName || '))).* FROM '|| tableName || ' WHERE ctid = $1' INTO row2USING row1.ctid;IF count % 100000 = 0 THENRAISE NOTICE 'rows processed: %', count;END IF;END LOOP;CLOSE curs;RETURN row1.ctid;EXCEPTIONWHEN OTHERS THENRAISE NOTICE 'LAST CTID: %', result;RAISE NOTICE '%: %', SQLSTATE, SQLERRM;RETURN result;END$find_bad_row$LANGUAGE plpgsql;
复制代码


2、通过函数查找问题行:


js1=# select find_bad_row('public.description');NOTICE: LAST CTID: (78497,6)NOTICE: XX000: invalid memory alloc request size 18446744073709551613find_bad_row--------------(78497,6)(1 row)
js1=# select * from xxxxxxx where ctid = '(78498,1)';ERROR: invalid memory alloc request size 18446744073709551613js1=# delete from xxxxxx where ctid = '(78498,1)';
复制代码


在这里我们需要对 xxxx 表格进行处理


3、然后再执行 pg_dump 命令


详细分析可见:


https://www.postgresql.org/message-id/54889986.3000308%40gmail.com

案例二:pgclog 因断电文件损坏

pg_clog 损坏


报错信息:Could not read from file "“pg_clog/0646"” at offset 243287


服务器异常断电,这台因为是测试库,所以没备份以及备库(所以对于 dba 来说备份就是生命啊,不管是测试库还是生产库一定要做好备份)


  1. 对数据库进行全库物理备份(为之后操作做保险)

  2. 用 dd 进行伪造这个数据块(数据块伪造全部提交),并且更改权限


for i in {1..262144}; do printf '\125'; done > committedls -l committedod -xv committed | headod -xv committed | tail
$ ls -l committed-rw-r--r-- 1 root root 262144 2009-06-25 11:01 committed
$ od -xv committed | head0000000 5555 5555 5555 5555 5555 5555 5555 55550000020 5555 5555 5555 5555 5555 5555 5555 55550000040 5555 5555 5555 5555 5555 5555 5555 55550000060 5555 5555 5555 5555 5555 5555 5555 55550000100 5555 5555 5555 5555 5555 5555 5555 55550000120 5555 5555 5555 5555 5555 5555 5555 55550000140 5555 5555 5555 5555 5555 5555 5555 55550000160 5555 5555 5555 5555 5555 5555 5555 55550000200 5555 5555 5555 5555 5555 5555 5555 55550000220 5555 5555 5555 5555 5555 5555 5555 5555$ od -xv committed | tail0777560 5555 5555 5555 5555 5555 5555 5555 55550777600 5555 5555 5555 5555 5555 5555 5555 55550777620 5555 5555 5555 5555 5555 5555 5555 55550777640 5555 5555 5555 5555 5555 5555 5555 55550777660 5555 5555 5555 5555 5555 5555 5555 55550777700 5555 5555 5555 5555 5555 5555 5555 55550777720 5555 5555 5555 5555 5555 5555 5555 55550777740 5555 5555 5555 5555 5555 5555 5555 55550777760 5555 5555 5555 5555 5555 5555 5555 55551000000
chown postgres.postgres committedchmod 600 committedmv -i committed $PGDATA/pg_clog/0646
复制代码


注意这个只能解决这个问题,不可以修复底层文件的损坏,所以如果有备份还是备份还原比较好。

案例三:toast 表损坏

missing chunk number x for toast value x in pg_toast_x


某张表关联的 toast 表发现数据损坏


解决方案引自:http://m.2cto.com/database/201802/720718.html


1、定位是哪张表的 toast 有问题:


select 2619::regclass;    regclass   -------------- pg_statistic
复制代码


2、找到哪个表有问题后,先对该表做一下简单的修复:


REINDEX table pg_toast.pg_toast_2619;REINDEX table pg_statistic;VACUUM ANALYZE pg_statistic;

复制代码


3、定位该表中损坏的数据行。执行


DO $$declarev_rec record;BEGINfor v_rec in SELECT * FROM pg_statistic loopraise notice ‘Parameter is:‘, v_rec.ctid;raise notice ‘Parameter is:’, v_rec;end loop; END;$$LANGUAGE plpgsql;
复制代码


4、将第 3 步中定位的记录删除:


delete from pg_statistic where ctid =‘(50,3)’;

复制代码


5、重复执行第 3,4 步,直到全部有问题的记录被清除。


6、至此,toast 问题就解决完了,解决之后,对数据库进行一次完整的维护或者索引重建。


其实一般来说,数据库会根据归档或者 wal 去自行将 postgres 中未提交事务进行回滚操作,笔者这个环境当时是因为缺失了归档,所以只能手动将混乱数据进行删除。


最后笔者想说,很多情况下都是因为没有一个靠谱的备份而导致很多问题,所以建议大家不管什么情况,备份为先,检查备份很重要!


作者介绍:


王睿操,平安好医数据库架构岗,多年 postgresql 数据库运维开发工作。曾就职于中国民航信息,迪卡侬。对其他数据库产品也有一定的涉猎。


原文链接:


https://mp.weixin.qq.com/s/mBLxAfVT6_cDOAOD8J0_aw


2019-08-29 09:265206

评论

发布
暂无评论
发现更多内容

企业如何快速地制作出电子产品宣传册?

小炮

2022 年了,还不了解 PWA ? 教你 VuePress 博客如何快速兼容 PWA

冴羽

JavaScript Vue 前端 vuepress PWA

FinClip 黑客马拉松正式开赛,码力集结,等你来战!

Speedoooo

小程序生态 hackathon APP开发 黑客马拉松 黑客松

Linux之traceroute命令

入门小站

Linux

在线TOML转YAML工具

入门小站

工具

你可以不知道KFC疯狂星期四,但不能不知道InfoQ会员周!七天限时福利冲冲冲!

InfoQ写作社区官方

热门活动 InfoQ会员周

天翼云基于 KubeEdge 的大规模 CDN 场景落地实践

华为云原生团队

开源 云原生 边缘计算 边缘技术 边缘云

OAuthApp H5 应用开发/云托管平台

unclewang

微服务 前端 .net core H5制作 SaaS平台

数据孤岛下的新破局 Real Time DaaS:面向 AP+TP 业务的数据平台架构

tapdata

数据中台 数据仓库 异构数据 Real Time DaaS DaaS

Amazon Graviton2上数据压缩算法性能比较

亚马逊云科技 (Amazon Web Services)

数据 应用性能

Apache SeaTunnel & Kyuubi 联合 Meetup | 见证中国大数据崛起!

Apache SeaTunnel

大数据 开源 大数据平台 apache 社区 Apache SeaTunnel

“东数西算”超级工程上马,利好云计算但暗藏汹涌

行云管家

云计算 混合云 多云 东数西算

CRM系统帮助降低业务成本的方式

低代码小观

企业管理 CRM 企业管理系统 CRM系统 客户关系管理系统

全网渗透率达80%!“耳朵经济”将成为当下市场的流行趋势

易观分析

耳朵经济 在线音频

LigaAI完成A轮融资,加速打造全新的智能研发协作平台

LigaAI

行业资讯 智能 LigaAI A轮融资 研发协作平台

如何编写有效的常见问题解答(内附 5 个最佳示例)

小炮

2个动作,让研发效率提升120%,代码减少50%

云智慧AIOps社区

敏捷开发 代码优化 开发规范 研发提效 研发效率

教你Mac下终端配置iterm2+oh-my-zsh+powerlevel10k

锋享前端

Mac iterm2

基于 XuperChain 的区块链项目从 0 到 N(二)

刘旭东

区块链 XuperChain

三步教企业搭建产品帮助中心

小炮

改进DevSecOps框架的 5 大关键技术

禅道项目管理

DevOps 敏捷 自动化

项目启动 | 德荣医疗携手用友iuap共谱数字化转型新篇章

用友BIP

用友 用友iuap

ModStartCMS 模块化建站系统 Laravel 9.0 版 v3.3.0

ModStart开源

4种常见分支模式解析及优劣对比 | 研发效能提升36计

阿里云云效

阿里云 云原生 研发团队 研发 分支管理

【专访蓝景科技】5G+实时云渲染赋能数字孪生,共建元宇宙

3DCAT实时渲染

5G 数字孪生 实时云渲染

视频渲染靠cpu还是显卡 视频渲染的作用是什么

懒得勤快

服务器被入侵了?反手溯源出入侵者画像【网络安全】

H

黑客 网络安全

大画 Spark :: 网络(5)-Spark中的server端和client端

dclar

大数据 hadoop spark Spark 源码 大数据开发

分库分表中间件的高可用实践讲解

Linux服务器开发

高可用 高并发 中间件 Linux服务器开发 Linux后台开发

大咖说|制造业发展趋势:“专精特新”与数字化转型

大咖说

阿里巴巴 阿里云 数字化 中制智库

Web 键盘输入法应用开发指南 (6) —— 开发实战(一)

天择

JavaScript 键盘 实战 输入法 3月月更

PostgreSQL 物理坏块和文件损坏案例分享_数据库_王睿操_InfoQ精选文章