xtrabackup全备和全备恢复

2017-02-23  本文已影响635人  CUFFS

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

Xtrabackup介绍

Xtrabackup是什么

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

Xtrabackup可以做什么 :

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

全备和全备还原

使用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/备份到此目录下面

在使用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还原备份

[root@localhost mysql]# cd /var/lib/mysql
[root@localhost mysql]# rm -r ./*
[root@localhost mysql]# ll
总用量 0
[root@localhost mysql]#

$ 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。

上一篇 下一篇

猜你喜欢

热点阅读