数据页(也称数据块)是DM数据库中最小的数据存储单元。页的大小对应物理存储空间上特定数量的存储字节,在DM数据库中,页大小可以为4KB、8KB、16KB或32KB,用户在创建数据库时可以指定,默认大小为8KB,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。
页头控制信息包含了关于页类型、页地址等信息。页的中部存放数据,为了更好地利用数据页,在数据页的尾部专门留出一部分空间用于存放行偏移数组,行偏移数组用于标识页上的空间占用情况以便管理数据页自身的空间。在绝大多数情况下,用户都无需干预DM数据库对数据页的管理。但是DM数据库还是提供了FILLFACTOR参数,是与性能有关的数据页级存储参数,它指定一个数据页初始化后插入数据时最大可以使用空间的百分比(100),该值在创建表/索引时可以指定。
通常导致坏块的原因是:
主机故障
存储故障
操作系统软件故障
达梦系统软件故障
通过达梦数据页损坏报错机制,在访问到损坏页时获得损坏页的信息,也可以在访问到损坏页后查询动态视图V$ERROR_PAGE或GV$ERROR_PAGE获得损坏页的信息。由于上述视图中记录了访问到的所有损坏数据页历史信息,因此查询得到结果集后需要再查询V$REPAIRED_PAGE或GV$REPAIRED_PAGE动态视图,得到所有数据页修复历史信息,通过对比两个结果集排除掉已经被修复的数据页,其余的是需要被修复的数据页。可能存在数据页被修复后再次损坏的情况,因此对比结果集时需要注意访问到损坏页的时间以及数据页修复时间,以此判断该数据页是否需要被再次修复。 如果是主库数据页损坏,则可以调用系统函数SF_PRIMARY_PAGE_REPAIR来修复数据页,调用该系统函数时需要指定一个数据页正常的备库实例名,借助该备库来修复主库数据页。如果是备库数据页损坏,则可以调用系统函数SF_STANDBY_PAGE_REPAIR来修复数据页,调用该系统函数时需要指定主库实例名,并保证该主库数据页正常,借助该主库来修复备库数据页。修复完成后可以查询动态视图V$REPAIRED_PAGE或GV$REPAIRED_PAGE获得修复完成的数据页信息。
主备库修复页损坏使用两个系统函数:
| 系统函数名 | 功能说明 |
|---|---|
| SF_PRIMARY_PAGE_REPAIR | 修复主库损坏的数据页 |
| SF_STANDBY_PAGE_REPAIR | 修复备库损坏的数据页 |
(1) SF_PRIMARY_PAGE_REPAIR
定义:
SF_PRIMARY_PAGE_REPAIR(
instance_name varchar(128),
ts_id int,
file_id int,
page_no int,
time_out int
)
参数说明:
instance_name: 指定备库实例名,如果备库是dsc集群,只需控制节点实例名。
ts_id: 损坏页所在表空间id。
file_id: 损坏页所在文件id。
page_no: 损坏页页号。不支持 0号页、6号页、7号页、非system表空间0号文件的1~5号页的修复。
time_out: 超时控制。单位:秒;范围0~86400。time_out为0时不做超时控制。
返回值:
0:执行成功。
<0:执行失败
举例说明:
SF_PRIMARY_PAGE_REPAIR(‘GRP1_RT_02’, 5, 0, 50, 5);
修复主库页,页信息(5,0,50),指定备库实例名GRP1_RT_02,超时控制5秒。
(2) SF_STANDBY_PAGE_REPAIR
定义:
SF_STANDBY_PAGE_REPAIR(
instance_name varchar(128),
ts_id int,
file_id int,
page_no int
)
参数说明:
instance_name: 指定主库实例名。
ts_id: 损坏页所在表空间ID。
file_id: 损坏页所在文件ID。
page_no: 损坏页的页号。不支持 0号页、6号页、7号页、非system表空间0号文件的1~5号页的修复。
返回值:
0:执行成功。
<0:执行失败。
举例说明:
SF_STANDBY_PAGE_REPAIR(‘GRP1_RT_01’, 5, 0, 51);
修复备库页,页信息(5,0,51),指定主库实例名GRP1_RT_01。
| 视图名 | 内容 |
|---|---|
| V$ERROR_PAGE/GV$ERROR_PAGE | 记录了访问到的所有损坏数据页历史信息 |
| V$REPAIRED_PAGE/GV$REPAIRED_PAGE | 记录了所有数据页修复历史信息 |
(1)调用系统过程修复损坏页时,要求PAGE_CHECK建库参数非0,并开启PTX_ROLLBACK、PAGE_CHECK_POLICY配置参数,确保获得已损坏页信息。
| 参数名 | 缺省值 | 属性 | 说明 |
|---|---|---|---|
| PAGE_CHECK | 3 | 不可修改 | 页检查模式: 3:开启页校验并使用快速 CRC校验(CRC32C标准) |
| PTX_ROLLBACK | 0 | 静态 | 针对访问数据页损坏的场景: 1:绝大部分情况可以正常报错,当损坏的数据页 是文件0号页、系统表空间数据页、文件系统INODE页或者描述页等时,无法正常报错,此时的处理策 略取决于INI参数PAGE_CHECK_POLICY |
| PAGE_CHECK_POLICY | 1 | 动态,系统级 | 数据页校验失败处理策略: 0:忽略失败;1:系统主动HALT |
(2)要求主库是open状态,没有故障处理或故障重加入。
(3)要求备库归档状态有效且处于open状态,和主库保持正常的数据同步。
(4)目前支持用来修复主库数据页的备库类型包括实时备库,即时备库,同步备库。因为备库归档必须valid才能进行修复,异步备库不会有valid状态,不支持主库修复;订阅备库不配置在dmarch.ini中,目前也不支持主库修复
| 操作系统 | CentOS Linux 7 (Core) |
|---|---|
| CPU | Intel x86_64 |
| 数据库版本 | 03134284488-20260212-314192-20200 |
(1)创建测试环境
create tablespace TEST datafile '/data/dmdata/DAMENG/TEST.DBF' size 128 CACHE = NORMAL;
create table SYSDBA.TAB1
(
COLUMN_1 int,
COLUMN_2 CHAR(10),
COLUMN_3 CHAR(10),
COLUMN_4 CHAR(10),
COLUMN_5 CHAR(10),
COLUMN_6 CHAR(10)
)
storage(on "TEST");
--插入10w条数据
DECLARE
BEGIN
for i in 1..100000 LOOP
insert into SYSDBA.TAB1 values(i,'sss','ddd','fff','ggg','hhh');
end loop;
commit;
end;
--查询数据
select * from tab1;
(2)确定位置
-- 确定数据文件位置
-- select * from v$datafile where client_path ='TEST.DBF';
--确定数据页
SELECT
PHYROWID,
-- 提取文件号 (55–48位)
(PHYROWID >> 48) & 0xFF AS 文件号,
-- 提取页号 (47–16位)
(PHYROWID >> 16) & 0xFFFFFFFF AS 页号,
-- 提取槽号 (15–0位)
PHYROWID & 0xFFFF AS 槽号,*
FROM TAB1;
(3)dd损坏页文件
--dd损坏(损坏TEST表空间0号文件0页一整页数据)
dd if=/dev/urandom of=/data/dmdata/DAMENG/TEST.DBF seek=0 count=1 bs=32k conv=notrunc
--修改参数,主备库都执行并重启集群:
sp_set_para_value(2,'PTX_ROLLBACK',1);
sp_set_para_value(2,'PAGE_CHECK_POLICY',1);
--查询报错
--日志报错
--查询坏页情况
select * from V$ERROR_PAGE;
--坏页修复
SF_PRIMARY_PAGE_REPAIR('DMSERVER_02',5,0,0 ,0);
PS:验证当前函数不支持特殊页修复,需要备份还原修复
前置步骤已完成,从模拟坏页开始
dd损坏页文件
--dd损坏(损坏2112页一整页数据)
dd if=/dev/urandom of=/data/dmdata/DAMENG/TEST.DBF seek=2112 count=1 bs=32k conv=notrunc
--重启数据库
--查询报错
select * from tab1;
--日志报错
--查询坏页情况
select * from V$ERROR_PAGE;
--坏页修复
SF_PRIMARY_PAGE_REPAIR('DMSERVER_02',5,0,2112 ,0);
--查询修复情况
select * from V$REPAIRED_PAGE;
--查询表数据进行确认
select * from tab1;
dd损坏页文件
--dd损坏(损坏2112一整页数据)
dd if=/dev/urandom of=/data/dmdata/DAMENG/TEST.DBF seek=2112 count=1 bs=32k conv=notrunc
--重启数据库
--备库查询报错
select * from tab1;
--日志报错
--查询坏页情况
select * from V$ERROR_PAGE;
--坏页修复
SF_STANDBY_PAGE_REPAIR('DMSERVER_01',5,0,2112);
(注:SF_STANDBY_PAGE_REPAIR在备库执行。为了简化处理,主库收到修复请求后,不再直接发回页内容,而是生成一条包含数据页内容的特殊日志,备库通过重演日志的方式来修复损坏页,因此不保证备库修复的时效性)
--查询修复情况
select * from V$REPAIRED_PAGE;
--查询表数据进行确认
select * from tab1;
在本次实践中,验证了达梦数据库主备架构下的页损坏修复函数,可借助对端正常实例实现大部分普通业务数据页的在线修复,提供了无需停机备份还原的便捷修复手段,但该页修复函数存在明确页号修复限制:不支持 0号页、6号页、7号页、非system表空间0号文件的1~5号页这类特殊页修复。对于特殊页,本次实践通过模拟page(5,0,0)页损坏进行了验证,该函数暂不支持这类特殊页修复,对于特殊页的修复,需要使用备份还原方式进行恢复。
文章
阅读量
获赞
