数据库备份是用在协议配置平台中的,环境是 Windows Server 2008,该方案用在一个简单的服务中是可行的,大型的应用备份肯定不是这个方案了。关于协议配置平台,参照这里,第一个就是。
概述
备份用到的是 mysqldump – mysql 自带的备份程序;通过 Installer 安装完 mysql,默认就有这个程序,但是需要把它配到系统变量里边才方便用;
目录为 mysql 安装目录/bin/,或者直接搜”mysqldump.exe”就能搜到了,把 bin 目录加到系统变量 Path 里;
用到的备份语法:mysqldump -u用户名 -p密码 -h主机 数据库 > 路径
还有更复杂的语法,备份整库,上面这个就够了
bat 脚本
@echo off
title backup_db
::echo set database ip
set ipaddress=127.0.0.1
::echo mysql database name
set db_name1=protocol
::echo set file name with data : yyyymmdd 20120311
set backup_date=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%
::echo set mysqldump backup arguments
set uid_test_db=-u%1 -p%2 -h %ipaddress% %db_name1%
::set backup path
cd /
cd Project
mkdir DataBackup
cd DataBackup
::go backup
mysqldump %uid_test_db% >%db_name1%_%backup_date%.sql
上面这段脚本是从网上找到然后修改的,bat 脚本真的是非常难写……
几个需要注意的地方:
- %数字,比如%0、%1这种,表示脚本的参数,比如 cmd 中调用:backup_db.bat username password;%0 就是该 bat 脚本的地址,%1 就是第一个参数 “username”,%2 就是第二个参数 “password”;
- cd /,回到当前文件所在盘符的根目录;
- title 标题名称,设置当前 cmd 窗口的标题;
- 字符串截取:%变量:~下标,截取长度%;
- 字符串拼接:%变量1%%变量2%
Python 调用
外面包了一层 python,python 扩充了两个功能:
- 读取配置文件,获取用户名、密码,调用 bat 脚本的时候传入进来;
- 开一个定时器,定时备份(当前的规则是每天中午12点-1点 和 凌晨12点 – 凌晨1点 各备份一次),定时器1小时调用一次
这两个功能,bat 脚本应该能直接实现,但它真的是难用又难调试…
调用 bat 脚本命令:os.system(“cmd 语句”),该方法是阻塞的,即如果有两句 os.system,则先执行完第一句 cmd 命令,才会执行第二句的 cmd 命令;
python 定时调用备份数据库bat脚本:
#!/usr/bin/env python
# coding=utf-8
import sys, re, time, os, json
import chardet
reload(sys)
sys.setdefaultencoding('utf8')
def main():
db_data = get_config_data()['db']
back_up(db_data)
while True:
localtime = time.localtime(time.time())
hour = localtime.tm_hour
if hour == 12 or hour == 0:
back_up(db_data)
time.sleep(60 * 60)
# 备份数据
def back_up(db_data):
cur_path = get_cur_path()
os.system(cur_path + '/backup_db.bat {0} {1}'.format(db_data['user'], db_data['password']))
print(u'备份成功:'+ time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) )
# 加载配置文件 config.json
def get_config_data():
# config_path = os.path.abspath('../../config/config.json')
cur_path = get_cur_path()
config_path = re.sub(r'script(/|\\)task$', r'config\config.json', cur_path)
f = open(config_path, 'r')
config_str = f.read()
f.close()
config_str = re.sub('\\n', '', config_str)
config_str = re.sub('\s+', '', config_str)
char_code = chardet.detect(config_str)['encoding']
config_str = config_str.decode(char_code).encode('utf-8')
config_data = json.loads(config_str)
print(u"获取config成功")
return config_data
# 获取脚本文件的当前路径,不包括文件名 E:\Mine\store\python\start\learn\request
def get_cur_path():
# 获取脚本路径
path = sys.path[0]
# 判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
if os.path.isdir(path):
return path
elif os.path.isfile(path):
return os.path.dirname(path)
if __name__ == "__main__":
main()