xtrabackup全备和全备恢复

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

Xtrabackup介绍

Xtrabackup是什么

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

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

Xtrabackup可以做什么 :

在线(热)备份整个库的InnoDB、 XtraDB表
在xtrabackup的上一次整库备份基础上做增量备份(innodb only)
以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)
MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。
Xtrabackup工具支持对InnoDB存储引擎的增量备份,工作原理如下:

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

全备和全备还原

使用innobackupex创建全备

  • 本地创建全备
[root@localhost var]# innobackupex -H 127.0.0.1 -u root -p newpass -P 3306 -S /var/lib/mysql/mysql.sock /home/xtarback/xtrabackup01/

[root@localhost var]# innobackupex -H 127.0.0.1 -u root -p newpass -P 3306 -S /var/lib/mysql/mysql.sock /home/xtarback/xtrabackup01/
170223 15:55:36 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

Unrecognized character \x01; marked by <-- HERE after <-- HERE near column 1 at - line 1374.
170223 15:55:36 Connecting to MySQL server host: 127.0.0.1, user: root, password: set, port: 3306, socket: /var/lib/mysql/mysql.sock
Using server version 5.6.35
innobackupex version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 54967d1)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /var/lib/mysql
xtrabackup: open files limit requested 0, set to 1024
xtrabackup: using the following InnoDB configuration:
xtrabackup:   innodb_data_home_dir = .
xtrabackup:   innodb_data_file_path = ibdata1:12M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 2
xtrabackup:   innodb_log_file_size = 50331648
InnoDB: Number of pools: 1
170223 15:55:36 >> log scanned up to (3692666)
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 1 for mysql/innodb_table_stats, old maximum was 0
170223 15:55:37 [01] Copying ./ibdata1 to /home/xtarback/xtrabackup01/2017-02-23_15-55-36/ibdata1
170223 15:55:37 [01]        ...done
170223 15:55:37 [01] Copying ./mysql/innodb_table_stats.ibd to /home/xtarback/xtrabackup01/2017-02-23_15-55-36/mysql/innodb_table_stats.ibd
170223 15:55:37 [01]        ...done
170223 15:55:37 [01] Copying ./mysql/innodb_index_stats.ibd to /home/xtarback/xtrabackup01/2017-02-23_15-55-36/mysql/innodb_index_stats.ibd
170223 15:55:37 [01]        ...done
....
....
....
170223 15:55:38 Finished backing up non-InnoDB tables and files
170223 15:55:38 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '3692666'
xtrabackup: Stopping log copying thread.
.170223 15:55:38 >> log scanned up to (3692666)

170223 15:55:38 Executing UNLOCK TABLES
170223 15:55:38 All tables unlocked
170223 15:55:38 Backup created in directory '/home/xtarback/xtrabackup01/2017-02-23_15-55-36/'
170223 15:55:38 [00] Writing backup-my.cnf
170223 15:55:38 [00]        ...done
170223 15:55:38 [00] Writing xtrabackup_info
170223 15:55:38 [00]        ...done
xtrabackup: Transaction log of lsn (3692666) to (3692666) was copied.
170223 15:55:39 completed OK! #全备份完成

在备份的同时,备份数据会在备份目录下创建一个以当前日期时间为名字的目录存放备份文件,/home/xtarback/xtrabackup01/2017-02-23_15-55-36/备份到此目录下面

  • 备份目录下面的各项文件说明
    1. xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;
      每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

    2. xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

    3. xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。

    4. xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;

    5. backup-my.cnf —— 备份命令用到的配置选项信息;

在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。

内部机制:在备份的时候innobackupex会调用xtrabackup来备份innodb表,并复制所有的表定义,其他引擎的表(MyISAM,MERGE,CSV,ARCHIVE)。

使用innobackupex预备全备

创建完备份之后数据并没有马上可以被还原,需要回滚未提交事务,前滚提交事务,让数据库文件保持一致性。
innobackupex使用--apply-log来做预备备份

innobackupex --apply-log /home/xtarback/xtrabackup01/2017-02-23_15-55-36/

输出:

xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 3693619
170223 16:24:26 completed OK!

成功后,备份可以被用来还原数据库了。

内部机制:读取备份文件夹中的配置文件,然后innobackupex重做已提交事务,回滚未提交事务,之后数据就被写到了备份的数据文件(innodb文件)中,并重建日志文件。这一步隐式调用了2次xtrabackup –prepare。跟多关于xtrabackup可以看之后的章节。

使用innobackupex还原备份

  • 模拟删除mysql目录下面的数据
[root@localhost mysql]# cd /var/lib/mysql
[root@localhost mysql]# rm -r ./*
[root@localhost mysql]# ll
总用量 0
[root@localhost mysql]#
  • 使用innobackupex --copy-back来还原备份

$ innobackupex --coyp-back /home/xtarback/xtrabackup01/2017-02-23_15-55-36/

会根据my.cnf复制所有备份到datadir下:

170223 16:34:50 Executing UNLOCK TABLES
170223 16:34:50 All tables unlocked
170223 16:34:50 Backup created in directory '/home/xtarback/xtrabackup01/2017-02-23_15-55-36/2017-02-23_16-34-48/'
170223 16:34:50 [00] Writing backup-my.cnf
170223 16:34:50 [00]        ...done
170223 16:34:50 [00] Writing xtrabackup_info
170223 16:34:50 [00]        ...done
xtrabackup: Transaction log of lsn (1625997) to (1625997) was copied.
170223 16:34:50 completed OK!

注:datadir必须是为空的,innobackupex –copy-back不会覆盖已存在的文件。

  • 修改还原数据目录的用户属组
cd /var/lib/mysql
[root@localhost mysql]# chown -R mysql:mysql ./*

注:datadir必须是为空的,innobackupex –copy-back不会覆盖已存在的文件,还要注意,还原时需要先关闭服务,如果服务是启动的,那么就不能还原到datadir。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容