我正在考虑更改备份的完成方式,并且想知道是否有办法确定 postgreql 集群中的哪些数据库最近没有更改?
而不是使用 pg_dumpall,我想使用 pg_dump 并且只转储自上次备份以来已更改的那些数据库(有些数据库不会经常更新)——这个想法是,如果没有任何变化,那么当前备份应该还是不错的。
有谁知道确定特定数据库上次更新/更改时间的方法?
谢谢...
更新:
我希望不必在整个地方编写触发器,因为我无法控制在一个特定集群中创建数据库(更不用说在数据库中创建 db 对象了)。
进一步挖掘,看起来 $PGDATA/global/pg_database 文件的内容(特别是第二个字段)和 $PGDATA/base 下的目录名称之间存在关联。
走出去,我猜 pg_database 文件的第二个字段是数据库 oid 并且每个数据库在 $PGDATA/base 下都有自己的子目录(子目录名称为 oid)。那是对的吗?如果是这样,使用 $PGDATA/base/* 下文件中的文件时间戳作为需要备份的触发器是否合理?
...或者,还有更好的方法?
再次感谢...
虽然
select datname, xact_commit from pg_stat_database;
按照@Jack Douglas 的建议使用并不能很好地工作(显然是由于 autovacuum),select datname, tup_inserted, tup_updated, tup_deleted from pg_stat_database
但似乎确实有效。DML 和 DDL 更改都会更改 tup_* 列的值,而 avacuum
不会(vacuum analyze
另一方面...)。万一这可能对其他人有用,我将包括我已经放置的备份脚本。这适用于 Pg 8.4.x 但不适用于 8.2.x-- YMMV,具体取决于所使用的 Pg 版本。
更新:脚本已经放在 github here上。
看起来您可以
pg_stat_database
用来获取事务计数并检查这是否从一个备份运行更改为下一个:如果有人打电话给
pg_stat_reset
您,您无法确定数据库是否已更改,但您可能认为发生这种情况的可能性不大,然后是与您上次阅读的交易数量完全一致。- 编辑
看到这个 SO question为什么这可能不起作用。不知道为什么会发生这种情况,但启用日志记录可能会有所启发......
通过挖掘 postgres 文档和新闻组:
txid_current()
会给你一个新的xid
- 如果你稍后再次调用该函数,如果你得到xid
一个更高的,你知道这两个调用之间没有事务提交。你可能会得到误报 - 例如,如果其他人打电话txid_current()
记住包含数据库数据的文件的时间戳,并查看它们是否已更改。如果他们这样做了,就会写。
在 WAL 提示后编辑:您应该仅在刷新未完成的写入后执行此操作。
Postgresql 9.5 让我们跟踪上次修改的时间戳查看此链接 https://thirumal-opensource.blogspot.in/2017/03/to-track-last-modified-commit-or-get.html