gpcheckcat

gpcheckcat

gpcheckcatgpcheckcat工具测试Greenplum数据库目录表的不一致性。

该工具在$GPHOME/bin/lib中。

概要

gpcheckcat [ options] [ dbname] 
        
        Options:
        -g dir
        -p port
        -P password
        -U user_name
        -S {none | only}
        -O
        -R test_name 
        -C catalog_name
        -B parallel_processes
        -v
        -A
        
        gpcheckcat  -l 
        
        gpcheckcat -? 
      

描述

gpcheckcat工具运行多种测试检查数据库目录的不一致。 某些测试不能与其他负载语句同时运行, 否则结果将不可用。运行gpcheckcat时,要以受限模式重新启动数据库,否则,gpcheckcat 可能会由于正在进行的数据库操作而报告不一致,这会与实际的不一致数量不同。如果用户在不停止数据库活动的情况下运行 gpcheckcat,请使用-O选项运行它。

Note: 每当用户运行该工具时,它都会检查并删除指定数据库中的孤立的临时数据库方案(没有会话ID的临时方案)。 该工具在命令行上显示孤立临时模式检查的结果,并在日志中记录该结果。
目录不一致是Greenplum数据库系统表之间发生的不一致。一般来说,有三种不一致:
  • Segment级的系统表不一致。例如,包含表数据的系统表与包含列数据的系统表之间的不一致。另一个例子是一个 系统表在本该唯一的列中包含重复。
  • Segment之间相同系统表之间的不一致。例如,一个系统表在一个Segment上缺少一行,但其他Segment具有这一行。 作为另一个例子,特定的行列数据的值在不同的Segment之间不同,例如表所有者或表访问特权。
  • 持久化系统表对象状态和文件系统对象间的不一致。例如,一个文件在数据库目录中存在,但数据库系统表中 不存在相应的对象。

选项

-A
在Greenplum数据库安装的所有数据库上运行gpcheckcat
-B parallel_processes
并行运行的进程数量。
gpcheckcat工具尝试确定要同时使用的进程数(批尺寸)。该工具假定它可以为 每个进程使用最小为20MB的缓冲区。并行进程的最大数量是Greenplum数据库Segment实例的数量。 当该工具开始检查目录时,它会显示所使用的并行进程的数量。
Note: 如果返回的错误数量超过缓冲区大小,则该工具可能会耗尽内存。如果发生内存不足错误,可以使用 -B选项降低批尺寸。例如,如果该工具显示批尺寸为936并且内存不足,则可以指定 -B 468并行运行468个进程。
-C catalog_table
对指定的目录表运行交叉一致性、外键和ACL测试。
-g data_directory
生成SQL脚本来修复目录不一致。脚本被放置在data_directory中。
-l
列出gpcheckcat测试。
-O
只运行可以在线(不受限)模式运行的gpcheckcat测试。
-p port
这一选项指定Greenplum数据库使用的端口。
-P password
连接到Greenplum数据库的用户的密码。
-R test_name
指定要运行的测试。某些测试只有当Greenplum数据库处于受限模式时才能运行。
这些是可以执行的测试:

acl - 对访问控制特权的交叉一致性检查

duplicate - 检查重复项

foreign_key - 检查外键

inconsistent - 对Master和Segment不一致性的交叉一致性检查

missing_extraneous - 对缺少的或无关的项的交叉一致性检查

owner - 检查表的拥有关系是否与Master数据库不一致

orphaned_toast_tables -检查孤立的TOAST表
Note: 有很多种情况都会导致TOAST表变成孤立表,此时不会生成修复脚本,要求进行手工元数据维护。 其中一种情况是pg_class中的reltoastrelid指向一个不正确的TOAST 表(不能匹配到TOAST表)。另外一种情况可能是pg_class表的reltoastrelidpg_depend丢失(双孤立TOAST表)。如果需要手工修复元数据, gpcheckcat会显示详细的元数据更新步骤。

part_integrity - 检查pg_partition分支的完整性、带OID的分区、 分区分布策略

part_constraint - 检查分区表上的约束

unique_index_violation - 检查有唯一索引约束的列的表中是否有重复项

dependency - 检查不存在对象的依赖关系(仅限于受限模式)

distribution_policy - 检查随机分布表上的约束(仅限于受限模式)

namespace - 检查缺少方案定义的方案(仅限于受限模式)

pgclass - 检查没有任何对应的pg_attribute项的(仅限于受限模式) pg_class项。

-S {none | only}
指定这一选项以控制对Greenplum数据库安装中所有数据库(如pg_database)上共享的目录表的测试。
none禁用对共享目录表的测试。值only仅测试共享目录表。
-U user_name
连接到Greenplum数据库的用户。
-?(帮助)
显示在线帮助。
-v(详细模式)
显示所执行测试的详细信息。

注解

该工具可识别缺少属性的表,并将其以非标准格式显示在输出中的各个位置。在显示输出信息之后,该工具还会以格式 database.schema.table.segment_id 显示缺少属性的表的摘要列表。

如果gpcheckcat检测到不一致的OID(对象ID)信息,它将生成一个或者多个包含SQL查询的验证文件。 用户可以运行SQL查询来查看有关OID不一致的详细信息,并调查不一致之处。这些文件在gpcheckcat 被调用的目录中生成。

这是该文件的格式:

gpcheckcat.verify.dbname.catalog_table_name.test_name.TIMESTAMP.sql
这是当gpcheckcat检测到数据库mydb中的目录表pg_type中的不一致OID (对象ID)信息时,它创建的验证文件名示例:
gpcheckcat.verify.mydb.pg_type.missing_extraneous.20150420102715.sql

这是验证文件中查询的一个示例:

SELECT *
  FROM (
       SELECT relname, oid FROM pg_class WHERE reltype 
         IN (1305822,1301043,1301069,1301095)
       UNION ALL
       SELECT relname, oid FROM gp_dist_random('pg_class') WHERE reltype 
         IN (1305822,1301043,1301069,1301095)
       ) alltyprelids
  GROUP BY relname, oid ORDER BY count(*) desc ;