云数据库 GAUSSDB-数据损坏检测修复函数

时间:2023-11-15 14:59:26

数据损坏检测修复函数

  • 修复主机备机文件页面的约束概述:

    文件类型

    文件页面级别

    主备机

    检测修复

    普通行存表(astore)、段页式表(不包括hashbucket表),不包括索引

    文件&页面

    主机

    手动检测手动修复。

    unlogged表的init fork文件

    文件

    主机

    手动检测手动修复。

    普通行存表(astore)、索引(btree)

    页面

    备机

    回放过程中自动检测自动修复。

    备机修复支持备集群的首备和级联备。

  • gs_verify_data_file(verify_segment bool)

    描述:校验当前实例当前库是否存在文件丢失的情况。校验只包括数据表主文件是否有中间段丢失的情况。默认参数是false,表示不校验段页式表数据文件。参数设置为true时仅校验段页式表文件。默认只有初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户可以查看,其余用户需要赋权后才可以使用。

    返回的结果:

    • 非段页式表:rel_oid和rel_name是对应文件的表oid和表名,miss_file_path表示丢失文件的相对路径。
    • 段页式表:因所有表存放在相同文件中,所以rel_oid和rel_name无法显示具体表的信息。对于段页式表,如果第一个文件损坏,不会检查出后面的.1 .2等文件。例如3、3.1、3.2损坏,只能检查出3损坏。当段页式文件不足5个时,使用函数检测时,未生成的文件也会校验出来,例如只有1和2文件,校验段页式时,也会检测出3,4,5文件。以下示例,第一个是校验非段页式表的示例,第二是校验段页式表的示例。

    参数说明:

    • verify_segment

      指定文件校验的范围。false校验非段页式表;true校验段页式表。

      取值范围:true和false,默认是false。

    返回值类型:record

    示例:

    校验非段页式表

    gaussdb=# select * from gs_verify_data_file();
    node_name         | rel_oid |  rel_name    |  miss_file_path
    ------------------+---------+--------------+------------------
    dn_6001_6002_6003 |   16554 |     test     | base/16552/24745

    校验段页式表

    gaussdb=# select * from gs_verify_data_file(true);
         node_name     | rel_oid | rel_name | miss_file_path
    -------------------+---------+----------+----------------
     dn_6001_6002_6003 |       0 | none     | base/16573/2

  • gs_repair_file(tableoid Oid,path text, timeout int)

    描述:根据传入的参数修复文件,仅支持有正常主备连接的主DN使用。参数依据gs_verify_data_file函数返回的oid和路径填写。段页式表tableoid赋值为0到4,294,967,295的任意值(内部校验根据文件路径判断是否是段页式表文件,段页式表文件则不使用tableoid)。修复成功返回值为true,修复失败会显示具体失败原因。默认只有在主DN节点上,使用初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户可以查看,其余用户需要赋权后才可以使用。

    1. 当DN实例上存在文件损坏时,进行升主会校验出错,报PANIC退出无法升主,为正常现象。
    2. 当文件存在但是大小为0时,此时不会去修复该文件,若想要修复该文件,需要将为0的文件删除后再修复。
    3. 删除文件需要等文件句柄(fd,file descriptor)自动关闭后再修复,人工操作可以执行重启进程,主备切换等命令。

    参数说明:

    • tableoid

      要修复的文件对应的表oid,依据gs_verify_data_file函数返回的列表中rel_oid一列填写。

      取值范围: Oid,0 - 4294967295。注意:输入负值等数值都会被强制转成非负整数类型。

    • path

      需要修复的文件路径,依据gs_verify_data_file函数返回的列表中miss_file_path一列填写。

      取值范围:字符串。

    • timeout

      等待备DN回放的时长,修复文件需要等待备DN回放到当前主DN对应的位置,根据备DN回放所需时长设定。

      取值范围:60s - 3600s。

    返回值类型:bool

    示例:

    gaussdb=# select * from gs_repair_file(16554,'base/16552/24745',360);
    gs_repair_file
    ----------------
    t

  • local_bad_block_info()

    描述:显示本实例页面损坏的情况。从磁盘读取页面,发现页面CRC校验失败时进行记录。默认只有初始用户、具有sysadmin属性的用户、具有监控管理员属性的用户以及在运维模式下具有运维管理员属性的用户、以及监控用户可以查看,其余用户需要赋权后才可以使用。file_path是损坏文件的相对路径,如果是段页式表,则显示的是逻辑信息,不是实际的物理文件信息。block_num是该文件损坏的具体页面号,页面号从0开始。check_time表示发现页面损坏的时间。repair_time表示修复页面的时间。

    返回值类型:record

    示例:

    gaussdb=# select * from local_bad_block_info();
    node_name    | spc_node | db_node | rel_node| bucket_node | fork_num | block_num |    file_path     |  check_time            |   repair_time
    -----------------+-------+--------+--------+--------------+----------+-----------+-----------------+--------------------------+-------------------------------
    dn_6001_6002_6003|  1663 |  16552 |  24745 |        -1    |    0    | 0        | base/16552/24745 | 2022-01-13 20:19:08.385004+08 | 2022-01-13 20:19:08.407314+08
    
  • remote_bad_block_info()

    描述:CN上查询时,查询除本实例以外其他实例页面损坏的情况,记录数据和在其他实例上执行local_bad_block_info函数一致。DN上执行结果为空。默认只有初始用户、具有sysadmin属性的用户、具有监控管理员属性的用户以及在运维模式下具有运维管理员属性的用户、以及监控用户可以查看,其余用户需要赋权后才可以使用。

    返回值类型:record

  • local_clear_bad_block_info()

    描述:清理local_bad_block_info中已修复页面的数据,也就是repair_time不为空的信息。默认只有初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户、以及监控用户可以查看,其余用户需要赋权后才可以使用。

    返回值类型:bool

    示例:

    gaussdb=# select * from local_clear_bad_block_info();
    result
    --------
    t
  • remote_clear_bad_block_info()

    描述:CN上执行时,清理除本实例以外其他实例已修复页面的数据,也就是repair_time不为空的信息。DN上执行结果为空。默认只有初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户、以及监控用户可以查看,其余用户需要赋权后才可以使用。

    返回值类型:record

  • gs_verify_and_tryrepair_page (path text, blocknum Oid, verify_mem bool, is_segment bool)

    描述:校验本实例指定页面的情况。默认只有在主DN节点上,使用初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户可以查看,其余用户需要赋权后才可以使用。返回的结果信息,disk_page_res表示磁盘上页面的校验结果,mem_page_res表示内存中页面的校验结果,is_repair表示在校验的过程中是否触发修复功能,t表示已修复,f表示未修复。

    注意:

    1. 当DN实例上存在页面损坏时,进行升主会校验出错,报PANIC退出无法升主,为正常现象。不支持hashbucket表页面损坏的修复。
    2. 此函数触发的修复仅支持修复内存中的页面,需要在内存页面落盘后物理页面修复才能正式生效。

    参数说明:

    • path

      损坏文件的路径,依据local_bad_block_info中file_path一列填写。

      取值范围:字符串。

    • blocknum

      损坏文件的页号,依据local_bad_block_info中block_num一列填写。

      取值范围:Oid,0 - 4294967295。注意:输入负值等都会被强制转成非负整数类型。

    • verify_mem

      指定是否校验内存中的指定页面。设定为false时,只校验磁盘上的页面。设置为true时,校验内存中的页面和磁盘上的页面。如果发现磁盘上页面损坏,会将内存中的页面做一个基本信息校验刷盘,修复磁盘上页面。如果校验内存页面时发现页面不在内存中,会经内存接口读取磁盘上的页面。此过程中如果磁盘页面有问题,则会触发远程读自动修复功能。

      取值范围:bool,true和false。

    • is_segment

      是否是段页式表。根据local_bad_block_info中的bucket_node列值决定。如果bucket_node为-1时,表示不是段页式表,将is_segment设置为false;非-1的情况将is_segment设置为true。

      取值范围:bool,true和false。

    返回值类型:record

    示例:

    gaussdb=# select * from gs_verify_and_tryrepair_page('base/16552/24745',0,false,false);
    node_name         |       path      |  blocknum  |        disk_page_res        | mem_page_res | is_repair
    ------------------+------------------+------------+-----------------------------+---------------+----------
    dn_6001_6002_6003 | base/16552/24745 |     0      | page verification succeeded.|              | f

  • gs_repair_page(path text, blocknum Oid is_segment bool, timeout int)

    描述:修复本实例指定页面,仅支持有正常主备连接的主DN使用。默认只有在主DN节点上,使用初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户可以查看,其余用户需要赋权后才可以使用。页面修复成功返回true,修复过程中出错会有报错信息提示。

    注意:当DN实例上存在页面损坏时,进行升主会校验出错,报PANIC退出无法升主,为正常现象。不支持hashbucket表页面损坏的修复。

    参数说明

    • path

      损坏页面的路径。根据local_bad_block_info中file_path一列设置,或者是gs_verify_and_tryrepair_page函数中path一列设置。

      取值范围:字符串。

    • blocknum

      损坏页面的页面号。根据local_bad_block_info中block_num一列设置,或者是gs_verify_and_tryrepair_page函数中blocknum一列设置。

      取值范围:Oid,0 - 4294967295。注意:输入负值等数值都会被强制转成非负整数类型。

    • is_segment

      是否是段页式表。根据local_bad_block_info中的bucket_node列值决定,如果bucket_node为-1时,表示不是段页式表,将is_segment设置为false,非-1的情况将is_segment设置为true。

      取值范围:bool,true或者false。

    • timeout

      等待备DN回放的时长。修复页面需要等待备DN回放到当前主DN对应的位置,根据备DN回放所需时长设定。

      取值范围:60s - 3600s。

    返回值类型:bool

    示例:

    gaussdb=# select * from gs_repair_page('base/16552/24745',0,false,60);
    result
    --------
    t
  • gs_verify_urq(index_oid oid, partindex_oid oid, blocknum bigint, queue_type text)

    描述:校验索引回收队列(潜在队列/可用队列/单页面)的正确性。

    参数说明:详见表1

    返回值类型:record

    表1 gs_verify_urq参数说明

    参数类型

    参数名

    类型

    描述

    输入参数

    index_oid

    oid

    UBTree索引oid:

    • 普通索引:索引oid。
    • 全局索引:GPI oid。
    • local索引:主索引oid。

    输入参数

    partindex_oid

    oid

    UBTree分区索引oid:

    • 普通索引:0。
    • 全局索引:0。
    • local索引:分区索引oid(一级/二级)。

    输入参数

    blocknum

    bigint

    页面号:

    • 队列类型为single page时,校验单个页面blocknum的所有元组正确性。取值范围为[0, 队列文件大小/8192)。
    • 队列类型为empty queue或free queue时,blocknum是一个无效值。

    输入参数

    queue_type

    text

    队列类型:

    • empty queue:潜在队列。
    • free queue:可用队列。
    • single page:队列单页面。

    输出参数

    error_code

    text

    错误码。

    输出参数

    detail

    text

    具体报错及其他关键信息。

    示例1:

    gaussdb=# select * from gs_verify_urq(16387, 0, 1, 'free queue');
     error_code | detail 
    ------------+--------
    (0 rows)

    示例2:

    gaussdb=# select * from gs_verify_urq(16387, 0, 1, 'empty queue');
          error_code       |                                                                         detail                                                        
    -----------------------+---------------------------------------------------------------------------------------------------------------
     VERIFY_URQ_PAGE_ERROR | invalid urq meta: oid 16387, blkno 1, head_blkno = 1, tail_blkno = 3, nblocks_upper = 4294967295, nblocks_lower = 1; urq_blocks = 6, index_blocks = 12
    (1 row)

    该接口当前仅支持USTORE索引表。如果索引回收队列校验正常,则该视图不输出错误码和报错详细信息,否则输出错误码和报错详细信息,错误码包含"VERIFY_URQ_PAGE_ERROR"、"VERIFY_URQ_LINK_ERROR"、"VERIFY_URQ_HEAD_MISSED_ERROR"和"VERIFY_URQ_TAIL_MISSED_ERROR",如出现以上错误码,请联系华为工程师辅助定位。

  • gs_urq_dump_stat(index_oid oid, partindex_oid oid)

    描述:查询指定索引回收队列相关信息。

    显示信息:recentGlobalDataXmin和globalFrozenXid是回收队列判断索引页面是否可以被回收时使用的两个oldestxmin,next_xid为下一个最新的事务xid,urq_blocks为回收队列总页面数以及free queue(可用队列)、empty queue(潜在队列)有效页面里的相关信息。

    参数说明:详见表2

    表2 gs_urq_dump_stat参数说明

    参数类型

    参数名

    类型

    描述

    输入参数

    index_oid

    oid

    UBTree索引oid:

    • 普通索引:索引oid。
    • 全局索引:GPI oid。
    • local索引:主索引oid。

    输入参数

    partindex_oid

    oid

    UBTree分区索引oid:

    • 普通索引:0。
    • 全局索引:0。
    • local索引:分区索引oid(一级/二级)。

    输出参数

    result

    text

    索引回收队列的详细统计信息。

    示例:

    gaussdb=# select * from gs_urq_dump_stat(16387, 0);
                                                                 result                                                              
    ---------------------------------------------------------------------------------------------------------------------------------
     urq stat info: recentGlobalDataXmin = 213156, globalFrozenXid = 213156, next_xid = 214157, urq_blocks = 6,                     +
       free  queue:    head page blkno = 0 min_xid = 211187 max_xid = 214157, tail page blkno = 0 min_xid = 211187 max_xid = 214157,+
                    middle page min_xid = 1152921504606846975 max_xid = 0, valid_pages = 1, valid_items = 6, can_use_item = 3       +
       empty queue:    head page blkno = 1 min_xid = 212160 max_xid = 213160, tail page blkno = 3 min_xid = 213162 max_xid = 214156,+
                    middle page min_xid = 1152921504606846975 max_xid = 0, valid_pages = 2, valid_items = 999, can_use_item = 498   +
    
    (1 row)

    该接口当前仅支持USTORE索引表。

  • gs_repair_urq(index_oid oid, partindex_oid oid)

    描述:重建(有损)索引回收队列(潜在队列和可用队列)。删除当前索引的回收队列文件,重新创建一个空的回收队列文件。重建成功显示reinitial the recycle queue of index relation sucessfully。

    参数说明:详见表3

    备注:当前函数仅支持在主节点进行调用。

    表3 gs_repair_urq参数说明

    参数类型

    参数名

    类型

    描述

    输入参数

    index_oid

    oid

    UBTree索引oid:

    • 普通索引:索引oid。
    • 全局索引:GPI oid。
    • local索引:主索引oid。

    输入参数

    partindex_oid

    oid

    UBTree分区索引oid:

    • 普通索引:0。
    • 全局索引:0。
    • local索引:分区索引oid(一级/二级)。

    输出参数

    result

    text

    重建成功显示reinitial the recycle queue of index relation sucessfully。

    示例:

    gaussdb=# select * from gs_repair_urq(16387, 0);
                               result
    ------------------------------------------------------------
     reinitial the recycle queue of index relation sucessfully.
    (1 row)

    该接口当前仅支持USTORE索引表。

  • gs_get_standby_bad_block_info()

    描述:显示备机上已经检测到但是还未修复的页面。默认只有在备DN节点上,使用初始用户、具有sysadmin权限的用户以及在运维模式下具有运维管理员权限的用户、以及监控用户可以查看,其余用户需要赋权后才可以使用。返回值invalid_type列共有4种类型:NOT_PRESENT(页面不存在)、 NOT_INITIALIZED(页面初始化失败)、 LSN_CHECK_ERROR(LSN校验失败)、CRC_CHECK_ERROR(CRC校验失败)。

    返回值类型:record

    示例:

    gaussdb=# select * from gs_get_standby_bad_block_info();
     spc_node | db_node | rel_node | bucket_node | fork_num | block_num |  invalid_type   | master_page_lsn 
    ----------+---------+----------+-------------+----------+-----------+-----------------+-----------------
       1663   |   16552 |   24745  |       -1    |    0     |     0     | CRC_CHECK_ERROR | 0/B2009E8
    (1 rows)
support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-12-0396.html