concat和outfile妙用
浏览:1145次 出处信息
大家有没有接触过这样的需求,采集历史数据库中或者其他数据库中的某些信息,这些信息是另一个服务器需要执行sql的条件。通常我们的处理手段是把这个信息通过sql找出来或导出,然后使用脚本或者手工拼凑新的新的sql语句。在很多紧急情况下(产品bug、数据错乱)会产生这样的需求,这个时候处理的是在线数据库,不能有一点马虎、如果数据量稍微大一点,DBA们就够焦头烂额了。我之前也多次遇见这种情况,我把一些经验介绍给大家。
其实这种情况下使用concat+out file会得到事半功倍的效果。
比如我们需要找到user表中昨天登录过的用户,然后修改修改他们的garbage中某个物品的属性。
由于数据库的结构,只记录用户最后一次登录的时间,所以当前的数据库中不能确定昨天哪些用户登录过。我们需要从备份中去挖出哪些用户昨天登录过,然后再
update garbage set data=value where id=xxx and num=value;
我们通常的做法是通过sql在备份数据中找到对应的用户id,然后导出到一个文件中,通过脚本来循环取id,自动生成要执行的sql,或者手工生成要执行的sql。
现在我们使用concat+out file来实现。
在重现备份数据的服务器上。
select concat('update garbage set data=value where id=',id,'and num=value;') from user into outfile '/tmp/a.txt';
检查生成的文件以后,在线上服务器直接执行
source /tmp/a.txt;
这个语句还有一个妙用,用来杀掉processlist中的某些连接,索然maatkit提供了类似的工具,但是还是没有mysql自己来完成方便。
生成杀连接的语句,当然你可以使用where条件过滤某些类型的连接。
select concat('KILL ',id,';') from information_schema.processlist into outfile '/tmp/kill.txt'; source /tmp/kill.txt;
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:主从同步失败,报错 1594
后一篇:一个有趣的SQL查询 >>
文章信息
- 作者:ISADBA 来源: MySQLOPS 数据库与运维自动化技术分享
- 标签: concat outfile
- 发布时间:2012-03-11 22:44:36
近3天十大热文
- [69] Twitter/微博客的学习摘要
- [67] IOS安全–浅谈关于IOS加固的几种方法
- [65] 如何拿下简短的域名
- [65] android 开发入门
- [63] find命令的一点注意事项
- [62] Go Reflect 性能
- [61] 流程管理与用户研究
- [60] Oracle MTS模式下 进程地址与会话信
- [59] 图书馆的世界纪录
- [57] 读书笔记-壹百度:百度十年千倍的29条法则