如何采用percona的xtrabackup 进行数据备份和恢复?!

摘要:

如何使用percona提供的xtrabackup 工具来做数据备份和恢复。

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。Xtrabackup有两个主要的工具:xtrabackup、innobackupex。innobackupex是参考了InnoDBHotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。

常用的MySQl备份工具解说

MySQLbackup物理备份缺点
1.跨平台性差
2. 备份时间长、冗余备份、浪费存储空间


MySQldump备份缺点
1. 效率较低、备份和还原速度慢、锁表
2. 备份过程中,数据插入和更新操作被阻塞。

 

XtraBackup工具
1. 支持在线热备
2. 备份过程中不锁表,适合生产环境
3. 组建持续更新,由专业组织Percona提供(改进MySQL分支)

主要含两个组件
xtrabackup:  c程序,支持InnoDB/XtraDB
innobackupex:  以Perl脚本封装xtrabackup,还支持MyISAM

 

注意:

另,mysqldump为MySQL server自带工具,无需额外提供费用,但mysqlbackup是企业版工具,需交软件许可费用,才可下载使用;Xtrabackup是由percona开发的一个开源软件是innodb热备工具ibbackup(收费的商业软件)的一个开源替代品,随便使用。

 

那这个Xtrabackup是什么东东?

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

Xtrabackup有两个主要的工具:xtrabackup、innobackupex

1、xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表

2、 innobackupex是参考了InnoDBHotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。

 

xtrabackup工具用于备份innodb和 xtraDB引擎的表;

innobackupex工具用于备份myisam和innodb引擎的表

 

本文将介绍如何用innobackupex工具做全量和增量备份。

 

xtrabackup innobackupex分3个阶段:

备份backup – 预恢复prepare  -- 恢复restore

tips:复制innodb表文件时可能包含不完整事务,需要prepare将其变为consistent

 

原理介绍:

首先复制所有的Innodb数据文件,这样复制出来的文件肯定是不一致的,然后对每个文件进行崩溃恢复处理,最终达到一致.

XtraBackup在启动的时候会记录一个LSN(log sequence number),然后就把所有的Innodb数据文件复制出来,这样复制出来的数据文件是不一致的,但是XtraBackup会在后台运行一个进程把所有对redo log file的修改记录下来;

以上的操作是由xtrabackup二进制程序(比如xtrabackup_55)完成的,如果使用innobackupex 脚本,刚才的步骤完成以后,innobackupex就会去备份MyISAM表和.frm文件,这时要保证数据的一致性就会先锁表了,通过FLUSH TABLES WITH READ LOCK命令锁表然后把文件复制出来,再释放掉这个锁。

在恢复数据的时候,要经过prepare(recovery)和restore两个步骤。在prepare结束以后,Innodb的表恢复到了复制Innodb文件结束的时间点,这个时间点也就是锁表复制MyISAM表的起点,所以最终数据是一致的。一般我们在恢复的时候执行两次prepare,是因为第二次prepare会帮助我们生成redo log文件,从而加快MySQL数据库启动的速度。

xtrabackup 恢复步骤介绍

数据完全恢复步骤

  1. 停止数据库服务
  2. 清空数据库目录
  3. 准备恢复数据
  4. 拷贝备份数据到数据库目录下
  5. 修改目录的所有者/组用户为mysql
  6. 启动服务
  7. 管理员登录查看数据

 

  1. 命令格式 innobackupex <选项>
  2. innobackupex命令

常用选项 含义

--host 主机名

--user 用户名

--port 端口号

--password 密码

--databases 数据库名

--no-timestamp 不用日期命名备份文件存储的子目录名

--databases=”库名” //1个库

--databases=”库1 库2” //多个库

--databases=”库1.表” //1张表

 

常用选项 含义

--redo-only 日志合并

--apply-log 准备恢复数据

--copy-back 拷贝数据

--incremental 目录名 增量备份

--incremental-basedir=目录名 增量备份时,指定上一次备份数据存储的目录名 --incremental-dir=目录名 准备恢复数据时,指定增量备份数据存储的目录名

--export 导出表信息

import 导入表空间

 

恢复单张表的所有数据步骤:

  1. 删除表空间文件
  2. 在备份文件里,导出表信息
  3. 把导出表信息文件拷贝到数据库目录下
  4. 导入表信息
  5. 删除表信息文件
  6. 查看表记录

相关命令

mysql>alter table 库名.表名 discard tablespace; //删除表空间

#innobackupex --apply-log --export 数据完全备份目录 //导出表信息

#cp 数据完全备份目录/数据库名目录/表名{ibd,cfg,exp} 数据库目录/库名目录 //拷贝表信息文件

#chown mysql:mysql 数据库目录/库名 //修改所有者/组

mysql>alter tables 库名.表名 import tablespace; //导入表空间

mysql>select * from 库名.表名 //查看表记录 ]

# rm -rf 数据库目录/库名/表名.{cfg,exp} //删除表信息文件

 

增量备份与恢复

  1. 增量备份:备份上次备份后,所有新产生的数据
  2. 首次备份:备份所有数据
  3. 增量恢复
  4. 停止服务
  5. 清空数据库目录
  6. 准备恢复数据
  7. 合并数据
  8. 拷贝数据到数据库目录下
  9. 修改数据库目录的所有者和组用户为mysql
  10. 启动服务
  11. 查看数据

#systemctl stop mysqld

#rm -rf /var/lib/mysql/*

#innobackupex --apply-log --redo-only /fullbak //完全恢复 #innobackupex --apply-log --redo-only /fullbak --incremental-dir=/newdir //恢复增量

#innobackupex --copy-back /fullbak //拷贝文件

#chown -R mysql:mysql /var/lib/mysql

#systemctl start mysqld

 

实操步骤演示:

1、首先检查源库和目标库库上是否有创建备份账号,没有需新建

create user 'bkadmin'@'localhost' identified by 'xxxxxx';

grant reload,lock tables,replication client,process on *.* to 'bkadmin'@'localhost';

 

flush privileges;

 

 

2、 原库上使用xtrabackup备份

备份backup 

$ innobackupex --defaults-file=/etc/my.cnf --host=*.*.*.100 --user=bkadmin --password=xxxxxx --port=3306 --socket=/app/gzyd/data/mysql/tmp/mysql.sock --no-timestamp mysqlbackup/BACKUP-DIR/

--将数据库备份放在BACKUP-DIR目录,默认新建一个子目录,--no-timestamp会跳过此功能;

 

3、新库上恢复

1)导入数据前记录binlog文件及同步位置(master_log_pos和master_log_file)

# 库上执行

mysql> flush table with read lock;

mysql> show master status;

注:记得记录下master状态信息,后面执行复制的时候要用到。

mysql> unlock table;

 

4、全量恢复

分别在原库100上使用xtrabackup做全量恢复

  1. 目标库上操作

– 预恢复prepare 

$ innobackupex --defaults-file=/etc/my.cnf  --use-memory=2G --apply-log  mysqlbackup/BACKUP-DIR/

--此阶段结束后,可以被程序访问使用;可使用—use-memory选项指定所用内存以加快进度,默认100M

$ mysqladmin  --login-path=myconn shutdown immediate

-- 冷备份新库原来的数据

mv data/mysql/data data/mysql/data-bak20201010

mkdir data/mysql/data

 

-- 恢复restore

innobackupex --defaults-file=/etc/my.cnf  --copy-back mysqlbackup/BACKUP-DIR/

--从my.cnf读取datadir/innodb_data_home_dir/innodb_data_file_path等变量;

先复制MyISAM表,然后是innodb表,最后为logfile;--data-dir目录必须为空 

 

接下来再说说如何进行增备

增量备份

首先做一次全备,每个备份目录都保有xtrabackup-checkpoints文件,内容如下

backup_type = full-backuped

from_lsn = 0

to_lsn = 1300001

增量备份以to_lsn为起点

$ innobackupex --incremental /data/backups --incremental-basedir=BASEDIR

其xtrabackup-checkpoints文件内容如下

backup_type = incremental

from_lsn = 1300001

to_lsn = 1458451

可再此基础上继续增量备份

增量备份的prepare有点复杂,如果对base backup执行事务一致性恢复,则其不能再用于增量备份恢复,为此须指定—redo-only选项;

innobackupex --apply-log --redo-only BASE-DIR

innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

当合并完所有的增量备份后,开始回滚所有未提交的事务

innobackupex --apply-log BASE-DIR

 

恢复单表

Oracle rman提供了restore datafile,针对坏块也有blockrecover,即尽可能的避免全库恢复;

Innobackx也提供了类似功能,允许恢复单个表空间;

 

对备份执行prepare

$ innobackupex --apply-log --export /path/to/backup

--export让innodb采用slow shutdown(full purge + change buffer merge),以保证表空间处于一致性并被import;

针对每个表,其文件列表如下

/data/backups/mysql/test/export_test.exp

/data/backups/mysql/test/export_test.ibd

/data/backups/mysql/test/export_test.cfg--innodb数据字典的dump,5.6起不是必需;

 

恢复单表

mysql> CREATE TABLE mytable (...) ENGINE=InnoDB; --创建相同结构的表

mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

将.ibd/.exp/.cfg复制到数据目录

mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

 

 

基于时间点的恢复

每个备份目录都有一个xtrabackup_binlog_info,记录备份binlog时数据库当前位置,这也是数据库一致性恢复的终点;

$ cat /path/to/backup/xtrabackup_binlog_info

mysql-bin.000003      57

 

$ innobackupex --copy-back /path/to/backup

待恢复完成后,便可通过mysqlbinlog执行时间点恢复

$ mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 \

--start-position=57 --stop-datetime="11-12-25 01:00:00" | mysql -u root –p

 

 

在slave执行备份

须留意以下两个参数

--slave-info

This option is useful when backing up a replication slave server. It prints the binary log position and name of the master server. It also writes this information to the xtrabackup_slave_info file as a CHANGE MASTER command. A new slave for this master can be set up by starting a slave server on this backup and issuing a CHANGE MASTER command with the binary log position saved in the xtrabackup_slave_info file.

 

--safe-slave-backup

Stop slave SQL thread and wait to start backup until Slave_open_temp_tables in SHOW STATUS is zero. If there are no open temporary tables, the backup will take place, otherwise the SQL thread will be started and stopped until there are no open temporary tables. The backup will fail if Slave_open_temp_tables does not become zero after --safe-slave-backup-timeout seconds. The slave SQL thread will be restarted when the backup finishes.

 

【参考】

https://www.cnblogs.com/zengkefu/p/5693837.html

【参考】

http://blog.itpub.net/29654823/viewspace-2140003/

 

欢迎关注个人微信公众号“一森咖记”

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值