记录一次金仓V8R3数据库坏块处理过程、PostgreSQL数据库适用
因数广政务云华为业务存储固件升级,导致数据库产生坏块,业务SQL查询报错如下:
ERROR: missing chunk number 0 for toast value 38166585 in SYS_TOAST_30170
CONTEXT: PL/SQL function inline_code_block line 12 at FOR over EXECUTE statement
解决办法:
1、先查询出 SYS_TOAST_30170 属于哪张表的大字段。
select
n.nspname AS schema_name,
c.relname AS table_name,
a.attname AS column_name,
bb.relname as TOAST_name
from
sys_class c
inner join (select substring(sc.RELNAME from '[0-9]+') gg, sc.relname from sys_class sc) bb on c.oid = bb.gg
inner join sys_attribute a on a.attrelid = c.oid
inner join sys_namespace n ON n.oid = c.relnamespace
WHERE
a.attnum > 0
AND NOT a.attisdropped
AND a.atttypid = (SELECT oid FROM sys_type WHERE typname = 'text')
and bb.relname = 'SYS_TOAST_30170';

PostgreSQL使用以下脚本:
select
n.nspname AS schema_name,
c.relname AS table_name,
a.attname AS column_name,
bb.relname as TOAST_name
from
pg_class c
inner join (select substring(sc.RELNAME from '[0-9]+') gg, sc.relname from pg_class sc) bb on c.oid = bb.gg
inner join pg_attribute a on a.attrelid = c.oid
inner join pg_namespace n ON n.oid = c.relnamespace
WHERE
a.attnum > 0
AND NOT a.attisdropped
AND a.atttypid = (SELECT oid FROM pg_type WHERE typname = 'text')
and bb.relname = 'SYS_TOAST_30170';
2、创建一张记录含有坏块行的表、row_error_table
CREATE TABLE row_error_table (
err_ctid tid,
err_tablename varchar2(1000),
err_cloum varchar2(500),
err_CONTEXT text
);
3、使用下面脚本找到坏块在哪些行进行处理。
DO $$
DECLARE
rec RECORD;
/* 需要检测坏块的表、手动输入 */
v_tablename text := 'g_inbox';
/* 需要检测坏块的列、手动输入 */
v_columnname text := 'PROCESS_CONTENT';
BEGIN
FOR rec IN EXECUTE format('SELECT ctid, %I FROM %I ORDER BY ctid ', v_columnname, v_tablename) LOOP
BEGIN
RAISE NOTICE 'CTID Parameter is: %', rec.ctid;
RAISE NOTICE 'ROW Parameter is: %', rec.PROCESS_CONTENT;
EXCEPTION WHEN others THEN
/* 遇到 ERROR: missing chunk number 0 for toast value ... 异常 直接记录在 row_error_table*/
INSERT INTO row_error_table (err_ctid, err_tablename,err_cloum,err_CONTEXT) VALUES (rec.ctid, v_tablename,v_columnname,SQLERRM);
END;
END LOOP;
END;
$$
LANGUAGE plpgsql;

这个脚本会对需要检测坏块的表进行全表扫描,逐行验证是否有坏块。
v_tablename text := 'g_inbox'; /* 需要检测坏块的表、手动输入 */
v_columnname text := 'PROCESS_CONTENT'; /* 需要检测坏块的列、手动输入 */
检测坏块的时间取决于表的数据量。

脚本跑完以后会显示DO。
4、上面脚本跑完以后检查哪些行是有坏块。
SELECT * FROM row_error_table;

保存坏块的表名和列名都有显示,保存着CTID。
5、校验行是否有坏块。

查询整行记录报错,确定是有坏块
6、找到坏块的主键id。

找到主键ID以后,可以通过备份集找到原来的备份在异机进行恢复,然后通过主键ID找到着5行数据导出,然后在生产库导入即可。
记录一次金仓V8R3数据库坏块处理过程、PostgreSQL数据库适用的更多相关文章
- 13 oracle数据库坏块-逻辑坏块(模拟/修复)
13 oracle数据库坏块-逻辑坏块 逻辑数据坏块的场景1)oracle bug也可能导致逻辑坏块的产生. 特别是parallel dml. 例如:Bug 5621677 Logical corru ...
- 12 oracle 数据库坏块--物理坏块-ORA-01578/ORA-01110
oracle 数据库坏块--物理坏块 数据坏块的类型物理坏块:通常是由于硬件损坏如磁盘异常导致.内存有问题.存储链有问题. IO有问题.文件系统有问题. Oracle本身的问题等逻辑坏块:可能都是软件 ...
- undo丢失恢复异常恢复,运维DBA反映Oracle数据库无法启动报错ORA-01157 ORA-01110,分析原因为Oracle数据库坏块导致
本文转自 惜纷飞 大师. 模拟基表事务未提交数据库crash,undo丢失恢复异常恢复,运维DBA反映Oracle数据库无法启动报错ORA-01157 ORA-01110,分析原因为Oracle数据库 ...
- Oracle数据库坏块的恢复
模拟数据块坏块: 对于发生数据块不一致的数据块,如果当前数据库有备份且处于归档模式,那么就可以利用rman工具数据块恢复功能 对数据块进行恢复,这种方法最简单有效,而且可以在数据文件在线时进行,不会发 ...
- 对Oracle数据库坏块的理解
1.物理坏块和逻辑坏块 在数据库中有一个概念叫做数据块的一致性,Oracle的数据块的一致性包括了两个层次:物理一致性和逻辑一致性,如果一个数据块在这两个层次上存在不一致性,那就对应到了我们今天要要说 ...
- 使用BBED模拟Oracle数据库坏块
BBED(OracleBlockBrowerandEDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢 ...
- [转]RMAN检测数据库坏块
backup validate check logical database; select * from v$database_block_corruption; RMAN> backup v ...
- PostgreSQL 恢复大法 - 恢复部分数据库、跳过坏块、修复无法启动的数据库
转载自:https://yq.aliyun.com/articles/582880 背景 一个较大的数据库,如何只恢复一部分数据(例如只恢复某个DB). 如果访问有坏块的表. 如何从无法启动的数据库中 ...
- PostgreSQL物理坏块和文件损坏案例分享
作者简介 王睿操,平安好医数据库架构岗,多年postgresql数据库运维开发工作.曾就职于中国民航信息,迪卡侬.对其他数据库产品也有一定的涉猎. 背景 笔者最近发现很多朋友经常遇到PostgreSQ ...
- oracle坏块问题的处理
一.背景 今天有用户反映数据库连不上了,查看日志发现有数据库坏块. 查看数据库日志,有如下报错: ORA-01578: ORACLE , 93642) ORA-01110: 1: '/oracle/a ...
随机推荐
- 公网环境部署zabbix5.0
实验环境 虚拟机两台,一台公网地址为 1.1.1.1,部署 zabbix server,一台公网地址为 1.1.1.2,部署 zabbix proxy,系统为centos7.2. 1 zabbix s ...
- 西门子HMI切换页面时的指示功能
怎么样才能做到像这样按下切换界面的按钮,切换过去之后对应的切换按钮还进行高亮指示呢? 首先我们要先新建模板,把我们的画面拖拽到模板里就会形成按钮 在画面的"属性"中 在属性中选上我 ...
- pyqt5中的布局方法
addLayout():用于在布局中插入子布局 addWidget():用于在布局中插入控件
- [nginx]定制http头信息
前言 修改http响应头信息,相关Nginx模块:ngx_http_headers_module expires 语法: expires [modified] time; expires [modif ...
- opencv-python 车牌检测和识别
首先利用级联分类器把车牌位置找到取出来,然后用ocr进行车牌识别. 1 OCR之Tesseract安装 Tesseract安装可以参考这个链接: https://blog.csdn.net/m0_53 ...
- xss-labs靶场
在线XSS-labs靶场:https://xssaq.com/yx/ 靶场搭建 靶场是直接使用docker搭建的 docker pull vulfocus/xss-labs 启动靶场 docker r ...
- 浅析三维模型OBJ格式轻量化处理常见问题与处理措施
浅析三维模型OBJ格式轻量化处理常见问题与处理措施 在三维模型OBJ格式轻量化处理过程中,可能会遇到一些问题.以下是一些常见问题以及相应的解决方法: 1.文件大小过大: OBJ格式的三维模型文件通常包 ...
- 搭建LNMP 架构
搭建LNMP 架构 环境准备 lnmp 需要 安装 nginx mysql php 软件 #关闭防火墙 systemctl disable --now firewalld #临时禁用SELinux的强 ...
- 简单了解PyCharm
简单了解PyCharm PyCharm的简单使用 修改主题 1 2 切换解释器 1 如何创建pythin文件 1 2 3 4 注释语法 行注释 这里是注释 块注释 '''这里是注释''' 常量和变量的 ...
- Vs2022安装.Net4.5程序包
因为VS2022将不再支持.NET4.5,即使在Visual Studio Installer中也找不到.NET4.5的选项 我们可以在NuGet包中下载.NET 4.5的工具包 找到程序包管理器控制 ...