转载地址:http://www.91linux.com/html/article/guanli/20070621/2902.html

1. 综述

为了保持所安装的 PostgreSQL 服务器平稳运行, 我们必须做一些日常性的维护工作。
我们在这里讨论的这些工作都是经常重复的事情, 可以很容易地使用标准的 Unix 工具,比如cron 脚本来实现。 不过,设置合适的脚本以及检查它们是否成功执行则是数据库管理员的责任, 一件很明显的维护工作就是经常性地创建数据的备份拷贝。 
如果没有最近的备份,那么您就没有从灾难中恢复的机会(比如磁盘坏了,失火,误删了表等等)。
其它主要的维护范畴的工作包括周期性的 "vacuuming" (清理)数据库。
其它需要周期性注意的东西是日志文件的管理。
PostgreSQL 和其它数据库产品比较起来是低维护量的。 
但是,适当在这些任务上放一些注意将更加能够确保我们的愉快工作和获取对这个系统富有成效的经验。 
操作环境:PostgreSQL9.6+centos 7.0

2.常清理
2.1 VACUUM;

2.1.1 语法结构;
VACUUM [ FULL | FREEZE ] [ VERBOSE ] [ table ]
VACUUM [ FULL | FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]

2.1.2 描述;
VACUUM 
回收已删除元组占据的存储空间。 在一般的 PostgreSQL 操作里, 那些已经 DELETE 的元组或者被 UPDATE 过后过时的元组是没有从它们所属的表中物理删除的; 在完成 VACUUM 之前它们仍然存在。 因此我们有必须周期地运行 VACUUM, 特别是在常更新的表上,如果没有参数,VACUUM 处理当前数据库里每个表, 如果有参数,VACUUM 只处理那个表,简单的 VACUUM (没有FULL) 只是简单地回收空间并且令其可以再次使用;

2.1.3 参数;
FULL 
------选择"完全"清理,这样可以恢复更多的空间, 但是花的时间更多并且在表上施加了排它锁。
FREEZE 
------选择激进的元组"冻结"。
VERBOSE 
------为每个表打印一份详细的清理工作报告。
ANALYZE 
------更新用于优化器的统计信息,以决定执行查询的最有效方法。
table 
------要清理的表的名称(可以有模式修饰)。缺省时是当前数据库中的所有表。
column 
------要分析的具体的列/字段名称。缺省是所有列/字段。

2.1.4 
为什么要用VACUUM;
VACUUM命令的含义为:垃圾收集以及可选地分析一个数据库。VACUUM回收已删除元组占据的存储空间。
在一般的 PostgreSQL 操作里,那些已经 DELETE 的元组或者被 UPDATE 过后过时的元组是没有从它们所属的表中物理删除的; 在完成 VACUUM 
之前它们仍然存在。 
由于以下几个原因,我们必须周期性运行 PostgreSQL 的 VACUUM 命令∶ 
1.恢复那些由已更新的或已删除的行占据的磁盘空间。
2.更新 PostgreSQL 查询规划器使用的数据统计信息。
3.避免因为事务 ID 重叠造成的老旧数据的丢失。 
对上面每个条件进行 VACUUM 操作的频率和范围因不同的节点而不同。 
因此,数据库管理员必须理解这些问题并且开发出合适的维护策略。
建议经常VACUUM(清理)(至少每晚一次)生产数据库, 以保证不断地删除失效的行。尤其是在增删了大量记录之后, 对受影响的表执行 VACUUM ANALYZE 命令是一个很好的习惯。例如:
MH=> vacuum full verbose  analyze r_data_main_test;
INFO:  vacuuming "public.r_data_main_test"
INFO:  "r_data_main_test": found 29230324 removable, 31473910 nonremovable row versions in 1076558 pages
DETAIL:  0 dead row versions cannot be removed yet.
CPU 11.11s/35.82u sec elapsed 152.01 sec.
INFO:  analyzing "public.r_data_main_test"
INFO:  "r_data_main_test": scanned 30000 of 481500 pages, containing 1961024 live rows and 0 dead rows; 30000 rows in sample, 31473943 estimated total rows
VACUUM
Time: 311716.828 m

VACUUM
这样做将更新系统目录为最近的更改,并且允许 PostgreSQL 查询优化器在规划用户查询时有更好的选择。
不建议日常使用 FULL 选项,但是可以在特殊情况下使用。 一个例子就是在您删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。VACUUM FULL 通常要比单纯的 VACUUM 收缩更多表的尺寸。

2.2 恢复磁盘空间
2.2.1 概述
在正常的 PostgreSQL 操作里, 对一行的UPDATE或DELETE并未立即删除旧版本的数据行。 这个方法对于获取多版本并行控制的好处是必要的: 
如果一个行的版本仍有可能被其它事务看到,那么您就不能删除它。 但到了最后,不会有任何事务对过期的或者已经删除的元组感兴趣。 而它占据的空间必须为那些新的元组使用而回收, 以避免对磁盘空间增长的无休止的需求。这件事是通过运行 VACUUM 实现的。
很明显,那些经常更新或者删除元组的表需要比那些较少更新的表清理的更频繁一些。 所以,设置一个周期性的 cron 任务 VACUUM那些选定的表,而忽略那些已经知道变化比较少的表. 这个方法只是在您拥有大量更新频繁的表和大量很少更新的表的时候有意义 — 清理一个小表的额外开销根本不值得担心; 
VACUUM 命令有两个变种:
第一种形式,叫做"懒汉 vacuum"或者只是 VACUUM, 
在表和索引中标记过期的数据为将来使用;它并不试图立即恢复这些过期数据使用的空间。因此,表文件不会缩小,并且任何文件中没有使用的空间都不会返回给操作系统。这个变种的 VACUUM 可以和通常的数据库操作并发执行。
第二种形式是 VACUUM FULL 命令。 
这个形式使用一种更加激进的算法来恢复过期的的行版本占据的空间。任何 VACUUM FULL 释放的空间都立即返回给操作系统。 但是,这个形式的 VACUUM 命令不可以和通常的数据库操作并发执行。

2.2.2 VACUUM FULL
VACUUM FULL 一个表的时候在其上要求一个排他锁。 因此,经常使用 VACUUM FULL 会对并发数据库查询有着非常糟糕的影响;
标准形式的 VACUUM 最适合用于维护相当程度的磁盘用量的稳定状态。 
如果您需要把磁盘空间归还给操作系统,那么您可以使用 VACUUM FULL — 不过如果释放的磁盘空间又会很快再次被分配又怎样? 
如果维护更新频繁的表,那么中等频率的多次标准 VACUUM 运行方法比很低频率的 VACUUM FULL 更好;
对于大多数节点而言,我们推荐的习惯是在一天中的低使用的时段安排一次整个数据库的 VACUUM, 必要时外加对更新频繁的表的更经常的清理。 (有些环境下,对那些更新非常频繁的表可能会每几分钟就 VACUUM 一次。) 
如果您的集群中有多个数据库,别忘记对每个库进行清理; vacuumdb脚本可能会帮您的忙。
如果您知道自己刚删除掉一个表中大部分的行,那么我们建议使用VACUUM FULL,这样该表的稳定态尺寸可以因为VACUUM FULL更富侵略性的方法而显著减小。日常的磁盘空间清理,请使用 VACUUM,而不是 VACUUM FULL。
如果您有一个表,它的内容经常被完全删除,那么可以考虑用 TRUNCATE,而不是后面跟着 VACUUM 的 DELETE。 TRUNCATE 立即删除整个表的内容, 而不要求随后的 VACUUM 或者VACUUM FULL 来恢复现在没有用的磁盘空间;

2.3 更新规划器统计;
PostgreSQL 的查询规划器依赖一些有关表内容的统计信息用以为查询生成好的规划。 这些统计是通过ANALYZE 命令获得的,您可以直接调用这条命令, 也可以把它当做 VACUUM 里的一个可选步骤来调用。 拥有合理准确的统计是非常重要的,否则,选择了恶劣的规划很可能会降低数据库的性能; 
和为了回收空间做清理一样,经常更新统计信息也是对更新频繁的表更有用。 不过,即使是更新非常频繁的表,如果它的数据的统计分布并不经常改变,那么也不需要更新统计信息。 一条简单的拇指定律就是想想表中字段的最大很最小值改变的幅度。比如,一个包含行更新时间的timestamp字段将是随着行的追加和更新稳定增长最大值的; 这样的字段可能需要比那些包含访问网站的 URL的字段更频繁一些更新统计信息。 那些URL字段可能改变得一样频繁,但是其数值的统计分布的改变相对要缓慢得多;
我们可以在特定的表,甚至是表中特定的字段上运行 ANALYZE ,所以如果您的应用有需求的话,我们是可以对某些信息更新得比其它信息更频繁的。不过,在实际中,这种做法的实用性是值得怀疑的。
ANALYZE是一项相当快的操作,即时在大表上也很快, 因为它使用了统计学上的随机采样的方法进行行采样, 而不是把每一行都读取进来。因此,每隔一段时间对整个数据库运行一便这条命令可能更简单。
注:尽管用 ANALYZE 按字段进行挖掘的方式可能不是很实用, 但您可能还是会发现值得按字段对 ANALYZE 
收集的统计信息的详细级别进行调整。 那些经常在WHERE子句里使用的字段如果有非常不规则的数据分布, 那么就可能需要比其它字段更细致的数据图表.参阅 ALTER TABLE SET STATISTICS.
我们对大多数节点都建议在每天的低使用时段安排一次数据库范围的 ANALYZE: 这个任务可以有效地和每天的 VACUUM 组合在一起。 不过,这对那些表统计信息改变相对缓慢的节点可能会过于夸张,而且少一些的 ANALYZE 也足够了。

vacuum清理数据库相关推荐

  1. dz mysql日志清理_Discuz教程:如何准确的清理数据库

    随着网站的发展占用的数据库是非常大的而且成本也越来越高如何清理数据库的无用数据是非常有效的减少成本的方法.清理周期不要太长也不需要太短的时间(特殊情况:网站被灌水需要做好防护并且随时清理).一定要提前 ...

  2. greenplum vacuum清理删除数据命令

    官方文档 http://docs.greenplum.org/6-4/ref_guide/sql_commands/VACUUM.html greenplum数据删除后不会释放存储空间,需要命令VAC ...

  3. Oracle 11g如何清理数据库的历史日志详解

    11g清理数据库历史日志的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍 1. 创建存放数据库待删除日志文件路径 用于存放准备删除,这里假设放在/home/Oracle/del ...

  4. [原创]shopex清理数据库挂马

    最近很多用户反映shopex网站被挂马,现象:网页打开完全后会自动跳转到木马网站,检查是数据库中sdb_settings表中的system字段 中含有木马,注意:不能直接在数据库中修改此字段的值,清理 ...

  5. mysql数据库进行清洗,清理数据库

    Mysql 查询所有数据库 mysql> show databases; +--------------------+ | Database | +--------------------+ | ...

  6. 清理数据库日志SQL语句

    查询数据库日志文件名 USE 数据库名称 GO SELECT file_id, name,size,* FROM sys.database_files; 清理数据库日志 --SQL2008: --在S ...

  7. linux定时任务重复率,基于SpringBoot实现定时任务的设置(常用:定时清理数据库)...

    1.构建SpringBoot工程项目 1)创建一个Springboot工程,在它的程序入口加上@EnableScheduling,开启调度任务. @SpringBootApplication @Ena ...

  8. SQL Server 2008 清理数据库日志文件

    前言:今天运维支撑跟我反映生产环境的数据库日志文件过大,占用服务器过多空间,希望我能帮忙解决这个问题,于是有了这个记录. 这是修改前的某一个数据库日志文件163G: 一开始我们在数据库执行下方语句: ...

  9. 清理数据库审计日志(.aud)

    一定要注意:不要直接删除adump目录,否则,你会sqlplus不了数据库. 1.进入审计日志目录: cd $ORACLE_BASE/admin/$ORACLE_SID/adump 2.查询3个月前的 ...

最新文章

  1. quota在oracle,Oracle的表空间quota详解
  2. docker 挂载主机目录访问报错Permission denied 解决办法
  3. 丢失__EVENTTARGET _dopost Asp.net自带隐藏域和脚本的现象
  4. http协议下:为什么请求与响应会做到准确误的对应。不会出现请求与响应的错乱...
  5. python统计分析--2.预分析:异常值、缺失值处理
  6. leetcode 10 --- 正则表达式匹配
  7. redis相关(搭建和数据落盘)
  8. 扫雷php,PHP也可以写扫雷游戏 不信看这里 PHP挖地雷
  9. onsyscommand
  10. 比较三个数大小PHP代码,php 写程序求三个数的最大值
  11. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于社区疫情防控管理系统l3p3p
  12. linux终端下如何下载文件,Linux终端下载文件的方法有哪些?
  13. 离开谷歌回归斯坦福,“AI女神”李飞飞新动向揭晓
  14. 5.10 数据的升序和降序排序 [原创Excel教程]
  15. LeetCode-55. 跳跃游戏
  16. [github] github入手教程
  17. python使用pika订阅rabbitmq消息链接被重置问题
  18. 盘点那些常用的Linux指令
  19. 分数的四则运算及化简(C语言实现)
  20. 《中国聚合支付行业发展报告2018》发布 深度分析未来八大趋势

热门文章

  1. 编写一个汇编语言程序,有一个50个数据的数据区,找出最大数和最小数,分别存放在AX和BX寄存器中
  2. 苹果怎么换字体_oppo换苹果手机怎么把便签里的东西移过去?
  3. 微信公众号文章批量保存到本地的方法
  4. 安卓手机上计算机的各按键功能,小米手机的按键作用及按键功能整理总结
  5. 证明了我.却证明不了我们
  6. vivo X9 Plus的USB调试模式在哪里,打开vivo X9 PlusUSB调试模式的流程
  7. docker 部署 ES
  8. LINUX做软raid
  9. windows 删除之前的蓝牙耳机
  10. 只能一个人偷偷的哭泣:伤感心情日志