xtrabackup备份数据库

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/目录下面会生成一个以时间命名的目录

wKiom1V2rDzCQFXAAAB2nlms8wA371.jpg

       全部的数据库数据都被备份在这个目录下,同时又会生成几个新的文件:

wKioL1V2rpDgXWtkAAJobK7LPxw890.jpg

       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   #全备份数据库

wKiom1V-RKmC4J8GAACgb5-ZQGQ008.jpg

        如图:生成一个全备份目录: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/           #指定上一次的备份(这里是上一次的全备份)

wKioL1V-S7CCqZ5kAABwWkUwqYE448.jpg

        如图:生成一个增量备份目录: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    #指定上一次的备份(这里是上一次的增量备份)

wKiom1V-SvLzpccoAAEdEfiIcjQ353.jpg

        如图:又生成一个增量备份目录: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服务


    使用二进制日志文件恢复最后一个增量备份以后的数据:

        找到最后一个增量备份:

wKioL1V-gVjROqErAADYtIk1xhI923.jpg

        如图:获取执行最后一个增量备份时正在使用的二进制日志文件和此时的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:解压缩

相关文章
相关标签/搜索