検索
Xtrabackup使用指南_MySQLJun 01, 2016 pm 01:51 PM
オンライン影響はい代替案

bitsCN.com

 一、Xtrabackup介绍

  A、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。
  3、官方文档:http://www.percona.com/docs/wiki/percona-xtrabackup:start

  B、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保持数据的一致。

  C、Xtrabackup备份原理

  XtraBackup基于InnoDB的crash-recovery功能。它会复制innodb的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。

  InnoDB维护了一个redo log,又称为transaction log,事务日志,它包含了innodb数据的所有改动情况。当InnoDB启动的时候,它会先去检查data file和transaction log,并且会做二步操作:

  XtraBackup在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着transactions log,一旦log发生变化,就把变化过的log pages复制走。为什么要急着复制走呢? 因为transactions log文件大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧的数据。

  在prepare过程中,XtraBackup使用复制到的transactions log对备份出来的innodb data file进行crash recovery。

  D、实现细节

  XtraBackup以read-write模式打开innodb的数据文件,然后对其进行复制。其实它不会修改此文件。也就是说,运行 XtraBackup的用户,必须对innodb的数据文件具有读写权限。之所以采用read-write模式是因为XtraBackup采用了其内置的 innodb库来打开文件,而innodb库打开文件的时候就是rw的。

  XtraBackup要从文件系统中复制大量的数据,所以它尽可能地使用posix_fadvise(),来告诉OS不要缓存读取到的数据,从 而提升性能。因为这些数据不会重用到了,OS却没有这么聪明。如果要缓存一下的话,几个G的数据,会对OS的虚拟内存造成很大的压力,其它进程,比如 mysqld很有可能被swap出去,这样系统就会受到很大影响了。

  在备份innodb page的过程中,XtraBackup每次读写1MB的数据,1MB/16KB=64个page。这个不可配置。读1MB数据之 后,XtraBackup一页一页地遍历这1MB数据,使用innodb的buf_page_is_corrupted()函数检查此页的数据是否正常, 如果数据不正常,就重新读取这一页,最多重新读取10次,如果还是失败,备份就失败了,退出。在复制transactions log的时候,每次读写512KB的数据。同样不可以配置。

  二、Xtrabackup安装

  本文通过源码方式安装Xtrabackup,最新的版本是1.6.

  Xtrabackup与一般的源码构建方式不同,它采用的在MySQL源代码上打补丁的构建方式。下载的源码包比较大就是是因为这个包里打包了编译需要的两个MySQL Source,一个5.1.56,一个5.5.10。

  安装编译所需的依赖包

?View Code BASH
1
yum install libaio libaio-devel

  编译安装Xtrabackup

?View Code BASH
1234
wget  http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-1.6/source/xtrabackup-1.6.tar.gztar xvf xtrabackup-1.6.tar.gz cd xtrabackup-1.6utils/build.sh innodb55

  注:build.sh是源码包中提供的编译脚本,MySQL 5.1可用参数innodb51_builtin。

  编译成功后,会在对应mysql版本目录中生成一个xtrabackup程序,我这里生成的路径是mysql-5.5.10/storage/innobase/xtrabackup/中

?View Code BASH
123
ls  mysql-5.5.10/storage/innobase/xtrabackup/ Makefile  xtrabackup.c  xtrabackup_innodb55  xtrabackup.o

  复制相应文件和建立软链到/usr/bin下,这么做的原因是满足innobackupex脚本的需要。

?View Code BASH
12345
cp  mysql-5.5.10/storage/innobase/xtrabackup/xtrabackup_innodb55 /usr/bin/xtrabackup_55cp innobackupex /usr/bin/innobackupex#备份时如果打包就需要这个命令,非必需。cp  libtar-1.2.11/libtar/tar4ibd /usr/bin/tar4ibd  ln -sf /usr/local/webserver/mysql/bin/mysql  /usr/bin/mysql

  三.Xtrabackup的备份与恢复使用

  A、Xtrabackup常用参数选项如下:

?View Code BASH
1234567891011121314151617181920212223242526272829303132333435363738394041424344
--defaults-file=#默认配置文件的路径,如果不该参数,xtrabackup将从依次从以下位置查找配置文件/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~/.my.cnf,并读取配置文件中的[mysqld]和[xtrabackup]配置段。[mysqld]中只需要指定datadir、innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir、innodb_log_files_in_group、innodb_log_file_size6个参数即可让xtrabackup正常工作。 --defaults-extra-file=#如果使用了该参数,在读取了全局配置文件之后,会再读取这里指定的配置文件 --target-dir=name备份文件的存放目录路径 --backup实施备份到target-dir --prepare实施对备份文件进行恢复前的准备(生成InnoDB log file) --print-param打印备份或恢复时需要的参数 --use-memory=#该参数在 prepare 的时候使用,控制prepare时innodb实例使用的内存量 --suspend-at-end在target-dir目录下产生一个xtrabackup_suspended文件,将xtrabackup进程挂起,不停地将数据文件的变化同步到备份文件,直到用户手工删除xtrabackup_suspended文件 --throttle=#每秒IO次数,限制backup时使用的I/O操作量,使备份对数据库正常业务的影响最小化 --log-stream该参数在backup的时候使用,将xtrabackup_logfile的内容输出到标准输出,使用该参数时会自动使用suspend-at-end参数,innobackupex脚本的stream 模式会使用该参数。 --incremental-lsn=name增量备份时只拷贝LSN比该参数指定值新的ibd pages,前次备份到了哪个LSN可以看前次备份集的xtrabackup_checkpoints文件 --incremental-basedir=name该参数在backup的时候使用,备份比该参数指定位置的备份集新的idb pages --incremental-dir=name该参数在prepare的时候使用,指定prepare时产生的.delta 文件和日志文件的存放路径 --tables=name在备份file-per-table类型的数据文件时使用,使用正则表达式指定需要备份的innodb表 --datadir=nameMySQL数据库的数据文件目录。

  B、普通备份方式

  a)普通备份(全量备份)

?View Code BASH
123
mkdir -p /data0/backup/mysqlxtrabackup_55  --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/cp -r  /data0/mysql/data/testinnodb/ /data0/backup/mysql/

  注意:xtrabackup只备份数据文件,并不备份数据表结构(.frm),所以这里要手动备份一下,以便xtrabackup恢复的时候使用。

  全量备份恢复

  实施对备份文件进行恢复前的准备

?View Code BASH
1
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare  --target-dir=/data0/backup/mysql/

  从备份目录复制对应数据库表结构到默认的数据目录

?View Code BASH
1
cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/

  删除默认数据目录中对应的数据文件并复制备份的数据文件到默认数据目录

?View Code BASH
12
rm /data0/backup/mysql/ib*cp /data0/backup/mysql/ib*  /data0/mysql/data/

  修改数据目录权限

?View Code BASH
1
chown -R mysql:mysql /data0/mysql/data

  重启MySQL

?View Code BASH
1
/data0/mysql/mysql restart

  b)增量备份

  增量备份优点:

  1、数据库太大没有足够的空间全量备份,作增量备份有效节省空间,且效率高。
  2、支持热备份。备份过程不锁表,不受时间限制,不影响用户使用。
  3、每日备份只产生少量数据,远程备份传输更方便。同时节省空间。
  4、备份恢复基于文件操作,降低直接对数据库操作风险。
  5、备份效率更高,恢复效率更高。

  这个我研究N久没成功,原因暂时还没找到。我测试环境的Mysql版本是5.5.11的,xtrabackup_55是根据MySQL5.5.9的源码编译的,不知道和这个有关系没?待验证!这里只把实现步骤整理出来。

  增量备份及模拟恢复步骤:

  先做一次全量备份,增量备份需要以此为基础

?View Code BASH
123456789
#建立备份目录mkdir -p /data0/backup/mysql/base#建立一个全量备份xtrabackup_55  --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/base#生成的备份数据文件ls /data0/backup/mysql/base/ibdata1  xtrabackup_checkpoints  xtrabackup_logfile#备份数据库表结构cp -r  /data0/mysql/data/testinnodb/ /data0/backup/mysql/

  以此全量备份为基础进行增量备份

?View Code BASH
1234567
#建立备份目录mkdir -p /data0/backup/mysql/delta#建立一个增量备份xtrabackup_55  --defaults-file=/data0/mysql/my.cnf --backup  --target-dir=/data0/backup/mysql/delta  --incremental-basedir=/data0/backup/mysql/base#生成的备份数据文件ls /data0/backup/mysql/delta/ibdata1.delta  xtrabackup_checkpoints  xtrabackup_logfile

  注:在增量备份目录下,数据文件都是以.delta结尾的。增量备份只备份上一次全量备份后被修改过的page,所以增量备份只暂用较少的空 间。增量备份可以在增量备份的基础上增量。增量备份目录每次都需修改的。比如第二次增量就改成/data0/backup/mysql/delta2)

  增量备份恢复过程:

  首先需要分别对全量、增量备份各做一次prepare操作。

?View Code BASH
12
xtrabackup_55  --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/basextrabackup_55  --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/base --incremental-dir=/data0/backup/mysql/delta/

  从备份目录复制对应数据库表结构到默认的数据目录

?View Code BASH
1
cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/

  删除默认数据目录中对应的数据文件并复制备份的数据文件到默认数据目录

?View Code BASH
12
rm /data0/backup/mysql/ib*cp /data0/backup/mysql/ib*  /data0/mysql/data/

  修改数据目录权限

?View Code BASH
1
chown -R mysql:mysql /data0/mysql/data

  重启MySQL

?View Code BASH
1
/data0/mysql/mysql restart

  四、innobackupex的备份与恢复使用

  A、数据备份

  通常一般都直接使用innobackupex,因为它能同时备份InnoDB和MyISAM引擎的表。要注意的是my.cnf里datadir这个参数是必须要指定的,xtrabackup_55是根据它去定位innodb数据文件的位置。

  innobackupex语法

?View Code BASH
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
innobackup [--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME] [--password=WORD][--port=PORT] [--socket=SOCKET] [--no-timestamp] [--ibbackup=IBBACKUP-BINARY] [--slave-info] [--stream=tar][--defaults-file=MY.CNF] [--databases=LIST] [--remote-host=HOSTNAME] BACKUP-ROOT-DIR innobackup --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF] [--ibbackup=IBBACKUP-BINARY] BACKUP-DIR innobackup --copy-back [--defaults-file=MY.CNF] BACKUP-DIR 各参数说明: --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.

备份前首先所需要建立一个备份所需的目录

?View Code BASH
1
mkdir -p /data0/backup/mysql

  1、普通备份

?View Code BASH
1
innobackupex --database="testinnodb test" --user=root --no-lock --defaults-file=/data0/mysql/my.cnf  /data0/backup/mysql 2>/tmp/mysqlbackup.log

  注:使用mysql的root用户将数据库testinnodb和test的备份,备份路径是/data0/backup/mysql/。备份 成功后会在该目录下将创建以时间戳为名称的备份目录。no-lock参数用于指定备份时不锁定表。2>/tmp/mysqlbackup.log是 将备份过程中的输出信息保存到/tmp/mysqlbackup.log中。

  2、打包备份

?View Code BASH
1
innobackupex  --database="testinnodb test"  --user=root --defaults-file=/data0/mysql/my.cnf  --no-lock --stream=tar /data0/backup/mysql/ 2>/tmp/innobackup.log 1>/data0/backup/mysql/mike.tar

  注:这种备份时间会比较长,主要是执行压缩操作。这种方式打的包需要使用tar izxvf解压。参数-i是必须加上的。

  3、压缩备份

?View Code BASH
1
innobackupex  --database="testinnodb test"  --user=root --defaults-file=/data0/mysql/my.cnf  --no-lock --stream=tar /data0/backup/mysql/ 2>/tmp/innobackup.log|gzip>/data0/backup/mysql/mike.tar.gz

  4、备份到远程服务器
  
  备份当前机器下的数据到192.168.1.101的/data0/目录下。

?View Code BASH
1
innobackupex  --database="testinnodb test"  --user=root --defaults-file=/data0/mysql/my.cnf  --no-lock --stream=tar /data0/backup/mysql/|ssh root@192.168.1.101  cat ">"/data0/backup.tar

  B、数据恢复

  以压缩后的备份数据为例,普通备份和打包备份的恢复方法和这个类似,就不在举例了。

  解包备份数据

?View Code BASH
1
tar xvzfi  mike.tar.gz

  指定恢复备份所需的xtrabackup_logfile文件的目录

?View Code BASH
1
innobackupex --apply-log --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql

  从备份目录拷贝数据、索引、日志到my.cnf文件里规定初始的数据目录位置。

?View Code BASH
1
innobackupex --copy-back --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql

  修改数据目录权限

?View Code BASH
1
chown -R mysql:mysql /data0/mysql/data

  重启MySQL

?View Code BASH
1
/data0/mysql/mysql restart

  五、参考文档

  http://www.google.com
  http://www.linuxidc.com/Linux/2011-05/35410.htm
  http://blogold.chinaunix.net/u4/122567/showart_2537465.html

bitsCN.com
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
如何使用Laravel开发一个在线餐厅预订系统如何使用Laravel开发一个在线餐厅预订系统Nov 02, 2023 pm 01:48 PM

如何使用Laravel开发一个在线餐厅预订系统近年来,随着互联网和移动互联网的快速发展,线上预订已成为现代人生活中不可或缺的一部分。餐饮行业也不例外,越来越多的餐厅开始提供在线预订服务,以提高用户体验和扩大市场份额。本文将介绍如何使用Laravel框架来开发一个简单但功能完善的在线餐厅预订系统,并提供具体的代码示例,方便读者学习和实践。环境搭建首先,我们需要

PHP中的在线发票管理系统开发指南PHP中的在线发票管理系统开发指南Jun 11, 2023 am 08:38 AM

随着电子商务的普及,越来越多的企业采用在线发票管理系统来管理销售和发票。在开发在线发票管理系统时,选择合适的工具和技术非常重要。本文将介绍如何使用PHP语言开发在线发票管理系统,并提供了一些有用的开发指南。确定系统需求在开始开发之前,需要确定在线发票管理系统的具体需求。这可能包括以下方面:发票管理:保存、查询和编辑发票信息;客户信息管理:保存、查询和编辑客户

如何使用Java Websocket实现在线音视频通话?如何使用Java Websocket实现在线音视频通话?Dec 02, 2023 am 09:44 AM

如何使用JavaWebsocket实现在线音视频通话?在当今数字化时代,实时通信变得越来越普遍。无论是在工作中进行远程协作,还是在家庭中与亲朋好友进行远程交流,实时音视频通话已经成为人们不可或缺的一部分。本文将介绍如何使用JavaWebsocket实现在线音视频通话,并提供具体的代码示例。一、了解WebsocketWebsocket是一种HTML5中的新

如何使用PHP实现一个简单的在线音乐播放器如何使用PHP实现一个简单的在线音乐播放器Sep 24, 2023 pm 02:53 PM

如何使用PHP实现一个简单的在线音乐播放器随着数字化时代的到来,越来越多的人开始通过网络来享受音乐,而在线音乐播放器就成了重要的工具。在本文中,我们将通过PHP编程语言来实现一个简单的在线音乐播放器,并提供具体的代码示例。准备工作:在开始之前,我们需要准备以下几个方面的工作:一台运行web服务器(如Apache)的机器。PHP运行环境。音乐文件,可以将音乐文

使用JavaScript构建在线电子签名工具使用JavaScript构建在线电子签名工具Aug 09, 2023 pm 12:01 PM

使用JavaScript构建在线电子签名工具随着数字化时代的到来,电子签名成为快速、便捷、安全的商业交流方式。而在开发在线电子签名工具时,JavaScript无疑是一种强大的语言选择。本文将介绍如何使用JavaScript构建一个简单而功能强大的在线电子签名工具,并附上代码示例。在开始之前,我们需要了解几个概念。电子签名通常有两种类型:基于图片的签名和基于矢

如何使用PHP实现一个简单的在线订单管理系统如何使用PHP实现一个简单的在线订单管理系统Sep 25, 2023 am 11:13 AM

如何使用PHP实现一个简单的在线订单管理系统一、简介在线订单管理系统是一种常见的电商应用,它可以帮助商家有效管理订单流程、加快订单处理速度、提升客户满意度。本文将介绍如何使用PHP实现一个简单的在线订单管理系统,包括实现订单的创建、修改、查询和删除等功能。本文假设读者已经具备一定的PHP基础知识。二、系统需求在线订单管理系统需要满足以下基本需求:登录功能

如何使用Laravel开发一个在线客服系统如何使用Laravel开发一个在线客服系统Nov 02, 2023 pm 02:48 PM

如何使用Laravel开发一个在线客服系统引言:在线客服系统在现代企业中扮演着重要的角色。它能够帮助企业与客户进行实时沟通,解答问题,提供支持,并增强用户体验。本文将介绍如何使用Laravel框架来开发一个简单且实用的在线客服系统。一、设计数据库在线客服系统需要存储用户和对话记录,因此首先需要设计一个合适的数据库模型。在Laravel中,我们可以使用迁移工具

如何使用PHP实现一个简单的在线财务管理系统如何使用PHP实现一个简单的在线财务管理系统Sep 24, 2023 pm 01:12 PM

如何使用PHP实现一个简单的在线财务管理系统引言:在现代社会,财务管理对个人和组织都至关重要。随着科技的不断发展,越来越多的人选择在线财务管理系统来帮助他们更好地管理自己的财务。本文将介绍如何使用PHP语言来实现一个简单的在线财务管理系统,并提供具体的代码示例。设计数据库结构:首先,我们需要设计一个适合的数据库结构来存储用户的财务数据。可以创建三个表:用户表

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境