日常数据库维护工作
定期备份,定期”清理“数据库,周期性的日志文件管理
check_postgres可用于检测数据库的健康并报告异常情况
PostgreSQL数据库要求周期性的清理维护。对于很多安装,让自动清理守护进程来执行清理已经足够
1.1. 清理的基础知识PostgreSQL的VACUUM命令出于几个原因必须定期处理每一个表:
1. 恢复或重用被已更新或已删除行所占用的磁盘空间。
2. 更新被PostgreSQL查询规划器使用的数据统计信息。
3. 更新可见性映射,它可以加速只用索引的扫描。
4. 保护老旧数据不会由于事务ID回卷或多事务ID回卷而丢失。
有 两 种VACUUM的变体:标准VACUUM和VACUUM FULL。
VACUUM FULL可以收回更多磁盘空间但是运行起来更慢。VACUUM FULL要求在其工作的表上得到一个排他锁,因此无法和对此表的其他使用并行。
标准形式的VACUUM可以和生产数据库操作并行运行(SELECT、INSERT、UPDATE和DELETE等命令将继续正常工作,但在清理期间你无法使
用ALTER TABLE等命令来更新表的定义)。
VACUUM会产生大量I/O流量,这将导致其他活动会话性能变差。
-bash-4.2$ vacuumdb --help
vacuumdb cleans and analyzes a PostgreSQL database.
Usage:
vacuumdb [OPTION]... [DBNAME]
Options:
-a, --all
vacuum all databases
-d, --dbname=DBNAME
database to vacuum
-e, --echo
show the commands being sent to the server
-f, --full
do full vacuuming
-F, --freeze
freeze row transaction information
-j, --jobs=NUM
use this many concurrent connections to vacuum
-q, --quiet
don\'t write any messages
-t, --table=\'TABLE[(COLUMNS)]\' vacuum specific table(s) only
-v, --verbose
write a lot of output
-V, --version
output version information, then exit
-z, --analyze
update optimizer statistics
-Z, --analyze-only
only update optimizer statistics; no vacuum
--analyze-in-stages
only update optimizer statistics, in multiple
stages for faster results; no vacuum
-?, --help
show this help, then exit
Connection options:
-h, --host=HOSTNAME
database server host or socket directory
-p, --port=PORT
database server port
-U, --username=USERNAME user name to connect as
-w, --no-password
never prompt for password
-W, --password
force password prompt
--maintenance-db=DBNAME alternate maintenance database
Read the description of the SQL command VACUUM for details.
Report bugs to <pgsql-bugs@postgresql.org>.
-bash-4.2$ vacuumdb -d hq -f -z -v >> /tmp/vacuumdb.log
INFO: vacuuming "pg_catalog.pg_statistic"
INFO: "pg_statistic": found 127 removable, 402 nonremovable row versions in 26 pages
在PostgreSQL中,一次行的UPDATE或DELETE不会立即移除该行的旧版本。这种方法对于从多版本并发控制(MVCC)获益是必需的:
当旧版本仍可能对其他事务可见时,它不能被删除。但是最后,任何事务都不会再对一个过时的或者被删除的行版本感兴
趣。它所占用的空间必须被回收来用于新行,这样可避免磁盘空间需求的无限制增长。这通过运行VACUUM完成。
VACUUM的标准形式移除表和索引中的死亡行版本并将该空间标记为可在未来重用。不过,它将不会把该空间交还给操作系统,除非在
特殊的情况中表尾部的一个或多个页面变成完全空闲并且能够很容易地得到一个排他表锁。
相反,VACUUM FULL通过把死亡空间之外的内容写成一个完整的新版本表文件来主动紧缩表。这将最小化表的尺寸,但是要花较长的时间。
它也需要额外的磁盘空间用于表的新副本,直到操作完成。
例行清理的一般目标是多做标准的VACUUM来避免需要VACUUM FULL。
提示: 当一个表因为大量更新或删除活动而包含大量死亡行版本时,纯粹的VACUUM可能不能令人满意。
如果你有这样一个表并且你需要回收它占用的过量磁盘空间,你将需要使用VACUUMFULL,或者CLUSTER,或者ALTER TABLE的表重写变体之一。
提示: 如果你有一个表,它的整个内容会被周期性删除,考虑用TRUNCATE而不是先用DELETE再用VACUUM。
PostgreSQL查询规划器依赖于有关表内容的统计信息来为查询产生好的计划。
这些统计信息由ANALYZE命令收集,它除了直接被调用之外还可以作为VACUUM的一个可选步骤被调用。
拥有适度准确的统计信息很重要,否则差的计划可能降低数据库性能。
自动清理守护进程如果被启用,当一个表的内容被改变得足够多时,它将自动发出ANALYZE命令。
提示: 自动清理守护进程不会为外部表发出ANALYZE命令,因为无法确定一个合适的频度。