postgres自动备份数据库

1,功能描述

​ 直接在安装有postgres psql和pg_dump的linux服务器上,直接脚本即可一键备份数据库到新建的bak2022xxxxxdbname数据库,同时生成**.sql备份文件。

2,实现原理

  • 使用psql(创建新库、备份数据到新的库)、pg_dump(备份数据到**.sql文件)工具命令

  • 使用expect工具(与bash工具类似)命令,自动填充密码

3,脚本文件

bakDatabase.sh文件

#!/bin/bash
# description:	Backing up the Database
# time:			2022.02.12
# author:		wanyu
# example: 		sh bakDatabase.sh dbname

# 目标数据库信息 ip地址、端口、用户名、密码、缓存路径
address=127.0.0.1
port=5432
user=postgres
password=XXXXX
directory=/home/postgres/postgresBakDb/

# 1,创建目录(成功)
echo "<1>,Create a directory {$directory}!"
mkdir -p "$directory""log"


# 2,拼接备份数据库名称(成功)
echo "<2>,Splice the name of the backup database -- {$bakdbname}!"
dbname=$1
date_format=`date +%Y%m%d%H%M`
bakdbname="bak""$date_format""_""$dbname"
logDirectory="$directory"log/info.log
bakFileDirectory="$directory""$bakdbname"".sql"


# 3,备份数据库(成功)
echo "<3>,Backing up the Database {$bakdbname} !"
expect <<EOF
#!/bin/expect
set timeout 60
spawn pg_dump -h $address -p $port -U $user -W -f $bakFileDirectory -d $dbname
expect "*assword:" {send "$password\r"}
expect eof
EOF


# 4,创建备份数据库
echo "<4>,Creating a backup database {$bakdbname}!"
expect <<EOF
#!/bin/expect
set timeout 60
spawn psql -h $address -p $port -U $user -W
expect "*assword:" {send "$password\r"}
expect "postgres=# " {
send "CREATE DATABASE \"$bakdbname\";\r"
send "\\\q\r"
}
expect eof
EOF


# 5,恢复备份数据库
echo "<5>,Restore backup database {$bakdbname} data !"
restoreData="psql -h $address -p $port -U $user -W -d $bakdbname -f $bakFileDirectory >& $logDirectory"
expect <<EOF
#!/bin/expect
set timeout 60
spawn $restoreData
expect "*assword:" {send "$password\r"}
expect eof
EOF

4,注意事项

  • 有可能会出现执行脚本服务器A中的pg_dump版本 与需要备份数据库服务器B上postgres版本不一致导致的数据备份失败的问题

​ 解决办法:服务器A上的pg_dump版本 >= 服务器B上postgres版本

  • 服务器A上需要安装有expect插件
apt-get install expect

posted on 2022-02-12 00:53  周健康  阅读(617)  评论(0编辑  收藏  举报

导航