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 > 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 backup@'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
mysql之使用xtrabackup进行物理备份、恢复、在线克隆从库、在线重做主从的更多相关文章
- mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)
一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...
- xtrabackup进行物理备份、恢复、在线克隆从库、在线重做主从
http://www.lai18.com/content/4733997.html 注:图片来自<深入浅出MySQL 数据库开发 优化与管理维护 第2版> 物理备份和恢复 1.冷备份:停掉 ...
- 【MySQL】全量+增量的备份/恢复
生产环境中,有时需要做MySQL的备份和恢复工作.因MySQL是在运行过程中的,做全量备份需要时间,全量备份完成后又有数据变动,此时需要增量备份辅助.如果想恢复数据到一个空库(例如数据迁移或者上云等更 ...
- mysql物理备份恢复 xtrabackup 初试
听闻xtrabackup开源且强大 2018-03-06 11:54:41 在官网下载安装了最新的2.4.9版本 网上文章都用的innobackupex,但是最新版已经抛弃了,自己看看手册<Pe ...
- Xtrabackup之innobackupex备份恢复详解(转)
add by zhj:对于Xtrabackup2.2来说,已经解决了本文结尾提到的那个bug,当使用--copy-back时,同时加--force-non-empty-directories 即可.这 ...
- Mysql数据库常用的命令 数据备份 恢复 远程
远程数据库 格式: mysql -h主机地址 -u用户名 -p用户密码数据库 mysql -h 42.51.150.68 -u yang -p discuz mysql设置密码 mysql>us ...
- Window环境下配置MySQL 5.6的主从复制、备份恢复
1.环境准备 Windows 7 64位 MySQL 5.6 主库:192.168.103.207 从库:192.168.103.208 navicat无法连接MySQL8解决方案 #修改加密规则 A ...
- 阿里云RDS物理备份恢复到本地
一:业务场景 验证阿里云备份文件可用性 二:恢复到本地过程中遇到的问题 1.修改密码报错 2.自定义函数不可用 三:恢复步骤 1.xtrabackup安装使用 请参考:https://www.cnbl ...
- kingbaseES V8R6集群备份恢复案例之---备库作为repo主机执行物理备份
案例说明: 此案例是在KingbaseES V8R6集群环境下,当主库磁盘空间不足时,执行sys_rman备份,将集群的备库节点作为repo主机,执行备份,并将备份存储在备库的磁盘空间. 集群架构 ...
随机推荐
- 将 IDENTITY 转换为数据类型 int 时出现算术溢出错误。
IDENTITY标识列为int类型,取值范围为-2^32到2^31-1.当增长值超过这个最大值时,我在SQL Server 2008 R2 x64上试验的结果是: 将 IDENTITY 转换为数据类型 ...
- 使用Universal USB Installer安装Ubuntu
1.下载Universal USB Installer 下载地址: 2.下载ubuntu 14 desktop.iso 运行Universal USB Installer,找到电脑上 ubuntu 1 ...
- Codeforce Round #224 Div2
一下子没打,这比赛,就被虐成狗!
- javaIO整理
写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...
- bzoj4152 [AMPPZ2014]The Captain
最短路,先将x排序,然后把排序后权值相邻的点连边,再把y排序,也把权值相邻的点连边,求一遍1到n的最短路就好啦. 代码 #include<cstdio> #include<queue ...
- Facebook开源项目:我们为什么要用Fresco框架?
(Facebook开源项目)Fresco:一个新的Android图像处理类库 在Facebook的Android客户端上快速高效的显示图片是非常重要的.然而多年来,我们遇到了很多如何高效存储图片的问题 ...
- paper 38 :entropy
图像熵计算 真是为了一个简单的基础概念弄的心力交瘁,请教了一下师姐,但是并没有真的理解,师弟我太笨呀~~所以,我又查熵的中文含义和相关的出处!共勉吧~~ 1.信息熵: 利用信息论中信息熵概念,求出任意 ...
- js 获取select 中option 的个数
//document.writeln(document.getElementById("sel").options.length); //document.writeln(docu ...
- nginx指定配制文件
nginx启动: 未指定配制文件: ./nginx 指定配制文件: /usr/local/nginx/sbin/nginx -c /home/deploy/nginx-wz/conf/nginx.co ...
- 夺命雷公狗—angularjs—12—get参数的接收
我们在实际的开发中get和post的交互都是离不开的,我们先来研究下get参数是如何接收到的.. 而且在实际开发中利用json来进行传递参数也是比较多的,这里我们就以get来接收参数为列.. 先创建一 ...