首頁 資料庫 mysql教程 Xtrabackup使用指南 InnoDB数据备份工具

Xtrabackup使用指南 InnoDB数据备份工具

Jun 07, 2016 pm 06:05 PM
xtrabackup

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

一、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。

  安装编译所需的依赖包

BASH

yum install libaio libaio-devel

  编译安装Xtrabackup

BASH
代码如下:
wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-1.6/source/xtrabackup-1.6.tar.gz
tar xvf xtrabackup-1.6.tar.gz
cd xtrabackup-1.6
utils/build.sh innodb55

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

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

BASH
ls mysql-5.5.10/storage/innobase/xtrabackup/
Makefile xtrabackup.c xtrabackup_innodb55 xtrabackup.o

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

BASH
代码如下:
cp mysql-5.5.10/storage/innobase/xtrabackup/xtrabackup_innodb55 /usr/bin/xtrabackup_55
cp 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常用参数选项如下:

BASH

--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=name
MySQL数据库的数据文件目录。

  B、普通备份方式

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

BASH
代码如下:
mkdir -p /data0/backup/mysql
xtrabackup_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恢复的时候使用。

  全量备份恢复

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

BASH

xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/

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

BASH

cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/

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

BASH

rm /data0/backup/mysql/ib*
cp /data0/backup/mysql/ib* /data0/mysql/data/

  修改数据目录权限

BASH

chown -R mysql:mysql /data0/mysql/data

  重启MySQL

BASH

/data0/mysql/mysql restart

  b)增量备份

  增量备份优点:

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

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

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

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

BASH
代码如下:
#建立备份目录
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/

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

BASH
代码如下:
#建立备份目录
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操作。

BASH

xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/base
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/base --incremental-dir=/data0/backup/mysql/delta/

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

BASH

cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/

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

BASH
rm /data0/backup/mysql/ib*
cp /data0/backup/mysql/ib* /data0/mysql/data/

  修改数据目录权限

BASH
chown -R mysql:mysql /data0/mysql/data

  重启MySQL

BASH
/data0/mysql/mysql restart

  四、innobackupex的备份与恢复使用

  A、数据备份

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

  innobackupex语法

BASH

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.

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

BASH

mkdir -p /data0/backup/mysql

  1、普通备份

BASH

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、打包备份

BASH

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、压缩备份

BASH

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/目录下。

BASH

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、数据恢复

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

  解包备份数据

BASH

tar xvzfi mike.tar.gz

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

BASH

innobackupex --apply-log --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql

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

BASH

innobackupex --copy-back --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql

  修改数据目录权限

BASH

chown -R mysql:mysql /data0/mysql/data

  重启MySQL

BASH

/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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

與MySQL中使用索引相比,全表掃描何時可以更快? 與MySQL中使用索引相比,全表掃描何時可以更快? Apr 09, 2025 am 12:05 AM

全表掃描在MySQL中可能比使用索引更快,具體情況包括:1)數據量較小時;2)查詢返回大量數據時;3)索引列不具備高選擇性時;4)複雜查詢時。通過分析查詢計劃、優化索引、避免過度索引和定期維護表,可以在實際應用中做出最優選擇。

可以在 Windows 7 上安裝 mysql 嗎 可以在 Windows 7 上安裝 mysql 嗎 Apr 08, 2025 pm 03:21 PM

是的,可以在 Windows 7 上安裝 MySQL,雖然微軟已停止支持 Windows 7,但 MySQL 仍兼容它。不過,安裝過程中需要注意以下幾點:下載適用於 Windows 的 MySQL 安裝程序。選擇合適的 MySQL 版本(社區版或企業版)。安裝過程中選擇適當的安裝目錄和字符集。設置 root 用戶密碼,並妥善保管。連接數據庫進行測試。注意 Windows 7 上的兼容性問題和安全性問題,建議升級到受支持的操作系統。

說明InnoDB全文搜索功能。 說明InnoDB全文搜索功能。 Apr 02, 2025 pm 06:09 PM

InnoDB的全文搜索功能非常强大,能够显著提高数据库查询效率和处理大量文本数据的能力。1)InnoDB通过倒排索引实现全文搜索,支持基本和高级搜索查询。2)使用MATCH和AGAINST关键字进行搜索,支持布尔模式和短语搜索。3)优化方法包括使用分词技术、定期重建索引和调整缓存大小,以提升性能和准确性。

InnoDB中的聚類索引和非簇索引(次級索引)之間的差異。 InnoDB中的聚類索引和非簇索引(次級索引)之間的差異。 Apr 02, 2025 pm 06:25 PM

聚集索引和非聚集索引的區別在於:1.聚集索引將數據行存儲在索引結構中,適合按主鍵查詢和範圍查詢。 2.非聚集索引存儲索引鍵值和數據行的指針,適用於非主鍵列查詢。

mysql:簡單的概念,用於輕鬆學習 mysql:簡單的概念,用於輕鬆學習 Apr 10, 2025 am 09:29 AM

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

mysql 和 mariadb 可以共存嗎 mysql 和 mariadb 可以共存嗎 Apr 08, 2025 pm 02:27 PM

MySQL 和 MariaDB 可以共存,但需要謹慎配置。關鍵在於為每個數據庫分配不同的端口號和數據目錄,並調整內存分配和緩存大小等參數。連接池、應用程序配置和版本差異也需要考慮,需要仔細測試和規劃以避免陷阱。在資源有限的情況下,同時運行兩個數據庫可能會導致性能問題。

mysql用戶和數據庫的關係 mysql用戶和數據庫的關係 Apr 08, 2025 pm 07:15 PM

MySQL 數據庫中,用戶和數據庫的關係通過權限和表定義。用戶擁有用戶名和密碼,用於訪問數據庫。權限通過 GRANT 命令授予,而表由 CREATE TABLE 命令創建。要建立用戶和數據庫之間的關係,需創建數據庫、創建用戶,然後授予權限。

RDS MySQL 與 Redshift 零 ETL 集成 RDS MySQL 與 Redshift 零 ETL 集成 Apr 08, 2025 pm 07:06 PM

數據集成簡化:AmazonRDSMySQL與Redshift的零ETL集成高效的數據集成是數據驅動型組織的核心。傳統的ETL(提取、轉換、加載)流程複雜且耗時,尤其是在將數據庫(例如AmazonRDSMySQL)與數據倉庫(例如Redshift)集成時。然而,AWS提供的零ETL集成方案徹底改變了這一現狀,為從RDSMySQL到Redshift的數據遷移提供了簡化、近乎實時的解決方案。本文將深入探討RDSMySQL零ETL與Redshift集成,闡述其工作原理以及為數據工程師和開發者帶來的優勢。

See all articles