mysql之使用xtrabackup进行物理备份、恢复、在线克隆从库、在线重做主从

注:图片来自《深入浅出MySQL 数据库开发 优化与管理维护 第2版》

物理备份和恢复

1.冷备份:停掉mysql再备份,一般很少用,因为很多应用不允许长时间停机,停机备份的可以直接CP数据库的数据目录,在进行恢复前,停掉mysql,然后把数据目录覆盖掉,再重启mysql。

2.热备份

Myisam存储引擎

可以使用mysqlhotcopy工具,如果此工具无法使用时,可以手工使用:flush tables with read lock;手动加读锁,然后复制mysiam表的文件做热备。

innodb引擎

3.使用xtrabackup热备工具,是percona公司的开源、免费、支持在线热备、备份恢复、在线主从、备份和恢复速度快,占用磁盘空间小,并且支持不同情况下的多种备份形式。下载地址:http://www.percona.com/redir/downloads/XtraBackup

本文档下载了rpm包进行安装,需要安装两个依赖包:

yum install perl-Time-HiRes -y

yum -y install perl-DBD-MySQL.x86_64

安装完成后:

主要有两个命令:xtrabackup和innobackupex,两者区别如下:

xtrabackup只能备份Innodb和xtradb两种数据表,不能备份myisam表,且备份出来没有表结构定义文件.frm,只是拷贝了datafile

innobackupex是一个封装了xtrabackup和perl脚本,支持同时备份Innodb和myisam,但在对于myisam备份时需要加一个全局锁。

示例:

下面是innobackupex命令备份全过程:

备份开始时会先开启一个后台检测进程,实时检测mysql redo日志(事务日志)的变化,一旦发现redo日志中有新日志写入,立刻记录后台日志文件xtrabackup_log文件中,之后复制Innodb的数据文件和系统表空间文件ibdata1,复制结束后,执行flush tables with read lock操作,复制.frm,.MYI,.MYD等文件(执行flush tables with read lock的目的是为了防止读取数据的时候发生DDL操作,并且在这一刻获取binlog的位置),最后发出unlock tables,把表设置为可读写状态,最终终止xtrabackup_log文件的写入。

完备恢复:

恢复过程原理示意图如下:

恢复阶段会启动xtrabackup内嵌的innodb实例,回放xtrabackup日志xtrabackup_log文件中的事务,将已经提交的事务变更应用到innodb数据文件、表空间,同时回滚未提交的事务,这一过程类似innodb实例的故障恢复

增量备份:

增量备份过程示意图如下:

innobackupex增量备份过程中的增量处理,其实主要相对innodb而言,对myisam和其他存储引擎而言,仍然是每次一个全备。增量备份过程主要是通过拷贝innodb有变更的页,这些变更数据页指的是LSN大于xtrabackup_checkpoints中给定的LSN,增量备份是基于全备的,第一次增量备份的数据必须要基于最近一次全备,之后每次增备都是基于上一次增备的基础上进行。过程跟完备一样,只是增备时在复制数据文件时复制的是上一次备份后从大于xtrabackup_checkpoints开始的改变的页。

增量备份恢复

过程示意图如下:

和全备恢复类似,也需要两部,一部分数据文件的恢复,这里数据文件包括全备份、增量备份和xtrabackup_log文件中已提交事务的回放,第二部分是对未提交事务的回滚

4.innobackupex使用示例:

1)、安装:

shell > yum install perl-Time-HiRes -y

shell > yum -y install perl-DBD-MySQL.x86_64

shell > wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.2.11/binary/redhat/6/x86_64/percona-xtrabackup-2.2.11-1.el6.x86_64.rpm

shell > rpm -ivh percona-xtrabackup-2.2.11-1.el6.x86_64.rpm

2)、全量备份:

创建备份用户:

mysql > grant reload,lock tables,replication client,create tablespace,super on *.* to ‘backup‘@‘%‘ identified by ‘123456‘;

mysql > flush privileges;

3)、创建备份路径为:

shell > mkdir -p /data/backup/hotbackup,

创建innobackupex配置文件:

[mysqld]

datadir = /data/mysql/data

innodb_data_home_dir = /data/mysq/data/data1

innodb_data_file_path = ibdata1:10M:autoextend

innodb_log_group_home_dir = /data/mysql/data

innodb_log_files_in_group = 2

innodb_log_file_size = 536870912

4)、创建测试表:

mysql > use test

mysql > create table test(id int auto_increment not null primary key,name varchar(20));

mysql > insert into test(name) values(‘test1’);

mysql > insert into test(name) values(‘test2’);

mysql > insert into test(name) values(‘test3’);

mysql > insert into test(name) values(‘test4’);

5)、执行全备:

shell > innobackupex --user=backup --password=123456 --socket=/tmp/mysql.sock --defaults-file=/tmp/my.cnf /data/backup/hotbackup/full --no-timestamp

这里--socket选项可以不要,因为指定配置文件中可以找到socket文件位置,如果配置文件中配置了用户名和密码,那么--user和--password也可以不指定

6)、恢复全备(回放事务日志):

shell > innobackupex --apply-log --use-memory=2G /data/backup/hotbackup/full

恢复全备(复制文件):这个过程要关闭mysql,重命名原来的数据目录,将备份数据复制到数据目录下命名为原来的数据目录,修改权限,启动mysql:

shell > mysqladmin -s /tmp/mysql.sock shut

shell > mv /data/mysql/data /data/mysql/data.bak

shell > mkdir /data/mysql/data

shell > innobackupex --defaults-file=/tmp/my.cnf --copy-backup --rsync /data/backup/hotbackup/full

shell > chown -R mysql.mysql /data/mysql/data

shell > service mysqld start

7)、登录数据库查询数据:

8)、增量备份

注意:第一次增量备份是基于完备的基础上,第二次增备是基于前一次增备的基础上进行的。

创建基础完备:

shell > innobackupex --user=backup --password=123456 --socket=/tmp/mysql.sock --defaults-file=/tmp/my.cnf /data/backup/hotbackup/base --no-timestamp

接着在test库下对test表新增数据:

mysql > insert into test(name) values(‘test5’);

mysql > insert into test(name) values(‘test6’);

mysql > insert into test(name) values(‘test7’);

mysql > insert into test(name) values(‘test8’);

创建第一次增量备份:

shell > innobackupex --user=backup --password=123456 --socket=/tmp/mysql.sock --defaults-file=/tmp/my.cnf --incremental /data/backup/hotbackup/incremental_one --incremental-basedir=/data/backup/hotbackup/base --no-timestamp --parallel=2

继续插入test表数据:

mysql > insert into test(name) values(‘test9’);

mysql > insert into test(name) values(‘test10’);

创建第二次增量备份:

shell > innobackupex --user=backup --password=123456 --socket=/tmp/mysql.sock --defaults-file=/tmp/my.cnf --incremental /data/backup/hotbackup/incremental_two --incremental-basedir=/data/backup/hotbackup/incremental_one --no-tiemstamp --parallel=2

9)、增量备份恢复

大体分为三个步骤:

A:恢复完备(需要使用--redo-only参数)

shell > innobackupex --apply-log --redo-only --use-memory=20G /data/backup/hotbackup/base

B:恢复增量备份到基础备份的还原上(最后一次增量备份恢复外,其他增量备份恢复要加--redo-only参数,此参数表示仅仅只应用xtrabackup日志中已提交的事务,不回滚日志中未提交的事务)

shell > innobackupex --apply-log --redo-only --use-memory=20G /data/backup/hotbackup/base --incremental-dir=/data/backup/hotbackup/incremental_one

shell > innobackupex --apply-log --use-memory=20G /data/backup/hotbackup/base --incremental-dir=/data/backup/hotbackup/incremental_two

C:对整体的基础备份进行恢复,回滚哪些未提交的数据,前面两个步骤中未提交的事务在这个步骤中才进行回滚

shell > innobackupex --apply-log --use-memory=20G /data/backup/hotbackup/base

D:把恢复完的备份复制到mysql的数据文件目录中,更改目录权限,然后启动mysql

shell > mysqladmin -s /tmp/mysql.sock shut

shell > mv /data/mysql/data/ /data/mysql/data.bak

shell > mkdir /data/mysql/data

shell > innobackupex --defaults-file=/tmp/my.cnf --copy-back --rsync /data/backup/hotbackup/base  #建议使用这个命令复制文件到数据目录下,因为原始的恢复目录中的xtrabackup_logfile可能很大,这个命令拷贝的没有这个文件

shell > chown -R mysql.mysql /data/mysql/data

shell > service mysqld start

E:查看数据

10)、不完全恢复

前面介绍了使用mysqlbinlog命令提取二进制信息进行不完全恢复,这个方法对innobackup热备的不完全恢复也适用

如:在14:00的时候误删除了数据,就可以进行基于位置和基于时间点一起来进行恢复

A:首先找到最近一次的完备,查看完备目录中的xtrabackup_binlog_info文件中的备份结束时刻的binlog的日志名称和position,并查看当前数据库的binlog文件名和position(show master logs;),注意,如果两个二进制日志文件不是同一个,那么这个跨度范围内的日志后边恢复的时候都要用到。

B:使用全备恢复数据库,之后再从热备(完备)结束时刻的binlog开始,恢复到误操作时刻之前的binlog(直接使用mysqlbinlog命令提取当前正在使用的二进制日志文件中的信息,这里假设完备结束的位置是100,结束时间是):

shell > mysqlbinlog --start-position=100 --stop-datetime=’2015-05-26 13:59:59’ /data/mysql/data/mysql-bin.000001 /data/mysql/data/mysql-bin.000002 |mysql -uroot -p’xxx’

C:跳过故障点时间:

shell > mysqlbinlog --start-datetime=’2015-05-26 14:01:00’ /data/mysql/data/mysql-bin.000001 /data/mysql/data/mysql-bin.000002 |mysql -uroot -p’xxx’

11)、克隆slave库

把现有的主从架构中的从库克隆一个出来,新增一个从库,克隆slave时,常用的参数是--slave-info和--safe-slave-backup

--slave-info:将master的binlog的文件名和position保存到xtrabackup_slave_info文件中。

--safe-slave-backup:会暂停slave的SQL线程,直到没有打开的临时表的时候开始备份,待备份结束后SQL线程自动启动,这样操作的目的主要是确保一致性的复制状态。

示例:

原master:192.168.1.1

原slave:192.168.1.2

新slave:192.168.1.3

A:在原slave上进行备份:(备份前先创建用户密码,创建备份目录)

shell > innobackupex --user=backup --password=123456 --socket=/tmp/mysql.sock --defaults-file=/tmp/my.cnf --slave-info --safe-slave-backup /data/backup/hotbackup/cloneslave --no-timestamp --parallel=2

B:在原slave的主机上对备份的目录进行applog:

shell > innobackupex --apply-log --redo-only --use-memory=20G /data/backup/hotbackup/cloneslave

C:将还原后的文件复制到新从库上:

shell > rsync -avprP -e ssh /data/backup/hotbackup/cloneslave newslave:/data/mysql/data

D:在原master上对新slave的同步数据帐号进行授权,当然也可以使用与原slave相同的帐号,不过为了区分,最好采用不同的同步帐号。

E:在新slave上复制原slave的my.cnf文件,并修改server-id参数,修改完毕后,启动新slave

shell > scp salve:/usr/local/services/mysql/my.cnf /usr/local/services/mysql/my.cnf

修改server-id

F:查找原slave备份后生成的xtrabackup_salve_info文件,提取其中的master_log_file和master_log_pos信息,然后在新slave上进行change maser to操作。

mysql > change master to MASTER_HOST=’master_ip’,MASTER_USER=’xx’,MASTER_PASSWORD=’123456’,MASTER_LOG_FILE=’xxx.xxx’,MASTER_LOG_POS=1000;

G:启动从库:

mysql > start slave;

12)、如果已有的主从架构中,从库损坏或者需要更换从库,那么可以使用xtrabackup在线重做主从:

主库:192.168.100.77

从库:192.168.100.76

xtrabackup部署mysql主从

A:首先在主从库上都安装xtrabackup

B:主库机器要做的事情

a、添加防火墙规则

shell > iptables -I INPUT -p tcp -s 192.168.100.76  --dport=3306 -j ACCEPT

shell > /etc/init.d/iptables save

b、添加mysql用户用于复制binlog

shell > /usr/local/mysql/bin/mysql -uroot -p -S /data/mysql-3306/mysql.sock

mysql > select host,user,password from mysql.user;

mysql > grant replication slave on *.* to [email protected]‘192.168.100.76‘ identified by ‘123456‘;

mysql > flush privileges;

主和从的my.cnf中的server-id要不相同,主启动二进制日志记录。

用命令备份mysql的datadir下的所有文件

shell > innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123456 --port=3306 /data/backup/dbbackup/

将备份文件夹scp传输到从库机器上,备份出来后是整个文件夹,如2015-04-25_16-14-21

shell > rsync -avprP -e ssh /data/backup/dbbackup/2015-04-25_16-14-21 192.168.100.76:/data/backup/dbbackup  #确保/data/backup/dbbackup目录在从库上存在

c、从库上用命令先把事务日志恢复(--apply-log),然后再复制到从库的datadir(--copy-back)

shell > innobackupex --defaults-file=/usr/local/mysql-slave/my.cnf --user=root --password=123456 --port=3307 --apply-log /data/backup/dbbackup/2015-04-25_16-14-21/

shell > innobackupex --defaults-file=/usr/local/mysql-slave/my.cnf --user=root --password=123456 --port=3307 --copy-back --rsync /data/backup/dbbackup/2015-04-25_16-14-21/

注意:

(1)datadir文件夹不存在时会报错

Warning: option ‘innodb_autoextend_increment‘: unsigned value 33554432 adjusted to 1000

Original data directory does not exist! at /usr/bin/innobackupex line 546.

(2)一定要把从库原来datadir下的所有文件删除掉再进行上面第二条命令的复制(--copy-back),不然会报错

d、删除datadir下的事务日志log文件(innodb引擎才会有)

shell > cd /data/mysql-slave/data

shell > rm -rf ib_logfile*

e、设置权限,启动从库mysql

shell > chown -R mysqlslave:mysqlslave /data/mysql-slave/data

shell > /usr/local/mysql-slave/start_mysql.sh

查看备份时的binlog-file

shell >  cat /data/backup/dbbackup/2015-04-27_17-28-16/xtrabackup_binlog_info

mysql-bin.000003        170301293

f、再change master to就可以了

shell > /usr/local/mysql-slave/bin/mysql -uroot -p -S /data/mysql-slave/mysql.sock

mysql > change master to master_host=‘192.168.100.77‘,master_user=‘backup‘,master_password=‘123456‘,master_log_file=‘mysql-bin.000003‘,master_log_pos=170301293;

mysql > start slave;

mysql > show slave status\G

时间: 2024-10-15 10:37:14

mysql之使用xtrabackup进行物理备份、恢复、在线克隆从库、在线重做主从的相关文章

利用XtraBackup实现MySQL物理备份恢复

Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具.特点: (1)备份过程快速.可靠: (2)备份过程不会打断正在执行的事务: (3)能够基于压缩等功能节约磁盘空间和流量: (4)自动实现备份检验: (5)还原速度快: Xtrabackup中主要包含两个工具: xtrabackup:是用于热备份innodb, xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构: in

专职DBA-Xtrabackup物理备份恢复

专职DBA-Xtrabackup物理备份恢复 Xtrabackup是Percona公司专门针对MySQL数据库开发的一款开源免费的物理热备工具. 可以对InnoDB和XtraDB事物引擎的数据库实现非阻塞(即不锁表)方式备份. 可以对MyISAM非事物引擎实现锁表方式备份. 1.Xtrabackup的主要特点: 直接复制物理文件,备份恢复数据速度快,安全可靠. 备份期间执行的事物不会间断,备份InnoDB数据不会影响业务. 备份期间不会增加太多数据库的性能压力. 支持对备份的数据进行自动校验.

mysql二进制日志详解及备份恢复、基于mysqldump及lvmsnapshot做备份恢复详解

二进制日志: 时间点恢复 复制 20140411 回顾: 日志文件:6类 一般查询日志:log, general_log, log_output 慢查询日志: 错误日志 二进制日志 中继日志 事务日志 二进制日志:"修改" position:位置 time: 时间 滚动: 1.大小 2.时间 二进制日志的功用: 即时点恢复: 复制: mysql> SHOW MASTER STATUS; mysql> FLUSH LOGS; mysql> SHOW BINARY LOG

mysql学习之旅-数据迁移-备份-恢复

1.数据迁移 将/tmp/t3.txt中的数据导入到t3表中,数据以逗号为分割符 load data infile ‘/tmp/t3.txt’ into table t3 fields terminated by ','; 将table2表中的数据导出为文件data.txt,以逗号为分隔符 SELECT * INTO OUTFILE 'data.txt' ->     FIELDS TERMINATED BY ',' ->     FROM table2; #####在mysql命令行内执行

mysql数据库使用xtrabackup工具 实现备份和还原

下载xtrabackup工具包 percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm 工具包可以从官网下载https://www.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm 安装xtrabackup工具包(需要启用epel源

Xtrabackup之innobackupex备份恢复详解(转)

原文:http://ourlinux.blog.51cto.com/274624/844854 安装配置Xtrabackup先看看如何安装Xtrabackup,最简单的安装方式是使用RPM包,不过想使用源代码方式安装的话,其安装方式有点古怪,因为它采用的在MySQL源代码上打补丁构建的方式安装的.这里使用二进制包的安装方式,相对比较灵活.Shell> mkdir /usr/local/xtrabackupShell> tar -zxvf xtrabackup-1.6.tar.gz –C /us

MySQL生产库之Xtrabackup物理备份

在生产环境中,我们一般采取mysqldump全库备份,但这对于大型数据库是不可用的,因为mysqldump是逻辑备份,备份和恢复的效率缓慢,根据个人经验给出一个临界值的话,500G以下的数据库可以用mysqldump来进行全库备份,500G以上的数据库则需要物理全库备份,甚至是增量备份.Xtrabackup是物理备份,其备份速度也因其物理特性远超逻辑备份的速度,而且Xtrabackup就是为了逻辑备份而生的,接下来演示一下Xtrabackup是如何完成对数据库的全备和增备的. 一:首先我们安装x

Mysql 备份恢复与 xtrabackup备份

1.1 备份的原因 备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低.衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(RTO),前者重点关注能恢复到什么程度,而后者则重点关注恢复需要多长时间. 1.1.1 备份的目录 做灾难恢复:对损坏的数据进行恢复和还原 需求改变:因需求改变而需要把数据还原到改变以前 测试:测试新功能是否可用 1.1.2 备份中需要考虑的问题 可以容忍丢失多长时间的数据: 恢复

innobackupex xtrabackup 备份恢复mysql数据

复制地址:https://www.linuxyw.com/download/xtrabackup.pdf http://www.linuxyw.com Email:[email protected] xtrabackup 对 MySQL 数据库的备份及恢复 此文档,只是简单地研究了下,用于数据库全备和增备,效果不错 因为目前对此软件未有需求,所以,文档并不完善,等有时间了,再进行完善吧 此文档资料,互联网收集而成 本人博客: http://www.linuxyw.com xtrabackup x