Postgresql 中文操作指南

pg_amcheck

pg_amcheck —— 检查一个或多个 PostgreSQL 数据库的损坏情况

Synopsis

pg_amcheck [ option …​] [ dbname ]

Description

pg_amcheck 支持对一个或多个数据库运行 amcheck 的损坏检查函数,并提供一些选项用于选择要检查的架构、表和索引、要执行的检查类型以及是否并行执行检查,如果是,则可以建立并使用多少并行连接。

当前仅支持常规且是 toast 表关系、物化视图、序列和 btree 索引。其他关系类型会悄悄被跳过。

如果指定了 dbname ,它应当是单个待检查数据库的名称,且不应存在其他数据库选择选项。否则,如果存在任何数据库选择选项,则所有相匹配的数据库都将被检查。如果没有这样的选项,则将检查默认数据库。数据库选择选项包括 —​all—​database—​exclude-database 。它们还包括 —​relation—​exclude-relation—​table—​exclude-table—​index—​exclude-index ,但只有在这些选择用于三部分模式(例如, mydb*.myschema*.myrel* )的情况下。最后,当这些选项与两部分模式(例如, mydb*.myschema* )搭配使用时,则会包括 —​schema—​exclude-schema

dbname 也可以是 connection string

Options

以下命令行选项控制检查的内容:

  • -a_—​all_

    • 检查所有数据库,但通过 —​exclude-database 除外任何数据库。

  • -d _pattern—​database=_pattern

    • 检查与指定 pattern 相匹配的数据库,但通过 —​exclude-database 排除任何数据库。此选项可多次指定。

  • -D _pattern—​exclude-database=_pattern

    • 排除与给定 pattern 匹配的数据库。此选项可多次指定。

  • -i _pattern—​index=_pattern

    • 检查与指定 pattern 相匹配的索引,除非它们被排除在外。此选项可多次指定。

    • 这与 —​relation 选项类似,但仅适用于索引,不适用于其他关系类型。

  • -I _pattern—​exclude-index=_pattern

    • 排除与指定 pattern 相匹配的索引。此选项可多次指定。

    • 这与 —​exclude-relation 选项相似,不同的是仅对索引适用,而不对其他关系类型适用。

  • -r _pattern—​relation=_pattern

    • 检查与指定 pattern 匹配的关系,除非另有排除。该选项可以指定多次。

    • 模式可以不限定,如 myrel* ,或可以根据架构进行限制,如 myschema*.myrel* 或根据数据库和架构进行限制,如 mydb*.myschema*.myrel* 。根据数据库限定的模式会向要检查的数据库列表添加匹配的数据库。

  • -R _pattern—​exclude-relation=_pattern

    • 排除与指定 pattern 匹配的关系。该选项可以指定多次。

    • —​relation 一样, pattern 可以不限定、可以根据架构限定,或可以根据数据库和架构限定。

  • -s _pattern—​schema=_pattern

    • 检查与指定 pattern 匹配的架构中的表和索引,除非另有排除。该选项可以指定多次。

    • 要仅选择与特定模式匹配的架构中的表,请考虑使用类似 —​table=SCHEMAPAT.* --no-dependent-indexes 的模式。要仅选择索引,请考虑使用类似 —​index=SCHEMAPAT.* 的模式。

    • 架构模式可以根据数据库限定。例如,您可以编写 —​schema=mydb*.myschema* 以选择与 myschema* 匹配的架构,这些架构在与 mydb* 匹配的数据库中。

  • -S _pattern—​exclude-schema=_pattern

    • 排除与指定 pattern 匹配的架构中的表和索引。该选项可以指定多次。

    • —​schema 一样,模式可以根据数据库限定。

  • -t _pattern—​table=_pattern

    • 检查与指定 pattern 匹配的表,除非另有排除。该选项可以指定多次。

    • 这与 —​relation 选项相似,不同的是仅对表、物化视图和序列适用,而不适用于索引。

  • -T _pattern—​exclude-table=_pattern

    • 排除与指定 pattern 匹配的表。该选项可以指定多次。

    • 这与 —​exclude-relation 选项相似,不同的是仅对表、物化视图和序列适用,而不适用于索引。

  • —​no-dependent-indexes

    • 默认情况下,如果检查表,该表的任何 btree 索引也将被检查,即使它们未通过 —​index—​relation 等选项显式选择。该选项会禁止这种行为。

  • —​no-dependent-toast

    • 默认情况下,如果检查某表,该表的 toast 表(如果存在)也将被检查,即使未通过 —​table—​relation 等选项显式选择。该选项会禁止这种行为。

  • —​no-strict-names

    • 默认情况下,如果 —​database—​table—​index—​relation 的参数不匹配任何对象,则为致命错误。该选项将该错误降级为警告。

以下命令行选项控制表的检查:

  • —​exclude-toast-pointers

    • 默认情况下,每当在表中遇到 toast 指针时,会执行查找以确保它引用 toast 表中看似有效的条目。这些检查可能非常慢,该选项可用于跳过它们。

  • —​on-error-stop

    • 在发现损坏的表第一页上报告所有损坏后,停止处理该表关系,并转到下一张表或索引。

    • 注意,索引检查总是在第一个损坏的页面后停止。此选项仅针对表关系有意义。

  • —​skip=_option_

    • 如果给出了 all-frozen ,表损坏检查将跳过所有表中标记为全部冻结的页面。

    • 如果给出了 all-visible ,表损坏检查将跳过所有表中标记为全部可见的页面。

    • 默认情况下,不跳过任何页面。这可以指定为 none ,但由于这是默认值,因此不必提及。

  • —​startblock=_block_

    • 从指定的块编号开始检查。如果正在检查的表关系的块数少于此数,将发生错误。此选项不适用于索引,并且可能仅在检查单个表关系时有用。有关更多注意事项,请参见 —​endblock

  • —​endblock=_block_

    • 在指定的块编号处结束检查。如果正在检查的表关系的块数少于此数,将发生错误。此选项不适用于索引,并且可能仅在检查单个表关系时有用。如果同时检查常规表和 toast 表,此选项将同时适用于两者,但仍可能在验证 toast 指针时访问更高级别的 toast 块,除非使用 —​exclude-toast-pointers 取消了对它们的访问。

以下命令行选项控制 B 树索引的检查:

  • —​heapallindexed

    • 对于每个检查的索引,使用 amcheckheapallindexed 选项验证索引中所有堆元组作为索引元组的存在。

  • —​parent-check

    • 对于每个检查的 btree 索引,使用 amcheckbt_index_parent_check 函数,该函数在索引检查期间执行对父/子关系的附加检查。

    • 默认情况下使用 amcheck 的 bt_index_check 函数,但请注意使用 —​rootdescend 选项会隐式选择 bt_index_parent_check

  • —​rootdescend

    • 对于每个检查的索引,通过使用 amcheckrootdescend 选项,从根页面为每个元组执行新的搜索,从而重新查找叶级别上的元组。

    • 使用此选项也会隐式选择 —​parent-check 选项。

    • 这种形式的验证最初是为了帮助开发 btree 索引功能而编写的。它可能用途很小,甚至在帮助检测实际发生的腐败类型方面毫无用处。它还可能导致损坏检查花费大量时间,并在服务器上消耗大量资源。

Warning

当指定 —​parent-check 选项或 —​rootdescend 选项时,对 B 树索引执行的额外检查需要相对较强的关系级别锁。这些检查是唯一会阻止来自 INSERTUPDATEDELETE 命令的并发数据修改的检查。

以下命令行选项控制与服务器的连接:

  • -h _hostname—​host=_hostname

    • 指定服务器正在运行的计算机的主机名。如果该值以斜杠开头,则将其用作 Unix 域套接字的目录。

  • -p _port—​port=_port

    • 指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。

  • -U—​username=username__

    • 连接时的用户名。

  • -w_—​no-password_

    • 永不发出密码提示。如果服务器需要密码验证但其他方法(如 .pgpass 文件)无法提供密码,连接尝试将失败。此选项可在无人执行密码输入的批处理作业和脚本中使用。

  • -W_—​password_

    • 强制 pg_amcheck 在连接到数据库之前提示输入密码。

    • 此选项永远不是必需的,因为如果服务器要求密码认证,pg_amcheck 将自动提示输入密码。但是,pg_amcheck 将浪费一次连接尝试,以找出服务器需要密码。在某些情况下,值得键入 -W 以避免额外的连接尝试。

  • —​maintenance-db=_dbname_

    • 指定一个数据库或 connection string 以用于发现要检查的数据库列表。如果既不使用 —​all 也不使用任何包含数据库模式的选项,则不需要此类连接,此选项将不起作用。否则,除了此选项值中包含的数据库名称以外,任何其他连接字符串参数也将用于连接到正在检查的数据库。如果省略此选项,则默认值为 postgres ,如果失败,则为 template1

还可以使用其他选项:

  • -e_—​echo_

    • 将发送到服务器的所有 SQL 回显到 stdout。

  • -j _num—​jobs=_num

    • 使用 num 并发连接到服务器,或按要检查的对象进行连接,以较少者为准。

    • 默认情况下,使用单个连接。

  • -P_—​progress_

    • 显示进度信息。进度信息包括已完成检查的关系数及其总大小。还包括最终要检查的关系总数及其估计大小。

  • -v_—​verbose_

    • 打印更多消息。具体来说,这会针对将要检查的每个关系打印一条消息,并增加服务器错误的详细级别。

  • -V_—​version_

    • 打印 pg_amcheck 版本并退出。

  • —​install-missing—​install-missing=schema__

    • 安装必需的任何缺少的扩展,以检查数据库。如果尚未安装,则每个扩展的对象将安装到给定的 schema 中,或者如果未指定,则安装到架构 pg_catalog 中。

    • 目前,唯一必需的扩展是 amcheck

  • -?_—​help_

    • 显示有关 pg_amcheck 命令行参数的帮助,并退出。

Notes

pg_amcheck 旨在与 PostgreSQL 14.0 及更高版本配合使用。

See Also