基于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.1 开启binlog日志
在my.cnf中增加
- [mysqld]
- log-bin=mysql-bin
- 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.*这样的文件,每启动一次,就会增加一个或者多个。
- [root@localhost data]# ls -l| grep mysql-bin
- -rw-rw----. 1 mysql mysql 107 Jul 5 11:19 mysql-bin.000001
- -rw-rw----. 1 mysql mysql 19 Jul 5 11:19 mysql-bin.index
- [root@localhost data]#
查看binlog开启情况
- mysql> show variables like 'log_bin%';
- +---------------------------------+-------+
- | Variable_name | Value |
- +---------------------------------+-------+
- | log_bin | ON |
- | log_bin_trust_function_creators | OFF |
- +---------------------------------+-------+
- mysql> show variables like 'binlog%';
- +-----------------------------------------+-------+
- | Variable_name | Value |
- +-----------------------------------------+-------+
- | binlog_cache_size | 32768 |
- | binlog_direct_non_transactional_updates | OFF |
- | binlog_format | ROW |
- | binlog_stmt_cache_size | 32768 |
- +-----------------------------------------+-------+
2.2 查看binlog日志内容
- [root@localhost data]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 ;
- mysqlbinlog: unknown variable 'default-character-set=utf8'
这里我们碰到了mysqlbinlog的一个bug,解决方法有两个:
方法一:使用--no-defaults选项
- [root@localhost 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),而不是服务器已经加载进内存的配置文件。
输出格式如下:
- # at 188
- #140705 11:23:55 server id 1 end_log_pos 271 Query thread_id=1 exec_time=0 error_code=0
- SET TIMESTAMP=1404573835/*!*/;
- create database test
- /*!*/;
- DELIMITER ;
- # End of log file
- ROLLBACK /* added by mysqlbinlog */;
- /*!50003 SET COMPLETION_TYPE=@OLD_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 一些常用操作
- mysql> show master logs; #查看数据库所有日志文件。
- mysql> show binlog events \g; #查看当前使用的binlog文件信息。
- mysql> show binlog events in 'mysql-bin.000016'; #查看指定的binlog文件信息。
- mysql> flush logs; #将内存中log日志写磁盘,保存在当前binlog文件中,并产生一个新的binlog日志文件。
- mysql> flush logs; reset master; #删除所有二进制日志,并重新(mysql-bin.000001)开始记录。
实例采用小数据量进行模拟,包含一份全备及两份增备,主要演示下备份还原过程,工程中可根据数据实际情况进行备份还原策略调整。
3.1 查看当前数据库binlog文件
通过mysql客户端查看
- mysql> show master logs;
- +------------------+-----------+
- | Log_name | File_size |
- +------------------+-----------+
- | mysql-bin.000001 | 107 |
- +------------------+-----------+
通过linux命令行直接查看(mysql数据目录data)
- [root@localhost data]# ll -h
- total 5.1G
- -rw-rw---- 1 mysql mysql 1.0G Jul 23 13:29 ibdata1
- -rw-rw---- 1 mysql mysql 2.0G Jul 18 14:12 ibdata2
- -rw-rw---- 1 mysql mysql 1.0G Jul 23 13:29 ib_logfile0
- -rw-rw---- 1 mysql mysql 1.0G Jul 23 13:29 ib_logfile1
- drwxr-xr-x 2 mysql mysql 4.0K Jul 18 13:52 mysql
- -rw-rw---- 1 mysql mysql 107 Jul 23 13:29 mysql-bin.000001
- -rw-rw---- 1 mysql mysql 19 Jul 23 13:29 mysql-bin.index
- srwxrwxrwx 1 mysql mysql 0 Jul 18 14:14 mysql.sock
- drwx------ 2 mysql mysql 4.0K Jul 18 14:01 performance_schema
- -rw-rw---- 1 mysql mysql 483 Jul 23 13:29 R820-08.err
- -rw-rw---- 1 mysql mysql 5 Jul 18 14:14 R820-08.pid
- drwx------ 2 mysql mysql 19 Jul 22 23:15 test
目前只有一个binlog文件mysql-bin.000001。
3.2 准备全量数据
- mysql> create database backup_full;
- mysql> create table full (c1 int(10), c2 varchar(20)) engine=innodb;
- mysql> insert into full values (1, 'full1'),(2, 'full2'),(3, 'full3'),(4, 'full4'),
- (5, 'full5'),(6, 'full6'),(7, 'full7'),(8, 'full8'),(9, 'full9'),(10, 'full10');
3.3 将全量数据进行备份
步骤如下:
a.备份前需要将数据库加读锁,防止数据在备份时写入。
- mysql> flush tables with read lock;
b.通过命令flush logs;将log日志刷盘,写入当前binlog(mysql-bin.000001),在生成一个新的binlog(mysql-bin.000002)为增备做准备。
- mysql> flush logs;
c.进行数据备份。在linux命令行下执行:
- mysqldump -u用户名 -p密码 -hIP地址 -P端口 数据库名 > /tmp/backup_full.sql
- mysqldump -uroot -pjesse -h127.0.0.1 -P3355 buckup_full > /tmp/backup_full.sql
d.解除表锁。
- mysql> unlock tables;
至此全量备份全部结束,将全量数据文件buckup_full.sql保存即可。数据库再有新的数据更新会记录在新的binlog(mysql-bin.000002)里面。
3.4 准备第一份增量数据
- mysql> create database backup_increment;
- mysql> use backup_increment;
- mysql> create table increment (c1 int(10), c2 varchar(20)) engine=innodb;
- mysql> insert into increment values (11, 'increment1'),(12, 'increment2'),(13, 'increment3'),(14, 'increment4'),(15, 'increment5');
3.5 将第一份增量数据进行备份
步骤如下:
a.备份前需要将数据库加读锁,防止数据在备份时写入。
- mysql> flush tables with read lock;
b.通过命令flush logs;将log日志刷盘,写入当前binlog(mysql-bin.000002),在生成一个新的binlog(mysql-bin.000003)为下次增备做准备。
- mysql> flush logs;
c.将binlog第一个增备文件mysql-bin.000002直接复制保存即可。
也可以将二进制文件导出到文本文件保存,在Linux命令行下执行
- mysqlbinlog mysql-bin.000002 > /tmp/increment1.txt
d.解除表锁。
- mysql> unlock tables;
至此第一个增量备份全部结束,将增量binlog文件mysql-bin.000002或者有binlog文件导出的文本文件/tmp/increment1.txt保存即可。数据库再有新的数据更新会记录在新的binlog(mysql-bin.000003)里面。
3.6 准备第二份增量数据
- mysql> use backup_increment;
- mysql> insert into increment values (16, 'increment16'),(17, 'increment17'),(18, 'increment18'),(19, 'increment19'),(20, 'increment20');
3.7 将第二份增量数据进行备份
步骤如下:
a.备份前需要将数据库加读锁,防止数据在备份时写入。
- mysql> flush tables with read lock;
b.通过命令flush logs;将log日志刷盘,写入当前binlog(mysql-bin.000003),在生成一个新的binlog(mysql-bin.000004)为下次增备做准备。
- mysql> flush logs;
c.将binlog第一个增备文件mysql-bin.000003直接复制保存即可。
也可以将二进制文件导出到文本文件保存,在linux命令行下执行
- mysqlbinlog mysql-bin.000003 > /tmp/increment2.txt
d.解除表锁。
- mysql> unlock tables;
至此第二个增量备份全部结束,将增量binlog文件mysql-bin.000003或者有binlog文件导出的文本文件/tmp/increment2.txt保存即可。数据库再有新的数据更新会记录在新的binlog(mysql-bin.000004)里面。
4 mysql还原实例分析(全备还原+基于binlog的增备还原)
模拟数据库故障,即删除全备数据及增备数据库。
- mysql> drop table backup_full.full;
- mysql> drop database backup_increment;
此时数据库数据被清空。
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | backup_full |
- | mysql |
- | performance_schema |
- | test |
- +--------------------+
- 5 rows in set (0.00 sec)
- mysql> select * from backup_full.full;
- ERROR 1146 (42S02): Table 'backup_full.full' doesn't exist
- mysql> select * from backup_increment.increment;
- ERROR 1146 (42S02): Table 'backup_increment.increment' doesn't exist
4.1 还原全备数据
方法1:进入数据库,通过source
- mysql> use backup_full;
- mysql> source /tmp/backup_full.sql;
- mysql> select * from backup_full.full;
- +------+--------+
- | c1 | c2 |
- +------+--------+
- | 1 | full1 |
- | 2 | full2 |
- | 3 | full3 |
- | 4 | full4 |
- | 5 | full5 |
- | 6 | full6 |
- | 7 | full7 |
- | 8 | full8 |
- | 9 | full9 |
- | 10 | full10 |
- +------+--------+
全量数据还原成功
方法2:直接还原数据文件。
- mysql -u用户名 -p密码 -hIP地址 -P端口 数据库名 < /tmp/buckup_full.sql
- mysql -uroot -pjesse -h127.0.0.1 -P3355 backup_full < /tmp/buckup_full.sql
- mysql> select * from backup_full.full;
- +------+--------+
- | c1 | c2 |
- +------+--------+
- | 1 | full1 |
- | 2 | full2 |
- | 3 | full3 |
- | 4 | full4 |
- | 5 | full5 |
- | 6 | full6 |
- | 7 | full7 |
- | 8 | full8 |
- | 9 | full9 |
- | 10 | full10 |
- +------+--------+
4.2 还原第一个增备文件
方法一:通过文本文件还原
- mysql> source /tmp/increment1.txt;
- mysql> select * from backup_increment.increment;
- +------+------------+
- | c1 | c2 |
- +------+------------+
- | 11 | increment1 |
- | 12 | increment2 |
- | 13 | increment3 |
- | 14 | increment4 |
- | 15 | increment5 |
- +------+------------+
方法二:通过binlog直接还原
在linux命令行下执行:
- mysqlbinlog binlog文件名 | mysql -u用户名 -p密码 -hIP地址 -P端口
- mysqlbinlog mysql-bin.000002 | mysql -uroot -pjesse -h127.0.0.1 -P3355
查看数据:
- mysql> select * from backup_increment.increment;
- +------+------------+
- | c1 | c2 |
- +------+------------+
- | 11 | increment1 |
- | 12 | increment2 |
- | 13 | increment3 |
- | 14 | increment4 |
- | 15 | increment5 |
- +------+------------+
第一份增量数据还原成功!
4.3 还原第二个增备文件(方法同上)
在linux命令行下执行:
- mysqlbinlog binlog文件名 | mysql -u用户名 -p密码 -hIP地址 -P端口
- mysqlbinlog mysql-bin.000003 | mysql -uroot -pjesse -h127.0.0.1 -P3355
查看数据:
- mysql> select * from backup_increment.increment;
- +------+-------------+
- | c1 | c2 |
- +------+-------------+
- | 11 | increment1 |
- | 12 | increment2 |
- | 13 | increment3 |
- | 14 | increment4 |
- | 15 | increment5 |
- | 16 | increment16 |
- | 17 | increment17 |
- | 18 | increment18 |
- | 19 | increment19 |
- | 20 | increment20 |
- +------+-------------+
至此数据全部还原成功!
基于binlog的增量备份的更多相关文章
- MySQL数据库备份还原(基于binlog的增量备份)
MySQL数据库备份还原(基于binlog的增量备份) 一.简介 1.增量备份 增量备份 是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件.这就意味 ...
- shell脚本 binlog方式增量备份mysql
一.简介 源码地址 日期:2018/4/12 介绍:复制Binlog日志方式的增量备份脚本,并保存固定天数的备份 效果图: 二.使用 适用:centos6+ 语言:中文 注意:使用前先修改脚本中变量 ...
- MySQL系列:基于binlog的增量订阅与消费(一)
在一些业务场景中,像在数据分析中我们有时候需要捕获数据变化(CDC):在数据审计中,我们也往往需要知道数据从这个点到另一个点的变化:同样在实时分析中,我们有时候需要看到某个值得实时变化等. 要解决以上 ...
- Centos 6.9 安装xtrabackup-2.4.8 通用包,yum安装,全量备份,增量备份
xtrabackup-2.4.8的安装及使用 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备 ...
- MySQL系列详解五: xtrabackup实现完全备份及增量备份详解-技术流ken
xtrabackup简介 xtrabackup是一个用来对mysql做备份的工具,它可以对innodb引擎的数据库做热备.xtrabackup备份和还原速度快,备份操作不会中断正在执行的事务,备份完成 ...
- MySQL5.7.18 备份、Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份,数据导入导出
粗略介绍冷备,热备,温暖,及Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份 --备份的目的 灾难恢复:意外情况下(如服务器宕机.磁盘损坏等)对损 ...
- Xtrabackup全量 增量备份详解
xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有开源,免费,支持在线热备,备份恢复速度快,占用磁盘空间小等特点,并且支持不同情况下的多种备份 ...
- Oracle通过SCN做增量备份修复DG
DG由于网络原因或者bug原因经常不同步,有时隔得时间久了,就会丢失归档日志,或者长时间的归档恢复较慢,有一种可以基于scn的方式来恢复DG库,使用基于scn的增量备份来恢复standby库可以节省大 ...
- MySQL 数据库备份策略:全备与增量备份
一.备份策略1.周日全备份,周一至周六增量备份2.全备份目录/u03/backup/innobackup/full_backup3.增量备份目录/u03/backup/innobackup/incre ...
随机推荐
- Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?
Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?先上两种实现方式的实例:$querys["house_type_image"] ...
- 面试题之一(Spring和堆栈和逻辑运算符)
1.&和&&区别? 都是逻辑运算符,都是判断两边同时为真,否则为假:但&&当第一个为假时,后面就不执行,而&则还是要继续执行,直至结束: ——————— ...
- c++第十一天
<c++ primer, 5E> 第68页到第81页,笔记: 1.读取未知量的string对象示例 #include<iostream> using std::cin; usi ...
- Python入门之os.walk()方法
os.walk方法,主要用来遍历一个目录内各个子目录和子文件. os.walk(top, topdown=True, onerror=None, followlinks=False) 可以得到一个三元 ...
- 20165211 学习基础和C语言调查
20165211 学习基础和C语言调查 理论脱离实践是最大的不幸.--达芬奇 达芬奇,是我眼里最有嫌疑的穿越者. 绘画.天文.雕塑.音乐.发明.建筑,数学.生理.物理.天文.地质--我很难想象有一个人 ...
- 自定义Web框架与jinja2模板
web应用与web框架 web应用 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 import socket def handle_reque ...
- JavaScrpt简单介绍
什么是javaScrpt javascript因为兼容于ECMA标准,因此也称为ECMAScript.JavaScript作为一种脚本语言,已经被广泛地应用于Web页面当中,通过嵌入HTML来实现各种 ...
- P3709 大爷的字符串题
题意 询问区间众数出现的次数 思路 唯有水题快人心 离散化+莫队 莫队一定要先加后减,有事会出错的 莫队维护区间众数: 维护两个数组,一个数组记录权值为x的出现次数,一个记录出现次数为x的数的个数 a ...
- POJ1144 Network(割点)题解
Description A Telephone Line Company (TLC) is establishing a new telephone cable network. They are c ...
- Linux——系统引导流程学习简单笔记
开启电源: 固件 firmware(CMOS/BIOS) → POST 加电自检 对硬件就行检查 ↓ 自举程序 BootLoader(GRUB) → 载入内核 ↓ 载入内核 Kernel 1:驱动硬件 ...