京东到家程序员删库跑路 ! 讲一讲 MySQL 数据备份杀手锏 binlog
我们都知道,数据非常重要
网上也经常看到一些段子,某公司程序员对工作不满,删库跑路,老板损失惨重,欲哭无泪。这不最近又爆出一例,京东到家程序员离职当天删库跑路!
那么有没有什么解决方案?
即使数据库真的被删了,也有备份数据,能快速恢复。甚至可以做到实时热备,即使内部炸掉外部用户也感知不到,一片风平浪静。
MySQL 作为当下流行数据库,在数据备份
、高可用
方面非常有竞争力,今天,我们就重点来讲下
什么是 MySQL 主备
情况一:
客户端的业务操作,
读、写
访问的是主库主库通过某种机制,将数据实时同步给备库
主库由于有些原因,无法正常响应客户端的请求
情况二:
完成主备切换
客户端读写,访问的是备库(此时备库升级为新主库)
那么,这里面最核心的数据同步
是如何实现的?
主从同步原理
1、在备库执行 change master 命令
,绑定主库的信息
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.1.1', MASTER_USER = 'repl', MASTER_PASSWORD = 'replpassword', MASTER_PORT = 3306, MASTER_AUTO_POSITION = 1, MASTER_RETRY_COUNT = 0, MASTER_HEARTBEAT_PERIOD = 10000;
MASTER_HOST :master主机名(或IP地址)
MASTER_PORT :mysql实例端口号
MASTER_USER:用户名
MASTER_PASSWORD:密码
MASTER_AUTO_POSITION:如果进行change master to时使用MASTER_AUTO_POSITION = 1,slave连接master将使用基于GTID的复制协议
MASTER_RETRY_COUNT:重连次数
MASTER_HEARTBEAT_PERIOD:复制心跳的周期
https://www.docs4dev.com/docs/zh/mysql/5.7/reference/change-master-to.html
2、备库执行 start slave
命令,备库启动两个线程:I/O thread
和 SQL thread
3、master主库,有数据更新,将此次更新的事件类型写入到主库的 binlog 文件中
4、主库会创建log dump 线程
,通知slave有数据更新
5、slave,向master节点的 log dump线程请求一份指定binlog文件位置的副本,并将请求回来的binlog
存到本地的Relay log
中继日志中
6、slave 再开启一个SQL 线程
读取Relay log
日志,解析出日志里的命令,并执行,从而保证主备库数据同步
binlog 有哪几种格式
现在,让我们近距离看下 binlog 日志。
binlog 格式有三种:row
、statement
、mixed
接下来,我们开始一个实验:
先创建一个表
CREATE TABLE `person` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',`income` bigint(20) NOT NULL COMMENT '收入',`expend` bigint(20) NOT NULL COMMENT '支出',PRIMARY KEY (`id`),KEY `idx_income` (`income`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='个人收支表';
插入4条记录:
insert into person values(50,500,500);
insert into person values(60,600,600);
insert into person values(70,700,700);
insert into person values(80,800,800);
查看binlog模式:
查看当前正在写入的binlog文件:
查看 binlog 中的内容,我们先来看下 row 模式
show binlog events in 'mysql-bin.000001';
说明:
SET @@SESSION.GTID_NEXT='ANONYMOUS’
BEGIN 开始一个事务
Table_map 记录更新了哪个库、哪张表
Write_rows 记录做了什么操作,详细看binlog需要借助mysqlbinlog工具。
COMMIT /* xid=157 */ 结束一个事务
查找 binlog 文件的物理位置:
root@167bfa3785f1:/# find / -name mysql-bin.000001
/var/lib/mysql/mysql-bin.000001
借助 mysqlbinlog 命令,查看具体内容:
mysqlbinlog -vv mysql-bin.000001 --start-position=2986;
红框中的内容表示执行了插入命令,insert into person values(80,800,800);
其中,@1、@2、@3 表示表 person
的第几个字段,不用原始名称,是为了节省空间。
修改 binlog 格式,设置为 STATEMENT ,查看日志格式:
set global binlog_format='STATEMENT';
设置之后,需要退出mysql重新连接,才能看到生效
show binlog events in 'mysql-bin.000001';
从图中我们可以看出,当 binlog_format=statement 时,binlog 里面记录的就是 SQL 语句的原文。
其中,use tomge
:表示要先切到对应的数据库
如果想从指定位置查看binlog,可以增加 from
可选参数,如下:
show binlog events in 'mysql-bin.000001' from 5168;
statement 与 row 对比:
statement
格式的binlog记录的是sql语句;row
格式的binlog记录的是event(Table_map,Write_rows,Delete_rows)
当 binlog 在 statement 格式下,记录的是sql语句,在主库执行时可能使用的是索引 A;但是同步给备库执行时,可能用了 索引B。
索引不同,同一条sql语句,运行结果可能也不一样。
针对这个场景,我们建议采用 row
格式的 binlog。
即使我们使用了带where 条件(如:income>720)的delete语句,但 binlog 记录的是要删除的主键id(id =80 ),所以不会出现差错。
mixed 格式 的binlog 是个啥?
由于 statement
格式的binlog 可能会导致主库、备库间的数据同步不一致,因此我们会采用 row
格式。
但是,row
格式占用的空间很大,写 binlog 也要占用大量的 IO 资源。
所以,官方提出一种mixed混合模式,集成了两者的优点。
内容如下:
mysql会自动判断
statement
格式,是否会引发主备不一致的问题如果
statement
格式会引起主备不一致的问题,自动使用row
格式。如果
statement
格式不会引起主备不一致的问题,那么就用statement
格式,
恢复数据
当然,我们还建议把MySQL 的binlog设置成 row
模式,因为它可以用于数据恢复。我们来看下 insert
、update
、delete
三种DML操作如何来恢复数据的。
1、delete:
当我们执行 delete 命令时,如果 binlog_row_image
设置了 'FULL',那么 Delete_rows 里面,包含了删掉的行的所有字段的值。
如果误删了,因为 binlog 记录了所有字段的值,反向执行 insert 就可以了。
当
binlog_row_image
设置为MINIMAL
,只记录关键信息,比如 id=80
2、insert:
row 格式下,binlog 会 记录 insert 的所有字段值。
如果误操作,只需要根据这些值找到对应的行,再执行 delete 操作即可
3、update:
row 格式下,binlog 会 记录 update 修改前、修改后的整行数据。
如果误操作,只需要用修改前的数据覆盖即可。
通过命令来恢复数据:
如果要执行数据恢复,可以使用下面命令
mysqlbinlog mysql-bin.000001 --start-position=1 --stop-position=3000 | mysql -h192.168.0.1 -P3306 -u$user -p$pwd;
将 mysql-bin.000001
文件位置从 1到3000 的 binlog 在 192.168.0.1
机器的数据库上回放,还原。
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
京东到家程序员删库跑路 ! 讲一讲 MySQL 数据备份杀手锏 binlog相关推荐
- 试用期被劝退,京东到家某程序员删库跑路,被判刑10个月!
最近,又有程序员因为"删库跑路"被判刑. 根据上海市杨浦区人民法院的消息,京东到家一名程序员未经公司许可,在离职当天私自删除了京东到家平台系统代码,构成破坏计算机信息系统罪,被判处 ...
- 代码内容变成图片_网站只剩25行代码,真有程序员“删库跑路”?
"可能我删了数据才会轻松吧 可能我格了硬盘才会休息吧 可能逃出了公司我就跑到天边 可能我还没找到 那个BUG--" 曾经,有一位程序员,在某个加班的深夜,一边听着<可能否&g ...
- php中文网侵权事件,【杂谈】程序员删库跑路事件,php中文网的几点声明!
最近网爆<"安徽汽车网"被程序员删库跑路了,只留下了一张图片做为官网!>事件持续发酵! ki4网也被躺枪,上了热点,网上也出现了各种版本的杜撰,作为当事方之一,ki4网 ...
- 上有程序员删库跑路,这次是程序员锁死服务器,600万打水漂,创始人负债数百万!
据说一家游戏公司做了两年的游戏,在上线测试当天,被一个员工锁死服务器和电脑,最终项目失败,600万投入付之东流,创始人负债数百万. 从微薄大V"首席内幕官"晒出的信息显示,这家游戏 ...
- 安徽汽车网程序员删库跑路?不,真相是这样!
近日,朋友圈和相关自媒体都在吃程序员删库跑路的瓜,大意是以前丰富的官网突然都点击不动,查看源代码发现官网是几张图片拼凑组成的,各路大神纷纷猜测是程序员删库跑路, 截止到目前相关自谋体和个人还在纷纷转发 ...
- 微盟程序员删库跑路,被判刑六年!
大家还记得今年年初,微盟"删库跑路"事件吗? 1 冲动删库 微盟那次删库事件,也许是国内删库最严重的事故之一,当天直接造成公司市值损失近10亿,影响超过300万商户. 事件详细过程 ...
- 又一程序员删库跑路被拘留?教你如何一键恢复!
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 日常工作中,总会有因手抖.写错条件.写错表名.错连生产库造成的误删库表和数据的事情发生,但是万一真删了,要记住一点,不要慌,作为程序员要学 ...
- 什么仇什么怨?游戏上线日程序员“锁库跑路”,致公司破产解散
这到底是什么仇什么怨呢? 程序员在游戏上线当天锁死服务器! 项目失败,创始人负债打工! 近日,深圳市螃蟹网络科技有限公司创始人尹柏霖发文控诉,前员工燕某在游戏上线测试当天(2017年12月15日),锁 ...
- 定时跑视图往另外一张表添加数据_程序猿删库跑路示例
今天给大家分享一个需要谨慎操作的示例. 我们在实际开发中,会用到大量的测试数据,又或者老了不想干了!想要清空数据库然后跑路了(这种违反职业道德的东西,我们不能干哦!),但涉及的表又很多,手工一张张的删 ...
最新文章
- NSJSONSerliazition文档翻译和使用
- Navicate Premium连接Oracle数据库报错
- Android中让Service被关闭后再重新启动
- Cookie禁用了Session还可以用吗?
- JavaScript—事件
- Jenkins持续集成案例之-运维部署方式
- svn利用钩子post-commit自动更新到线上测试服务器
- Oracle调优检查点
- Atitit 大脑能够储存多大的数据量
- 虚拟机nas服务器,VMware虚拟机搭建安装黑群晖NAS服务器
- 打开我的收藏夹 -- Python篇
- js 实现选择文件存放路径
- 苹果手机怎么在照片上添加文字_用手机修图软件,给照片添加精美的文字排版,如何操作最简单?...
- opencv Fast特征提取函数
- arduino的基本函数
- QTextEdit设计的几个知识点
- mysql: [Warning] Using a password on the command line interface can be insecure.解决方法
- 10分钟认识低代码平台
- 广州计算机专业分数线,广东人工智能专业分数线多少
- 如何能百度到自己的博客
热门文章
- 4.3.2模拟匹配的一种改价算法(KMP及KMP优化算法)
- file association没有 *.class文件_springboot如何MultipartFile文件跨服务
- docker更新容器命令 ,自启
- PHP 会话 线程 进程,php进程后台调用(多线程/进程)
- linux强制关机启动后是白屏,解决安装Ubuntu后,启动出现屏幕空白(全黑,无内容)...
- android从github 下开源库引用问题 (出现ClassNotFoundException)
- (软件工程复习核心重点)第二章可行性研究-第一节:可行性研究基本介绍
- Jenkins-CI 远程代码执行漏洞复现(CVE-2017-1000353)
- Python @property装饰器的用法,判断函数参数整形、字符串、取值范围
- gevent开发http服务器与tcp服务器(WSGIServer、StreamServer)