前提条件:一般在磁盘坏块报错信息提示中,可以得到 “磁盘块标识符”。举例:本次泰山库的 bass_mod 数据库,磁盘块标识符为 “208483865”。
如果不知道是那个数据库的情况下,一般报错提示中,磁盘坏块的前一个数字就是数据库的 oid。执行下列语句可得出是那个数据库。举例本次数据库的 oid 为 25097。
Select oid,* frome pg_database;
查询出 25097 对应的数据库为 bass_mod。
在表类型是 ao 的情况下
登录磁盘坏块所在的数据库,并查询 pg_appendonly 系统表中的 segrelid 字段 (字段含义:表在磁盘上的文件标识符),查询条件是磁盘块标识符为 “208483865”。
登录数据库(如果不是默认的 bass_mod 则执行 psql -d “指定的数据库名”)
Psql
查询语句
Select * from pg_appendonly where segrelid = 208483865;
执行完成后可得到 208483865 磁盘标识符在 pg_appendonly 中的所有信息。本次任务所需要的是 relid 字段(含义:AO 表的对象标识符,个人理解为 ao 表的 oid)的数据为 “208483860”。
得到 relid 之后只需将 relid 与 regclass(oid 的别名,个人理解像是一个函数,代表的是一个在 pg_class 表的 sql 查询语句)拼在一起,就可以得到这个磁盘标识符的表名。语句如下:
Select 208483860::regclass;
得到表名 dwd.dwd_a_ac_backgiftrec_dm_1_prt_p20210805
在表类型是 heap(堆存储) 的情况下
登录磁盘坏块所在的数据库,并查询 pg_class 系统表中的 relfilenode 字段 (字段含义:关系在磁盘上的文件的名字,如果没有则为 0),查询条件是磁盘块标识符为 “171209851”。语句如下:
登录数据库(如果不是默认的 bass_mod 则是 psql -d “指定的数据库名”)
Psql
查询语句:
Select * from pg_class where relfilenode = ‘171209851’;
执行完成后可直接得到表名字段 relname,本次查询的表名为 “a”.