这适用于 Windows 上的 PostgreSQL 16。
我使用 archive_command = 'copy "%p" "C:\PostgreSQL\16\data\pg_wal\archive_status\%f"' 打开 archive_mode 并将 archive_timeout 设置为 3600
执行了select pg_switch_wal(); 几次(Oracle 的 ALTER SYSTEM SWITCH LOGFILE??)
现在,我在 pg_wal 文件夹中生成了 16 MB 的文件。我的 pg_wal\archive_status 文件夹中也有文件。pg_wal 和 pg_wal\archive_status 中的一些文件是相似的。pg_wal\archive_status 中的一些文件,例如大小为 16MB 的 00000001000000000000007A 和大小为 0 KB 的 00000001000000000000007A.done。
我正在努力理解这一切。来自Oracle,我了解归档日志和重做日志。我认为 pg_wal 中的文件是重做日志,而 pg_wal\archive_status 中的文件是归档日志?当我执行select pg_switch_wal();时 ,我正在切换重做日志并且旧日志已存档?
我现在的问题是
- pg_wal\archive_status 文件夹中的 00000001000000000000007A 与 00000001000000000000007A.done 是什么?
- 另外,当我运行pg_basebackup时,它会自动删除所有已备份的归档日志吗?
谢谢
正如杰夫所说,你的
archive_command
错误是危险的。您必须将 WAL 段复制到数据目录之外的位置,即与常规数据库存储不同的远程存储设备上。对于您的问题:
00000001000000000000007A
是一个WAL段,一个包含重做日志信息的文件。与 Oracle 不同的是,这些文件不会被重用(这是一个善意的谎言),但一旦归档,就会创建新段并删除旧段。00000001000000000000007A.done
是归档程序进程创建的一个文件,用于告诉 PostgreSQL 已完成对 WAL 段的归档,并且 PostgreSQL 可以根据需要自由删除该段。PostgreSQL 不知道有存档的 WAL 段,并且根本不维护它们。PostgreSQL 应该如何知道你写入的内容的语义
archive_command
?您必须自己处理存档的 WAL 段。