因数广政务云华为业务存储固件升级,导致数据库产生坏块,业务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数据库适用的更多相关文章

  1. 13 oracle数据库坏块-逻辑坏块(模拟/修复)

    13 oracle数据库坏块-逻辑坏块 逻辑数据坏块的场景1)oracle bug也可能导致逻辑坏块的产生. 特别是parallel dml. 例如:Bug 5621677 Logical corru ...

  2. 12 oracle 数据库坏块--物理坏块-ORA-01578/ORA-01110

    oracle 数据库坏块--物理坏块 数据坏块的类型物理坏块:通常是由于硬件损坏如磁盘异常导致.内存有问题.存储链有问题. IO有问题.文件系统有问题. Oracle本身的问题等逻辑坏块:可能都是软件 ...

  3. undo丢失恢复异常恢复,运维DBA反映Oracle数据库无法启动报错ORA-01157 ORA-01110,分析原因为Oracle数据库坏块导致

    本文转自 惜纷飞 大师. 模拟基表事务未提交数据库crash,undo丢失恢复异常恢复,运维DBA反映Oracle数据库无法启动报错ORA-01157 ORA-01110,分析原因为Oracle数据库 ...

  4. Oracle数据库坏块的恢复

    模拟数据块坏块: 对于发生数据块不一致的数据块,如果当前数据库有备份且处于归档模式,那么就可以利用rman工具数据块恢复功能 对数据块进行恢复,这种方法最简单有效,而且可以在数据文件在线时进行,不会发 ...

  5. 对Oracle数据库坏块的理解

    1.物理坏块和逻辑坏块 在数据库中有一个概念叫做数据块的一致性,Oracle的数据块的一致性包括了两个层次:物理一致性和逻辑一致性,如果一个数据块在这两个层次上存在不一致性,那就对应到了我们今天要要说 ...

  6. 使用BBED模拟Oracle数据库坏块

    BBED(OracleBlockBrowerandEDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢 ...

  7. [转]RMAN检测数据库坏块

    backup validate check logical database; select * from v$database_block_corruption; RMAN> backup v ...

  8. PostgreSQL 恢复大法 - 恢复部分数据库、跳过坏块、修复无法启动的数据库

    转载自:https://yq.aliyun.com/articles/582880 背景 一个较大的数据库,如何只恢复一部分数据(例如只恢复某个DB). 如果访问有坏块的表. 如何从无法启动的数据库中 ...

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

    作者简介 王睿操,平安好医数据库架构岗,多年postgresql数据库运维开发工作.曾就职于中国民航信息,迪卡侬.对其他数据库产品也有一定的涉猎. 背景 笔者最近发现很多朋友经常遇到PostgreSQ ...

  10. oracle坏块问题的处理

    一.背景 今天有用户反映数据库连不上了,查看日志发现有数据库坏块. 查看数据库日志,有如下报错: ORA-01578: ORACLE , 93642) ORA-01110: 1: '/oracle/a ...

随机推荐

  1. 自用 .net C# List集合和DataTable互转,可自定义表头

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...

  2. 为react项目添加开发/提交规范(前端工程化、eslint、prettier、husky、commitlint、stylelint)

    因历史遗留原因,接手的项目没有代码提醒/格式化,包括 eslint.pretttier,也没有 commit 提交校验,如 husky.commitlint.stylelint,与其期待自己或者同事的 ...

  3. [linux]常见内核TCP参数描述与配置

    前言 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),如果需要固化设置,则需要修改/etc ...

  4. UI获取元素的几种方式

    通过浏览器驱动获取页面元素的8种方式. 定位方法: 通过webdriver对象的find_element方法 通过 id获取元素 el = driver.find_element(By.ID,'id' ...

  5. 基于C#的消息处理的应用程序 - 开源研究系列文章

    今天讲讲基于C#里的基于消息处理的应用程序的一个例子. 我们知道,Windows操作系统的程序是基于消息处理的.也就是说,程序接收到消息代码定义,然后根据消息代码定义去处理对应的操作.前面有一个博文例 ...

  6. 结果过滤器—MVC项目中结果过滤器(Result Filter)使用

    一.什么是结果过滤器? 结果过滤器(ResultFilter),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑.结果过滤器可以替换或更改 Ac ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (79)-- 算法导论7.4 4题

    四.请用go语言,证明:RANDOMIZED-QUICKSORT 期望运行时间是 Ω(nlgn). 文心一言: 首先,为了证明RANDOMIZED-QUICKSORT的期望运行时间是Ω(nlg n), ...

  8. dotnet SemanticKernel 入门 自定义变量和技能

    本文将告诉大家如何在 SemanticKernel 框架内定义自定义的变量和如何开发自定义的技能 本文属于 SemanticKernel 入门系列博客,更多博客内容请参阅我的 博客导航 自定义变量是一 ...

  9. 为何 Linus 一个人就能写出这么强的系统,中国却做不出来?

    前言 知乎上有一个提问:为何 Linus 一个人就能写出这么强的系统,中国却做不出来? ↓↓↓ 今天,我们就这个话题,一起来做个讨论. 不知道大家是怎么看这个问题的?是美国人更聪明吗,所以才能写出这么 ...

  10. 如何在Nuxt3.0中使用MongoDB数据库

    如何在Nuxt3.0中使用MongoDB数据库 一.介绍 Nuxt.js 是一个基于 Vue.js 的开源框架,用于构建服务端渲染 (Server-Side Rendering, SSR) 或静态生成 ...