协议配置平台 – Mysql数据库备份

数据库备份是用在协议配置平台中的,环境是 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 脚本真的是非常难写……

几个需要注意的地方:

  1. %数字,比如%0、%1这种,表示脚本的参数,比如 cmd 中调用:backup_db.bat username password;%0 就是该 bat 脚本的地址,%1 就是第一个参数 “username”,%2 就是第二个参数 “password”;
  2. cd /,回到当前文件所在盘符的根目录;
  3. title 标题名称,设置当前 cmd 窗口的标题;
  4. 字符串截取:%变量:~下标,截取长度%;
  5. 字符串拼接:%变量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()


如果这篇文章对你有用,可以点击下面的按钮告诉我

0

发表回复