MySQL中基于mysqldump和二进制日志log-bin进行逻辑备份以及基于时间点的还原
本文出处:http://www.cnblogs.com/wy123/p/6956464.html
本文仅模拟使用mysqldump和log-bin二进制日志进行简单测试,仅作为个人学习笔记,可能离实际应用还有很大差距,仅参考。
开启MySQL的bin-log二进制日志
模拟还原是需要mysqldump出来的文件和log-bin,因此需要开始log-bin二进制日志。
mysql5.7.18在开启二进制日志的时候除了要设置log-bin的位置之外,另外需要设置一个server-id,MySQL之前的版本应该不需要这个设置。
吐槽一下开源软件,基本上每个版本都有一些跟之前版本不一样的地方,网上查资料往往不好使,不同版本的情况下不少东西都是不一样的,这一点需要注意。

重启之后,查询log_bin相关的变量

mysqldump备份(导出)数据的基本使用
mysqldump命令参数相当多,简单记录一下常用的命令,以及利用mysqldump备份(严格说是导出数据)和二进制日志log-bin进行数据库还原操作。
-- 备份testdb整个数据库,-l 表示给所有表上加一个读锁,-F (F要大写,小写不报错单页无效)表示滚动生成一个新的日志文件
mysqldump -u root -p -l -F -h localhost testdb > usr/local/mysqlbak/test20170607_data.sql

备份出来的文件就是create table和insert into table的脚本

-- 备份testdb数据库中的test_table1 test_table2两张表,加上--no-create-info就意味这个备份出来的文件不带create table的脚本,仅仅是insert into table的信息
mysqldump -uroot -p -h localhost testdb test_table1 test_table2 --no-create-info> usr/local/mysqlbak/test20170606_1.sql
-- 备份testdb数据库中的test2表中的一部分数据,也就是备份test_table1表中符合id<1000的数据
mysqldump -uroot -p -h localhost testdb test_table1 --where "id<1000" > usr/local/mysqlbak/test20170606_2.sql
更多mysqldump的参数,参考:http://www.cnblogs.com/xuejie/archive/2013/01/11/2856911.html
另外,mysql log-bin的更换策略:
使用索引来循环文件,在以下条件将循环至下一个索引
1。服务器重启
2。服务器被更新
3。日志到达了最大日志长度 max_binlog_size
4。日志被刷新 mysql> flush logs;
利用mysqldump备份的文件和log-bin二进制日志进行还原
首先在以表中有数据的情况下进行备份

执行 mysqldump -u root -p -l -F -h localhost testdb --master-data=2 > usr/local/mysqlbak/test20170607_data.sql

这里加了一个--master-data=2的选项,目的是在备份文件中备注出来当前的log_bin的文件,
至于为什么要加这个命令,很多博客上都记录的是用mysqldump备份出来一个文件之后,修改数据,然后模拟数据库误删或者宕机还原怎么的,然后在使用mysqldump出来的文件还原之后,接着使用log-bin还原
虽然都是测试模拟,但是有一个明显的问题啊,怎么知道mysqldump之后日志是否发生了滚动,滚动了几次?
如果日志不滚动还要,按照时间点或者位置还原log-bin文件,如果滚动了,怎么知道滚动了几个日志文件呢
就需要在mysqldump执行的时候,记录下来刷新日志之后的新生成的log-bin文件,在使用日志还原的时候,才能判断使用哪些日志进行还原。
有了--master-data=2的选项,才知道mysqldump备份时候的log_file位置

然后继续往表中插入10条数据

然后模拟在某个时间点误删数据的情况,truncate测试表,测试表此时为空

首先利用mysqldump出来的文件还原数据库,mysqldump出来的文件备份是100行时候的数据
因为备份文件中备份的时候的数据是100行,这里还原之后是100行,没有问题。

然后接着利用log-bin按照时间点还原,上面说了,mysqldump出来的文件记录了日志刷新之后的log-bin的文件名称,
那么就可以判断日志是否发生了滚动,如果没有滚动,就按照下图最新的log-bin进行按照时间点进行还原。

进行一次mysqldump备份还原
mysql -u root -p testdb < usr/local/mysqlbak/test20170607_data.sql
进然后再行一次基于bin-log的时间点还原
mysqlbinlog --stop-datetime="2017-6-7 21:45:00" /var/lib/mysql/mysql-bin.000022 | mysql -u root -p testdb
然后数据就回来了。

当然这里仅仅是模拟操作,当然还有许多细节尚未确定,如果发生了日志滚动,要做基于时间点的还原,还要追究到究竟是基于哪个日志文件的时间点。
总结:
本文仅仅以一个简单的示例来模式数据库的还原操作,
mysqldump备份模式比较简单粗暴,仅仅是将数据导出为insert脚本,在还原较大数据时候会有性能问题,可能mysqldump就不适合了,就需要更为高效的xtrabackup来做备份还原了。
MySQL中基于mysqldump和二进制日志log-bin进行逻辑备份以及基于时间点的还原的更多相关文章
- MySQL中几种常见的日志
前言: 在 MySQL 系统中,有着诸多不同类型的日志.各种日志都有着自己的用途,通过分析日志,我们可以优化数据库性能,排除故障,甚至能够还原数据.这些不同类型的日志有助于我们更清晰的了解数据库,在日 ...
- 如何开启MySQL 5.7.12 的二进制日志
1. 打开/etc下的my.cnf文件 2. 编辑它,添加内容: log_bin=binary-log #二进制日志的文件名 server_id=1 #必须指定server_id,这是MySQL ...
- MySql中innodb存储引擎事务日志详解
分析下MySql中innodb存储引擎是如何通过日志来实现事务的? Mysql会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据 ...
- Mysql中使用mysqldump进行导入导出sql文件
纪念工作中的第一次删库跑路的经历 今天接到一个任务,是将一个测试库数据导到另一个测试库,然而我们公司的数据库是不让直连的,所以只能通过远程连接进行导库操作. 老大布置任务的时候让用dump命令进行操作 ...
- mysql主从复制linux配置(二进制日志文件)
安装mysql,两台机器一主(192.168.131.153),一从(192.168.131.154) 主机配置 修改主/etc/my.cnf文件 添加 #server_id=153 ###服务器id ...
- MySQL复制(二)--基于二进制日志文件(binlog)配置复制
基础环境: 主库 从库 服务器IP地址 192.168.10.11 192.168.10.12 版本 5.7.24 5.7.24 已存在的数据库 mysql> show databases; ...
- MySQL二进制日志(binary log)总结
本文出处:http://www.cnblogs.com/wy123/p/7182356.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- mysql错误日志/var/log/mariadb/mariadb.log,二进制日志
mariadb-日志 IT_luo关注0人评论65人阅读2018-10-15 08:59:03 mariadb日志 mariadb日志: 1.查询日志:query log: 2.慢查询日志:slo ...
- MySQL基于二进制日志的主从复制
一.什么是MySQL的主从复制? MySQL可以将一个数据库设置为主库,另一个数据库设置为该主库的从库,当主库发生了变更,会同步到从库中.MySQL的主从架构,可以是星型的,也可以是线型的. 星型架构 ...
随机推荐
- 剑指Offer 6. 旋转数组的最小数字 (数组)
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...
- Ajax之Json对象序列化传参
前端部分:传入参数 "groupObject" : jsonString //对象序列化传参 var projectGroup = {}; projectGroup["i ...
- 重开ES6
一.ES6的开发环境搭建 现在的Chrome浏览器已经支持ES6了,但是有些低版本的浏览器还是不支持ES6的语法,这就需要我们把ES6的语法自动的转变成ES5的语法. 1.建立工程目录: 先建立一个项 ...
- 通过位运算求两个数的和(求解leetcode:371. Sum of Two Integers)
昨天在leetcode做题的时候做到了371,原题是这样的: 371. Sum of Two Integers Calculate the sum of two integers a and b, b ...
- XML二
XML的语法要求: 1,XML文档必须有一个顶层元素,即文档元素,所有其他元素必须嵌入在文档元素中. 2,元素嵌套要正确,即如果一个元素在另一个元素中开始,那么必须在同一个元素中结束. 3,每个元素必 ...
- node day1 login
https://blog.csdn.net/weixin_33901641/article/details/85967847 vue之node.js的简单介绍 http://nodejs.cn/ ht ...
- 手撕RPC框架
手撕RPC 使用Netty+Zookeeper+Spring实现简易的RPC框架.阅读本文需要有一些Netty使用基础. 服务信息在网络传输,需要讲服务类进行序列化,服务端使用Spring作为容器.服 ...
- 如何写一个makefile
最近因为编译需求,需要更改一些编译条件,顺带看了一些Makefile相关的知识,介绍的很详细,但是例子很少,拆分的比较零碎.初学的话,确实有点压力,我还是喜欢直接在原有的基础上改一些东西,然后遇到问题 ...
- PHP如何判断一个数组是一维还是多维
什么叫多维数组呢?多维数组,本质上是以数组作为数组元素的数组. 二维数组又称为矩阵,一个数组的元素如果是一维数组,那么我们就称这个数组是二维数组. 怎么判断一个数组是否是一维数组呢?通过count() ...
- linux 保留文件 其余删除
set选项与shopt选项是两组不同的内容,用set -o和shopt -p可以分别查看两个组所有的打开和关闭的条目, 在默认状态下,有些是打开的,有些是关闭的,shopt各选项随着bash版本的更新 ...