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

最新文章

  1. 第3月第11天 vs2005调试 ace编译
  2. python &quot;yield&quot;(转载)
  3. vim 配置,我本机的配置[windows]
  4. Delphi管理多线程之线程局部存储:threadvar
  5. 在.NET中使用EPPlus生成Excel报表 .
  6. Python之路【第十八篇】:Web框架们
  7. 【CKEditor ASP.NET】解决360安全浏览器极速模式下不显示
  8. BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )
  9. WimTool(Wim映像处理工具) V1.30.2011.501 免费绿色版
  10. PLT文件 和 DXF文件
  11. 深入浅出 Spring
  12. pythonseleniumAPI
  13. java基础概述
  14. spark als scala实现(二)
  15. Python Learning - Three
  16. windows开发各种dll缺失
  17. Linux修改网卡名称的方法
  18. Vue2.0 脚手架代码详解
  19. Java中的 JDK下载和环境配置(方式一)
  20. openwrt的编译系统是如何生成squashfs文件系统的

热门文章

  1. JavaScript中JSON对象和JSON字符串的相互转化
  2. 使用js做LeetCode
  3. LabVIEW(十二):VI本地化-控件标题内容的修改
  4. itext实现合同尾部签章部分自动添加,定位签名
  5. ubuntu解压rar文件
  6. Spring Boot读取配置的 5 种方式
  7. [Objective-C语言教程]协议(31)
  8. flex和box-shadow一些兼容性问题
  9. cgroup其他部分 IO + hugepage
  10. Spring Boot + Spring Cloud 构建微服务系统(二):服务消费和负载(Ribbon)