阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

xtrabackup热备和恢复MySQL

164次阅读
没有评论

共计 12615 个字符,预计需要花费 32 分钟才能阅读完成。

热备份与恢复

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/ 下

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计12615字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中