【原创,转载请说明】
本文讲述PostgreSql数据备份后的还原操作。上一篇讲到了在项目实战中,可采用PostgreSql自带工具pg_dump,结合shell以及定时任务来自动备份数据库文件。【PostgreSQL实战】之实现数据库自动备份
其中备份pg_dump采用的其实为一逻辑备份,即将数据库以转储sql的方式备份出一sql文件来,我们根据日期进行了压缩。接下来我们结合pg_restore命令和shell脚本进行数据库的逻辑还原。
还原的逻辑为在linux操作系统下,shell脚本中筛选出备份目录下的最新tar文件,并进行解压,解压完成后,采用pg_restore进行还原。
命令为:
pg_restore -Upostgres -d postgres sql/psqldata.dump >> /dev/null 2>&1 &
-d:指定还原的数据库名称
-Upostgres: 指定用户为postgres,如不写则会默认为当前linux用户(root),如你pg中没有创建此用户则无法进行下一步咯。
首先按照当前目录下的tar.gz压缩文件进行降序排列,即获取当前文件夹下的所有tar.gz文件,并对其排序:
##获取当前目录下的所有tar.gz文件
ls -lt pgsqldata*.tar.gz
由于我们采用每天备份一次,即取第一行即为最后的备份,将其文件名取出。
ls -lt pgsqldata*.tar.gz | head -1
取第一行的最后一列即为文件名:
ls -lt pgsqldata*.tar.gz | head -1 | awk '{print $NF}
## | awk '{print $NF} 为取当前输入的最后一列
接下来运用pg_restore还原备份数据库即可。
此处默认还原最新的备份文件,如果想指定文件则可将其做为参数输入。完整脚本如下:
#!/bin/bash
DBDIR=/home/postgres/pgsql/bin/pg_restore
DBDUMPOUTDIR=/var/backup/sql/
DBUMPTARDIR=/var/backup/*.tar.gz
#获取数据库密码,根据实际情况获取数据库密码,此处为读取一配置文件
getDbPasswd(){
export PGPASSWORD=` cat /mnt/syncdata/pg.cfg | grep DBPassword | awk -F "=" '{ print $2}'`
}
recoverDb(){
#解压目标文件
pushd /var/backup
## 获取备份文件tar名称
TARFILENAME=`ls -lt pgsqldata*.tar.gz | head -1 | awk '{print $NF}'`
if [ -z $TARFILENAME ]; then
echo "recover faild, because can not find recover file"
exit 1
fi
##将tar解压到指定文件夹下
tar zxvf $TARFILENAME -C sql/
## 获取数据库密码
getDbPasswd
$DBDIR -Upostgres -d postgres sql/psqldata.dump >> /dev/null 2>&1 &
popd
}
if [ ! -d $DBDUMPOUTDIR ]; then
mkdir -p $DBDUMPOUTDIR
fi
cd /var/backup
if [ -z `ls -lt pgsqldata*.tar.gz` ]; then
echo "recover faild,because recover file not exits"
exit 1
fi
echo "============================================>"
echo "=========begin to recover pgsqldata========="
recoverDb
if [[ $? -ne 0 ]]; then
echo "=========recover pgsqldata faild========="
fi
echo "=========recover pgsqldata sucess========="