我按照WAL归档的postgres文档备份PostgreSQL9.4数据库。
备份后,我在DB中创建2条记录。
现在,当我试图恢复DB时,上面创建的最后两个记录不会出现。
WAL归档步骤:
cd /etc/postgresql/9.4/
mkdir archives
mkdir backups
chown postgres:postgres archives
chown postgres:postgres backups
cd /etc/postgresql/9.4/main/
echo 'max_wal_senders=1' >> postgresql.conf
echo 'wal_level=hot_standby' >> postgresql.conf
echo 'archive_mode=on' >> postgresql.conf
echo "archive_command='test ! -f /etc/postgresql/9.4/archives/%f && cp %p /etc/postgresql/9.4/archives/%f'" >> postgresql.conf
echo 'local replication postgres trust' >> pg_hba.conf
service postgresql restart
备份步骤:
cd /etc/postgresql/9.4/backups
rm -rf *
pg_basebackup --xlog -U postgres --format=t -D /etc/postgresql/9.4/backups/
还原步骤:
service postgresql stop
cd /var/lib/postgresql/9.4/
if [ ! -d "/var/lib/postgresql/9.4/tmp/" ]
then
mkdir tmp
else
rm -rf tmp
fi
mkdir tmp
mv /var/lib/postgresql/9.4/main/* /var/lib/postgresql/9.4/tmp/
cd /var/lib/postgresql/9.4/main/
rm -rf *
cd /etc/postgresql/9.4/backups
tar -xf base.tar -C /var/lib/postgresql/9.4/main/
cd /var/lib/postgresql/9.4/main/
FROMDIR="/etc/postgresql/9.4/archives/"
TODIR="/var/lib/postgresql/9.4/tmp/pg_xlog/"
if [ ! -d "$FROMDIR" ]
then
echo "Directory $FROMDIR does not exist!!"
exit
fi
if [ ! -d "$TODIR" ]
then
echo "Directory $TODIR does not exist!!"
exit
fi
cd $FROMDIR
for i in `find . -type f`
do
if [ ! -f $TODIR/$i ]
then
echo "copying file $i"
cp $i /var/lib/postgresql/9.4/main/pg_xlog/$i
fi
done
cd /var/lib/postgresql/9.4/main/pg_xlog/
chown -R postgres:postgres *
cd /var/lib/postgresql/9.4/main/
FILE="recovery.done"
if [ -f $FILE ]
then
mv $FILE recovery.conf
else
echo "restore_command = 'cp /etc/postgresql/9.4/archives/%f %p'" >> recovery.conf
fi
su postgres service postgresql start
exit
发布于 2015-11-19 09:18:51
在填充当前的WAL段(通常为16 Mb)时,归档文件(/etc/postgresql/9.4/ filled /在您的情况下)中会出现更改。让我引用文档的话
只对已完成的WAL段调用archive_command。因此,如果您的服务器生成少量的WAL通信量(或者在它这样做的情况下有空闲时间),那么在完成事务和在归档存储中安全记录事务之间可能会有很长的延迟。要限制未存档数据的历史,可以设置archive_timeout强制服务器定期切换到新的WAL段文件。当此参数大于零时,服务器将切换到一个新的段文件,而自上一段文件切换以来已经过了这么多秒,并且有任何数据库活动,包括一个检查点。(增加checkpoint_timeout将减少空闲系统上不必要的检查点。)请注意,由于强制切换而提前关闭的归档文件仍然与完全完整的文件相同。因此,使用非常短的archive_timeout是不明智的-它将膨胀您的存档存储。
如果您只想测试还原过程,可以在创建一些记录以强制切换到新的WAL段之后执行select pg_switch_xlog();
。然后验证存档目录中是否出现了一个新文件。
另外,您不需要将文件从归档目录复制到pg_xlog/。Restore_command
会为你做的。
https://stackoverflow.com/questions/33795975
复制相似问题