MySQL备份方案(综述及脚本)

1.环境说明

系统为centos 6.5

需要安装mutt和msmtp并可以发送邮件

需要安装xtrabackup

2.备份方案功能模块介绍

备份:

使用xtrabackup进行备份,每次备份会把备份文件放到一个当前日期和时间的文件夹内。所以创建备份夹new,把备份文件放到new中,并根据new中文件夹的个数判断是全备还是增备还是需要转移文件到last中。第一个文件是全备,每次增备是在前一天的基础上进行增备。备份脚本在把所有的文件从new移动到last的时候 会把所有文件文件打包。以下是mysql备份脚本:

#!/usr/bin/env python
#coding:utf-8
#auther:Bran Guo
#date:10/23/2015 
#description:myql自动备份脚本,添加定时任务自动运行,不要修改mysqlbackup文件夹中的文件
#version:V1.0

import ConfigParser,os,datetime,logger

#读取配置文件
conf = ConfigParser.ConfigParser()
conf.read("mysqlbak.conf")

bakdir_new = conf.get("file_path","bakdir_new")
bakdir_last = conf.get("file_path","bakdir_last")
bak_cycle = conf.get(‘bak_cycle‘,‘bak_cycle‘)
bak_output = conf.get(‘log_file‘,‘bak_output‘)
bak_user = conf.get(‘mysql_set‘,‘bak_user‘)
bak_passwd = conf.get(‘mysql_set‘,‘bak_passwd‘)
os.environ[‘bakdir_new‘]=str(bakdir_new)
os.environ[‘bak_output‘]=str(bak_output)
os.environ[‘bak_user‘]=str(bak_user)
os.environ[‘bak_passwd‘]=str(bak_passwd)
 
#判断备份文件夹个数
dirnew_count = int(os.popen(‘ls %s |wc -l‘ % bakdir_new).read())
if dirnew_count == 0:
	os.system(‘echo %s full backup start ---------------------------------------------------- >> $bak_output ‘ % datetime.datetime.now())
	ret = os.system(‘innobackupex --user=$bak_user --password=$bak_passwd $bakdir_new &>> $bak_output‘) 
	logger.logger(ret)
elif dirnew_count >= int(bak_cycle):
	os.system(‘rm -rf %s/*‘ % bakdir_last)
	os.system(‘mv %s/* %s‘ % (bakdir_new,bakdir_last))
	os.system(‘tar zcf %s/`date +%%m-%%d-%%Y`.tar.gz %s/*‘ %(bakdir_last,bakdir_last))
	os.system(‘echo %s full backup start ---------------------------------------------------- >> $bak_output ‘ % datetime.datetime.now())
	ret = os.system(‘innobackupex --user=$bak_user --password=$bak_passwd $bakdir_new &>> $bak_output‘) 
	logger.logger(ret)
else:
        full_file = os.popen(‘ls %s‘ % bakdir_new).readlines()
        for file_name in full_file :
		file_list= []
		file_list.append(file_name)
        basedir = file_list[-1]
	os.system(‘echo %s incremental backup start ---------------------------------------------------- >> $bak_output ‘ % datetime.datetime.now())
	os.environ[‘basedir‘]=str(basedir)
	ret = os.system(‘innobackupex --user=$bak_user --password=$bak_passwd --incremental $bakdir_new --incremental-basedir=$bakdir_new/$basedir &>> $bak_output‘)
	logger.logger(ret)

还原:

使用xtrabackup还原需要先准备(perpare)。一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。准备的过程是以第一个完备为基础,提交第二个然后是第三个一直到最后一个。整个准备完成后使用第一个完备文件进行还原即可。还原脚本使用cli进行交互,用户可以选择还原到最近日期或指定日期。

还原脚本运行界面

还原脚本代码

#!/usr/bin/python
#coding:utf-8
#auther:Bran Guo
#date:10/26/2015
#version:V1.0

import os,ConfigParser

#读取配置文件
conf = ConfigParser.ConfigParser()
conf.read("mysqlbak.conf")

bakdir_new = conf.get(‘file_path‘,‘bakdir_new‘)
bakdir_last = conf.get(‘file_path‘,‘bakdir_last‘)
mysql_data_path = conf.get(‘mysql_set‘,‘mysql_data_path‘)
dirlist_new = os.popen(‘ls %s‘ % bakdir_new).readlines()
dirlist_last = os.popen(‘ls %s‘ % bakdir_last).readlines()

#备份函数
def restore(dir_count=len(dirlist_new),bakdir=bakdir_new,dirlist=dirlist_new):
	if dir_count == 1:
		print dir_count,bakdir,dirlist
		ret=os.system(‘innobackupex --apply-log --redo-only %s/%s‘ %(bakdir,dirlist[0]))
		if ret != 0:
			print "prepare failed"
			exit()
	else:
		ret=os.system(‘innobackupex --apply-log --redo-only %s/%s‘ %(bakdir,dirlist[0]))
		count = 1
		while (count < dir_count):
			incrdir = dirlist[count]
			basedir = dirlist[0]
			os.environ[‘incrdir‘] = str(incrdir)
			os.environ[‘basedir‘] = str(basedir)
			os.environ[‘bakdir‘] = str(bakdir)
			ret=os.system(‘innobackupex --apply-log --redo-only $bakdir/$basedir  --incremental-dir=$bakdir/$incrdir‘)
			if ret != 0:
				print "prepare failed"
			count +=1
	os.system(‘service mysqld stop‘)
	os.system(‘rm -rf %s‘ % mysql_data_path)
	os.system(‘innobackupex --copy-back %s/%s‘ %(bakdir,dirlist[0]))
	os.system(‘chown -R mysql:mysql %s‘ % mysql_data_path)
	os.system(‘service mysqld start‘)

#输入菜单
while True:
	user_input = raw_input(‘Command (m for help):‘).strip()
	if user_input == ‘m‘:
		print ‘‘‘Warning: The following command will remove mysql datafile, should be used with caution.
	r	restore to recent backup
	s	show backup list
	n	choose backup restore from new
	l	choose backup restore from last
	q	quit
‘‘‘,
	elif user_input == ‘r‘:
		restore()
	elif user_input == ‘q‘:
		exit()
	elif user_input == ‘s‘:
		print ‘New:‘
		os.system(‘ls %s‘ % bakdir_new)
		print ‘Last‘
		os.system(‘ls %s‘ % bakdir_new)
	elif user_input == ‘n‘:
		os.system(‘ls -l %s‘ % bakdir_new)
		while True:
			user_input = raw_input(‘Please enter line number restore:‘).strip()
			if user_input == ‘q‘:
				exit()
			try:
				line_number = int(user_input)
				dir_count = len(dirlist_new)
				if line_number <= dir_count:
					restore(line_number)
				else:
					print ‘‘‘Please enter a number less then line or "q".‘‘‘
			except ValueError:
				print ‘‘‘Please enter a number less then line or "q".‘‘‘
	elif user_input == ‘l‘:
		os.system(‘ls -l %s‘ % bakdir_last)
		while True:
			user_input = raw_input(‘Please enter line number restore:‘).strip()
			if user_input == ‘q‘:
				exit()
			try:
				line_number = int(user_input)
				dir_count = len(dirlist_last)
				if line_number <= dir_count:
					restore(line_number,bakdir_last,dirlist_last)
				else:
					print ‘‘‘Please enter a number less then line sum or "q".‘‘‘
			except ValueError:
				print ‘‘‘Please enter a number less then line sum "q".‘‘‘

远程保存:

使用rsync和scp同步文件(脚本在备份服务器)

备份脚本rsync

#!/bin/bash
rsync -Paz -e ‘ssh -p 22‘  [email protected]:/home/dev/mysqlbackup/new ./ &> ./logs/rsyncbak.log

备份脚本scp

#!/bin/bash
scp -P 22 [email protected]:/home/dev/mysqlbackup/last/*.tar.gz ./history &> ./logs/scpbak.log

日志:

所有xtrabackup的输出会保存到一个日志文件便于排查。通过命令执行后返回值判断成功或失败后的结果输出到一个日志文件中。

#!/usr/bin/python

import datetime,os,ConfigParser

conf = ConfigParser.ConfigParser()
conf.read("mysqlbak.conf")
bak_log = conf.get("log_file","bak_log")
mail_addr = conf.get(‘mail‘,‘mail_addr‘)

logfile = ‘backup.log‘
def logger(ret):
	if ret == 0:
		echo_line = "%s\tBackup mysql data file succes\n" % datetime.datetime.now()
	else:
		echo_line = "%s\tBackup mysql data file failed, plz check bakoutput.log\n" % datetime.datetime.now()
		os.system(‘echo "%s" | mutt -s "Backup mysql failed" %s‘ %(echo_line,mail_addr))
	f = file(bak_log,‘a‘)
	f.write(echo_line)
	f.flush()
	f.close()

邮件:

每次备份失败后背自动发送邮件给指定邮件地址,便于运维及时发现问题并进行排查。发送邮件功能写到日志脚本中

配置文件:

除远程保存部分脚本(放在备份服务器)外,所有变量都被抽出来放到配置文件中。

#备份文件路径
[file_path]
bakdir_new = /home/dev/mysqlbackup/new
bakdir_last = /home/dev/mysqlbackup/last

#备份周期
[bak_cycle]
bak_cycle = 7

#日志文件位置
[log_file]
bak_output = bakoutput.log
bak_log = backup.log

#MySQL设置
[mysql_set]
mysql_data_path = /var/lib/mysql
bak_user = user
bak_passwd = password

#备份失败发送邮件地址
[mail]
mail_addr = [email protected]
时间: 2024-08-01 01:20:20

MySQL备份方案(综述及脚本)的相关文章

MySQL备份方案--&gt;(利用mysqldump以及binlog二进制日志)

From:http://blog.csdn.net/mchdba/article/details/11575605 随着数据不断增加,而且为了兼容以后的innodb存储引擎, 所以考虑采用mysqldump全备+日志增量备份的策略.使用mysqldump对于MySQL大部分mysql存储引擎比如myisam.innodb都有很好的支持. 方案一:mysqldump全备份+日志增量备份 1, mysqldump备份方案: 周一凌晨3点全备 周二到周日凌晨3点增量备份 2, 备份步骤 (1)    

mysql备份方案

1.环境说明 系统为centos 6.5 需要安装mutt和msmtp并可以发送邮件 需要安装python 2.6.6 需要安装xtrabackup 2.备份方案功能模块介绍 备份: 使用xtrabackup进行备份,每次备份会把备份文件放到一个当前日期和时间的文件夹内.所以创建备份夹new,把备份文件放到new中,并根据new中文件夹的个数判断是全备还是增备还是需要转移文件到last中.第一个文件是全备,每次增备是在前一天的基础上进行增备.备份脚本在把所有的文件从new移动到last的时候 会

XtraBackup物理备份 阿里云的Mysql备份方案

XtraBackup物理备份 Percona XtraBackup是世界上唯一的开源,免费的MySQL热备份软件,为InnoDB和XtraDB 数据库执行非阻塞备份.使用Percona XtraBackup,可以实现以下优势: 快速可靠地完成的备份 备份期间的不间断事务处理 节省磁盘空间和网络带宽 自动备份验证 创建热InnoDB备份,而不暂停数据库 对MySQL进行增量备份 将压缩的MySQL备份压缩到另一个服务器 在MySQL服务器之间移动表 轻松创建新的MySQL主从 备份MySQL,而不

mysql 数据库备份方案及策略

由于mysql存在多种数据库备份方式,而且各有利弊,对于我们初学者来说,选择合适的备份方式确实有些困难.个人觉得,首先要基于公司的需求,考虑能够容忍丢失多少数据.花多少人力时间成本等,这是我们制定备份方案的依据,同时制定出来的方案要可执行,要执行,不能把方案当作纸上谈兵.下面我把我们实际的备份方案整理出来供大家参考交流. 作为数据安全的一个重要内容——数据备份的重要性却往往被人们所忽视.只要发生数据传输.数据存储和数据交换,就有可能产生数据故障.这时,如果没有采取数据备份和数据恢复手段与措施,就

Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录

在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份. 下面对这种备份方案详细说明下:1.MySQLdump增量备份配置执行增量备份的前提条件是MySQL打开binlog日志功能,在my.cnf中加入log-bin=/opt/Data/MySQL-bin"log-bin="后的字符串为日志记载目录,一般建议放在不同于MySQL数据目录的磁盘

MySQL备份数据库脚本

Windows @echo offmysqldump --add-drop-database --add-drop-table -u root -p123456 dbname > d:\db_backup\%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%_dbname.sql Linux #!/bin/shcd /usr/binDATE=`date +%Y-%m-%d`# 备份dbname数据库/usr

Mysql使用innobackupex在线备份方案(全量+增量)操作记录

在日常的linux运维工作中,对mysql数据库的备份是非常重要的一个环节.关于mysql的备份和恢复,比较传统的是用mysqldump工具.今天这里介绍下另一款mysql备份工具innobackupex,利用它对mysql做全量和增量备份,仅仅依据本人实战操作做一记录,如有误述,敬请指出~ 一.innobackupex的介绍Xtrabackup是由percona开发的一个开源软件,是使用perl语言完成的脚本工具,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写

mysql备份实例方案

在线备份如何保障备份的数据的一致性,使用逻辑卷快照功能来实现,先锁几秒 把blog日志重定向到一个文件里,再用source导入到数据库里,因为每操作一步都会产生新的blog日志 物理备份: 直接复制数据库文件,适用于大型数据库环境,一般结构lvm snapshot的方式实现,缺点是不能恢复到异构系统中如Windows中 逻辑备份 备份的是建表,建库,插入等操作所执行的sql语句,适用于中小型数据库,效率比较低 Mysqldump实现逻辑备份 语法 #mysqldump -h 服务器 -u用户名

web服务文件更新自动同步、数据库主从复制、shell脚本实现网站代码备份和mysql备份

基搭建LAMP环境,并实践基于DNS做基于域名的虚拟主机中的环境,重新搭建一个同样的环境 要求: a)实现web服务文件更新的自动同步到另一台机器上 b)数据库实现主从复制 c)通过shell脚本实现网站源代码备份和mysql备份,备份策略包括全量备份.增量备份.差异备份 a,实现web服务文件更新的自动同步到另一台机器上: 1,在httpd服务器上建立基于FQDN的两个虚拟web站点,并创建相关目录. 2,修改测试windows主机的hosts文件,并编辑两个虚拟web站点对应的目录下的ind