• [原创]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  '{}' 
    

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

  • 相关阅读:
    Bug测试报告--在线考试系统--金州勇士
    Bug测试报告--食物链教学工具--奋斗吧兄弟
    Jquery对象和dom对象获取html的方法
    mysql中常见的存储引擎和索引类型
    转:spring MVC HTTP406 Not Acceptable
    Mybatis动态建表
    ssm框架插入mysql数据库中文乱码问题解决
    Maven环境下Poi的使用
    【转】Mybatis传多个参数(三种解决方案)
    【译文】用Spring Cloud和Docker搭建微服务平台
  • 原文地址:https://www.cnblogs.com/ode/p/3196200.html
Copyright © 2020-2023  润新知