Postgres 9.4恢复无法正常工作

时间:2015-11-19 05:33:47

标签: postgresql postgresql-9.4

我根据WAL存档的postgres文档对postgresql 9.4数据库进行了备份。

备份后,我在DB中创建了2条记录。

现在,当我尝试恢复数据库时,我上面创建的最后2条记录不会出现。

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

1 个答案:

答案 0 :(得分:0)

当前WAL段(通常为16 Mb)被填满时,存档(/ case / etc / gretgresql / 9.4 / archives /)中会出现更改。我引用documentation

  

仅对已完成的WAL段调用archive_command。因此,   如果您的服务器生成很少的WAL流量(或具有松弛周期   如果这样做的话,完成之间可能会有很长的延迟   事务及其在存档存储中的安全记录。要限制   可以将未归档的数据保存多久,您可以将archive_timeout设置为强制   服务器定期切换到新的WAL段文件。当这个   参数大于零,服务器将切换到新的   自上次经过这么多秒后的段文件   段文件切换,并且有任何数据库活动,   包括一个检查站。 (增加checkpoint_timeout会   减少空闲系统上不必要的检查点。)注意存档   由于强制切换而提前关闭的文件仍然相同   长度为完全完整的文件。因此,使用非常不明智   short archive_timeout - 它会使你的档案存储空白。

如果您只想测试恢复过程,可以在创建一些记录后强制切换到新的WAL段,然后执行select pg_switch_xlog();。然后验证归档目录中是否出现了新文件。

此外,您无需将文件从存档目录复制到pg_xlog /。 Restore_command将为您完成。

相关问题