对MySQL中误操作的思考

作为一名DBA需要有着严谨的工作态度。

两台测试DB  Server A, Server B, 默认存储引擎InnoDB.有这样一个需求:需要将A中所有的表结构同步到B中。当时是这样做的: mysqldump -no-data......

导出mysql表的文件后结果又将这些文件应用到了Server A 中,可想而知A中的 data已经被清空啦。由于是测试DB,数据量不大,用备份+binlog完全可以恢复的过来。但处于谨慎,得出第一个总结:对于新增加的表或者修改表结构的情况,要应用到其他DB的话,最好使用上 --skip-add-drop-table(宁原有重复表的报错,也不要产生删除数据的情况)

这时候我们另一个热心长的同学,将MySQL重启啦。少了一个binlog日志文件。当时心想,数据肯定会丢失一部分。丢失binlog日志的原因是由于设置了expire_logs_days(binlog在多久之后没有改动的话会被删除)。由此得出第二个总结:由于设置expire_logs_days 无法确定文件删除的具体日期,改为purge binary logs 方式进行手动删除。对于线上主从复制的情况,更应如此,原先设置的expire_logs_days=15(需要检查 各个slave应用binlog 的具体位置)

在将binlog应用到DB中时,报duplicate key的错误而中断。引起的原因是 原来的表中某个字段只是普通索引,后来改为非唯一索引。没有办法只好手动修改从binlog解析出的文件。由此得出第三个结论:为了防止在 有schema 变更之后 恢复数据时发生错误,可以考虑每天进行flush logs 一次。将范围缩减到最小。mysqlbinlog 进行解析的时候 可以单个文件进行解析。 可以利用 confluence 类西的工具将 对表的变更做实时更新记录。对自己的DB有充分的掌握。

最终还是我们需要多总结,态度很重要,形成一个良好的规范。

本栏目更多精彩内容:http://www.bianceng.cn/database/MySQL/

时间: 2024-10-30 08:46:54

对MySQL中误操作的思考的相关文章

MySQL数据库误操作后快速回滚的方法_Mysql

基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了.假如这还是线上环境核心业务数据,那这事就闹大了.误操作后,能快速回滚数据是非常重要的. binlog2sql快速回滚 首先,确认你的MySQL server开启了binlog,设置了以下参数: [mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log max_binlog_siz

MySQL数据库防止人为误操作的实例讲解_Mysql

有不少开发人员在操作MySQL数据库的时候都遇到过误操作的情况,例如更新数据库的时候update语句忘记加上where条件,就会造成极为悲剧的结果.本文就针对防止MySQL数据库误操作的方法做出如下详解: 1.mysql帮助说明 # mysql --help|grep dummy -U, --i-am-a-dummy Synonym for option --safe-updates, -U. i-am-a-dummy FALSE 在mysql命令加上选项-U后,当发出没有WHERE或LIMIT

MySQL误操作后快速恢复数据的方法_Mysql

摘要: 利用binlog闪回误操作数据. 基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了.假如这还是线上环境核心业务数据,那这事就闹大了.误操作后,能快速回滚数据是非常重要的. 传统解法 用全量备份重搭实例,再利用增量binlog备份,恢复到误操作之前的状态.然后跳过误操作的SQL,再继续应用binlog.此法费时费力,不值得再推荐. 利用binlog2sql快速闪回 首先,确认你的MySQ

几种MySQL中的联接查询操作方法总结_Mysql

前言 现在系统的各种业务是如此的复杂,数据都存在数据库中的各种表中,这个主键啊,那个外键啊,而表与表之间就依靠着这些主键和外键联系在一起.而我们进行业务操作时,就需要在多个表之间,使用sql语句建立起关系,然后再进行各种sql操作.那么在使用sql写出各种操作时,如何使用sql语句,将多个表关联在一起,进行业务操作呢?而这篇文章,就对这个知识点进行总结. 联接查询是一种常见的数据库操作,即在两张表(多张表)中进行匹配的操作.MySQL数据库支持如下的联接查询:     CROSS JOIN(交叉

MySQL中truncate误操作后的数据恢复案例_Mysql

实际线上的场景比较复杂,当时涉及了truncate, delete 两个操作,经确认丢数据差不多7万多行,等停下来时,差不多又有共计1万多行数据写入. 这里为了简单说明,只拿弄一个简单的业务场景举例. 测试环境: Percona-Server-5.6.16 日志格式: mixed 没起用gtid 表结构如下: CREATE TABLE `tb_wubx` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL

【MySQL】恢复误操作的方法

一 .前言 本周接二连三的出现开发人员在测试环境和生产误操作导致数据库误删除/更新,对DBA而言,回滚数据着实是一件头疼的事情,凡涉及到恢复线上数据必然对应用带来一定的影响.大多数情况是开发误操作delete数据,update多数行,根据之前的操作经验,本文介绍常用的恢复方法. 写本文的时候 Monogdb 也被曝出有被利用安全漏洞,数据被删除了,希望各位DBA/安全相关人员及时查看自己负责的业务数据库安全相关问题,保护好自己的数据. 二.常用的恢复方式 2.1 利用备份恢复 使用这种方式的前提

AWS S3误操作,官方故障回顾及专家深度思考

继Gitlab的误删除数据事件没几天,"不沉航母" AWS S3(Simple Storage Service)几天前也"沉"了4个小时,墙外的半个互联网也跟着挂了.如约,按AWS惯例,AWS给出了一个简单的故障报告<Summary of the Amazon S3 Service Disruption in the Northern Virginia (US-EAST-1) Region>.这个故障简单来说和Gitlab一样,也是人员误操作.先简单说一

详解MySQL误操作后怎样进行数据恢复_Mysql

一.开启binlog. 首先查看binlog是否开启 mysql> show variables like "log_bin"; +---------------+-------+ |Variable_name | Value +---------------+-------+ | log_bin OFF +---------------+-------+ 1 row in set (0.00 sec) 值为OFF,需开启,开启binlog方式如下: #vim /etc/my.c

Mysql中IFNULL与IN操作

  Mysql IFNULL操作 项目中用到的,当SQL查询某个字段为空的时候,查询结果中设置其值为默认值.最笨的方法当然是对查询结果进行处理了,遍历查询结果,当为空的时候,设置其值:  代码如下   $len=count($result); for($i=0;$i<$len ;$i++){     $var = $result[$i]['name'];  if(!$var){   $result[$i]['name']='default_name';  } } 如上办法,不仅费时,还??隆H绻