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!