mysql避免数据库误操作小技巧(转)
避免混淆开发环境的DB和生产环境的DB这在小公司小团队尤其常见。一个人即负责开发,又管DB。桌面上开了一坨终端,有的是开发的DB,有的是生产的DB。一不留神,就写串了,或者粘贴串了。更郁闷的是,有时候粘贴会顺便粘贴SQL最后的回车,这样一贴就执行了。稍有不慎就有大祸。这里最重要的就是用很显眼的方式让开发环境的客户端和生产环境的客户端看起来不一样。有这么几种做法:启动mysql时设定一个特定的prompt。使用--prompt=<string>来给生产环境设置一个特别的提示符。$ mysql -uroot -p --prompt='PRODUCTION> '
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5225
Server version: 8.0.4-rc-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. PRODUCTION> SELECT 1 + 2;
+-------+
| 1 + 2 |
+-------+
| 3 |
+-------+
1 row in set (0.00 sec) PRODUCTION>
这样通过提示就可以看得出来自己在哪。用初始化命令--init-command来初始设置一个MYSQL的变量。之后每次执行之前都要先确定一下这个变量的值。比如:$ mysql -uroot -p --init-command='SET @whereami="production"'
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5227
Server version: 8.0.4-rc-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select @whereami;
+------------+
| @whereami |
+------------+
| production |
+------------+
1 row in set (0.00 sec) mysql>
当然,这个招数不如上一种直观。此外,还有最重要的一个招数,就是用--delimiter=<str>改生产环境的Delimiter。这样就彻底隔绝了将一个普通的SQL贴到终端里直接执行的可能性。$ mysql -uroot -p --delimiter=_D_
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5228
Server version: 8.0.4-rc-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> delete mysql.user;
-> --mysql不认为分号是分隔符
每次执行生产的SQL之前,对SQL进行review后,由DBA将默认的分号替换为专用的分隔符,再贴入执行。这样可以确保万无一失。用事务保护在更新数据和删除数据时,要特别留意比如忘记写where或者写错了where的情况。所以始终要预先确定要更新/删除的行有多少条。但DBA不可能总是清楚即将会变更多少行数据,所以需要由SQL执行的提出者先从生产库上执行select拿到大致要修改的数据量,然后与DBA确认。DBA执行时,应该总是将update/delete语句用事务保护起来:mysql> start transaction;
Query OK, 0 rows affected (0.00 sec) mysql> delete from user;
Query OK, 47823 rows affected (0.12 sec) mysql> -- 核对数据,如果发现搞错了,赶紧回滚
mysql> rollback;
通过核对数据和回滚,可以增加一次自我救赎的机会。即便是在开发环境,做更新和删除时,最好也要用这一招,不要怕麻烦。如果管不住自己的手,可以考虑——使用安全更新模式mysql提供一个参数--safe-updates启用安全更新模式。启动这个模式后,update和delete就必须用主键/唯一索引才能操作。这时,使用泛泛的where条件只能得到一个错误。$ mysql -uroot -p --safe-updates
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5230
Server version: 8.0.4-rc-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> delete from mysql.user;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column mysql>
当然,如果临时你的确想去掉这个模式的保护,不需要重新进入客户端,只需要执行指令SET SQL_SAFE_UPDATES = 0;
就可以临时禁用掉这个保护。执行SET SQL_SAFE_UPDATES = 1;
可以再次开启这个保护模式。MySQL自己图形界面工具Mysql Workbench默认情况下的安全更新模式是打开的。对DROP和TRUNCATE慎之又慎不管在什么环境,要删除表时,永远不要直接删。而是要保证总是把要删的表的表名改了运行一段时间后,程序没有问题,再真的删ALTER TABLE tbl_name RENAME TO tal_name_tobedel
删除数据库时,因为MySQL不支持改数据库的名字,所以要修改所有这个数据库里的表名。但是怎么拿到一个数据库里的所有表名呢?用information_schema。select concat('alter table ', table_name, ' rename to ', table_name, '_tobedel;') as `sql` from information_schema.`TABLES` where TABLE_SCHEMA='mysite';
+------------------------------------------------------------------------------------+
| sql |
+------------------------------------------------------------------------------------+
| alter table user rename to user_tobedel; |
| alter table user_role rename to user_role_tobedel; |
| alter table role rename to role_tobedel; |
+------------------------------------------------------------------------------------+
3 rows in set (0.01 sec)
这样一次性产生所有的改名指令后,直接再执行一遍就大功告成。最终的招数如果真的删除了怎么办?生产库必须得有备份。果断停服务,用备份恢复数据,给用户发抱歉通知。越快越好。如果没有——同时如果你是责任人的话,可以抽空准备简历了。最终的话严于律己,可得永生
mysql避免数据库误操作小技巧(转)的更多相关文章
- DBA必备:MySQL数据库常用操作和技巧
DBA必备:MySQL数据库常用操作和技巧 2011-02-25 15:31 kaduo it168 字号:T | T MySQL数据库可以说是DBA们最常见和常用的数据库之一,为了方便大家使用,老M ...
- MySQL平滑删除数据的小技巧【转】
今天接到一位开发同学的数据操作需求,需求看似很简单,需要执行下面的SQL语句: delete from test_track_log where log_time < '2019-1-7 00: ...
- MySQL【Update误操作】回滚(转)
前言: 继上一篇MySQL[Delete误操作]回滚之后,现在介绍下Update回滚,操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和bi ...
- mysql 使用的三个小技巧
mysql 使用的三个小技巧 快速阅读 Mysql查询工具中如何查询多条语名,Mysql中如何设置变量,Mysql中如何查特定字段,后面再加* Mysql查询工具中如何查询多条语名 默认myslq只能 ...
- ORACLE数据库误操作执行了DELETE,该如何恢复数据?
ORACLE数据库误操作执行了DELETE,该如何恢复数据? 原创 2016年08月11日 17:23:04 10517 作为一个程序员,数据库操作是必须的,但是如果操作失误,一般都会造成比较严重的后 ...
- MySQL中truncate误操作后的数据恢复案例
MySQL中truncate误操作后的数据恢复案例 这篇文章主要介绍了MySQL中truncate误操作后的数据恢复案例,主要是要从日志中定位到truncate操作的地方然后备份之前丢失的数据,需要的 ...
- OMG,12 个精致的 Java 字符串操作小技巧,学它
字符串可以说是 Java 中最具有代表性的类了,似乎没有之一哈,这就好像直播界的李佳琪,脱口秀中的李诞,一等一的大哥地位.不得不承认,最近吐槽大会刷多了,脑子里全是那些段子,写文章都有点不由自主,真的 ...
- MySQL数据库常用操作和技巧
MySQL数据库可以说是DBA们最常见和常用的数据库之一,MySQL的广泛应用,也使更多的人加入到学习它的行列之中.下面是老MySQL DBA总结的MySQL数据库最常见和最常使用的一些经验和技巧,分 ...
- MySQL的delete误操作的快速恢复方法
1. 根据误操作时间定位binlog位置找到数据库的binlog存放位置,当前正在使用的binlog文件里面就有我们要恢复的数据.一般生产环境中的binlog文件都是几百M乃至上G的大小,我们不能逐行 ...
随机推荐
- MySQL在INSERT IGNORE未新增记录时避免AUTO_INCREMENT自增
在MySQL5.7中做INSERT IGNORE时发现, 即使INSERT未成功执行, 表的自增主键却自动加1了, 在某些情况下需要避免这种行为. 需要修改的变量是 innodb_autoinc_lo ...
- PHP访问SQL Server驱动对应关系
引用地址: https://docs.microsoft.com/en-us/sql/connect/php/system-requirements-for-the-php-sql-driver?vi ...
- Spring Boot 2.x 学习专栏
Spring Boot 2.0 入门指南 Spring Boot 2.0 返回JSP页面实战 Spring Boot 2.0 热部署指南 Spring Boot 2.0 整合FreeMarker模板引 ...
- Atitit 如何创新 创新只有在两种条件下发生:自由、效率。
Atitit 如何创新 创新只有在两种条件下发生:自由.效率. 创新是如何发生的呢? 创新只有在两种条件下发生:自由.效率.在自由的环境下,对效率的追逐等于创新.如果你不自由,你的思想不够开阔,你脑洞 ...
- vue中如何动态的绑定图片,vue中通过data返回图片路径
在项目中遇到需要动态的改变图片路径,图片路径并非是从后台获取过来的数据. 因此在data中必须用require加载,否则会当成字符串来处理. 效果:
- RTP推流及验证
[时间:2018-07] [状态:Open] [关键词:rtp,rtcp, ffmpeg,ffplay,sdp,h264,mp2,ts,推流] 近期在学习有关RTP/RTCP的资料,发现看了很多资料, ...
- Open Cygwin at a specific folder
转自:https://stackoverflow.com/questions/9637601/open-cygwin-at-a-specific-folder# When you install Cy ...
- AICODER全栈实习报名
三期班开始报名 三期班定于6月17日开班,实习费用如下: 三个月模式实习费为12000元. 一个月模式实习费为4500元. AICODER提供后付费模式,报名参加AICODER的线下实习3个月模式的朋 ...
- 关于QQ邮箱有时候接受不到邮件的解决
1.很可能是被当作垃圾邮件拦截了,这时候就要自己找回 2.首先点击邮箱首页 3.在最后一行倒数第三个选择自助查询 4.一般在收信查询或者删信查询里面,找到被删的邮件,添加到白名单就好了
- 手机访问PC网站自动跳转到手机版
随着智能手机的流行,4G时代来临,手机用户越来越多,在生活中甚至手机比电脑用的还多,当前开发的网站大都是PC和WAP版并存,但是很少有用户愿意去记住一个网站的两个端的不同域名,所以需要我们做一些设置, ...