分享好友 系统运维首页 频道列表

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

Linux系统  2023-02-09 23:420

由于 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!

查看更多关于【Linux系统】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
linux下如何单独编译设备树? linux设备树是什么
答: make vendor/device_name.dtb  如: make freescale/fsl-1043a-rdb.dtb

0评论2023-02-10369

移植linux3.7到nuc900系列开发板遇到的问题
通过移植学习linux新版本内核,大概了解一下内核变化。记录一下移植过程中遇到的问题或值得注意的地方。1,添加一款arm9芯片的支持首先修改\arch\arm\tools\mach-types文件添加一行w90p950evbMACH_W90P950EVBW90P950EVB同目录下的脚本文件在编译内核时会根据

0评论2023-02-10697

linux下安装redis3.2
这部分来自网络: http://blog.csdn.net/cuibruce/article/details/535015321.下载下载地址:http://www.redis.io/download选取当前最新版本3.2.1下载,上传到linux上,进行解压缩:[root@mongodb1 redis]# lsredis-3.2.1 redis-3.2.1.tar.gz进入redis-3.2.1目录

0评论2023-02-10962

终于解决了Linux下运行OCCI程序一直报Error while trying to retrieve text for error ORA-01804错误
终于解决了Linux下运行OCCI程序一直报Error while trying to retrieve text for error ORA-01804错误http://blog.csdn.net/zklth/article/details/7184032Linux下 和 Windows 下 Oracle Instant Client 的安装.http://fableking.iteye.com/blog/2115724 http

0评论2023-02-10637

linux lvm删除导致无法启动
要想编辑/etc/fstab文件,我们需要在系统中重新挂载根目录,使其具有可读写状态,使用如下命令:mount -o remount,rw /该条命令的作用是,以可读写的形式重新挂载根分区。然后再编辑/etc/fstab文件,就可以正常编辑。如下:

0评论2023-02-10931

linux中的strip命令简介------给文件脱衣服【转】
转自:http://blog.csdn.net/stpeace/article/details/47090255版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则会用法律维权。作为一名Linux开发人员, 如果没有听说过strip命令, 那是很不应该的。 strip这个单词,

0评论2023-02-10728

linux下常用文件系统 linux支持的文件系统
不同的操作系统需要使用不同类型的文件系统,为了与其他操作系统兼容,以相互交换数据,通常操作系统都能支持多种类型的文件系统。Linux内核支持十多种不同类型的文件系统,下面对Linux常用的文件系统作一个简单介绍。ext2与ext3文件系统ext是第一个专门为Lin

0评论2023-02-10794

linux下将Python环境默认更改为Python3.6
步骤:#删除原来指向python2的软链接sudo mv /usr/bin/python /usr/bin/python.bak #/usr/local/python3.6/bin/python3.6 这个路径为实际的python3.6的bin文件夹下的Python3.6的路径,这个按照自己的实际情况进行更改 sudo ln -s /usr/bin/python3.6 /usr/bin

0评论2023-02-10852

Linux更改SSH默认端口 linux设置ssh端口
1.修改ssh配置文件  vim /etc/ssh/sshd_config  将 #Port 22 改为 Port 10023(更改的端口号最好在1024~65535间,不和其他服务端口冲突就ok)2.关闭防火墙  systemctl stop firewalld.service3.重启ssh服务  systemctl restart sshd.service4.新建ssh

0评论2023-02-10765

mongodb 对内存的占用监控 ——mongostat,linux系统可用的内存是free + buffers + cached
刚开始使用mongodb的时候,不太注意mongodb的内存使用,但通过查资料发现mongodb对内存的占用是巨大的,在本地测试服务器中,8G的内存居然被占用了45%。汗呀。 本文就来剖析一下mongodb对内存的具体使用方法,以及生产环境针对mongodb占大量内存的问题的解决

0评论2023-02-10641

更多推荐