postgresql数据库定时备份到阿里云oss
需求描述
因为一直在做的项目都是通过docker部署的,最近有个需求就是将数据库定时备份到阿里云oss上。
用的相关包
因为是需要定时和备份这两个功能,所以使用了:django-crontab,和django-dbbackup这两个django的包,由于是在docker内启动的项目,所以在requirement.txt加入这两个包的相关版本号即可
settings配置
INSTALLED_APPS = [
'dbbackup',
'django_crontab'
]
DBBACKUP_STORAGE = 'django.core.files.storage.FileSystemStorage'
DBBACKUP_STORAGE_OPTIONS = {'location': 'xx'} #存储的路径
DBBACKUP_FILENAME_TEMPLATE = 'xxx' #备份文件的文件名
DBBACKUP_CONNECTORS = DATABASES #数据库连接
CRONJOBS = [
('* * * * *', '模块名.文件名.函数名', '>>/home/backup.log')
]
CRONTAB_COMMAND_PREFIX = 'xxx' #由于django_crontab运行时无法拿到相关的环境变量,所以在这里配上相应的环境变量(数据库的DATABASE_URL)
backup函数
if settings.DEBUG:
print('this is debug') #print的东西都会输出在settings配置的log文件中
else:
try:
management.call_command('dbbackup') #数据库备份的命令
except Exception as e:
print(e)
auth = oss2.Auth(youraccesskey,youraccesssecret)
bucket = oss2.Bucket(auth, 'http://oss-cn-beijing.aliyuncs.com', 'yourbucketname')
try:
while True:
bucket.put_object_from_file('备份到阿里云的文件名', '本地的备份文件文件名')
exist = bucket.object_exists('备份到阿里云的文件名') #检测文件在阿里云oss是否存在
if exist:
print('%s object save' % time)
break
else:
print('%s object not save' % time)
except Exception as e:
print(e)
bucket.put_object_from_file('备份到阿里云的文件名' , '/home/backup.log')
Dockerfile
apt-get install -y cron; #记得安装定时器
docker执行的sh脚本中加入
cd '项目路径' python3 manage.py crontab add #将settings配置的定时任务加入到定时器中
/etc/init.d/cron start #开启定时器