A)定期备份大型PostgreSQL数据库(在最新的Ubuntu服务器上运行的8.3版)的最佳解决方案是什么?请不要用那些痛苦的慢插入语句来说pg_dump
B)在现实世界中运行的PostgreSQL数据库复制的最佳解决方案是什么
答案 0 :(得分:6)
我认为只有一个答案。
PITR,或即时恢复。它基本上是对事务日志的归档,据我所知,这是备份的最佳方式。
我已经为8.1设置了几次,但它在8.3中应该是相同的。
在postgresql.conf中你需要做的就是添加:
archive_command = 'test ! -f /path/to/your/backups/archive_logs/%f && cp -i %p /path/to/your/backups/archive_logs/%f </dev/null'
此命令将存档日志复制到指定的目录,您可以使用您选择的备份软件安全地备份它。
要进行完整备份,您需要先告诉PostgreSQL您正在进行备份。
它是通过psql命令psql "SELECT pg_start_backup('my_backup');"
完成的
之后,只需使用rsync,cpio或其他工具复制数据目录。如果数据库被大量使用,文件将在复制期间发生变化,因此工具可以正确处理并且不会挽救,这一点非常重要。
复制完成后,只需运行psql "SELECT pg_stop_backup();"
告诉PostgreSQL再次停止复制。这些命令的作用是在备份开始的归档日志中放置一个标记,因此在恢复中,它知道从哪里开始读取。
此技术也可用于为复制提供热备份,但它不可读,只是在紧急情况下准备好接管。 在我认为版本8.4中计划完全热备用,所以在那之前我认为没有其他选择。
如果您使用PITR,那么一件好事就是您可以指定何时需要追加存档日志的时间戳。因此,它还可以保护数据库免于意外(例如删除或更改某些数据)
答案 1 :(得分:4)
一个。 pg_dump默认不使用insert语句。它默认使用COPY命令。 -d或--inserts的命令行开关将导致pg_dump将insert语句放入导出中。如果pg_dump命令中有这些开关中的任何一个,只需将它们删除即可使pg_dump使用COPY。
B中。在即将推出的Postgres版本中,它们将开箱即用simple replication。我认为8.4发布计划很快就会完成。因此,如果可能的话,可能值得为此做好准备。
答案 2 :(得分:2)
您可以结合使用Online WAL-Backup每晚/每日/每周/每月pg_dumps。每周/每月一次,您应该将整个群集复制掉。
恢复效果很好,早期复制时几乎不会丢失数据(rsync最好,因为它非常有效)。
速度很快,因为它只需要应用比最新的完整群集备份/副本更晚的WAL。