[原创]PostgreSQL Plus Advanced Server配合crontab实现定时维护工作

时间:2023-03-09 05:46:10
[原创]PostgreSQL Plus Advanced Server配合crontab实现定时维护工作

本文要实现的目标
1、PostgreSQL定时全备
2、定时删除归档WAL文件
3、定时删除全备文件
4、删除n天之前的数据库日志文件

实验环境
操作系统:RHEL 6.3
数据库:PostgreSQL Plus Advanced Server 9.2.1.3

准备工作
在执行脚本时,为避免脚本中要求输入数据库所有者密码,先在root用户的家目录配置一个.pgpass文件
[root@s8 ~]# touch .pgpass
[root@s8 ~]# vim .pgpass
~/.pgpass:
127.0.0.1:5444:edb:enterprisedb:000000
pgpass文件的格式:hostname:port:database:username:password
需要注意该文件的权限:
[root@s8 ~]# chmod 0600 ~/.pgpass

一、创建归档目录和备份目录
[root@s8 ~]# mkdir /mnt/archivedir
[root@s8 ~]# chown enterprisedb.enterprisedb /mnt/archivedir
[root@s8 ~]# mkdir /mnt/edb_backup
[root@s8 ~]# chown enterprisedb.enterprisedb /mnt/edb_backup
其中:archivedir为归档目录,edb_backup为全备目录。

二、修改配置文件postgresql.conf
[root@s8 ~]# vim /opt/PostgresPlus/9.2AS/data/postgresql.conf
postgresql.conf:
wal_level = archive    
archive_mode = on
archive_command = 'cp -i %p /mnt/archivedir/%f < /dev/null'

[root@s8 ~]# /etc/init.d/ppas-9.2 reload
[root@s8 ~]# /etc/init.d/ppas-9.2 restart

三、执行一次backup_check.sh脚本
backup_check.sh的内容:

执行结束后,可以看到备份目录中已经有了data目录及需要全备的内容。

四、插入一些测试数据并记录插入时间
edb=# insert into mytest values(55); SELECT CURRENT_TIMESTAMP(0);
2013-07-16 20:50:56-04
edb=# insert into mytest values(58); SELECT CURRENT_TIMESTAMP(0);
2013-07-16 20:51:18-04
edb=# insert into mytest values(510); SELECT CURRENT_TIMESTAMP(0);
2013-07-16 20:51:44-04
edb=# insert into mytest values(530); SELECT CURRENT_TIMESTAMP(0);
2013-07-16 20:52:40-04

五、再执行一次backup.sh脚本之后检查备份目录

六、模拟数据丢失
[root@s8 ~]# /etc/init.d/ppas-9.2 stop
[root@s8 ~]# mv /opt/PostgresPlus/9.2AS/data /opt/PostgresPlus/9.2AS/data_bak

七、恢复
[root@s8 ~]# cp -rp /mnt/edb_backup/dbbak_2013-07-16_07-37-08/dbs/data /opt/PostgresPlus/9.2AS/
[root@s8 ~]# mkdir /opt/PostgresPlus/9.2AS/data/pg_xlog
[root@s8 ~]# cp /opt/PostgresPlus/9.2AS/share/recovery.conf.sample /opt/PostgresPlus/9.2AS/data/recovery.conf
[root@s8 ~]# vim /opt/PostgresPlus/9.2AS/data/recovery.conf
recovery.conf文件的内容:
restore_command = 'cp /mnt/archivedir/%f %p'
recovery_target_time = '2013-07-16 07:37:00'
如果不定义恢复到的时间点recovery_target_time的值,会恢复到最近的时间。

另外要注意看看enterprisedb用户是否是pg_xlog的所有者
[root@s8 ~]# chown enterprisedb.enterprisedb /opt/PostgresPlus/9.2AS/data/pg_xlog/
[root@s8 ~]# chown enterprisedb.enterprisedb /opt/PostgresPlus/9.2AS/data/recovery.conf

然后启动数据库服务,恢复成功。

八、配置和执行计划任务

在/etc/cron.daily/创建文件
[root@s8 edb_backup]# touch /etc/cron.daily/delaheadlog.cron
[root@s8 edb_backup]# vim /etc/cron.daily/delaheadlog.cron

在这里,也可以用crontab -e来编辑,crontab的单位:分时日月周

delaheadlog.cron的内容:

PATH_DATE=$(date +""%Y-%m-%d_%H-%M-%S"")

# 为防止已经存在备份进程,先执行一次pg_stop_backup()    //http://ode.cnblogs.com
/opt/PostgresPlus/9.2AS/bin/edb-psql -h 127.0.0.1 -p 5444 -U enterprisedb edb -c "select pg_stop_backup();" # 开始备份
/opt/PostgresPlus/9.2AS/bin/edb-psql -h 127.0.0.1 -p 5444 -U enterprisedb edb -c "select pg_start_backup('full_backup');" # 执行一次全备
/bin/mkdir -p /mnt/edb_backup/dbbak_$PATH_DATE
/usr/bin/rsync -a --delete --exclude=pg_xlog --exclude=postmaster.pid /opt/PostgresPlus/9.2AS/data /mnt/edb_backup/dbbak_$PATH_DATE/dbs # 结束备份
/opt/PostgresPlus/9.2AS/bin/edb-psql -h 127.0.0.1 -p 5444 -U enterprisedb edb -c "select pg_stop_backup();"
/opt/PostgresPlus/9.2AS/bin/edb-psql -h 127.0.0.1 -p 5444 -U enterprisedb edb -c "select pg_switch_xlog();" # 定期删除归档WAL文件
find /mnt/archivedir/ -mtime +7 -exec rm -rf '{}' \ # 定期删除全备份文件
find /mnt/edb_backup/ -mtime +7 -exec rm -rf '{}' \ # 删除n(当前定义7天)天之前的数据库日志文件
# delete /opt/PostgresPlus/9.2AS/data/pg_log/****.log which is gernerate n days ago.
find /opt/PostgresPlus/9.2AS/data/pg_log/*.log -mtime +7 -exec rm -rf '{}' \

附件中有脚本文件的,创建后改名即可。