Xtrabackup对mysql全备以及增量备份实施

1.完全备份与恢复

本文使用的是centos5.8 64位系统,mysql 使用5.5.35.

如果要使用一个最小权限的用户进行备份,可基于以下:

mysql> createuser 'bkuser'@'localhost' identified by 'redhat';

mysql> grant reload,lock tables,replication client on *.* to 'bkuser'@'localhost';

mysql> flushprivileges;

[root@client1 py]#mkdir/innobackup

[root@client1 py]#yum install perl-DBD-MySQL -y

[root@client1 py]# wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.7/RPM/rhel6/x86_64/percona-xtrabackup-2.1.7-721.rhel6.x86_64.rpm

[root@client1 py]# rpm -ivh percona-xtrabackup-2.1.7-721.rhel5.x86_64.rpm

[root@client1 py]#innobackupex --user=root --password='wisdom' /innobackup/

最后提示:

14021902:17:17  innobackupex: Connection todatabase server closed

14021902:17:17  innobackupex: completed OK!

说明备份成功了。

在/inobackup 目录里会发现有2014-02-19_02-17-10 (这是在做备份时的时间点)目录。在这个目录里会多出几个文件:

(1) xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息。每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

[root@client12014-02-19_02-17-10]# cat xtrabackup_checkpoints

backup_type =full-backuped #备份类型为全备

from_lsn = 0     #lsn起始点为0

to_lsn = 1685925  #lsn结束点为1685925

last_lsn = 1685925

compact = 0  #没有压缩

(2)xtrabackup_binlog_info :mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

[root@client12014-02-19_02-17-10]# cat xtrabackup_binlog_info

mysql-bin.000003      548717

mysql> showmaster status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB |Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000003|   548717 |              |                  |

+------------------+----------+--------------+------------------+

可以看到position 和file 都是符合的。

(3)xtrabackup_logfile:xtrabackup备份时的日志

[root@client12014-02-19_02-17-10]# file xtrabackup_logfile

xtrabackup_logfile:data

所以不能用cat 命令来读取,只能是xtrabackup程序来读取。

(4) )xtrabackup_binary:备份中用到的xtrabackup的可执行文件;

cat xtrabackup_binary

xtrabackup_55

[root@client12014-02-19_02-44-34]# rpm -ql percona-xtrabackup

/usr/bin/innobackupex

/usr/bin/innobackupex-1.5.1

/usr/bin/xbcrypt

/usr/bin/xbstream

/usr/bin/xtrabackup

/usr/bin/xtrabackup_55

/usr/bin/xtrabackup_56

/usr/share/doc/percona-xtrabackup-2.1.7

/usr/share/doc/percona-xtrabackup-2.1.7/COPYING

我们的mysql是5.5版本的,所以使用的xtrabackup_55可执行文件

(5)backup-my.cnf:备份命令用到的配置选项信息;

[root@client12014-02-19_02-17-10]# cat backup-my.cnf

[mysqld]

innodb_data_file_path=ibdata1:10M:autoextend

innodb_log_files_in_group=2

innodb_log_file_size=5242880

innodb_fast_checksum=0

innodb_page_size=16384

innodb_log_block_size=512

这是my.cnf 中 mysqld里面的选项。

模拟故障,进行恢复。

[root@client1innobackup]# /etc/init.d/mysqld stop

Shutting downMySQL..[确定]

[root@client1innobackup]# cd /data/mydata/

首先进行准备(prepare)一个完全备份,也就是预处理

[root@client1innobackup]#innobackupex --apply-log /innobackup/2014-02-19_02-17-10/

140219  2:40:24 InnoDB: Shutdown completed; log sequence number 1687564

14021902:40:24  innobackupex: completed OK!

出现类似上面的情况准备完成。

接着,从完全备份中进行恢复

[root@client1innobackup]#innobackupex --copy-back /innobackup/2014-02-19_02-17-10/

innobackupex:Finished copying back files.

14021902:40:58  innobackupex: completed OK!

说明成功。

[root@client1mydata]# ll

总计 28812

drwxr-xr-x 2 root root     4096 02-19 02:40 hellodb

-rw-r--r-- 1 root root 18874368 02-19 02:40 ibdata1

-rw-r--r-- 1 root root  5242880 02-19 02:40 ib_logfile0

-rw-r--r-- 1 root root  5242880 02-19 02:40 ib_logfile1

drwxr-xr-x 2 root root     4096 02-19 02:40 mydb

drwxr-xr-x 2 root root     4096 02-19 02:40 mysql

drwxr-xr-x 2 root root     4096 02-19 02:40performance_schema

drwxr-xr-x 2 root root     4096 02-19 02:40 rm_dbxt

drwxr-xr-x 2 root root     4096 02-19 02:40 rm_db1

drwxr-xr-x 2 root root     4096 02-19 02:40 rm_db2

drwxr-xr-x 2 root root     4096 02-19 02:40 test

drwxr-xr-x 2 root root     4096 02-19 02:40 test1

-rw-r--r-- 1 root root       37 02-19 02:40xtrabackup_binlog_pos_innodb

这都是root的属性的。需要修改成mysql的。

[root@client1 mydata]# chown  mysql.mysql -R *

启动mysql

[root@client1 mydata]# /etc/init.d/mysqld start

StartingMySQL....[确定]

[root@client1mydata]# mysql -uroot –p

mysql> showdatabases;

+--------------------+

| Database           |

+--------------------+

| information_schema|

| hellodb            |

| mydb               |

| mysql              |

|performance_schema |

| rm_db              |

| rm_db1             |

| rm_db2             |

| test               |

| test1              |

+--------------------+

都已经恢复成功了。

2.增量备份与恢复

增量备份,是依据上一次备份的,也就是备份上一次备份后,所有发生变化的数据。

首先进行一次完全备份:

[root@client1 mydata]# innobackupex--user=root --password='wisdom’ /innobackup/

备份成功后,进行数据修改,与上一次备份发生变化。

[root@client1innobackup]# mysql -uroot –p

mysql> usermdb;

mysql> createtable test(id tinyint unsigned auto_increment primary key,name varchar(10));

mysql>insertinto test values (1,’zhang san’);

mysql>insertinto test values(2,’li si’);

mysql> select *from test;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | zhang san |

|  2 | li si    |

+----+-----------+

[root@client1 mydata]#innobackupex --user=root --password=’wisdom’--incremental/innobackup/ --incremental-basedir=/innobackup/2014-02-19_02-44-34/

其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/innobackup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。

继续对mysql进行操作,修改数据。

[root@client12014-02-19_02-54-24]# mysql -uroot –p

mysql> select *from test;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | zhang san |

|  2 | li si    |

+----+-----------+

mysql> deletefrom test where id=2;

mysql> insertinto test values(3,'wang wu');

[root@client1 mydata]#innobackupex --user=root --password='wisdom' --incremental /innobackup/ --incremental-basedir=/innobackup/2014-02-19_02-54-24/

[root@client1innobackup]# ls

2014-02-19_02-17-10  2014-02-19_02-44-34  2014-02-19_02-54-24  2014-02-19_02-57-09

连接数据库,继续修改数据

[root@client12014-02-19_02-57-09]# mysql -uroot -p

mysql> userm_db;

mysql> select *from test;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | zhang san |

|  3 | wang wu  |

mysql> deletefrom test where id=3;

Query OK, 1 rowaffected (0.00 sec)

mysql> select *from test;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | zhang san |

+----+-----------+

这时模拟发生故障,然后进行恢复,这时需要备份binlog文件,(如果你的binlog和数据文件在一起的话,需要备份出来),我的没有在同意目录下。现在对mysql数据文件进行删除。

[root@client1mydata]# cd /data/mydata

[root@client1mydata]# /etc/init.d/mysqld stop

Shutting downMySQL.[确定]

[root@client1mydata]# rm -rf *

同样先进行准备:

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

(2)基于所有的备份将未提交的事务进行“回滚”。

只进行redo操作。

[root@client1 mydata]# innobackupex--apply-log --redo-only /innobackup/2014-02-19_02-44-34/

[root@client1 mydata]# innobackupex--apply-log --redo-only /innobackup/2014-02-19_02-44-34/ --incremental-dir=/innobackup/2014-02-19_02-54-24/

[root@client1 mydata]# innobackupex--apply-log --redo-only /innobackup/2014-02-19_02-44-34/--incremental-dir=/innobackup/2014-02-19_02-57-09/

进行数据恢复:

#innobackupex--copy-back /innobackup/2014-02-19_02-44-34/

#cd /data/mydata

#chown mysql.mysql–R *

启动mysql

[root@client1mydata]# /etc/init.d/mysqld start

Starting MySQL...[确定]

[root@client1mydata]# mysql -uroot –p

mysql> userm_db;

Database changed

mysql> select *from test;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | zhang san |

|  3 | wang wu  |

+----+-----------+

这时看到了我们的数据中还有 id为3的数据,而我们在数据崩溃的时候,这条数据已经被删除了,所以我们还得应用binlog文件。

[root@client12014-02-19_02-57-09]# cat xtrabackup_binlog_info

mysql-bin.000004      979

[root@client1 mydata]# mysqlbinlog--start-position=979 /data/binlogs/mysql-bin.000004 > /tmp/all.sql

[root@client12014-02-19_02-44-34]# mysql -uroot –p

mysql> set sql_log_bin=0;

#这次恢复的过程中,不要往binlog中进行记录

mysql> source /tmp/all.sql

mysql> userm_db;

Database changed

mysql> select *from test;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | zhang san |

+----+-----------+

1 row in set (0.00sec)

mysql> set sql_log_bin=1;

这时,我们的数据已经完全进行了恢复。

总结:

总结:1.上面的操作,首先进行全备,然后修改数据,在rm_db中,创建了一个test表,并网表中插入2条数据1,’zhang san’;2,’li si’。接着进行增量备份,然后又操作数据库并删除一条数据 2,‘li si’;插入一条数据3,’wang wu’, 然后接着进行增量备份。最后连接数据库,删除一条数据 3,‘wang wu’,这时模拟数据库崩溃,数据文件损坏。

2.进行数据恢复,先进行准备工作,完成就是数据恢复,这时恢复到了做完增量备份后的时间点,然后是通过binlog来恢复到数据库崩溃时的时间点。

3.Xtrabackup的知识点

在innodb内部会维护redo日志文件,也就是事务日志文件。事务日志文件会存储每个innodb表数据的记录修改。

Xtrabackup在启动时会记住 log sequence number(LSN),并且复制所有的数据文件。复制过程中需要时间,所以这段时间内数据文件有改动,那么将会使数据库处于一个不同的时间点,这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。Xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来。

而在恢复准备(prepare)过程中,xtrabackup使用之前复制的事务日志,对各个数据文件执行灾难恢复(应用已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作)。当这个过程结束后,数据库就可以进行恢复还原了。

对于myisam表来说,在准备过程结束后,innodb表数据已经前滚到整个备份结束的点,这个时间点与执行flush tables with readlock的时间点是一致的,所以myisam表数据与innodb的表数据是同步的。对于增量备份而已,myisam表是没有增量备份的,每次xtrabackup的增量备份都是对myisam表的全备份,增量备份仅能应用于InnoDB或XtraDB表。

本人第一次写博客,如有错误欢迎指正。

转载于:https://blog.51cto.com/xiaoyuer3/1362861

Xtrabackup对mysql全备以及增量备份实施相关推荐

  1. XtraBackup全备与增量备份

    一.XtraBackup安装 下载地址:http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.8/source/ 安装步骤: ===== ...

  2. Linux随笔19-MySQL主从复制、Percona XtraBackup实现全量和增量备份、ProxySQL实现读写分离

    Contents 1. MySQL5.7实现主从复制 1.1 基础环境 1.2. 配置主从复制 1.2.1. master节点上的配置 1.2.2. slave节点上的配置 1.2.3. 中继日志问题 ...

  3. xtrabackup 实现mysql的全量备份与增量备份

    Percona XtraBackup是世界上唯一一款开源的免费MySQL热备份软件,可以为InnoDB和XtraDB数据库执行非阻塞备份. 使用Percona XtraBackup,可以获得以下好处: ...

  4. percona xtrabackupd定期做全备,增量备份shell脚本

    一:全备脚本 cat xtrabackup_full.sh #!/bin/bash local_ip="$(/sbin/ifconfig eth0|grep 'inet addr'|awk ...

  5. Linux 平台下 RMAN 全备 和 增量备份 shell 脚本

    一. 一些准备知识 Oracle 分归档和非归档模式. 这两者的区别就是对redo log的处理.归档模式下,当一个redo log 写满之后,就会把这个redo log里的内容写入归档文件,等写完之 ...

  6. mysql 如何做增量备份_mysql 做增量备份

    首先在这里我要感谢我的同事 @mamiya_c3 哥的指教...QQQ 最近数据库的数据猛然增多,以前的每天一个正备份的方式显然压力越来越大,对备份的数据传输考验也随之加大,所以考虑改成每周二服务器维 ...

  7. mysql 如何做增量备份_mysql实现增量备份

    有点要注意 如果你误删了表 想通过这个恢复 必须恢复日志里面有创建表的日志 不然的话是无法回复的 ?就是必须是从你开始创建表的时候就已经记录日志了? 恢复到哪个位置 就按照哪个位置来计算 mysql ...

  8. mysql冷备增量备份,MySQL备份与恢复之真实环境使用冷备(2)

    这篇文章主要介绍了MySQL备份与恢复之真实环境使用冷备,需要的朋友可以参考下 在上一篇文章(MySQL备份与恢复之冷备)中,我们提到了冷备.但是有个问题,我们存储的数据文件是保存在当前本地磁盘的,如 ...

  9. mysql 利用binlog增量备份,还原实例

    援引至以下链接. 1 blog.51yip.com/mysql/1042.html#more-1042 转载于:https://www.cnblogs.com/droko/archive/2011/1 ...

最新文章

  1. OVH公司进军英国数据中心市场
  2. 在C#程序设计中使用Win32 API
  3. java程序员面试中的5个杀手锏问题
  4. python函数可以作为容器对象吗_正确理解Python函数是第一类对象
  5. CTO:再写if-else,逮着罚款1000!
  6. 软件测试 学习之路 linux 基础命令 (三)
  7. Atitit 编程范式之道 attilax著 v2 u66.docx Atitit 编程范式之道 attilax著 著 1. 编程范式与编程语言的关系是什么? 2 2. 高效率的编程范式 2
  8. 《跟李沐读论文》之对比学习
  9. AMPL Matlab 自动求导(AD)求解雅克比、海森矩阵
  10. 设计一些自学软件的小测试demo吧。
  11. 推荐一款基于bootstrap的漂亮的前端模板—inspinia_admin
  12. java水电费收费系统_java水电费管理系统
  13. 嵊州D5T1 鸡翅 chicken
  14. js模仿QQ头像资料卡显示与隐藏
  15. 解决:Unknown column ‘id‘ in ‘where clause‘ 问题
  16. 一个简单的OPPO商城页面
  17. flutter type ‘int‘ is not a subtype of type ‘String?‘
  18. 网页版linux客户端,网页版微信将关闭,Linux开发者哭惨
  19. oracle中设置表的主键字段为自增序列(实例)
  20. html5网页流行色,Pantone 2018流行色:紫外光色(附紫色的UI设计作品)

热门文章

  1. Java项目:仿小米商城系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
  2. php扩展开发中文教程.pdf,PHP扩展开发系列教程-1
  3. 【硬件基础】振荡(时钟)周期、状态周期、机械周期、指令周期
  4. 数据结构之【栈】的基本操作C语言实现
  5. python中ttk和tkinter_Python tkinter与ttk日历
  6. php读取本地xlsx格式文件的数据并按json格式返回
  7. iOS 开发之 pdf 文档的加载与浏览的 4 种方式
  8. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义...
  9. linux 服务器FTP服务安装教程
  10. Uva 10074【递推dp】