基于binlog的增量备份

1.1 增量备份简介

增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件。这就意味着,第一次增量备份的对象是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增加和修改的文件,如此类推。这种备份方式最显著的优点就是:没有重复的备份数据,因此备份的数据量不大,备份所需的时间很短。但增量备份的数据恢复是比较麻烦的。您必须具有上一次全备份和所有增量备份磁带(一旦丢失或损坏其中的一个增量,就会造成恢复的失败),并且它们必须沿着从全备份到依次增量备份的时间顺序逐个反推恢复,因此这就极大地延长了恢复时间。

假如我们有一个数据库,有20G的数据,每天会增加10M的数据,数据库每天都要全量备份一次,这样的话服务器的压力比较大,因此我们只需要备份增加的这部分数据,这样减少服务器的负担。

    1.2 binlog简介

binlog日志由配置文件的log-bin选项负责启用,MySQL服务器将在数据根目录创建两个新文 件XXX-bin.001和xxx-bin.index,若配置选项没有给出文件名,Mysql将使用主机名称命名这两个文件,其中.index文件包含一份全体日志文件的清单。   Mysql会把用户对所有数据库的内容和结构的修改情况记入XXX-bin.n文件,而不会记录 SELECT和没有实际更新的UPDATE语句。
        当MySQL数据库停止或重启时,服务器会把日志文件记入下一个日志文件,Mysql会在重启时生成一个新的binlog日志文件,文件序号递增,此外,如果日志文件超过max_binlog_size系统变量配置的上限时,也会生成新的日志文件。

 

2 binlog日志操作

    2.1 开启binlog日志 

在my.cnf中增加

[sql] view plain copy

  1. [mysqld]
  2. log-bin=mysql-bin
  3. binlog_format=row

其中:log-bin若不显示指定存储目录,则默认存储在mysql的data目录下

binlog_format的几种格式:(STATEMENT,ROW和MIXED)

STATEMENT:基于SQL语句的复制(statement-based replication, SBR)
    ROW:基于行的复制(row-based replication, RBR)
    MIXED:混合模式复制(mixed-based replication, MBR)

启动后会产生mysql-bin.*这样的文件,每启动一次,就会增加一个或者多个。

[sql] view plain copy

  1. [[email protected] data]# ls -l| grep mysql-bin
  2. -rw-rw----. 1 mysql mysql       107 Jul  5 11:19 mysql-bin.000001
  3. -rw-rw----. 1 mysql mysql        19 Jul  5 11:19 mysql-bin.index
  4. [[email protected] data]#

查看binlog开启情况

[sql] view plain copy

  1. mysql> show variables like ‘log_bin%‘;
  2. +---------------------------------+-------+
  3. | Variable_name                   | Value |
  4. +---------------------------------+-------+
  5. | log_bin                         | ON    |
  6. | log_bin_trust_function_creators | OFF   |
  7. +---------------------------------+-------+
  8. mysql> show variables like ‘binlog%‘;
  9. +-----------------------------------------+-------+
  10. | Variable_name                           | Value |
  11. +-----------------------------------------+-------+
  12. | binlog_cache_size                       | 32768 |
  13. | binlog_direct_non_transactional_updates | OFF   |
  14. | binlog_format                           | ROW |
  15. | binlog_stmt_cache_size                  | 32768 |
  16. +-----------------------------------------+-------+

    2.2 查看binlog日志内容

[sql] view plain copy

  1. [[email protected] data]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 ;
  2. mysqlbinlog: unknown variable ‘default-character-set=utf8‘

这里我们碰到了mysqlbinlog的一个bug,解决方法有两个:

方法一:使用--no-defaults选项

[sql] view plain copy

  1. [[email protected] data]# mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000001

方法二:将my.cnf中[client]选项组中default-character-set=utf8选项临时屏蔽掉(该选项即时生效,不用重启数据库),使用完mysqlbinlog命令时在恢复。因为使用mysqlbinlog工具查看二进制日志时会重新读取的mysql的配置文件my.cnf(windows下是my.ini),而不是服务器已经加载进内存的配置文件。

输出格式如下:

[sql] view plain copy

  1. # at 188
  2. #140705 11:23:55 server id 1  end_log_pos 271   Query   thread_id=1 exec_time=0 error_code=0
  3. SET TIMESTAMP=1404573835/*!*/;
  4. create database test
  5. /*!*/;
  6. DELIMITER ;
  7. # End of log file
  8. ROLLBACK /* added by mysqlbinlog */;
  9. /*!50003 SET [email protected]_COMPLETION_TYPE*/;

包含以下要素:

Position:位于文件中的位置,即第一行的(#at 4)和第二行的(log_pos 4),说明该事件记录从文件第4字节开始。  
    Timestamp:事件发生的时间戳,即第二行的(#070813 14:16:36)
    Exec_time:事件的执行花费时间
    Error_code:错误码 
    Type 事件类型: 
    Master ID:创建二进制事件的主机服务器ID 
    Master Pos:事件在原始二进制文件中的位置 
    Flags:标志信息
    2.3 一些常用操作

[sql] view plain copy

  1. mysql> show master logs;  #查看数据库所有日志文件。
  2. mysql> show binlog events \g;  #查看当前使用的binlog文件信息。
  3. mysql> show binlog events in ‘mysql-bin.000016‘;  #查看指定的binlog文件信息。
  4. mysql> flush logs;  #将内存中log日志写磁盘,保存在当前binlog文件中,并产生一个新的binlog日志文件。
  5. mysql> flush logs; reset master;  #删除所有二进制日志,并重新(mysql-bin.000001)开始记录。

3 mysql备份实例分析(全备+基于binlog的增备)

实例采用小数据量进行模拟,包含一份全备及两份增备,主要演示下备份还原过程,工程中可根据数据实际情况进行备份还原策略调整。

    3.1 查看当前数据库binlog文件

通过mysql客户端查看

[sql] view plain copy

  1. mysql> show master logs;
  2. +------------------+-----------+
  3. | Log_name         | File_size |
  4. +------------------+-----------+
  5. | mysql-bin.000001 |       107 |
  6. +------------------+-----------+

通过linux命令行直接查看(mysql数据目录data)

[plain] view plain copy

  1. [[email protected] data]# ll -h
  2. total 5.1G
  3. -rw-rw---- 1 mysql mysql 1.0G Jul 23 13:29 ibdata1
  4. -rw-rw---- 1 mysql mysql 2.0G Jul 18 14:12 ibdata2
  5. -rw-rw---- 1 mysql mysql 1.0G Jul 23 13:29 ib_logfile0
  6. -rw-rw---- 1 mysql mysql 1.0G Jul 23 13:29 ib_logfile1
  7. drwxr-xr-x 2 mysql mysql 4.0K Jul 18 13:52 mysql
  8. -rw-rw---- 1 mysql mysql  107 Jul 23 13:29 mysql-bin.000001
  9. -rw-rw---- 1 mysql mysql   19 Jul 23 13:29 mysql-bin.index
  10. srwxrwxrwx 1 mysql mysql    0 Jul 18 14:14 mysql.sock
  11. drwx------ 2 mysql mysql 4.0K Jul 18 14:01 performance_schema
  12. -rw-rw---- 1 mysql mysql  483 Jul 23 13:29 R820-08.err
  13. -rw-rw---- 1 mysql mysql    5 Jul 18 14:14 R820-08.pid
  14. drwx------ 2 mysql mysql   19 Jul 22 23:15 test

目前只有一个binlog文件mysql-bin.000001。

    3.2 准备全量数据

[plain] view plain copy

  1. mysql> create database backup_full;
  2. mysql> create table full (c1 int(10), c2 varchar(20)) engine=innodb;
  3. mysql> insert into full values (1, ‘full1‘),(2, ‘full2‘),(3, ‘full3‘),(4, ‘full4‘),
  4. (5, ‘full5‘),(6, ‘full6‘),(7, ‘full7‘),(8, ‘full8‘),(9, ‘full9‘),(10, ‘full10‘);

    3.3 将全量数据进行备份

步骤如下:

a.备份前需要将数据库加读锁,防止数据在备份时写入。

[plain] view plain copy

  1. mysql> flush tables with read lock;

b.通过命令flush logs;将log日志刷盘,写入当前binlog(mysql-bin.000001),在生成一个新的binlog(mysql-bin.000002)为增备做准备。

[plain] view plain copy

  1. mysql> flush logs;

c.进行数据备份。在linux命令行下执行:

[plain] view plain copy

  1. mysqldump  -u用户名 -p密码 -hIP地址 -P端口 数据库名 > /tmp/backup_full.sql
  2. mysqldump  -uroot -pjesse -h127.0.0.1 -P3355 buckup_full > /tmp/backup_full.sql

d.解除表锁。

[sql] view plain copy

  1. mysql> unlock tables;

至此全量备份全部结束,将全量数据文件buckup_full.sql保存即可。数据库再有新的数据更新会记录在新的binlog(mysql-bin.000002)里面。
    3.4 准备第一份增量数据

[sql] view plain copy

  1. mysql> create database backup_increment;
  2. mysql> use backup_increment;
  3. mysql> create table increment (c1 int(10), c2 varchar(20)) engine=innodb;
  4. mysql> insert into increment values (11, ‘increment1‘),(12, ‘increment2‘),(13, ‘increment3‘),(14, ‘increment4‘),(15, ‘increment5‘);

    3.5 将第一份增量数据进行备份

步骤如下:

a.备份前需要将数据库加读锁,防止数据在备份时写入。

[sql] view plain copy

  1. mysql> flush tables with read lock;

b.通过命令flush logs;将log日志刷盘,写入当前binlog(mysql-bin.000002),在生成一个新的binlog(mysql-bin.000003)为下次增备做准备。

[sql] view plain copy

  1. mysql> flush logs;

c.将binlog第一个增备文件mysql-bin.000002直接复制保存即可。

也可以将二进制文件导出到文本文件保存,在Linux命令行下执行

[sql] view plain copy

  1. mysqlbinlog  mysql-bin.000002 > /tmp/increment1.txt

d.解除表锁。

[sql] view plain copy

  1. mysql> unlock tables;

至此第一个增量备份全部结束,将增量binlog文件mysql-bin.000002或者有binlog文件导出的文本文件/tmp/increment1.txt保存即可。数据库再有新的数据更新会记录在新的binlog(mysql-bin.000003)里面。
    3.6 准备第二份增量数据

[sql] view plain copy

  1. mysql> use backup_increment;
  2. mysql> insert into increment values (16, ‘increment16‘),(17, ‘increment17‘),(18, ‘increment18‘),(19, ‘increment19‘),(20, ‘increment20‘);

    3.7 将第二份增量数据进行备份

步骤如下:

a.备份前需要将数据库加读锁,防止数据在备份时写入。

[sql] view plain copy

  1. mysql> flush tables with read lock;

b.通过命令flush logs;将log日志刷盘,写入当前binlog(mysql-bin.000003),在生成一个新的binlog(mysql-bin.000004)为下次增备做准备。

[sql] view plain copy

  1. mysql> flush logs;

c.将binlog第一个增备文件mysql-bin.000003直接复制保存即可。

也可以将二进制文件导出到文本文件保存,在linux命令行下执行

[sql] view plain copy

  1. mysqlbinlog  mysql-bin.000003 > /tmp/increment2.txt

d.解除表锁。

[sql] view plain copy

  1. mysql> unlock tables;

至此第二个增量备份全部结束,将增量binlog文件mysql-bin.000003或者有binlog文件导出的文本文件/tmp/increment2.txt保存即可。数据库再有新的数据更新会记录在新的binlog(mysql-bin.000004)里面。

 

4 mysql还原实例分析(全备还原+基于binlog的增备还原)

模拟数据库故障,即删除全备数据及增备数据库。

[sql] view plain copy

  1. mysql> drop table backup_full.full;
  2. mysql> drop database backup_increment;

此时数据库数据被清空。

[sql] view plain copy

  1. mysql> show databases;
  2. +--------------------+
  3. | Database           |
  4. +--------------------+
  5. | information_schema |
  6. | backup_full        |
  7. | mysql              |
  8. | performance_schema |
  9. | test               |
  10. +--------------------+
  11. 5 rows in set (0.00 sec)
  12. mysql> select * from backup_full.full;
  13. ERROR 1146 (42S02): Table ‘backup_full.full‘ doesn‘t exist
  14. mysql> select * from backup_increment.increment;
  15. ERROR 1146 (42S02): Table ‘backup_increment.increment‘ doesn‘t exist

    4.1 还原全备数据

方法1:进入数据库,通过source

[sql] view plain copy

  1. mysql> use backup_full;
  2. mysql> source /tmp/backup_full.sql;
  3. mysql> select * from backup_full.full;
  4. +------+--------+
  5. | c1   | c2     |
  6. +------+--------+
  7. |    1 | full1  |
  8. |    2 | full2  |
  9. |    3 | full3  |
  10. |    4 | full4  |
  11. |    5 | full5  |
  12. |    6 | full6  |
  13. |    7 | full7  |
  14. |    8 | full8  |
  15. |    9 | full9  |
  16. |   10 | full10 |
  17. +------+--------+

全量数据还原成功

方法2:直接还原数据文件。

[sql] view plain copy

  1. mysql -u用户名 -p密码  -hIP地址    -P端口 数据库名     < /tmp/buckup_full.sql
  2. mysql -uroot   -pjesse -h127.0.0.1 -P3355 backup_full  < /tmp/buckup_full.sql
  3. mysql> select * from backup_full.full;
  4. +------+--------+
  5. | c1   | c2     |
  6. +------+--------+
  7. |    1 | full1  |
  8. |    2 | full2  |
  9. |    3 | full3  |
  10. |    4 | full4  |
  11. |    5 | full5  |
  12. |    6 | full6  |
  13. |    7 | full7  |
  14. |    8 | full8  |
  15. |    9 | full9  |
  16. |   10 | full10 |
  17. +------+--------+

    4.2 还原第一个增备文件

方法一:通过文本文件还原

[sql] view plain copy

  1. mysql> source /tmp/increment1.txt;
  2. mysql> select * from backup_increment.increment;
  3. +------+------------+
  4. | c1   | c2         |
  5. +------+------------+
  6. |   11 | increment1 |
  7. |   12 | increment2 |
  8. |   13 | increment3 |
  9. |   14 | increment4 |
  10. |   15 | increment5 |
  11. +------+------------+

方法二:通过binlog直接还原

在linux命令行下执行:

[sql] view plain copy

  1. mysqlbinlog  binlog文件名 | mysql -u用户名 -p密码 -hIP地址 -P端口
  2. mysqlbinlog  mysql-bin.000002 | mysql -uroot -pjesse -h127.0.0.1 -P3355

查看数据:

[sql] view plain copy

  1. mysql> select * from backup_increment.increment;
  2. +------+------------+
  3. | c1   | c2         |
  4. +------+------------+
  5. |   11 | increment1 |
  6. |   12 | increment2 |
  7. |   13 | increment3 |
  8. |   14 | increment4 |
  9. |   15 | increment5 |
  10. +------+------------+

第一份增量数据还原成功!

    4.3 还原第二个增备文件(方法同上)

在linux命令行下执行:

[sql] view plain copy

  1. mysqlbinlog  binlog文件名 | mysql -u用户名 -p密码 -hIP地址 -P端口
  2. mysqlbinlog  mysql-bin.000003 | mysql -uroot -pjesse -h127.0.0.1 -P3355

查看数据:

[sql] view plain copy

  1. mysql> select * from backup_increment.increment;
  2. +------+-------------+
  3. | c1   | c2          |
  4. +------+-------------+
  5. |   11 | increment1  |
  6. |   12 | increment2  |
  7. |   13 | increment3  |
  8. |   14 | increment4  |
  9. |   15 | increment5  |
  10. |   16 | increment16 |
  11. |   17 | increment17 |
  12. |   18 | increment18 |
  13. |   19 | increment19 |
  14. |   20 | increment20 |
  15. +------+-------------+

至此数据全部还原成功!

时间: 2024-10-07 16:05:17

基于binlog的增量备份的相关文章

【Oracle】基于SCN的增量备份修复DataGuard GAP

1. 首先来模拟Gap的产生 1.1. 备库关闭: [email protected]_s>shutdown immediate; 1.2. 主库切换日志 [email protected]>select SEQUENCE#,ARCHIVED,STATUS from v$log; SEQUENCE# ARC STATUS ---------- --- ---------------- 61 YES ACTIVE 62 YES ACTIVE 63 NO  CURRENT [email prote

binlog日志增量备份

#!/bin/bash loglast=`cat /var/lib/mysql/localhost-bin.index | awk -F "/" '{print $2}'| tail -n 1`       //取出正在使用binlog日志    if [ ! -e /binlogdir ]; then  mkdir /binlogdir fi for i in `cat /var/lib/mysql/localhost-bin.index | awk -F "/"

Xtrabackup 增量备份、恢复、原理

整合了网上的一些资料,结合自己的理解,并进行了实验验证 理解一: 1,Xtrabackup是什么 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品. Xtrabackup有两个主要的工具:xtrabackup.innobackupex (1).xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表 (2). innobackupex是参考了In

MySQL5.7.18 备份、Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份,数据导入导出

粗略介绍冷备,热备,温暖,及Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份 --备份的目的 灾难恢复:意外情况下(如服务器宕机.磁盘损坏等)对损坏的数据进行恢复和还原保证数据不丢失,最小程度地丢失需求改变:因需求改变而需要把数据还原到改变以前测试:测试新功能是否可用 --备份与恢复概述 根据备份的方法可以分为: 1.Hot Backup(热备) 2.Cold Backup(冷备) 3.Warm Backup(温备) Hot Backup是指

Centos 6.9 安装xtrabackup-2.4.8 通用包,yum安装,全量备份,增量备份

xtrabackup-2.4.8的安装及使用 ---Yum安装 官网地址:https://www.percona.com/doc/percona-xtrabackup/LATEST/installation/yum_repo.html [[email protected] ~]# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm [[

ORACLE 11G通过SCN做增量备份修复standby库详细过程

背景描述:Oracle 的standby库后台alert报错,如下: ORA-00354: corrupt redo log block header ORA-00353: log corruption near block 10240change 11125950022 time 05/08/2015 22:00:41 ORA-00334: archived log:'/data/oracle/oradgdata/standby_archive/1_32350_821708334.dbf' R

MySQL 全量及增量备份,基于xtrabackup 2.3.5

昨天一个pgp加密盘坏了,东西全丢了...,我的笔记啊!我咋怎么2呢.. 备份个脚本吧,方便以后手机查看,话说我都快忘记帐号密码了 备注:脚步恢复时只能恢复到备份前的状态,如果需要恢复到当前状态,还需配合binlog,睡觉就这样 #!/bin/sh #################################################### # AUTHOR : JusonSummer # # VERSION : V1.0.0 # # DATE : 2016-08-13 # # CO

shell脚本:mysql全备与binlog增量备份

脚本功能:mysql库备份脚本,全备与binlog日志备份 脚本可以根据指定的参数进行全备,其余时间备份binlog日志 --------------- #!/bin/bash # description:Trian Server backup databases # revision on 2016-02-18 # by colin # #################################### # 功能说明:该脚本运用于mysql每天备份与上传 #  # 使用说明: # ./m

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

mysql 利用binlog增量备份,还原实例 张映 发表于 2010-09-29 分类目录: mysql 一,什么是增量备份 增量备份,就是将新增加的数据进行备份.假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,很显然,我只要备份增加的数据.这样减少服务器的负担. 二,启用binlog vi my.cnf log-bin=/var/lib/mysql/mysql-bin.log,如果是这样的话log-bin