日常系统维护任务
日常系统维护任务¶
要保持SeaboxMPP数据库集群高效运行,必须对数据库定期清理过期数据并且更新表统计信息, 这样查询优化器才能有准确的信息。
SeaboxMPP数据库要求定期执行特定的任务来达到最优性能。本章讨论的任务都是必须的,但数据库管理员可以使用标准的UNIX工具(如cron
脚本)来自动化这些任务。管理员建立适当的脚本并且检查它们是否
成功执行。
例行清理和分析¶
SeaboxMPP数据库中使用的MVCC事务并发模型的设计意味着被删除或者被更新的数据行仍在磁盘上占据物理空间,即便它们已经对新事务不可见。如果数据库进行了很多更新和删除,会有很多过期行存在并且它们所使用的空间必须使用VACUUM
命令来回收。VACUUM
命令还会收集表级的统计信息,例如行数和页面数,因此即便无需从被更新或者被删除行回收空间,也还是有必要去清理列存表。
清理列存表和清理行存表使用不同的处理逻辑。执行VACUUM时,在每一个executor实例上,会创建一个新的executor文件并且把可见数据从当前executor复制到该文件中。当executor文件被拷贝完时,将会安排删除原始的executor文件并且让新的executor文件变得可用。这要求足够的可用磁盘空间用于拷贝可见行,直到原始的executor文件被删除为止。
如果一个executor文件中隐藏行和所有行的比率低于一个阈值(默认是10),该executor文件不会被紧缩。
该阈值可以通过scolumn_compaction_threshold
服务器配置参数配置。VACUUM FULL
忽略scolumn_compaction_threshold
的值并且不管该比率为多少都会重写executor文件。
可以使用sc_toolkit模式中的__sc_aovisimap_compaction_info()
函数来查看列存表上的VACUUM操作的效果。
事务ID管理¶
SeaboxMPP的MVCC事务机制依赖于比较事务ID(XID)号来判断当前数据对于其他事务的可见性。
事务ID号使用一种模232的算法来比较,因此一个运行了超过二十亿事务的SeaboxMPP系统可能会遇到事务ID回卷,即过去的事务变成了未来的事务。这意味着过去的事务的输出变得不可见。因此,每过二十亿个事务就有必要VACUUM
每个数据库中的每个表至少一次。
SeaboxMPP数据库只对涉及DDL或者DML操作的事务分配XID值,通常也只有这些事务需要XID。
重要: SeaboxMPP数据库会监控事务ID。如果没有定期清理数据库,SeaboxMPP数据库将产生警告和错误。
当事务ID中相当多的一部分变得不再可用并且事务ID回卷还没有发生时,SeaboxMPP数据库会发出 下面的警告:
WARNING: database "database_name" must be vacuumed within number_of_transactions transactions
当这个警告被发出时,需要一次VACUUM
操作。如果没有执行VACUUM
操作,当SeaboxMPP数据库在事务ID回卷发生前达到一个限制,它会停止创建新的事务。在停止创建事务以避免可能的数据丢失时,SeaboxMPP数据库会发出这个错误:
FATAL: database is not accepting commands to avoid
wraparound data loss in database "database_name"
系统目录维护¶
多次使用CREATE
和DROP
命令的数据库更新会增长系统目录尺寸并且 影响系统性能。例如,运行很多次DROP TABLE
语句会降低总体系统性能,因为在目录表上的元数据查询期间会需要更多扫描时间。性能损失会在数千次或者数万次DROP TABLE
语句 之间发生,具体时间取决于系统。
应该定期维护系统目录来回收已删除对象所占据的空间。如果长时间没有运行这种定期回收操作,那可能需要运行一个更彻底的回收操作来清理系统目录。这个主题会描述这两种方式。
系统目录常规维护¶
推荐周期性地在系统目录上运行REINDEX
和VACUUM
来清理系统索引和表中已删除对象所占用的空间。如果常规的数据库操作包括很多DROP
语句,那么每天在非峰值时间用VACUUM
命令运行一次系统目录维护是安全且适当的。用户可以在系统可用时执行这种操作。
下面是SeaboxMPP数据库系统目录维护步骤。
-
在系统表上执行
REINDEX
命令以重建系统表索引。该操作移除索引膨胀并提高VACUUM
性能。注意:当在系统表上执行
REINDEX
操作时,表上会产生锁,此时可能会对当前正在运行的查询产生比较大的影响。建议在系统负载较低时执行REINDEX
操作,以避免对正在运行的 业务操作产生较大的干扰。 -
在系统表上执行
VACUUM
操作。 -
在系统表上执行
ANALYZE
操作,用以更新统计信息。
下面的示例脚本在一个SeaboxMPP数据库系统目录上执行一次REINDEX
、VACUUM
以及ANALYZE
操作:
将脚本中的<database-name>
替换为真实数据库名。
##!/bin/bash
DBNAME="<database-name>"
SYSTABLES="' pg_catalog.' || relname || ';' FROM pg_class a, pg_namespace b
WHERE a.relnamespace=b.oid AND b.nspname='pg_catalog' AND a.relkind='r'"
reindexdb --system -d $DBNAME
ssql -tc "SELECT 'VACUUM' || $SYSTABLES" $DBNAME | ssql -a $DBNAME
analyzedb -s pg_catalog -d $DBNAME
注意:
如果在系统维护时间内已经开始了正常的系统目录维护操作,但是由于时间原因想要停止某一维护进程,此时可以运行SeaboxMPP数据库函数pg_cancel_backend(<PID>)
以安全停止该SeaboxMPP数据库进程。
系统目录深度维护¶
如果很长时间都没有执行一次系统目录维护操作,该目录可能因为废弃空间而膨胀。这会导致简单的元数据操作都会等待很长时间。在ssql
中用\d
命令列出用户表需要超过两秒的等待,就是目录膨胀的一种征兆。
如果发现系统目录膨胀的征兆,就必须在计划好的停机时段用VACUUM FULL
执行一次深度系统目录维护操作。在这一时段中,停止系统上的所有目录活动,这种VACUUM FULL
系统目录维护过程会对系统目录加排他锁。
运行定期系统目录维护操作可以防止对这种更高开销操作的需求。
以下是深度系统目录维护操作的步骤。
-
停止SeaboxMPP数据库系统上的所有活动元数据操作。
-
在系统表上执行
REINDEX
操作以重建系统表索引。该操作移除索引上的膨胀并提高VACUUM
操作性能。 -
在系统表上执行
VACUUM FULL
命令,具体查看下面的注释。 -
在系统表上执行
ANALYZE
命令以更新系统表的统计信息。
注意:
通常来说,表pg_attribute
是最大的系统表。如果pg_attribute
表膨胀的特别厉害,该表上的VACUUM FULL
操作可能需要更长的时间并且可能需要分开执行。
以下两种情况的出现预示着pg_attribute
表膨胀很厉害并且需要长时间的VACUUM FULL
操作:
-
pg_attribute
表包含大量记录。 -
sc_toolkit.sc_bloat_diag
视图中的信息显示pg_attribute
的状态为significant amount of bloat
为查询优化进行清理和分析¶
SeaboxMPP数据库使用一种基于代价的查询优化器,它依赖于数据库的统计信息。准确的统计信息帮助查询优化器更好的评估选择度以及一个查询操作检索的行数。这些评估会帮助它选择最有效的查询计划。ANALYZE
命令会为查询优化器收集列级的统计信息。
可以在同一个命令中同时执行VACUUM
和ANALYZE
操作。例如:
=# VACUUM ANALYZE mytable;
当在一个显著膨胀的表(显著膨胀的表磁盘空间被已删除或者已废弃行占据)上运行VACUUM ANALYZE 命令时,该命令可能会产生不正确的统计信息。对于大型的表,ANALYZE
命令会从行的一个随机采样中计算统计信息。它会通过计算采样中每页的平均行数与表中实际页数的成绩来估算表中的总行数。如果采样包含很多空页,估计出的行计数可能会不准确。
对于单个表,可以在sc_toolkit视图sc_bloat_diag中查看有关未使用磁盘空间(被已删除或者已废弃行占据的空间)量的信息。如果一个表的bdidiag
列包含值 significant amount of bloat suspected
,那么相当多的表磁盘空间由未使用空间组成。
在一个表被清理后,相关项会被加入到sc_bloat_diag视图中。
要从表中移除未使用的磁盘空间,可以在该表上运行命令VACUUM FULL
。由于对表锁的需求, VACUUM FULL
可能无法在非维护时段运行。
作为一种临时的变通方案,可以运行ANALYZE来计算列统计信息,然后在该表上运行VACUUM来生成准确的行计数。这个例子在cust_info表上先运行ANALYZE,然后运行VACUUM。
ANALYZE cust_info;
VACUUM cust_info;
重要: 如果想在启用了ORCA(默认启用)的情况下对分区表执行查询,必须用ANALYZE命令在分区表根分区上收集统计信息。
注意: 可以使用SeaboxMPP数据库工具analyzedb来更新表统计信息。表可以被并行地分析。
常规索引重建¶
对于B-树索引,一个刚刚构建的索引访问起来比一个已经更新过很多次的索引要快一点,因为在新构建的索引中逻辑上相邻的页面在物理上也相邻。定期地重建旧的索引可以提升访问速度。如果一个页面上除了索引以外的数据都被删除,那么索引页上对应的也会产生浪费的空间。重建索引操作会回收这些被浪费的空间。在SeaboxMPP数据库中,删除索引 (DROP INDEX
)再重建 (CREATE INDEX
)通常比直接使用REINDEX
命令要快。
对于有索引的表列,批量更新或者插入之类的一些操作可能会执行得更慢,因为需要更新索引。为了提高带有索引的表上的批量操作性能,可以先删除掉索引,然后执行批量操作,最后再重建索引。
数据库日志文件管理¶
数据库服务日志文件¶
SeaboxMPP数据库的日志输出常常会体量很大,尤其是在调试级别时,用户不需要无限期保存它。管理员可以应该定期清理日志文件。
SeaboxMPP数据库在Coordinator和所有的executor实例上都启用了日志文件轮转机制。日志文件被创建在Coordinator以及每个executor的数据目录中的sd_log
子目录下,这些文件使用命名规则:scdb-YYYY-MM-DD_hhmmss.csv
。数据库管理员需要编写脚本或程序定期清理Coordinator以及每个executor日志目录sd_log
下的旧文件。
日志轮转可以被当前日志文件的大小或当前日志文件的年龄触发。log_rotation_size
配置参数设置触发日志轮转的单个日志文件大小。当日志文件大小等于或大于特定的大小时,该文件会停止写入,系统重新创建一个新的日志文件。log_rotation_size
的值的单位为KB。默认为1048576,即1GB。如果log_rotation_size
设置为0,表示基于文件大小的日志轮转被禁用。
log_rotation_age
配置参数定义了出发日志轮转的日志文件年龄。当文件自创建时开始到达特定长度的时间时,该文件停止写入,系统重新创建一个新的日志文件。默认的log_rotation_age
时间为1d,即当前日志文件创建24小时之后。如果log_rotation_age
设置为0,表示基于时间 的轮转被禁用。
管理工具日志文件¶
SeaboxMPP数据库管理工具的日志文件默认被写入到Coordinator节点Seabox用户的~/scAdminLogs
。管理日志文件的命名规则是:
script_name_date.log
日志详情的格式是:
timestamp:utility:host:user:[INFO|WARN|FATAL]:message
每次一个工具运行时,就会向其每日的日志文件中增加与其执行相关的日志信息。