
准备
所需的库:os,zipfile,re,datetime
功能
1、根据配置文件生成数据库备份压缩文件
2、根据配置的过期时间(天)清理过期压缩文件
介绍
mysqldump是备份MySQL数据库的一种好工具。它相对于用phpmyadmin等备份工具更加快速,又避免受php.ini等的限制,在windows系统下还可以结合计划任务实现定时远程备份数据库。
mysqldump命令的一些用法:
1、将整个数据库以及建表文件导出到sql文件中
mysqldump -uroot -proot database1 > database1.sql2.将sql文件的数据导入,不再是mysqldump,而是mysql
mysql -uroot -proot database2 < database1.sql3.将数据库中的某个表的数据及结构导出到sql文件中
mysqldump -uroot -proot database1 tablename > table1.sql4..将sql文件的数据导入,不再是mysqldump,而是mysql
mysql -uroot -proot database1 < database1.sql5.mysql 数据迁移命令 备份database库table表中id大于22的数据,SQL如下
mysqldump -utest -ptest database table --default-character-set=utf8 -t --where="id>22" >c:\test.sql代码实现
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : backupMySQL.py
@Time : 2019/10/12 14:48:49
@Author : MrYong
@Version : 1.0
@Contact : m.yong@foxmail.com
@License : (C)Copyright 2018-2019, MR YONG
@Desc : None
'''
# here put the import lib
import os,zipfile,re
from datetime import date, datetime
class BackupMySQL(object):
def __init__(self, options):
'''
初始化配置信息,mysql链接信息,备份文件保存信息
'''
self.host = options['host'] if "host" in options.keys() else 'localhost'
if 'db_name' not in options.keys():
print('请设置数据库名称')
return
self.db_name = options['db_name']
if 'db_user_name' not in options.keys():
print('请设置数据库用户名')
return
self.db_user_name = options['db_user_name']
if 'db_user_pwd' not in options.keys():
print('请设置数据库密码')
return
self.db_user_pwd = options['db_user_pwd']
self.port = options['port'] if 'port' in options.keys() else 3306
self.mysql_dump_exe = options['mysql_dump_exe'] if 'mysql_dump_exe' in options.keys() else '"D:\\MySQL\\MySQL Server 5.7\\bin\\mysqldump.exe"'
self.backup_dir = options['backup_dir'] if 'backup_dir' in options.keys() else 'D:\\dataBaseBackup'
self.max_clear_days = options['max_clear_days'] if 'max_clear_days' in options.keys() else 15
self.init()
def init(self):
'''
备份目录创建
文件名称生成
'''
#备份目录不存在创建
if not os.path.exists(self.backup_dir):
os.makedirs(self.backup_dir)
#生成备份文件名称
today_date = date.today().strftime('%Y-%m-%d')
self.file_name = today_date + '.sql'
self.zip_file_name = today_date + '.zip'
def search_file(self, pattern):
'''
列出备份文件目录
'''
file_lsit = []
with os.scandir(self.backup_dir) as files:
for file in files:
if not file.name.startswith('.') and file.is_file():
if re.fullmatch(pattern, file.name):
file_lsit.append(file.name)
return file_lsit
def clear_file(self):
'''
清理max_clear_days的过期文件
'''
files = self.search_file(r'\d{4}-\d{2}-\d{2}.zip')
for file in files:
file_date = file.split('.')[0]
time = datetime.strptime(file_date, '%Y-%m-%d')
days = (datetime.today() - time).days
if days > self.max_clear_days:
print('正在删除文件:%s'%file)
os.remove(self.backup_dir + '\\' + file)
print('清理完成')
def run(self):
'''
数据库备份执行
'''
#切换到备份目录
os.chdir(self.backup_dir)
#生成备份数据库命令
run_backup = '%s --host=%s --user=%s --password=%s --protocol=tcp --port=%s --default-character-set=utf8 %s > %s'%(
self.mysql_dump_exe,
self.host,
self.db_user_name,
self.db_user_pwd,
self.port,
self.db_name,
self.file_name
)
print(run_backup)
os.system(run_backup)
self.save_file()
def save_file(self):
'''
保存为压缩文件
'''
if os.path.exists(self.file_name):
with zipfile.ZipFile(self.zip_file_name, 'w', zipfile.ZIP_DEFLATED) as zp:
zp.write(self.file_name)
os.remove(self.file_name)
print('备份数据库成功')
if __name__ == "__main__":
options = {
'host':'127.0.0.1',
'db_name' :'test',
'db_user_name' :'root',
'db_user_pwd' :'root',
'max_clear_days':30,
}
backup = BackupMySQL(options)
#执行备份
backup.run()
#执行清理
#backup.clear_file()评论
暂无评论
评论(0)