技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> MySQL --> concat和outfile妙用

concat和outfile妙用

浏览:1089次  出处信息

    大家有没有接触过这样的需求,采集历史数据库中或者其他数据库中的某些信息,这些信息是另一个服务器需要执行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技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1