首页 > 数据库技术 > 详细

Linux 下的 PostgreSQL 数据库+文件通用自动备份脚本

时间:2017-02-10 15:39:23      阅读:827      评论:0      收藏:0      [点我收藏+]

由于 Odoo(原名 OpenERP)自 8.0 以来会生成 CSS,并把附件存储在文件系统中,因此以前单纯备份数据库的脚本已经不够用了。出于实际部署的考虑,我专门写了个较为通用的 Odoo 备份脚本,不仅能备份 PostgreSQL 数据库,还能包括 Odoo 在文件系统存储的数据文件一起备份,也能备份相应的配置等。

本备份脚本会将数据库、Odoo 的数据文件及指定目录的其他文件(含子目录)一起打包到一个 .7z 的压缩包中,非常便于同步到本地。

#!/usr/bin/python
#encoding: utf-8
# A automatic backup script for Odoo

# Please run it by crontab

from datetime import datetime, date, time
import os, sys, time
from subprocess import call


PG_SYSUSER = postgres

profiles = [

    # First profile
    {
        name: odoo1, # 此 profile 的名称,注意此名称会作为文件名的一部分,推荐只使用数字和字母
        backup_dir: /var/backup/odoo, # 存放备份文件的目录 
        expired_days: 30, # 保留 30 天的备份文件 
        dbs: [odoodb], # 要备份的 数据库
        dirs: [/var/odoo/runtime/filestore, /etc/nginx] # 要包含到备份中的目录或文件,如果你愿意可以连 odoo 代码一起备份
    }
    
]


def remove_files_before(dir_path, days):
    now = time.time()
    cutoff = now - (days * 86400)
    files = os.listdir(dir_path)
    for filename in files:
        file_path = os.path.join(dir_path, filename)
        if not os.path.isfile(file_path):
            continue
        fs = os.stat(file_path)
        file_time = fs.st_ctime
        # delete file if older than 10 days
        if file_time < cutoff:
            print Deleteing file: , file_path
            os.remove(filename)


def dump_pgdb(dir_path, dbname):
    cmd = sudo -u {0} vacuumdb -z {1}.format(PG_SYSUSER, dbname)
    print cmd
    os.system(cmd)
    dump_path = os.path.join(dir_path, dbname + .pgdump)
    cmd = "sudo -u {1} pg_dump --no-owner --format=c -b -f {0} {2}".format(dump_path, PG_SYSUSER, dbname)
    print cmd
    os.system(cmd)
    return os.path.join(dir_path, dbname + .pgdump)



#remove_files_before(‘/data/backup/xindi‘, 10)

def backup_snapshot(profile):
    paths = []
    #第一步备份数据库
    dbs = profile[dbs]
    temp_dumps = []
    for db in dbs: 
        dump_path = dump_pgdb(/tmp, db)
        temp_dumps.append(dump_path)
        paths.append(dump_path)
    #第二步打包
    for dir in profile[dirs]:
        paths.append(dir)
    paths_arg =  .join(paths)
    now = datetime.now()
    archive_name = snapbak_{0}_{1}.7z.format(profile[name], now.strftime(%Y%m%d%H%M%S))
    archive_path = os.path.join(profile[backup_dir], archive_name)
    cmd = 7z a {0} {1}.format(archive_path, paths_arg)
    print cmd
    os.system(cmd)
    # Remove the database dump file in /tmp
    for td in temp_dumps:
        os.remove(td)    

    remove_files_before(profile[backup_dir], profile[expired_days])


for profile in profiles:
    print Processing profile  + profile[name]
    backup_snapshot(profile)

使用方法:

1. 安装依赖项

假设使用 debian/ubuntu:

$sudo apt-get install sudo p7zip-full

2. 创建脚本

$sudo mkdir /opt/bin

$sudo vim /opt/bin/autobackup.py

$sudo chmod a+x /opt/bin/autobackup.py

3. 在 cron 中设置定时任务

crontab -e

在打开的编辑器中输入:

 0 3 * * * /opt/bin/auto-backup.bat

表示每天夜里三点执行此自动备份任务。

最后重启系统即告完成。

 


Happy Hacking!

Linux 下的 PostgreSQL 数据库+文件通用自动备份脚本

原文:http://www.cnblogs.com/oldrev/p/db_and_files_python_backup_script.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!