设为首页 加入收藏

TOP

MySQL备份工具mydumper备份(一)
2015-11-10 12:16:40 来源: 作者: 【 】 浏览:0
Tags:MySQL 备份工具 mydumper 备份

MySQL备份工具mydumper备份


#!/usr/bin/phthon?
?
?
import os?
import time?
import commands?
import shutil?
import threading?
from os.path import join, getsize?
import MySQLdb as mydb?
?
?
# 备份目录?
baseDir = "/data2/backup/backup_data/"?
?
?
# ns 或 wx;? 备份后是否要压缩(mydumper 自带压缩功能),要压缩 True,否则 False.?
idc = 'ns'; isZip = True?
?
?
# 备份失败是否重试 ,True 则重试,不重试 设 False, retry_sleep 多久后才开始重试(秒)?
is_errRetryBackup = True; retry_sleep = 300?
?
?
# 备份日期?
backup_date = time.strftime("%Y%m%d")?
?
?
# 备份命令?
cmd? = "/usr/local/bin/mydumper -h %s -u root -p password? -P %s %s -t 5 -o %s"?
?
?
'''''
功能描述:
? 1. mydumper 远程批量备份, 备份列表由配置文件提供
? 2. 可按要求对备份是否压缩(mydumper 自动压缩)
? 3. 备份失败允许再尝试备份一次
? 4. 备份信息写入数据库
'''?
def main():?
? ? thread_pool = []?
?
?
? ? # 是否启用压缩?
? ? zip = '-c' if isZip == True else ''?
?
?
? ? # 从配置文件读取 ip, 名称, 端口, 并拼凑备份语句?
? ? #f = open('/data2/backup/cnf/other_list.cnf', 'r')?
? ? f = open('/data/other_list.cnf', 'r')?
? ? for lines in f.readlines():?
? ? ? ? if (not lines.startswith('#') and len(lines.strip()) > 0):?
? ? ? ? ? ? str = lines.split()?
? ? ? ? ? ? host, businessName, port, isMaster = str[0], str[1], str[2], str[3]?
? ? ? ? ? ? # 业务文件夹不存在则创建?
? ? ? ? ? ? dir = baseDir + '/' + businessName;?
? ? ? ? ? ? if (not os.path.exists(dir)):?
? ? ? ? ? ? ? ? os.makedirs(dir)?
?
?
? ? ? ? ? ? dir += "/%s%s" % (businessName, backup_date)?
? ? ? ? ? ? # 业务目录: dir , 备份目录: dir/name+备份日期?
? ? ? ? ? ? strcmd? = cmd % (host, port, zip, dir)?
?
?
? ? ? ? ? ? th = threading.Thread(target = mydumper, args =(strcmd, dir, businessName, host, port, is_errRetryBackup, int(isMaster)))?
? ? ? ? ? ? thread_pool.append(th)?
?
?
? ? if (thread_pool):?
? ? ? ? for t in thread_pool:?
? ? ? ? ? ? t.daemon = True?
? ? ? ? ? ? t.start()?
? ? ? ? for t in thread_pool:?
? ? ? ? ? ? t.join()?
?
?
def mydumper(sCmd, backupDir, businessName, host, port, is_Retry, isMaster):?
? ? master_host = ""; backup_host = host; name = businessName; port = port; backup_type = 1; file = "";?
? ? start_time = ""; stop_time = ""; returncode = 0; file_size = 0; slave_statement = ""; std_err = "";?
?
?
? ? start_time = time.strftime("%Y%m%d%H%M%S")?
?
?
? ? # 清除可能遗留的备份?
? ? if (os.path.exists(backupDir)):?
? ? ? ? shutil.rmtree(backupDir)?
?
?
? ? # 执行备份?
? ? returncode, std_err = execute(sCmd)?
?
?
? ? stop_time = time.strftime("%Y%m%d%H%M%S")?
?
?
? ? if (returncode == 0):?
? ? ? ? # 备份 std_err 返回不为空也视为出错。?
? ? ? ? if (std_err.strip() != ""):?
? ? ? ? ? ? returncode = 123456?
? ? ? ? else:?
? ? ? ? ? ? # 获取 change master to 信息,再次校验备份是否有效?
? ? ? ? ? ? returncode, std_err, master_host, slave_statement = statement(backupDir, backup_host, isMaster)?
?
?
? ? ? ? ? ? if (returncode == 0):?
? ? ? ? ? ? ? ? file = backupDir?
?
?
? ? if (returncode != 0):?
? ? ? ? # 异常备份标记为: 日期 + _ERR?
? ? ? ? errDir = backupDir + "_ERR"?
? ? ? ? os.rename(backupDir, errDir)?
? ? ? ? file = errDir?
?
?
? ? # 获取备份大小?
? ? file_size = getDirsize(file)?
?
?
? ? if (len(std_err) > 255):?
? ? ? ? std_err = std_err[:250] + "..."?
?
?
? ? my_args? = [idc, master_host, backup_host, name, port, backup_type, file, start_time, stop_time, returncode, file_size, slave_statement, std_err]?
?
?
? ? # 写入数据库?
? ? call_proc(my_args)?
?
?
? ? # 备份失败是否需要重备? 重备允许一次.?
? ? if (is_Retry == True and returncode != 0):?
? ? ? ? time.sleep(retry_sleep)?
?
?
? ? ? ? oldfile = sCmd.split('-o')[1]?
? ? ? ? pos = oldfile.rfind("/") + 1?
?
?
? ? ? ? # 获取备份全路径, 备份文件标记为重备 字样?
? ? ? ? retry_file = oldfile[:pos] + "ReBackup-" + oldfile[pos:]?
?
?
? ? ? ? retryCmd = sCmd.replace(oldfile,? retry_file)?
?
?
? ? ? ? # 重备开始?
? ? ? ? mydumper(retryCmd, retry_file.strip(), name, host, port, False, isMaster)?
?
?
def getDirsize(path):?
? ? # 获取备份文件夹大小?
? ? size = 0L?
? ? for root, di

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇如果使用得当,MySQL也可以化身No.. 下一篇Linux下实现MySQL数据库每天自动..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: