MariaDB [(none)]> grant> Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
2)、创建备份文件目录:
[root@localhost ~]# mkdir -p /hotbackup
对数据库进行完整备份,如果在从库上进行备份,请添加--slave_info –safe-slave-backup参数来获取复制主库的binlog信息。默认备份会将当前库的binlog信息保存到xtrabackup_binlog_info文件中,而--slave_info参数将复制主库的binlog信息保存到xtrabackup_slave_info中,如果使用备份来添加复制,请注意选取正确的binlog信息。
3)、创建innobackupex的配置文件:
[root@localhost ~]# vim /usr/local/etc/my.cnf
[mysqld]
datadir = "/data/mysql/"
innodb_data_home_dir = "/data/mysql/"
innodb_data_home_path = "ibdata1:10M:autoextend"
innodb_log_group_home_dir = "/data/mysql/"
innodb_log_file_in_group = 2
innodb_log_file_size = 1G
4)、进行完整备份:
[root@localhost ~]# innobackupex --user=backup --password=pancou /hotbackup/full
170427 17:00:51 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!".
170427 17:00:52 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup' as 'backup' (using password: YES).
170427 17:00:52 version_check Connected to MySQL server
170427 17:00:52 version_check Executing a version check against the server...
170427 17:00:52 version_check Done.
170427 17:00:52 Connecting to MySQL server host: localhost, user: backup, password: set, port: not set, socket: not set
Using server version 10.1.22-MariaDB
innobackupex version 2.4.7 based on MySQL server 5.7.13 Linux (x86_64) (revision> xtrabackup: uses posix_fadvise().
xtrabackup: cd to /data/mysql
xtrabackup: open files limit requested 0, set to 60000
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 = ./
......
.... .....
170427 17:00:57 Executing UNLOCK TABLES
170427 17:00:57 All tables unlocked
170427 17:00:57 Backup created in directory '/hotbackup/full/2017-04-27_17-00-51/'
MySQL binlog position: filename 'mysql-bin.000007', position '941', GTID of the last change '0-1-270'
170427 17:00:57 [00] Writing backup-my.cnf
170427 17:00:57 [00] ...done
170427 17:00:57 [00] Writing xtrabackup_info
170427 17:00:57 [00] ...done
xtrabackup: Transaction log of lsn (21843393) to (21843393) was copied.
170427 17:00:57 completed OK!
从信息中会发现备份被创建在'/hotbackup/full/2017-04-27_17-00-51/'
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=backup --password=pancou --socket=/var/lib/mysql/mysql.sock /hotbackup/full
其他选项:
--no-timestamp,指定了这个选项备份会直接备份在BACKUP-DIR,不再创建时间戳文件夹。
--default-file,指定配置文件,用来配置innobackupex的选项。
[root@localhost full]# innobackupex --defaults-file=/etc/my.cnf --user=backup --password=pancou --socket=/var/lib/mysql/mysql.sock /hotbackup/full --no-timestamp
.....
170427 17:14:43 Executing UNLOCK TABLES
170427 17:14:43 All tables unlocked
170427 17:14:43 Backup created in directory '/hotbackup/full/'
MySQL binlog position: filename 'mysql-bin.000007', position '941', GTID of the last change '0-1-270'
170427 17:14:43 [00] Writing backup-my.cnf
170427 17:14:43 [00] ...done
170427 17:14:43 [00] Writing xtrabackup_info
170427 17:14:43 [00] ...done
xtrabackup: Transaction log of lsn (21843393) to (21843393) was copied.
170427 17:14:43 completed OK!
使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。
在备份的同时,innobackupex还会在备份目录中创建如下文件:
(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目录来存储备份数据。
[root@localhost full]# ls /hotbackup/full/
backup-my.cnf ib_logfile1 performance_schema testdb xtrabackup_checkpoints
ibdata1 ibtmp1 sakila xtrabackup_binlog_info xtrabackup_info
ib_logfile0 mysql test xtrabackup_binlog_pos_innodb xtrabackup_logfile
MariaDB [testdb]> drop table emp;
Query OK, 0 rows affected (0.10 sec)
2、恢复一个完全备份
1)、准备(prepare)一个完全备份
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
innobakupex命令的--apply-log选项可用于实现上述功能。如下面的命令:
# innobackupex --apply-log /path/to/BACKUP-DIR
如果执行正确,其最后输出的几行信息通常如下:
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
120407 9:01:36 InnoDB: Starting shutdown...
120407 9:01:40 InnoDB: Shutdown completed; log sequence number 92036620
120407 09:01:40 innobackupex: completed OK!
在实现“准备”的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。
[root@localhost full]# innobackupex --apply-log --use-memory=4G /hotbackup/full/
.... .......
InnoDB: 5.7.13 started; log sequence number 21843477
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 21843496
170427 17:23:19 completed OK!
2)、正式从一个完全备份中恢复数据
注意:恢复时要先关闭MySQL
innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。
# innobackupex --copy-back /path/to/BACKUP-DIR
如果执行正确,其输出信息的最后几行通常如下:
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2012-04-07_08-17-03'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Finished copying back files.
120407 09:36:10 innobackupex: completed OK!
请确保如上信息的最行一行出现“innobackupex: completed OK!”。
当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。如:
# chown -R mysql:mysql /mydata/data/
[root@localhost ~]# service mysql stop
Shutting down MySQL... [ OK ]
[root@localhost ~]# mv /data/mysql/ /opt/mysql_bak
[root@localhost ~]# ls /data/
[root@localhost ~]# mkdir /data/mysql
[root@localhost ~]# rm -rf /data/mysql/
[root@localhost ~]# ls /data/
[root@localhost ~]# innobackupex --defaults-file=/usr/local/etc/my.cnf --copy-back /hotbackup/full/
[root@localhost ~]# chown -R mysql:mysql /data/mysql/
[root@localhost ~]# service mysql start
Starting MySQL.170427 17:35:13 mysqld_safe Logging to '/data/mysql/localhost.err'.
170427 17:35:13 mysqld_safe Starting mysqld daemon with databases from /data/mysql
[ OK ]
MariaDB [testdb]> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| emp |
+------------------+
1 row in set (0.00 sec)
3、使用innobackupex进行增量备份和恢复
每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。
要实现第一次增量备份,可以使用下面的命令进行:
# innobackupex --incremental /backup --incremental-basedir=BASEDIR
其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向(上一次的增量备份)所在的目录。
需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。
1)、执行增量备份
MariaDB [testdb]> insert into emp(name) values('tom'),('jerry');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
MariaDB [testdb]> select * from emp;
+------+-------+