热备份与恢复
3.1xtrabackup 介绍:
热备份的方式也是直接复制数据物理文件, 和冷备份一样, 但是热备份可以不停机直接复制, 一般用于 7*24 小时不间断的重要核心业务. MySQL 的社区版本热备份工具 InnoDB Hot Backup 是付费的, 只能试用 30 天, 商业版才可以永久的使用,
Percona 公司发布一个 xtrabackup 热备工具, 和付费的工具一样, 支持在线热备 (备份时不影响数据的读写) 是商业工具 InnoDB Hot Backup 的一个很好的替代.
xtrabackup 热备工具是一个开源的工具, 他可以非常快速的备份和恢复 mysql 数据库. Xrabackup 中包含两个工具:
1.xtrabackup 适用于热备份 InnoDB 及 XtraDB 表中数据的工具, 不能备份其他类型的表, 也不能备份数据表结构
2.innobakupex 是将 xtrabackup 进行封装的 perl 脚本, 他提供备份 MyISAM 表的能力, 由于 innobakupex 功能更完善, 所以一般采用 innobakupex 来进行备份, 但在处理 myisam 时需要加一个读锁. 并且加入了一些使用的选项. 如 slave-info 可以记录备份恢复后, 作为 slave 需要的一些信息, 根据这些信息, 可以很方便的利用备份来重做 slave.
Xtrabackup 可以做什么:
在线 (热) 备份整个库的 InnoDB, XtraDB 表
在 xtrabackup 的上一次整库备份基础上做增量备份(innodbonly)
以流的形式产生备份, 可以直接保存到远程机器上(本机硬盘空间不足时很有用)
MySQL 数据库本身提供的工具并不支持真正的增量备份, 二进制日志恢复是 point-in-time(时间点)的恢复而不是增量备份. Xtrabackup 工具支持对 InnoDB 存储引擎的增量备份, 工作原理如下:
(1)首先完成一个完全备份, 并记录下此时检查点的 LSN(LogSequenceNumber).
(2)在进程增量备份时, 比较表空间中每个页的 LSN 是否大于上次备份时的 LSN, 如果是, 则备份该页, 同时记录当前检查点的 LSN.
首先, 在 logfile 中找到并记录最后一个 checkpoint("last checkpoint LSN"), 然后开始从 LSN 的位置开始拷贝 InnoDB 的 logfile 到 xtrabackup_logfile; 接着, 开始拷贝全部的数据文件. ibd; 在拷贝全部数据文件结束之后, 才停止拷贝 logfile.
因为 logfile 里面记录全部的数据修改情况, 所以, 即时在备份过程中数据文件被修改过了, 恢复时仍然能够通过解析 xtrabackup_logfile 保持数据的一致.
3.2Xtrabackup 备份原理
XtraBackup 基于 InnoDB 的 crash-recovery 功能. 它会复制 innodb 的 datafile, 由于不锁表, 复制出来的数据是不一致的, 在恢复的时候使用 crash-recovery, 使得数据恢复一致.
InnoDB 维护了一个 redo log, 又称为 transactionlog, 事务日志, 它包含了 innodb 数据的所有改动情况. 当 InnoDB 启动的时候, 它会先去检查 data file 和 transaction log, 并且会做二步操作:
XtraBackup 在备份的时候, 一页一页地复制 innodb 的数据, 而且不锁定表, 与此同时, XtraBackup 还有另外一个线程监视着 transactions log, 一旦 log 发生变化, 就把变化过的 logpages 复制走. 为什么要急着复制走呢? 因为 transactions log 文件大小有限, 写满之后, 就会从头再开始写, 所以新数据可能会覆盖到旧的数据.
在 prepare 过程中, XtraBackup 使用复制到的 transactions log 对备份出来的 innodb data file 进行 crash recovery.
3.3 实现细节
XtraBackup 以 read-write 模式打开 innodb 的数据文件, 然后对其进行复制. 其实它不会修改此文件. 也就是说, 运行 XtraBackup 的用户, 必须对 innodb 的数据文件具有读写权限. 之所以采用 read-write 模式是因为 XtraBackup 采用了其内置的 innodb 库来打开文件, 而 innodb 库打开文件的时候就是 rw 的.
XtraBackup 要从文件系统中复制大量的数据, 所以它尽可能地使用 posix_fadvise(), 来告诉 OS 不要缓存读取到的数据, 从而提升性能. 因为这些数据不会重用到了, OS 却没有这么聪明. 如果要缓存一下的话, 几个 G 的数据, 会对 OS 的虚拟内存造成很大的压力, 其它进程, 比如 mysqld 很有可能被 swap 出去, 这样系统就会受到很大影响了.
在备份 innodbpage 的过程中, XtraBackup 每次读写 1MB 的数据, 1MB/16KB=64 个 page. 这个不可配置. 读 1MB 数据之后, XtraBackup 一页一页地遍历这 1MB 数据, 使用 innodb 的 buf_page_is_corrupted()函数检查此页的数据是否正常, 如果数据不正常, 就重新读取这一页, 最多重新读取 10 次, 如果还是失败, 备份就失败了, 退出. 在复制 transactionslog 的时候, 每次读写 512KB 的数据. 同样不可以配置.
3.4xtrabackup 工具的安装
1 软件下载地址
http://www.percona.com/downloads / 软件下载地址
2 直接下载二进制包安装
不编译安装, 编译安装需要和 MySQL 源码包配合.
- wgethttp://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.9/binary/Linux/x86_64/percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz
- tar zxvf percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz
- [root@localhost bin]# cd/opt/percona-xtrabackup-2.1.9-Linux-x86_64/bin/
- [root@localhostpercona-xtrabackup-2.1.9-Linux-x86_64]# ll bin/
总用量 114072
-rwxr-xr-x 1 root root 168821 5 月 2 2014 innobackupex
lrwxrwxrwx 1 root root 12 4 月 4 10:11 innobackupex-1.5.1 ->innobackupex
-rwxr-xr-x 1 root root 2226551 5 月 2 2014 xbcrypt
-rwxr-xr-x 1 root root 2300304 5 月 2 2014 xbstream
-rwxr-xr-x 1 root root 13178050 5 月 2 2014 xtrabackup
-rwxr-xr-x 1 root root 16598470 5 月 2 2014 xtrabackup_55
-rwxr-xr-x 1 root root 82321834 5 月 2 2014 xtrabackup_56
- cp innobackupex-1.5.1 /usr/bin/innobackupex
- cp xtrabackup_55 /usr/bin/xtrabackup
- cp xtrabackup /usr/bin
安装相关插件
- yum install perl-DBI -y
- yum install perl-DBD-MySQL -y
- yum install perl-Time-HiRes -y
- yum install perl-IO-Socket-SSL -y
- yum install perl-TermReadKey.x86_64 -y
3.5 innobackupex 参数介绍:
--defaults-file=/etc/my.cnf: 指定 my.cnf 配置文件位置
--user=root: 指定链接数据库的用户名
--apply-log: 对 xtrabackup 的 - prepare 参数的封装
--copy-back: 做数据恢复时把备份文件拷贝到 mysql 服务器的 datadir 目录下
--remote-host: 通过 ssh 将备份数据存储到远程的服务器上
--stream: 通过指定的数据格式将备份的数据输出到标准输出
--tmpdir: 当指定了 - remote-host 或者是 - stream 参数后, 事务日志需要临时存储到本地磁盘, 此参数默认使用了 mysql 服务器的配置
--use-memory: 此参数结合 ibbackup 使用, 类似于 xrtabackup 的参数 use-memory 参数
--throttle=IOS: 同 xtrabackup 的参数 throttle
--sleep: 是给 ibbackup 使用的, 指定每备份 1M 数据, 进程停止考呗多少秒, 也是为了减少对正常业务的影响, 具体查看 ibbackup 的手册
-compass: 对备份的数据进行压缩, 仅仅支持 ibbackup,xtrabackup 还没有实现
--include=REGEXP 对 xtrabackup 参数的封装, 也支持 ibbackup;
--database=LIST : 列出需要备份的 databases, 如果没有制定该参数, 则所有包含 Myisam 和 innoDB 表的 database 都会被备份
--password="*****": 访问 mysql 的用户口令, 当 mysql 的 root 口令为空时省略 - password 参数.
PORT=3306 : 指定 mysql 监听的端口
--slave-info:slave-info 可以记录备份恢 复后, 作为 slave 需要的一些信息, 根据这些信息, 可以很方便的利用备份来重做 slave.
/mysql_backup: 备份位置
--socket=SOCKET :mysql 服务器的 socket 文件的位置
2>/mysql_backup/ innobackupex.log: 记录备份时的输出
--databases = 数据库名: 使用这个参数, 针对某个数据库进行备份, 如果不加这个参数默认就是全部的库备份
innobackupex --defaults-file= /data/mysqldata/3307/my.cnf--user=root --password= zywerj@11erwe --databases="cooolyisydb" /backup/full_data/
3.6 实例演示操作:
- innobackupex --defaults-file= /data/mysqldata/3307/my.cnf--user=root --password= zywerj@11erwe --databases="cooolyisydb" /backup/full_data/
- [root@localhost backup]# innobackupex --defaults-file= /data/mysqldata/3307/my.cnf--user=root --password=zywerj@11erwe --databases="cooolyisydb"/backup/full_data/
- Can't locate Time/HiRes.pm in @INC (@INC contains:/usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at/usr/bin/innobackupex line 23.
- BEGIN failed--compilation aborted at/usr/bin/innobackupex line 23.
报错解决办法:
yum -y install perl-Time-HiRes
参考: http://blog.csdn.net/lwei_998/article/details/40896321
1. 单库备份及恢复过程:
创建备份数据存放的目录:
mkdir -p/backup/{full_data,dk_data,zl_data}
注: full_data 全库备份目录
dk_data 单库备份目录
zl_data 增量备份目录
- [root@localhost ~]# time innobackupex--defaults-file=/etc/my.cnf --user=root --password=Zy@634#R0ot--socket=/tmp/mysql.sock --port=3306 --databases="mahtu" --slave-info/backup/full_data/
- InnoDB Backup Utility v1.5.1-xtrabackup; Copyright2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates2009-2013. All Rights Reserved.
This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.
- Get the latest version of Percona XtraBackup,documentation, and help resources:
- http://www.percona.com/xb/p
- 170404 13:28:55 innobackupex: Connecting to MySQL server with DSN'dbi:mysql:;mysql_read_default_file=/etc/my.cnf;mysql_read_default_group=xtrabackup;port=3306;mysql_socket=/tmp/mysql.sock'as 'root' (using password: YES).
- 170404 13:28:55 innobackupex: Connected to MySQL server
170404 13:28:55 innobackupex: Executing a version check against the server...
170404 13:28:58 innobackupex: Done.
IMPORTANT: Please check that the backup runcompletes successfully.
- Atthe end of a successful backup run innobackupex
- prints "completed OK!".
- innobackupex: Using mysql server version 5.5.48
- innobackupex: Created backup directory /backup/full_data/2017-04-04_13-28-58
- 170404 13:28:58 innobackupex: Starting ibbackup with command: xtrabackup_55 --defaults-file="/etc/my.cnf" --defaults-group="mysqld" --backup--suspend-at-end --target-dir=/backup/full_data/2017-04-04_13-28-58 --tmpdir=/tmp
- innobackupex: Waiting for ibbackup (pid=26398) tosuspend
- innobackupex: Suspend file'/backup/full_data/2017-04-04_13-28-58/xtrabackup_suspended_2'
- xtrabackup_55 version 2.1.9 for Percona Server5.5.35 Linux (x86_64) (revision id: 744)
- xtrabackup: uses posix_fadvise().
- xtrabackup: cd to /data/mysql/
- xtrabackup: open files limit requested 65535, setto 65535
- xtrabackup: using the following InnoDBconfiguration:
- xtrabackup: innodb_data_home_dir = /usr/local/mysql/var
- xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend
- xtrabackup: innodb_log_group_home_dir = /usr/local/mysql/var
- xtrabackup: innodb_log_files_in_group = 2
- xtrabackup: innodb_log_file_size = 268435456
- >> log scanned up to (619371504)
[01] Copying/usr/local/mysql/var/ibdata1 to /backup/full_data/2017-04-04_13-28-58/ibdata1
- >> log scanned up to (619371504)
- .......................
- >> log scanned up to (619371544)
[01] ...done
- >> log scanned up to (619371544)
- xtrabackup: Creating suspend file'/backup/full_data/2017-04-04_13-28-58/xtrabackup_suspended_2' with pid '26398'
- 170404 13:29:13 innobackupex: Continuing after ibbackup has suspended
170404 13:29:13 innobackupex: Starting to lock all tables...
- >> log scanned up to (619371544)
- 170404 13:29:13 innobackupex: All tables locked and flushed to disk
- 170404 13:29:13 innobackupex: Starting to backup non-InnoDB tables and files
- innobackupex: in subdirectories of '/data/mysql/'
- innobackupex: Backing up files'/data/mysql//mahtu/*.{frm,isl,MYD,MYI,MAD,MAI,MRG,TRG,TRN,ARM,ARZ,CSM,CSV,opt,par}'(747 files)
- >> log scanned up to (619371544)
- ...............
- >> log scanned up to (619371544)
- 170404 13:29:19 innobackupex: Finished backing up non-InnoDB tables and files
- 170404 13:29:19 innobackupex: Waiting for log copying to finish
- xtrabackup: The latest check point (forincremental): '619371544'
xtrabackup: Stopping log copying thread.
- .>> log scanned up to (619371544)
- xtrabackup: Creating suspend file'/backup/full_data/2017-04-04_13-28-58/xtrabackup_log_copied' with pid '26398'
- xtrabackup: Transaction log of lsn (619371135) to(619371544) was copied.
- 170404 13:29:20 innobackupex: All tables unlocked
- innobackupex: Backup created in directory'/backup/full_data/2017-04-04_13-28-58'
- innobackupex: MySQL slave binlog position: masterhost '192.168.10.20', filename 'mysql-bin.000001', position 35593612
- 170404 13:29:20 innobackupex: Connection to database server closed
- 170404 13:29:20 innobackupex: completed OK!
- real 0m25.738s
- user 0m2.765s
- sys 0m3.927s
备份数据恢复的报错提示:
- [root@localhost 2017-04-04_16-04-46]#innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/dk_data/2017-04-04_16-04-46/
- InnoDB Backup Utility v1.5.1-xtrabackup; Copyright2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates2009-2013. All Rights Reserved.
This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.
- Get the latest version of Percona XtraBackup,documentation, and help resources:
- http://www.percona.com/xb/p
- IMPORTANT: Please check that the copy-back runcompletes successfully.
- Atthe end of a successful copy-back run innobackupex
- prints "completed OK!".
- innobackupex: Error: Original data directory'/data/mysql/' is not empty! at /usr/bin/innobackupex line 2113.
- root@localhost mysql]# ps -ef|grep"/data/mysql/"|grep -v grep
- root 28100 1 0 14:01 pts/1 00:00:00 /bin/sh/usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/--pid-file=/data/mysql//localhost.localdomain.pid
- mysql 28598 28100 29 14:01 pts/1 01:21:31 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql--datadir=/data/mysql/ --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql--log-error=/data/mysql//localhost.localdomain.err --open-files-limit=65535--pid-file=/data/mysql//localhost.localdomain.pid --socket=/tmp/mysql.sock--port=3306
原因是 xtrabackup 在恢复 mysql 的备份数据时, mysql 环境必须是全新的环境, 没有任何数据的
数据目录为 / data/mysql, 恢复之前必须把这个目录下的文件全部移走, 然后把文件 / usr/local/mysql/var/ibdata1 移到其他的目录, 这样才可以正常的恢复备份的数据库
以下是恢复备份的数据库 cooolyisydb:
- [root@localhost var]# time innobackupex--defaults-file=/etc/my.cnf --copy-back /backup/dk_data/2017-04-04_16-04-46/
- InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013. All Rights Reserved.
This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.
- Get the latest version of Percona XtraBackup, documentation, and help resources:
- http://www.percona.com/xb/p
- 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 files in '/backup/dk_data/2017-04-04_16-04-46'
- innobackupex: back to original data directory '/data/mysql/'
- innobackupex: Copying '/backup/dk_data/2017-04-04_16-04-46/xtrabackup_slave_info' to '/data/mysql/xtrabackup_slave_info'
- innobackupex: Creating directory '/data/mysql/cooolyisydb'
- ......................
- innobackupex: Starting to copy InnoDB log files
- innobackupex: in'/backup/dk_data/2017-04-04_16-04-46'
- innobackupex: back to original InnoDB log directory'/usr/local/mysql/var'
innobackupex: Finished copying back files.
- 170404 17:03:35 innobackupex: completed OK!
- real 5m25.809s
- user 0m0.303s
- sys 0m13.316s
- [root@localhost ~]# time mysqldump -uroot-p -B mahtu>test_mahtu.sql
- Enter password:
- real 0m36.932s
- user 0m10.967s
- sys 0m1.337s
得出结论: innobackupex 备份比 mysqldump 备份的速度快
3.7 压缩备份
xbstream 打包:
[root@localhost bin]# innobackupex --defaults-file=/etc/my.cnf --user=root--password=Zy@66#erot --stream=xbstream --databases="cooolyisydb"/backup/full_data/> /backup/full_data/backup.xbstream
--compress 压缩参数
[root@localhost full_data]# innobackupex --defaults-file=/etc/my.cnf --user=root--password=Zy@66##erot --stream=xbstream --compress--databases="cooolyisydb" /backup/full_data/>/backup/full_data/backup.xbstream
tar 压缩方法:
- innobackupex --defaults-file=/data/3307/my.cnf --user=system--password=test3306 --databases="oldboy xtra_test" --stream=tar/backup/data/yasuo/|gzip> /backup/data/yasuo/test.dir_$(date +%F).tar.gz
- [root@localhost full_data]# innobackupex --defaults-file=/etc/my.cnf --user=root--password=Zy@66##erot --stream=tar --databases="cooolyisydb"/backup/full_data/|gzip> /backup/full_data/cooolyisydb.$(date +%F).tar.gz
3.8 解压备份的方法:
xbstream 解压备份方法:
[root@db02 yasuo]# xbstream -x </backup/data/yasuo/backup.xbstream -C /mysql.test/ -C 指定解压的目录
tar 解压备份方法:
tar ixf /backup/data/yasuo/test.dir_2016-01-17.tar.gz -C /mysql.test/
3.9 备份到远端的方法
- [root@xtrabackup ~]# innobackupex --compress--stream=xbstream /root/backup/ | ssh oldboy@192.168.1.123 "xbstream -x -C
- /root/backup/"
比较三种压缩的方式:
- [root@localhost full_data]# du -sh *
- 5.8G backup.xbstream
- 7.3G backup.xbstream1
- 2.2G cooolyisydb.2017-04-04.tar.gz
3.10innobackupex 也可以进行分库分表备份
innobackupex --defaults-file=/data/3307/my.cnf--user=system --password=123456 --databases="mahtu student"/mysql.test/
备份到 / mysql.test / 下
来源: http://www.linuxidc.com/Linux/2018-08/153635.htm