xtrabackup备份数据库python
说明:mysql
公司以前备份数据库用的是mysqldump,备份几十G的数据,再加上服务器繁忙,备份速度像蜗牛似的。如今选用xtrabackup备份大的数据库,备份效率高,恢复速度也快sql
参考:shell
http://467754239.blog.51cto.com/4878013/1621711 数据库
优势:安全
(1)备份过程快速、可靠;bash
(2)备份过程不会打断正在执行的事务;服务器
(3)可以基于压缩等功能节约磁盘空间和流量;app
(4)自动实现备份检验;socket
(5)还原速度快
安装:
这里采用rpm包方式(推荐)
yum -y install libaio perl-Time-HiRes perl-DBD-MySQL perl-IO-Socket-SSL
cd /usr/local/src/
32位:wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.9/binary/redhat/6/i386/percona-xtrabackup-2.2.9-5067.el6.i686.rpm
64位:wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.9/binary/redhat/6/x86_64/percona-xtrabackup-2.2.9-5067.el6.x86_64.rpm
rpm -ivh percona-xtrabackup-2.2.9-5067.el6.i686.rpm
使用:
全备份:(目前公司只采用了全备份)
innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock --defaults-file=/usr/local/mysql/my.cnf /data/mysql_bacp/ #备份数据库
注意:
/data/mysql_bacp/:备份目录
在/data/mysql_bacp/目录下面会生成一个以时间命名的目录
全部的数据库数据都被备份在这个目录下,同时又会生成几个新的文件:
backup-my.cnf: 备份命令用到的配置选项信息
xtrabackup_binlog_info: 备份时所用的二进制日志信息(记录了在备份时,正在用的二进制日志文件及备份完这一刻的pos值,这个在数据恢复时用)
xtrabackup_checkpoints: 备份的信息(备份类型(彻底或增量)、备份状态(是否已经为prepared状态)、LSN(日志序列号)范围信息),能够查看此备份是全备份仍是增量备份
xtrabackup_info: xtrabackup相关的信息
使用全备份恢复到备份时的数据:
/etc/init.d/mysqld stop #在数据恢复时必定要记得把mysql服务停掉
mv /opt/mysql/data/* /tmp/linshi/ #把数据库数据目录下的全部数据临时mv到一个临时目录里
innobackupex --apply-log 2015-06-09_13-02-30/ #找到最后一个全备份目录(准备(prepared)一个全备份) 意义:将未提交的事务进行回滚,将已经提交但尚未同步的数据进行同步
innobackupex --copy-back --defaults-file=/usr/local/mysql/my.cnf 2015-06-09_13-02-30/ #恢复数据
chown -R mysql.mysql /opt/mysql/data/ #修改数据权限(默认xtrabackup恢复数据后,全部数据的权限都是root)
/etc/init.d/mysqld start #启动mysql服务
使用二进制日志文件恢复备份以后的数据:
找到最后一个全备份目录:
cd /data/mysql_bacp/2015-06-09_13-02-30/
cat xtrabackup_binlog_info mysql-binlog.000052 120
mysql-binlog.000052和120:作全备份时正在使用的二进制日志文件和备份完那一刻的pos值
从这个二进制日志文件和pos值开始恢复以后的数据
参考:http://732233048.blog.51cto.com/9323668/1633051
使用脚本和计划任务实现自动全备份:
vi /data/scripts/mysql/mysqlfullbackup.py
#!/usr/bin/python #encoding:utf-8 #此脚本用来对数据库作全备份,并定时清理备份文件和二进制日志文件 import os import sys import commands user='root' password='123456' socket='/tmp/mysqld.sock' defaults_file='/usr/local/mysql/my.cnf' backuptodir='/data/mysql_bacp/' #备份目录 binlogdir='/opt/mysql/binlog/' #二进制日志目录 binlogname='mysql-binlog.0*' #二进制日志文件名 def fullbackup(): #备份数据 os.system('innobackupex --user='+user+ ' --password='+password+ ' --socket='+socket+ ' --defaults-file='+defaults_file+ ' ' +backuptodir+ ' 2> /dev/null') #删除两天前的备份文件,即保留三个备份文件 os.system('find ' +backuptodir+ ' -type f -mtime +2 -exec rm -f {} \;') #找出两天前的最后一个二进制日志文件 os.chdir(binlogdir) twodaysago_binlog=commands.getoutput('find . -type f -mtime +2 -name ' '"'+binlogname+'"' " | sort | tail -n1 | awk -F'/' '{print $2}'") # '"'+binlogname+'"' 在shell中是"mysql-binlog.0*" #删除两天前的二进制日志文件,即保留两天的二进制日志文件 os.system('mysql -u'+user+ ' -p'+password+ ' -e "PURGE MASTER LOGS TO ' "'"+twodaysago_binlog+"'" '" 2> /dev/null') if __name__=='__main__': fullbackup()
注意:使用此脚本时,脚本def函数里的语句不用修改,只须要修改函数上面的变量值便可
chmod 600 /data/scripts/mysql/mysqlfullbackup.py #此脚本里面包含了mysql的root密码,为了安全,设置600权限,其余人都不可访问
crontab -e #建立计划任务
#分 时 日 月 周 用户名 命令 0 1 * * * cd /data/scripts/mysql;python mysqlfullbackup.py
附加:使用xtrabackup进行全备份+增量备份:
增量备份经常使用的几个参数:
--redo-only:将一个增量备份与全备份进行合并,造成一个新的全备份(以后用这个新的全备份进行数据的恢复)
--incremental:指定进行增量备份
--incremental-basedir:进行增量备份时,用来指定上一次的备份(全备份或上一次的增量备份)
--incremental-dir:数据恢复时,用来指定上一次的备份(全备份或上一次的增量备份)
全备份+增量备份:
全备份:
innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock --defaults-file=/usr/local/mysql/my.cnf /data/mysql_backup/mysql_full_backup_lszc #全备份数据库
如图:生成一个全备份目录:2015-06-15_07-20-33
增量备份:
innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock --defaults-file=/usr/local/mysql/my.cnf --incremental /data/mysql_backup/mysql_incremental_backup_lszc/ --incremental-basedir=/data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ #指定上一次的备份(这里是上一次的全备份)
如图:生成一个增量备份目录:2015-06-15_07-26-29
再次增量备份:
innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock --defaults-file=/usr/local/mysql/my.cnf --incremental /data/mysql_backup/mysql_incremental_backup_lszc/ --incremental-basedir=/data/mysql_backup/mysql_incremental_backup_lszc/2015-06-15_07-26-29 #指定上一次的备份(这里是上一次的增量备份)
如图:又生成一个增量备份目录:2015-06-15_07-43-33
数据恢复:
使用全备份和增量备份将数据恢复到最后一个增量备份时的数据:
/etc/init.d/mysqld stop #在数据恢复时必定要记得把mysql服务停掉
mv /opt/mysql/data/* /tmp/linshi/ #把数据库数据目录下的全部数据临时mv到一个临时目录里
innobackupex --apply-log --redo-only /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ #找到最后一个全备份目录(准备(prepared)一个全备份)
innobackupex --apply-log --redo-only /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ --incremental-dir=/data/mysql_backup/mysql_incremental_backup_lszc/2015-06-15_07-26-29/ #将第一个增量备份合并到全备份
innobackupex --apply-log --redo-only /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ --incremental-dir=/data/mysql_backup/mysql_incremental_backup_lszc/2015-06-15_07-43-33/ #将第二个增量备份合并到全备份
注意:将增量备份与全备份合并,造成一个新的全备份,以后将用这个新的全备份进行数据恢复(全备份名称始终不变,即:永远是最初的名字)
innobackupex --copy-back --defaults-file=/usr/local/mysql/my.cnf /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ #恢复数据
chown -R mysql.mysql /opt/mysql/data/ #修改数据权限(默认xtrabackup恢复数据后,全部数据的权限都是root)
/etc/init.d/mysqld start #启动mysql服务
使用二进制日志文件恢复最后一个增量备份以后的数据:
找到最后一个增量备份:
如图:获取执行最后一个增量备份时正在使用的二进制日志文件和此时的pos值
从这个二进制日志文件和pos值开始恢复以后的数据
附加:
注意:备份时候MySQL必须是运行状态,而在作数据恢复时候服务必须是处于停滞状态。
重要参数:
--defaults-file=/etc/my.cnf:备份时,指定配置文件
--socket=/tmp/mysql.sock:备份时,链接到备份的mysql服务器所使用的 套接字文件
--user=root:链接备份mysqld所使用的用户
--password=hello:链接备份mysqld所使用的用户密码
--no-timestamp:默认状况下,备份目录会使用以当前时间为名称建立一个备份目录,加上此参数则不会作这个动做
--apply-log:建立ib_logfile文件,并恢复备份期间产生的redo日志到ib_logfile和表空间中。注意:若备份期间产生了提交的事务日志,则apply-log操做会将未提交的事务回滚
--copy-back:执行恢复数据到目标mysqld,可是目标mysqld的数据目录不 能用—datadir指定,这一点不一样与meb,而是须要使用—defaults-file指 定一个配置文件,在配置文件中指定恢复的datadir。与meb不一样,恢复前必 须清空目录数据目录
--use-memory=1G:备份时xtrabackup可用的内存大小,取决于操做系统可用的内存量,默认为100M,使用大的内存可加速备份的速度
--incremental:表示为增量备份,增量备份只对innodb表有效,对于non-innodb表,例如myisam则无效,由于每次增量备份都会拷贝myisam相关的全部文件,无论上次备份到此次备份有没有发生更改;而对于innodb表,增量备份则只会备份上次备份到此次备份所更改的表
--incremental-basedir=/lxw/full-back/:基于上一次的备份目录作增量 备份
--incremental-dir=/lxw/incr-backup/:用于将增量备份恢复到全备时指定增量备份的目录
--redo-only:增量备份恢复到以前的备份时,除了最后一个增量备份外,其余的增量备份最好指定该参数
--databases=’dba.t1 mysql performance_schema lxw.t1’:用于部分备份,能够用空格分开,指定备份哪些库的全部表,或者哪些库的某些表
--export:在执行apply-log操做时,将应用信息保存到文件中,在恢复部分备份时有用
--compact:采用压缩备份
--rebuild-indexes:解压缩