Rumah >pangkalan data >tutorial mysql > 基于Xtrabackup备份mysql(MairaDB)
一、Xtrabackup1、Xtrabackup介绍PerconaXtraBackup是开源免费的MySQL数据库热备份软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份,据官方介绍,这也
一、Xtrabackup
1、Xtrabackup介绍
Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具
2、Xtrabackup的特点
(1)在线热备整个库的InnoDB、XtraDB表
(2)备份过程不会打断正在执行的事务;
(3)在xtrabackup的上一次整库备份基础上做增量备份(innodb only)
(4)自动实现备份检验;
(5)以流的形式产生备份,可以直接保存到远程主机上
3、Xtrabackup有两个主要的工具
(1)xtrabackup
xtrabackup的增量备份只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
(2)innobackupex
innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。
4、增量备份的过程
(1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。
(2)在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。
首先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。
因为logfile里面记录全部的数据修改情况,所以,即使在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。
5、Xtrabackup备份原理
(1)XtraBackup基于InnoDB的crash-recovery功能。它会复制innodb的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。
(2)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。
6、实现细节
XtraBackup以read-write模式打开innodb的数据文件,然后对其进行复制。其实它不会修改此文件。也就是说,运行XtraBackup的用户,必须对innodb的数据文件具有读写权限。之所以采用read-write模式是因为XtraBackup采用了其内置的innodb库来打开文件,而innodb库打开文件的时候就是rw的。
7、Xtrabackup的安装
(1)所需软件,直接到percona官网下载即可
percona-toolkit-2.2.4-1.noarch.rpm percona-xtrabackup-2.1.8-733.rhel6.x86_64.rpm因为percona-toolkit是perl组件,所以会依赖很多perl库,所以选择yum方式安装
二、Xtrabackup完全备份的实现
1、前提准备
(1)创建数据备份目录
[root@shuishui ~]# mkdir /backups/(2)修改二进制日志文件存储路径
[root@shuishui ~]# vim /etc/my.cnf log-bin=/mydata/binlogs/master-bin(3)授权一个最小权限的用户进行复制
MariaDB [(none)]> grant reload,lock tables,replication client on *.* to 'backup'@'localhost' identified by 'backup'; MariaDB [(none)]> flush privileges;2、完整备份的实现
(1)导入一个数据库,就不自己建库了
MariaDB [hellodb]> set sql_log_bin=0; #导入数据库过程无需记录二进制日志,把以先暂时关闭 MariaDB [hellodb]> source hellodb.sql; MariaDB [hellodb]> show databases; +--------------------+ | Database | +--------------------+ | hellodb | | information_schema | | makingware | | mysql | | performance_schema | | test | | ultrax | +--------------------+ MariaDB [hellodb]> set sql_log_bin=1; #开启二进制日志(2)做完整备份
[root@shuishui ~]# innobackupex --user=backup --password=backup --host=localhost /backups/ #做完备 …… …… innobackupex: Backup created in directory '/backups/2014-04-21_11-28-06' #备份存储路径 innobackupex: MySQL binlog position: filename 'master-bin.000013', position 105544 #二进制日志及位置信息 140421 11:28:15 innobackupex: Connection to database server closed 140421 11:28:15 innobackupex: completed OK! #只有到了这里才说明备份成功看一下备份目录中生成的一些文件
[root@shuishui ~]# cd /backups/2014-04-21_11-28-06/ [root@shuishui 2014-04-21_11-28-06]# ll total 12388 -rw-r--r--. 1 root root 357 Apr 21 11:28 backup-my.cnf drwxr-xr-x. 2 root root 4096 Apr 21 11:28 hellodb -rw-r-----. 1 root root 12582912 Apr 21 11:28 ibdata1 drwxr-xr-x. 2 root root 4096 Apr 21 11:28 makingware drwx------. 2 root root 4096 Apr 21 11:28 mysql drwxr-xr-x. 2 root root 4096 Apr 21 11:28 performance_schema drwxr-xr-x. 2 root root 4096 Apr 21 11:28 test drwxr-xr-x. 2 root root 61440 Apr 21 11:28 ultrax -rw-r--r--. 1 root root 13 Apr 21 11:28 xtrabackup_binary -rw-r--r--. 1 root root 27 Apr 21 11:28 xtrabackup_binlog_info -rw-r-----. 1 root root 89 Apr 21 11:28 xtrabackup_checkpoints -rw-r-----. 1 root root 2560 Apr 21 11:28 xtrabackup_logfile [root@shuishui 2014-04-21_11-28-06]#