innodb_support_xa={TRUE|FALSE}
:用于表示InnoDB
是否支持分布式事务;存储引擎事务在存储引擎内部被赋予了ACID
权限,分布式(XA)
事务是一种高层次的事务,它利用”准备”, 然后 “提交”,两段式的方式将ACID
扩展属性扩展到存储引擎外部,甚至是数据库外部,然而,”准备阶段”会导致额外的磁盘刷写操作,XA
需要事务协调员,它会通知所有的参与者准备提交事务,当协调员从参与者那里得到就绪的消息时,它会只是所有的参与者进行真正的提交操作;这个变量正式用于定义InnoDB
是否支持两段式提交的分布式事务,默认为启用,事实上,所有的启用了二进制日志的,并且支持多个线程同时向二进制日志写入数据的MySQL
服务器都需要启用分布式事务,否则,多个线程对于二进制日志的写入操作,可能会以与原始次序不同的方式完成,这将会在基于二进制日志的恢复中或者是从从服务器上面创建出不同原始数据的结果,因此除了仅仅有一个线程用于改变数据以外的其他应用场景都不应该禁用此功能,而在仅有一个线程可以修改数据的应用中,禁用次功能是安全的,并且可以提高InnoDB
的性能,作用范围是全局和会话级别;sync_binlog = 1
:用于保证在备份的时候不会存在正在写入的事务,可以用于防止二进制日志文件损坏;
ibbackup
:用于实现对于InnoDB
存储引擎是现在线的安全备份,用于实现在线的物理备份;
mylvmbackup(perl scripts)
:可以实现对于逻辑卷上面的进行备份;
Xtrabackup
:实现对于xtradb
(是对于InnoDB
的增强版本),Xtradb
是percona
官方提供的存储引擎,可以下载,并且放在InnoDB
源代码目录,并且进行编译安装,并且需要更改名称为InnoDB
;支持的备份类型包括:完全备份,增量备份,并且可以自动保存信息文件;percona
提供了innodb
的改进版xtradb
, 支持完全备份和增量备份,
使用Xtrabackup进行完全备份
Xtrabackup-2.0.1.rpm
这里可以选择对应平台的rpm
软件包进行下载MySQL
,并且会检查gpgcheck
,使用一下选项避免[root@server60 mnt]# yum install percona-xtrabackup-2.0.1-446.rhel5.x86_64.rpm -y --nogpgcheck
[root@server60 mnt]# innobackupex --user=root ~/backup
//输出关于软件的版本信息以及参数的配置信息
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Inc 2009-2012. All Rights Reserved.
This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.
180513 04:52:32 innobackupex: Starting mysql with options: --user='root' --unbuffered --
180513 04:52:32 innobackupex: Connected to database with mysql child process (pid=25619)
180513 04:52:38 innobackupex: Connection to database server closed
IMPORTANT: Please check that the backup run completes successfully.
At the end of a successful backup run innobackupex
prints "completed OK!".
//根据时间创建了数据备份目录
innobackupex: Created backup directory /root/backup/2018-05-13_04-52-3
//首先进行的是一些文件的扫描
>> log scanned up to (1672262)
[01] Copying ./ibdata1 to /root/backup/2018-05-13_04-52-38/ibdata1
[01] ...done
[01] Copying ./dbdata/dbdata.ibd to /root/backup/2018-05-13_04-52-38/./dbdata/dbdata.ibd
[01] ...done
[01] Copying ./jiaowu/students.ibd to /root/backup/2018-05-13_04-52-38/./jiaowu/students.ibd
[01] ...done
[01] Copying ./jiaowu/tutors.ibd to /root/backup/2018-05-13_04-52-38/./jiaowu/tutors.ibd
[01] ...done
[01] Copying ./jiaowu/scores.ibd to /root/backup/2018-05-13_04-52-38/./jiaowu/scores.ibd
[01] ...done
[01] Copying ./jiaowu/courses.ibd to /root/backup/2018-05-13_04-52-38/./jiaowu/courses.ibd
[01] ...done
[01] Copying ./cactidb/testdb.ibd to /root/backup/2018-05-13_04-52-38/./cactidb/testdb.ibd
[01] ...done
//开始进行锁表,并且刷新表空间
180513 04:52:42 innobackupex: Starting mysql with options: --user='root' --unbuffered --
180513 04:52:42 innobackupex: Connected to database with mysql child process (pid=25663)
180513 04:52:44 innobackupex: Starting to lock all tables...
>> log scanned up to (1672262)
>> log scanned up to (1672262)
180513 04:52:54 innobackupex: All tables locked and flushed to disk
//表示备份信息已经完成
innobackupex: Backup created in directory '/root/backup/2018-05-13_04-52-38'
innobackupex: MySQL binlog position: filename 'mysql-bin.000001', position 107
180513 04:52:57 innobackupex: completed OK!
[root@server60 2018-05-13_04-52-38]# ll
total 18548
-rw-r--r-- 1 root root 260 05-13 04:52 backup-my.cnf
drwx------ 2 root root 4096 05-13 04:52 cactidb
drwx------ 2 root root 4096 05-13 04:52 dbdata
-rw-r----- 1 root root 18874368 05-13 04:52 ibdata1
drwx------ 2 root root 4096 05-13 04:52 jiaowu
drwxr-xr-x 2 root root 4096 05-13 04:52 lost+found
drwxr-xr-x 2 root root 4096 05-13 04:52 mysql
drwxr-xr-x 2 root root 4096 05-13 04:52 performance_schema
-rw-r--r-- 1 root root 13 05-13 04:52 xtrabackup_binary
-rw-r--r-- 1 root root 23 05-13 04:52 xtrabackup_binlog_info
-rw-r----- 1 root root 77 05-13 04:52 xtrabackup_checkpoints
-rw-r----- 1 root root 2560 05-13 04:52 xtrabackup_logfile
backup-my.cnf
:配置文件备份;xtrabackup_binlog_info
:二进制文件信息文件名称以及position
; xtrabackup_binary
:备份使用哪个命令执行的; xtrabackup_logfile
:数据文件; xtrabackup_checkpoints
:备份类型的等数据; backup_type = full-backuped
:表示备份类型;from_lsn = 0:0
:表示从哪个逻辑号码进行的备份;to_lsn = 0:54664
:last_lsn = 0:54664
: lsn
:表示每一个InnoDB
存储日志的信息都包含一个日志序列号,InnoDB
存储引擎会自己维护日志信息的序列号,如果这个信息发生改变,号码就会往前走一个,可以根据这个号码来进行增量备份;如果进行增量备份只需要从last_lsn
开始就可以了;--apply-log
:用于实现上述功能,在执行完成之后,就是一个干净的,可以直接用于恢复的数据文件;[root@server60 backup]# innobackupex --apply-log ~/backup/2018-05-13_04-52-38/
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Inc 2009-2012. All Rights Reserved.
This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.
IMPORTANT: Please check that the apply-log run completes successfully.
At the end of a successful apply-log run innobackupex
prints "completed OK!".
180513 05:13:45 innobackupex: Starting ibbackup with command: xtrabackup_55 --defaults-file="/root/backup/2018-05-13_04-52-38/backup-my.cnf" --defaults-group="mysqld" --prepare --target-dir=/root/backup/2018-05-13_04-52-38
xtrabackup_55 version 2.0.1 for Percona Server 5.5.16 Linux (x86_64) (revision id: 446)
xtrabackup: cd to /root/backup/2018-05-13_04-52-38
xtrabackup: This target seems to be not prepared yet.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(1672262)
xtrabackup: Temporary instance for recovery is set as followings.
xtrabackup: innodb_data_home_dir = ./
xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 1
xtrabackup: innodb_log_file_size = 2097152
180513 5:13:45 InnoDB: Using Linux native AIO
xtrabackup: Starting InnoDB instance for recovery.
xtrabackup: Using 104857600 bytes for buffer pool (set by --use-memory parameter)
[notice (again)]
If you use binary log and don't use any hack of group commit,
the binary log position seems to be:
InnoDB: Last MySQL binlog file position 0 107, file name ./mysql-bin.000001
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
180513 5:13:51 InnoDB: Starting shutdown...
180513 5:13:56 InnoDB: Shutdown completed; log sequence number 1673740
180513 05:13:56 innobackupex: completed OK!
mysql> use jiaowu;
Database changed
mysql> INSERT INTO tutors (Tname) VALUES ('stu00005');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO tutors (Tname) VALUES ('stu00006');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO tutors (Tname) VALUES ('stu00007');
Query OK, 1 row affected (0.00 sec)
mysql> FLUSH LOGS;
Query OK, 0 rows affected (0.10 sec)
[root@server60 backup]# cp /mysql/mydata/mysql-bin.000001 ~/backup/
[root@server60 ~]# service mysqld stop
Shutting down MySQL. [ OK ]
[root@server60 ~]# rm -fr /mysql/mydata/*
这里不需要进行数据库的初始化,在备份的时候,需要数据库正常工作,但是在恢复时,是不需要数据库正常工作的;
使用命令直接恢复数据
[root@server60 mysql]# innobackupex --copy-back ~/backup/2018-05-13_04-52-38/
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Inc 2009-2012. All Rights Reserved.
This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.
IMPORTANT: Please check that the copy-back run completes successfully.
At the end of a successful copy-back run innobackupex
prints "completed OK!".
innobackupex: Starting to copy InnoDB system tablespace
innobackupex: in '/root/backup/2018-05-13_04-52-38'
innobackupex: back to original InnoDB data directory '/mysql/mydata'
innobackupex: Copying file '/root/backup/2018-05-13_04-52-38/ibdata1'
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/root/backup/2018-05-13_04-52-38'
innobackupex: back to original InnoDB log directory '/mysql/mydata'
innobackupex: Finished copying back files.
180513 05:31:10 innobackupex: completed OK!
[root@server60 ~]# chown -R mysql.mysql /mysql/mydata/
MySQL
服务[root@server60 ~]# service mysqld start
Starting MySQL.. [ OK ]
mysql> SET sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
[root@server60 backup]# mysqlbinlog ~/backup/mysql-bin.000001 > /tmp/abc.sql
mysql> SOURCE /tmp/abc.sql
mysql> SET sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)
xtrabackup
对于InnoDB
可以执行增量备份,但是对于MyISAM
是完全备份;
接下来进行完全备份,并且进行增量备份
[root@server60 ~]# innobackupex /backup/
mysql> INSERT INTO tutors(Tname) VALUES('stu00001');
mysql> INSERT INTO tutors(Tname) VALUES('stu00002');
mysql> INSERT INTO tutors(Tname) VALUES('stu00003');
[root@server60 ~]# innobackupex --incremental /backup/ --incremental-basedir=/backup/2018-05-14_02-08-33/
180215 18:42:23 innobackupex: Connection to database server closed
180215 18:42:23 innobackupex: Starting ibbackup with command: xtrabackup_55 --backup --suspend-at-end --target-dir=/root/backup/2018-02-15_18-42-21 --incremental-basedir='~/backup/2018-02-15_18-31-11/'
innobackupex: Waiting for ibbackup (pid=13644) to suspend
innobackupex: Suspend file '/root/backup/2018-02-15_18-42-21/xtrabackup_suspended'
xtrabackup: Error: cannot open ~/backup/2018-02-15_18-31-11//xtrabackup_checkpoints
xtrabackup: error: failed to read metadata from ~/backup/2018-02-15_18-31-11//xtrabackup_checkpoints
innobackupex: Error: ibbackup child process has died at /usr/bin/innobackupex line 371.
~/backup
这样的目录,否则会出现上面的错误;[root@server4 backup]# innobackupex --incremental ~/backup/ --incremental-basedir=~/backup/2018-02-15_18-31-11/
mysql> INSERT INTO tutors(Tname) VALUES('stu00010');
mysql> INSERT INTO tutors(Tname) VALUES('stu00011');
mysql> INSERT INTO tutors(Tname) VALUES('stu00012');
base-dir
为上一次增量备份的目录[root@server60 ~]# innobackupex --incremental /backup/ --incremental-basedir=/backup/2018-05-14_02-17-48/
.......
.......
.......
180513 09:07:17 innobackupex: completed OK!
--redo-only
操作,只执行redo
操作,因为在完全备份和增量备份之间的事务可能存在事务的提交操作;redo-only
操作[root@server60 ~]# innobackupex --apply-log --redo-only /backup/2018-05-14_02-08-33/
[root@server60 ~]# innobackupex --apply-log --redo-only /backup/2018-05-14_02-08-33/ --incremental-dir=/backup/2018-05-14_02-17-48/
[root@server60 ~]# innobackupex --apply-log --redo-only /backup/2018-05-14_02-08-33/ --incremental-dir=/backup/2018-05-14_02-18-36/
redo
操作都已经合并到完全被上面去了MySQL
服务器,删除数据目录[root@server60 ~]# /etc/init.d/mysqld stop
Shutting down MySQL. [ OK ]
[root@server60 ~]# rm -fr /mysql/mydata/*
[root@server60 ~]# innobackupex --copy-back /backup/2018-05-14_02-08-33
[root@server60 ~]# chown -R mysql.mysql /mysql/mydata/
[root@server60 ~]# /etc/init.d/mysqld start
Starting MySQL.. [ OK ]
默认情况下,InnoDB
表不能通过直接复制表文件的方式在mysql
服务器之间移植,即使采用了innodb_file_per_table
选项,但是使用xtrabackup
可以实现此功能,导出表的服务器需要在创建这张表之前启用innodb_file_pre_table
选项,需要导入表的服务器需要启用innodb_file_pre_table
和innodb_expand_import
选项;
xtrabackup
会为每张表创建一个使用exp
结尾的表文件,复制单个表的exp
文件,导入表的服务器需要执行: