合 GreenPlum数据库日常维护运维(持续更新)
Tags: GreenPlum整理自网络脚本小麦苗常用DBA脚本脚本分享日常维护日常运维
扩容GreenPlum系统
1、主要是4步扩容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | su - gpadmin -- 1、使用gpexpand创建初始化文件,输入Y,然后个回车即可 cd /home/gpadmin/conf gpexpand -f /home/gpadmin/conf/seg_hosts -- 2、利用生成的初始化文件,初始化Segment并且创建扩容schema -- 该步骤若报错,可以修复错误后,再重复运行如下命令 gpexpand -i gpexpand_inputfile_20230313_131204 -- 3、重新分布数据,最长时间1小时 gpexpand -d 1:00:00 -- 4、移除扩容schema gpexpand -c |
2、监控视图,在postgres数据库中:
1 2 3 4 5 | select * from gpexpand.status; select * from gpexpand.status_detail; select * from gpexpand.expansion_progress; gpstate -x |
例行清理和分析
Greenplum数据库中使用的MVCC事务并发模型的设计意味着被删除或者被更新的数据行仍在磁盘上占据物理空间, 即便它们已经对新事务不可见。如果数据库进行了很多更新和删除,会有很多过期行存在并且它们所使用的空间必须使用 VACUUM命令来回收。VACUUM命令还会收集表级的统计信息,例如行数和 页面数,因此即便无需从被更新或者被删除行回收空间,也还是有必要去清理追加优化表。
清理一个追加优化表遵循一种和清理堆表不同的处理逻辑。在每一个Segment上,会创建一个新的Segment文件并且 把可见行从当前Segment复制到该文件中。当Segment文件被拷贝完时,将会安排删除原始的Segment文件并且让新 的Segment文件变得可用。这要求足够的可用磁盘空间用于拷贝可见行,直到原始的Segment文件被删除为止。
如果一个Segment文件中隐藏行和所有行的比率低于一个阈值(默认是10),该Segment文件不会被紧缩。 该阈值可以通过gp_appendonly_compaction_threshold服务器配置参数配置。VACUUM FULL 忽略gp_appendonly_compaction_threshold的值并且不管该比率为多少都会重写Segment文件。
可以使用gp_toolkit
模式中的__gp_aovisimap_compaction_info()
函数来查看 追加优化表上的VACUUM操作的效果。
可以使用gp_appendonly_compaction服务器配置参数为追加优化表禁用 VACUUM操作。
事务ID管理
Greenplum的MVCC事务机制依赖于比较事务ID(XID)号来判断当前数据对于其他事务的可见性。 事务ID号使用一种模232的算法来比较,因此一个运行了超过二十亿事务的 Greenplum系统可能会遇到事务ID回卷,即过去的事务变成了未来的事务。这意味着过去的事务的 输出变得不可见。因此,每过二十亿个事务就有必要VACUUM每个数据库中的 每个表至少一次。
Greenplum数据库只对涉及DDL或者DML操作的事务分配XID值,通常也只有这些事务需要XID。
Important: Greenplum数据库会监控事务ID。如果没有定期清理数据库,Greenplum 数据库将产生警告和错误。
当事务ID中相当多的一部分变得不再可用并且事务ID回卷还没有发生时,Greenplum数据库会发出 下面的警告:
WARNING: database “database_name” must be vacuumed within number_of_transactions transactions
当这个警告被发出时,需要一次VACUUM操作。如果没有执行VACUUM 操作,当Greenplum数据库在事务ID回卷发生前达到一个限制,它会停止创建新的事务。在停止创建 事务以避免可能的数据丢失时,Greenplum数据库会发出这个错误:
1 | FATAL: database is not accepting commands to avoid wraparound data loss in database "database_name" |
Greenplum数据库配置参数xid_warn_limit控制何时显示该警告。参数 xid_stop_limit控制何时Greenplum数据库停止创建事务。
从一次事务ID限制错误中恢复
当Greenplum数据库由于不频繁的VACUUM维护而达到 xid_stop_limit事务ID限制时,它会变得没有响应。为了从这种情况中 恢复过来,作为数据库管理员执行下面的步骤:
- 关闭Greenplum数据库。
- 临时将xid_stop_limit降低10,000,000。
- 启动Greenplum数据库。
- 在所有受影响的数据库上运行VACUUM FREEZE。
- 将xid_stop_limit重置为原来的值。
- 重启Greenplum数据库。
有关这些配置参数的信息请见Greenplum Database Reference Guide。
有关事务ID回卷的信息请见PostgreSQL documentation.
系统目录维护
多次使用CREATE和DROP命令的数据库更新会增长系统目录尺寸并且 影响系统性能。例如,运行很多次DROP TABLE语句会降低总体系统性能,因为在目录表上 的元数据查询期间会需要更多扫描时间。性能损失会在数千次或者数万次DROP TABLE语句 之间发生,具体时间取决于系统。
应该定期维护系统目录来回收已删除对象所占据的空间。如果长时间没有运行这种定期回收操作,那可能需要运行 一个更彻底的回收操作来清理系统目录。这个主题会描述这两种方式。
常规系统目录维护
推荐周期性地在系统目录上运行REINDEX和VACUUM来清理系统索引和 表中已删除对象所占用的空间。如果常规的数据库操作包括很多DROP语句,那么每天在非峰值 时间用VACUUM命令运行一次系统目录维护是安全且适当的。用户可以在系统可用时执行这种操作。
下面是Greenplum数据库系统目录维护步骤。
在系统表上执行REINDEX命令以重建系统表索引。该操作移除索引膨胀并提高VACUUM 性能。
Note: 当在系统表上执行REINDEX操作时,表上会产生锁,此时可能会对当前正在运行的 查询产生比较大的影响。建议在系统负载较低时执行REINDEX操作,以避免对正在运行的 业务操作产生较大的干扰。
在系统表上执行VACUUM操作。
在系统表上执行ANALYZE操作,用以更新统计信息。
下面的示例脚本在一个Greenplum数据库系统目录上执行一次REINDEX、VACUUM 以及ANALYZE操作: 将脚本中的替换为真实数据库名。
1 2 3 4 5 6 7 | #!/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 psql -tc "SELECT 'VACUUM' || $SYSTABLES" $DBNAME | psql -a $DBNAME analyzedb -s pg_catalog -d $DBNAME |
Note: 如果在系统维护时间内已经开始了正常的系统目录维护操作,但是由于时间原因想要停止某一维护进程, 此时可以运行Greenplum数据库函数pg_cancel_backend() 以安全停止该Greenplum数据库进程。
深度系统目录维护
如果很长时间都没有执行一次系统目录维护操作,该目录可能因为废弃空间而膨胀。这会导致简单的元数据 操作都会等待很长时间。在psql中用\d命令列出用户表需要超过 两秒的等待,就是目录膨胀的一种征兆。
如果发现系统目录膨胀的征兆,就必须在计划好的停机时段用VACUUM FULL执行一次 深度系统目录维护操作。在这一时段中,停止系统上的所有目录活动,这种VACUUM FULL 系统目录维护过程会对系统目录加排他锁。
运行定期系统目录维护操作可以防止对这种更高开销操作的需求。
以下是深度系统目录维护操作的步骤。
- 停止Greenplum数据库系统上的所有活动元数据操作。
- 在系统表上执行REINDEX操作以重建系统表索引。该操作移除索引上的膨胀并提高 VACUUM操作性能。
- 在系统表上执行VACUUM FULL命令,具体查看下面的注释。
- 在系统表上执行ANALYZE命令以更新系统表的统计信息。
Note: 通常来说,表pg_attribute是最大的系统表。如果pg_attribute 表膨胀的特别厉害,该表上的VACUUM FULL操作可能需要更长的时间并且可能需要分开执行。 以下两种情况的出现预示着pg_attribute表膨胀很厉害并且需要长时间的VACUUM FULL 操作:
- pg_attribute表包含大量记录。
- gp_toolkit.gp_bloat_diag视图中的信息显示pg_attribute的状态为significant amount of bloat
为查询优化进行清理和分析
Greenplum数据库使用一种基于代价的查询优化器,它依赖于数据库的统计信息。准确的统计信息帮助查询优化器 更好的评估选择度以及一个查询操作检索的行数。这些评估会帮助它选择最有效的查询计划。ANALYZE 命令会为查询优化器收集列级的统计信息。
可以在同一个命令中同时执行VACUUM和ANALYZE操作。例如: