导读

  我一直都主张,技多不压身(没有学不会的技术,只有不学习的人),多学一项技能,未来就少求人一次。网上经常听到xxx删库跑路,万一真的遇到了,相信通过今天的学习,也能将数据再恢复回来~~~

  当然啦,备份数据/还原数据也是挺重要的,可以看我另一篇:点我直达

  如果感觉这样还不安全,可以考虑授予用户权限:点我直达

介绍

  记录着mysql数据库中的一些增删改操作(没有查询)

功能

  1. 数据复制(主从复制)
  2. 数据恢复

注意事项

  开启二进制日志会有性能的消耗!!!

查看二进制日志是否开启

查看是否开启:show variables like 'log_bin%';

开启二进制日志

  修改my.cnf文件

[mysqld]
datadir=/usr/local/mysql/data
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
max_connections=400
innodb_file_per_table=1
#表名大小写不明感,敏感为
lower_case_table_names=1
# skip-grant-tables
log-bin=/usr/local/mysql/log_bin_data/mysql-bin
server-id=1
切换:cd /usr/local/mysql/
创建目录(用于存放二进制日志):mkdir log_bin_data 注意:
1、log_bin_data必须要有mysql权限
2、修改权限:chown -R mysql:mysql /usr/local/mysql/log_bin_data 修改my.cnf: vim /usr/local/mysql/my.cnf 在[mysqld]下添加
log-bin=/usr/local/mysql/log_bin_data/mysql-bin
server-id=1 修改完之后,一定要重启mysql服务:service mysql restart

  此时继续查看二进制日志是否开启,现在可以看到已经开启

查看binlog日志列表

show master logs;

刷新二进制日志

  刷新/重启mysql服务,都会在加一个binlog日志文件

flush logs;

重置(清空)日志文件

  有时候感觉日志文件没啥用,还占用空间,可以使用下面命令重置日志文件

登录mysql:mysql -uroot -proot
删除binlog:reset master

二进制备份

  备份好二进制日志文件之后,往表中插入一条记录,然后将数据库给删掉,等会使用二进制日志恢复数据库

描述:备份本地db2库,并压缩存放到/mysql_data_back下

切换:cd /usr/local/mysql/bin 语法:./mysqldump -u用户 -p密码 -F --databases 数据库 | gzip > 路径+文件名 备份:./mysqldump -uroot -proot -F --databases db2 | gzip > /mysql_data_back/db2.sql.gz 新增一条记录:
INSERT INTO `db2`.`nba_player`(`id`, `countryEn`, `teamName`, `birthDay`, `country`, `teamCityEn`, `code`, `displayAffiliation`, `displayName`, `schoolType`, `teamConference`, `teamConferenceEn`, `weight`, `teamCity`, `playYear`, `jerseyNo`, `teamNameEn`, `draft`, `displayNameEn`, `birthDayStr`, `heightValue`, `position`, `age`, `playerId`) VALUES (999999, 'Croatia', '快船', 858661200000, '克罗地亚', 'LA', 'ivica_zubac', 'Croatia', '伊维察 祖巴茨', '', '西部', 'Western', '108.9 公斤', '洛杉矶', 3, '40', 'Clippers', 2016, 'Ivica Zubac', '1997-03-18', 2.16, '中锋', 22, '1627826');

刚才的所有操作,都会记录在binlog日志文件中!

binlog恢复数据

  刚才我们备份数据库之前,新增一条记录,id=9999,恢复回去之后,如果有这条记录,说明我们恢复成功啦

查看binlog里的日志

语法:./mysqlbinlog binlog日志文件

切换:/usr/local/mysql/bin

查看binlog日志 :./mysqlbinlog /usr/local/mysql/log_bin_data/mysql-bin.000002

  如果查看binlog日志报错,解决方法

添加:--no-defaults参数
./mysqlbinlog --no-defaults /usr/local/mysql/log_bin_data/mysql-bin.000002

将binlog日志转换普通文件

语法:./mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -v binlog日志文件 > 导出文件路径

./mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -v /usr/local/mysql/log_bin_data/mysql-bin.000002 > /mysql_data_back/bin-log.sql

恢复数据方式

根据binlog日志的时间

根据binlog的位置

找到删除库的行

./mysqlbinlog --no-defaults ../log_bin_data/mysql-bin.000002 | cat -n |grep -iw 'drop'

./mysqlbinlog --no-defaults ../log_bin_data/mysql-bin.000002 | cat -n | sed -n '行数1,行数2p'

./mysqlbinlog --no-defaults ../log_bin_data/mysql-bin.000002 | cat -n | sed -n '59,70p'

开始恢复数据

先恢复数据库

  先将原先备份的数据库给备份回来

切换: cd /mysql_data_back

解压: gunzip -d db2.sql.gz 

恢复数据:mysql -uroot -proot -h 127.0.0.1 < /mysql_data_back/db2.sql

  此时数据库已经恢复回来,但是新增的那条记录没有恢复回来(id=9999)

恢复binlog

语法:./mysqlbinlog --no-defaults --set-charset=utf8 --stop-position="停止位置" binlog日志 | mysql -u用户 -p密码
./mysqlbinlog --no-defaults --set-charset=utf8 --stop-position="761" /usr/local/mysql/log_bin_data/mysql-bin.000002 | mysql -uroot -proot

恢复某一段记录
./mysqlbinlog --no-defaults --set-charset=utf8 --start-position="开始坐标" --stop-position="结束坐标" | mysql -uroot -proot

备注

  本次案例,我先备份一次数据库然后新增一条记录再把数据库给删了,我先恢复数据库(恢复的数据库中是没新增的这条记录),通过binlog将新增的记录,回滚到数据库中

搞定

Mysql binlog备份数据及恢复数据,学会这个,我在也不怕删库跑路啦~的更多相关文章

  1. 数据误操作,删库跑路?教你使用ApexSQLLog工具从 SQLServer日志恢复数据!

    前几天同事不小心误操作,将SQLServer库的一张表的一个状态字段给刷成了一个统一状态,由于是update执行所以原来的相关状态无法确定.发生这种事情的时候我的小伙伴背后 一凉,估计心里里面想这怕是 ...

  2. 教你如何6秒钟往MySQL插入100万条数据!然后删库跑路!

    教你如何6秒钟往MySQL插入100万条数据!然后删库跑路! 由于我用的mysql 8版本,所以增加了Timezone,然后就可以了 前提是要自己建好库和表. 数据库test, 表user, 三个字段 ...

  3. 大数据开发从入门小白到删库跑路(一)- 获取Hadoop

    Hadoop是一个可以通过相对简单编程模型实现跨多台计算机集群分布式处理大型数据集的框架.它不是依赖于高额成本的硬件可靠性来提供高可用性,Hadoop的设计能从单个服务器扩展到数千台机器,每个机器提供 ...

  4. MySQL通过bin log日志恢复数据|手撕MySQL|对线面试官

    关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第二篇文章,今天介绍一下MySQL的二进制日志(bin log),注意不要和MySQL的InnoDB ...

  5. MYSQL使用二进制日志来恢复数据

    mysqlbinlog工具的使用,大家可以看MySQL的帮助手册.里面有详细的用, 在这个例子中,重点是--start-position参数和--stop-position参数的使用. ·--star ...

  6. mysql数据库通过二进制 -【恢复数据记录】

    1.修改配置文件 vi /etc/my.cnf log-bin = binlog systemctl restart mysqld mysql -uroot -p123456 mysql> sh ...

  7. mysql通过数据文件恢复数据方法

    情况描述:服务器硬盘损坏,服务器换了个新硬盘 ,然后老硬盘插在上面.挂载在这台机器.可以从老硬盘里面拿到数据.只拿到了里面的mysql数据文件夹,把数据文件夹覆盖新的服务器mysql数据文件夹 启动报 ...

  8. MySQL从.ibd文件中恢复数据

    首先,在MySQL命令行下执行如下命令可以查看MySQL中存放数据的位置: show global variables like "%datadir%"; 我这里的执行结果: +- ...

  9. 9.11、mysql增量备份和增量恢复介绍

    1.增量备份: 增量数据是从上次全量备份之后,更新的新数据,对于mysql来说,binlog日志就是mysql的增量数据: (1)按天进行备份: 周一00点全量备份 周二00点全量备份 ...... ...

随机推荐

  1. Windows(WSL2) Linux子系统搭建Docker环境

    摘要:本文主要介绍了如何再Windows(WSL2)中启用Linux系统中,并搭建Docker环境. WSL是适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux ...

  2. java 调用WebService【转】

    1.客户单编程方式(和第一种方式一样) //文件名:HelloService.java import javax.jws.WebMethod; import javax.jws.WebParam; i ...

  3. TimeSpan时间间隔详解

    1 public string GetShiXian(string fadanshijian) 2 { 3 string result,chulishijian; 4 5 DateTime fdTim ...

  4. CTCall简介(后续会继续补充)

    使用CTCall需要导入CoreTelephony.framework框架. CTCall的基本使用 (1)初始化call CFStringRef number = CFSTR("15555 ...

  5. 想买保时捷的运维李先生学Java性能之 运行时数据区域

    前言 不知道自己不知道,不知道自己知道,知道自己不知道,知道自己知道,目前处于知道自己不知道这个阶段,很痛苦啊,干了4年了运维,是一个坎.越来越发觉想要走得远,还是得扎根底.   一.运行时数据区域 ...

  6. 2020-2021-1 20209306 《linux内核原理与分析》第二周作业

    一.实验一内容及分析 1.实验一内容过程截图 2.实验一完成后收获 可以看到汇编代码中出现了eax.esp.ebp.eax是累加寄存器,esp是堆栈指针寄存器,ebp是基指针寄存器.汇编代码中用到了m ...

  7. 自定义Jackson2HttpMessageConverter,适应.html后缀url

    Jackson2HttpMessageConverter 用处 SpringMVC中,controller中的方法返回java Bean对象,mvc将此对象转换成字符串 默认支持的mediaType: ...

  8. 蒲公英 · JELLY技术周刊 Vol 27: 平平无奇 React 17

    蒲公英 · JELLY技术周刊 Vol.27 这个热闹的十月终于要走到尾声,React 17 历经 4 个 RC 版本之后,也于数天前正式发布了,而同在几天前发布的 CRA 4.0 也已经完成了 Re ...

  9. 二进制获取List中缺少的对象

    今天,我需要做一个大数据页面,其中分了5类 大概就像这样:1类,2类,3类,4类,5类...... 但是由于数据没有足够多,所以现在统计出来的数据缺少了一到两类,或者更多,所以现在要找出在List在总 ...

  10. Win32之创建线程

    0x01.什么是线程? 1.线程是附属在进程上的执行实体,是代码的执行流程 进程 本身是空间上的概念,代表4GB的虚拟内存,线程代表着时间概念,也就是说,线程是当前运行的代码 在某个时间点只能有一段代 ...