大数据量备份与还原,始终是个难点。当MYSQL超10G,用mysqldump来导出就比较慢了。在这里推荐xtrabackup,这个工具比mysqldump要快很多。

一、Xtrabackup介绍

1,Xtrabackup是什么

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex

1、xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表

2、 innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的 同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。

2,Xtrabackup可以做什么 :

在线(热)备份整个库的InnoDB、 XtraDB表
在xtrabackup的上一次整库备份基础上做增量备份(innodb only)
以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)

MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。
Xtrabackup工具支持对InnoDB存储引擎的增量备份,工作原理如下:

(1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。

(2)在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。
首 先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文 件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。
因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。

因为innobackupex支持innodb,myisam,所以本文说一下,怎么使用innobackupex

二,安装xtrabackup

1,下载地址

http://www.percona.com/downloads/XtraBackup/

2,安装

根据需求,选择不同的版本,我选择的是rpm安装包,如果报以下错误

[root@localhost xtrabackup]# rpm -ivh percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm 
warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
perl(Time::HiRes) is needed by percona-xtrabackup-2.2.4-5004.el6.x86_64

解决办法:

  1. [root@localhost xtrabackup]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL //安装依赖包
  2. [root@localhost xtrabackup]# rpm -ivh percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm   //重新安装
  3. warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
  4. Preparing... ########################################### [100%]
  5. 1:percona-xtrabackup ########################################### [100%]

注意:

xtrabackup 2.2.4不支持mysql 5.1.73,所以如果要用新的xtrabackup,就要用高版本的mysql数据库,不然就会报以下错误:

innobackupex: Error: Unsupported server version: '5.1.73'

二,修改my.cnf

查看一下mysqld下面有没有datadir,如果没有加上

  1. [mysqld]
  2. datadir=/var/lib/mysql

不加的话,还原数据的时候,有可能会出现以下问题,

xtrabackup: Error: Please set parameter 'datadir'
innobackupex: fatal error: no 'mysqld' group in MySQL options
innobackupex: fatal error: OR no 'datadir' option in group 'mysqld' in MySQL options

三,全部数据库备份与还原

1,全部数据库备份

  1. # innobackupex --defaults-file=/etc/my.cnf --user=root /home/tank/backup/

如果报以下错误:

InnoDB: Error: log file ./ib_logfile0 is of different size 5242880 bytes
InnoDB: than specified in the .cnf file 50331648 bytes!
innobackupex: Error: The xtrabackup child process has died at /usr/bin/innobackupex line 2679.

解决办法:在my.cnf的mysqld中加入以下内容

  1. [mysqld]
  2. innodb_log_file_size = 5M

2,单数据库备份

  1. # innobackupex --defaults-file=/etc/my.cnf --user=root --database=backup_test /home/tank/backup/

3,数据库备份并压缩

  1. # innobackupex --defaults-file=/etc/my.cnf --user=root --stream=tar  /home/tank/backup | gzip > /home/tank/backup/`date +%F_%H-%M-%S`.tar.gz

4,全数据还原

  1. # /etc/init.d/mysqld stop      //停掉mysql
  2. # mv /var/lib/mysql /var/lib/mysql_bak   //数据目录备份
  3. # mkdir -p /var/lib/mysql  //重建数据目录
  4. //--apply-log选项的命令是准备在一个备份上启动mysql服务
  5. # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /home/tank/backup/2014-09-18_16-35-12
  6. //--copy-back 选项的命令从备份目录拷贝数据,索引,日志到my.cnf文件里规定的初始位置
  7. # innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /home/tank/backup/2014-09-18_16-35-12
  8. # chown -R mysql.mysql /var/lib/mysql  //改变文件所属
  9. # /etc/init.d/mysqld stop  //启动mysql

四,增量备份与还原

1,创建测试数据库和表

  1. create database backup_test;  //创建库
  2. CREATE TABLE `backup` (  //创建表
  3. `id` int(11) NOT NULL AUTO_INCREMENT ,
  4. `name` varchar(20) NOT NULL DEFAULT '' ,
  5. `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  6. `del` tinyint(1) NOT NULL DEFAULT '0',
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=myisam DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

2,增量备份

  1. mysql> INSERT INTO backup (name) VALUES ('tank'),('tank1');  //插入数据
  2. # innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/tank/backup/2014-09-18_16-35-12 --incremental /home/tank/backup/

3,在增量的基础上在进行增量备份

  1. mysql> INSERT INTO backup (name) VALUES ('tank2'),('tank3'),('tank4'),('tank5'),('tank6');  //在插入数据
  2. //2014-09-18_18-05-20这个目录,上次增量备份产生的目录
  3. # innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/tank/backup/2014-09-18_18-05-20 --incremental /home/tank/backup/

查看增量备份记录文件:

  1. [root@localhost 2014-09-18_16-35-12]# cat xtrabackup_checkpoints   //全备目录下的文件
  2. backup_type = full-prepared
  3. from_lsn = 0             //全备起始为0
  4. to_lsn = 23853959
  5. last_lsn = 23853959
  6. compact = 0
  7. [root@localhost 2014-09-18_18-05-20]# cat xtrabackup_checkpoints  //第一次增量备份目录下的文件
  8. backup_type = incremental
  9. from_lsn = 23853959
  10. to_lsn = 23854112
  11. last_lsn = 23854112
  12. compact = 0
  13. [root@localhost 2014-09-18_18-11-43]# cat xtrabackup_checkpoints  //第二次增量备份目录下的文件
  14. backup_type = incremental
  15. from_lsn = 23854112
  16. to_lsn = 23854712
  17. last_lsn = 23854712
  18. compact = 0

增量备份做完后,把backup_test这个数据库删除掉,drop database backup_test;这样可以对比还原后

4,增量还原

  1. # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/tank/backup/2014-09-18_16-35-12
  2. # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/tank/backup/2014-09-18_16-35-12 --incremental-dir=/home/tank/backup/2014-09-18_18-05-20
  3. # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/tank/backup/2014-09-18_16-35-12 --incremental-dir=/home/tank/backup/2014-09-18_18-11-43

在这里有三个目录,

1),/home/tank/backup/2014-09-18_16-35-12,全备份目录

2),/home/tank/backup/2014-09-18_18-05-20,第一次增量备份产生的目录

3),/home/tank/backup/2014-09-18_18-11-43,第二次增量备份产生的目录

到这里增量还原,还没有结束,还有最重要一步,就是要进行一次全量还原。停止数据库,删除/var/lib/mysql,在还原。

增量备份的原理就是,把增量目录下的数据,整合到全变量目录下,然后在进行,全数据量的还原。

总体来说,innobackupex速度快,支持innodb,myisam,用起来是还不是很方便,单库还原,还是增量备份还原,都要进行全部数据库还原,这个不合理。

五,innobackup 常用参数说明

--defaults-file
同xtrabackup的--defaults-file参数

--apply-log
对xtrabackup的--prepare参数的封装

--copy-back
做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;

--remote-host=HOSTNAME
通过ssh将备份数据存储到进程服务器上;

--stream=[tar]
备 份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定--stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。
在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。

--tmpdir=DIRECTORY
当有指定--remote-host or --stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir

--redo-only --apply-log组,
强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要。

--use-memory=#
该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量

--throttle=IOS
同xtrabackup的--throttle参数

--sleep=是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册 ;

--compress[=LEVEL]
对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;

--include=REGEXP
对 xtrabackup参数--tables的封装,也支持ibbackup。备份包含的库表,例如:--include="test.*",意思是要备份 test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。

--databases=LIST
列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;

--uncompress
解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;

--slave-info,
备 份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0

--socket=SOCKET
指定mysql.sock所在位置,以便备份进程登录mysql.

安装xtrabackup

cp bin/innobackupex /usr/bin/
cp bin/xtrabackup* /usr/bin/
innobackupex --defaults-file=/etc/my.cnf --user=root  --password=cc.123 --parallel=16 --database=ESB /home/backup

innobackupex --defaults-file=/etc/my.cnf --user=root --password=cc.123 --incremental-basedir=/home/backup/2016-03-15_15-08-23 --incremental /home/backup

  

mysql innobackupex xtrabackup 大数据量 备份 还原的更多相关文章

  1. mysql innobackupex xtrabackup 大数据量 备份 还原(转)

    原文:http://blog.51yip.com/mysql/1650.html 作者:海底苍鹰 大数据量备份与还原,始终是个难点.当MYSQL超10G,用mysqldump来导出就比较慢了.在这里推 ...

  2. MySQL数据库解决大数据量存储问题

    转载自:https://www.cnblogs.com/ryanzheng/p/8334915.html 提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如 ...

  3. MYSQL数据库导入大数据量sql文件失败的解决方案

    1.在讨论这个问题之前首先介绍一下什么是"大数据量sql文件". 导出sql文件.选择数据库-----右击选择"转储SQL文件"-----选择"结构和 ...

  4. Confluence 6 针对大数据量备份

    XML 站点备份的方式只针对 Confluence 包含有几千页面的情况,XML 备份所需要的时间随着数据量的变化而增加.另外的一个问题是 XML 站点的备份将会包含上 G 的附件数据,随着数据量的增 ...

  5. mysql/oracle jdbc大数据量插入优化

    10.10.6  大数据量插入优化 在很多涉及支付和金融相关的系统中,夜间会进行批处理,在批处理的一开始或最后一般需要将数据回库,因为应用和数据库通常部署在不同的服务器,而且应用所在的服务器一般也不会 ...

  6. MySQL分页查询大数据量优化方法

    方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N适应场景: 适用于数据量较少的情况(元组百/千级)原因/缺点: ...

  7. Mysql千万级大数据量查询优化

    来源于:https://blog.csdn.net/A350204530/article/details/79040277 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 ord ...

  8. 【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)

    原文地址:http://blog.csdn.net/zwan0518/article/details/11972853 目录(?)[-] 一查询优化 1创建索引 2缓存的配置 3slow_query_ ...

  9. 【mysql优化】大数据量分页优化

    limit 翻页原理 limit offset,N, 当offset非常大时, 效率极低, 原因是mysql并不是跳过offset行,然后单取N行, 而是取offset+N行,返回放弃前offset行 ...

随机推荐

  1. XE6移动开发环境搭建之IOS篇(4):VMware9里安装Mac OSX 10.8(有图有真相)

    网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 以下内容比较长,我们 ...

  2. 关于n!mod p

    2016.1.26 让我们来研究一下关于n!在mod p下的性质,当然这里p是质数. 首先n!=a*pe,其中p不可整除a.我们现在来做两件事情,求e和a mod p. 显然,n/p表示[1,n]中p ...

  3. 57. Jump Game && Jump Game II

    Jump Game Given an array of non-negative integers, you are initially positioned at the first index o ...

  4. tracer

    http://people.canonical.com/~acelan/coscup-2010/Debugging%20Linux%20Kernel%20by%20Ftrace.pdf http:// ...

  5. 用wireshark抓包分析TCP三次握手、四次挥手以及TCP实现可靠传输的机制

    关于TCP三次握手和四次挥手大家都在<计算机网络>课程里学过,还记得当时高超老师耐心地讲解.大学里我遇到的最好的老师大概就是这位了,虽然他只给我讲过<java程序设计>和< ...

  6. Jmeter组件5. 逻辑控制

    逻辑控制组件也有不少,但是用到的情况也不多,只打算举个While controller结合Regular Expression Extractor的例子 Condition,跳出循环的条件 如果放空, ...

  7. iOS开发中的4种数据持久化方式【一、属性列表与归档解档】

    iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹.ios开发中, ...

  8. nohup输入密码后继续后台运行

    Linux/Unix 是真正的多用户,多任务.Linux 提供了 fg 和bg 命令,让你轻松调度正在运行的任务. 假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用 Ctr ...

  9. java se the operation is not applicable to the current selection

    当新建某的类时,需要自动构建 set get方法时. 我们一般 会直接让Myeclipse自动生动.偶尔 .他会犯2. the operation is not applicable to the c ...

  10. SQL Server 之AdventureWorks 2008 安

    学习背景:<SQL Server 2008 编程入门经典> SQL Sever 版本 SQL Server 2008 R2 方法一: 1:AdventureWorks 2008 下载地址: ...