[入门介绍] GaussDB 100 数据库宕机-磁盘页面故障导致数据库停止

磁盘页面故障导致数据库停止

问题现象

现象一:客户端报错,错误码 GS-00880,错误信息为page损坏,例如:

GS-00880, Page 3-44 corrupted

现象二:数据库突然停止,运行日志中记录 "ABORT INFO:page corrupted",例如:

ERROR>[BUF] ABORT INFO:page corrupted(file 0, page 9632).checksum level 1, page size 8192,cks 12745,from_disk 1, changed 0

原因分析

数据库从磁盘加载页面,检测页面checksum值发现不匹配时,即数据页面已经损坏,如果此页面损坏不影响数据库正常运行,则客户端会返回GS-00880错误码,并打印损坏的页面ID; 如果页面损坏导致数据库无法继续正常运行,数据库将停止,并在运行日志中记录 "ABORT INFO:page corrupted"信息。故障原因有:

  • 磁盘发生静默故障,导致页面数据损坏。

  • 非法写入操作,将数据库不支持的数据类型写入,导致页面数据损坏。

处理方法 1

单机和HA主机磁盘页面故障且无法启动场景下,可以通过备份文件以及重演日志方式修复损坏页面。

前提条件

  • 数据库必须包含从备份时间点开始到发现磁盘数据页故障时的所有重演日志。

  • 已经获取ztrst工具包GAUSSDB100-V300R001C00-RESTORE.tar.gz,该包位于GAUSSDB100-V300R001C00-TOOLS.tar.gz压缩包下。

  • ztrst工具所需的环境变量已经配置好,具体请参见《GaussDB 100 V300R001C00 用户指南(单机)》中数据库系统管理 > 备份与恢复 > 使用ztrst工具恢复数据的步骤4。

  • 数据临时目录(-D参数指定)下的tmp_data目录和export_data目录不存在。

  • 使用的备份集(参数-B指定)必须是有效备份集,备份时间必须发生在坏页产生之前。

  • 备份文件备份时使用的数据库版本要与工具的版本一致。

说明:

目前不支持恢复如下类型的页面:

  • 不支持恢复临时表空间,nologging表空间的数据页面。

  • 不支持修复表空间描述信息的数据页面。

  • 不支持恢复数据库控制文件的数据页面。

操作步骤

  1. 使用安装GaussDB 100数据库的操作系统用户,登录GaussDB 100所在服务器。

  2. 如果数据库已经停止运行,请以mount模式启动数据库;若数据库状态正常,跳过此步骤。


    cd $GSDB_HOME/binpython zctl.py -t start -m MOUNT


  1. 获取受损坏页面的datafile序号和page序号。



  • 数据库因磁盘故障停止,则可以从运行日志获取,如下日志表示datafile序号为0,page序号为9632。

    ERROR>[BUF] ABORT INFO:page corrupted(file 0, page 9632).checksum level 1, page size 8192,cks 12745,from_disk 1, changed 0
  • 数据库状态正常,可从客户端返回的错误信息中得到,如下报错表示datafile序号为3,page序号为44。

    GS-00880, Page 3-44 corrupted
  • 运行ztrst工具修复损坏的磁盘页面。


    ztrst Changeme_123:1881 -D /temp -B /data/backup/bak1 -P 3_44 -S 192.168.0.1:1888

    各参数含义如下:

    ztrst的详细参数说明请参见《GaussDB 100 V300R001C00 工具使用指南(单机)》中的数据库管理工具 > ztrst


    • Changeme_123:1881 :Changeme_123为数据库管理员SYS用户的密码,1881为ztrst工具的端口,注意与数据库端口不同。

    • -D /temp : -D参数指定ztrst工具运行提供所需要的临时目录,执行页面修复后,损坏页面也会备份在此目录下的/tmp_data/data文件夹,以便修复出现异常后,恢复原始页面内容。页面修复成功后,用户需要手动删除此临时目录。

    • -B /data/backup/bak1 : -B参数指定备份集的绝对路径。

    • -P 3_44 : -P参数用于指定待修复的页面ID,格式为x_y,x表示datafile序号,y表示page序号。

    • -S 192.168.0.1:1888 : -S参数用于指定数据库IP和端口,用于ztrst工具连接数据库实例。

  • 修复结束后,若数据库是以mount模式启动,执行如下命令重启数据库;如果数据库状态为open,跳过此步骤。


    cd $GSDB_HOME/binpython zctl.py -t stoppython zctl.py -t start


  • 处理方法 2

    HA场景下,如果坏页发生在主机,并且主机没有停止,或者停止后可重新启动,则可以利用备机来进行页面自动修复。

    前提条件

    • 主机至少与一个备机连接状态正常。

    • 主机PAGE_CHECKSUM参数不为OFF。

    操作步骤

    1. 如果主机数据库已经停止,则启动数据库;否则,跳过此步骤。


      cd $GSDB_HOME/binpython zctl.py -t start


    2. 在主机设置 BLOCK_REPAIR_ENABLE 参数为TRUE。


      ALTER SYSTEM SET BLOCK_REPAIR_ENABLE = TRUE;


      重新执行提示报错的数据库业务,主机数据库会自动修复遇到的损坏页面。


      说明:

      此方法只能在主机上启用自动修复功能。如果主机没有在超时时间内收到备机发送过来的正确页面,主机数据库就会停止,同时在运行日志中打印损坏页面的详细位置和信息,此时可以使用备份集手动修复页面。

      您可以修改BLOCK_REPAIR_TIMEOUT参数取值,调整主机启用数据页面自动修复时,从备机获取正确页面的超时时间,默认超时时长为60s。