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


    由于 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.py

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

    最后重启系统即告完成。


    Happy Hacking!

  • 相关阅读:
    老齐python-基础7(文件操作、迭代)
    老齐python-基础6(循环 if while for)
    老齐python-基础5(运算符、语句)
    老齐python-基础4(元祖、字典、集合)
    老齐python-基础3(列表)
    老齐python-基础2(字符串)
    Jupyter notebook 的安装、入门
    pycharm 激活码
    VMware无法连接 MKS:套接字连接尝试次数太多正在放弃
    Numpy基本用法简介
  • 原文地址:https://www.cnblogs.com/oldrev/p/db_and_files_python_backup_script.html
Copyright © 2020-2023  润新知