博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
concat和outfile妙用
阅读量:7080 次
发布时间:2019-06-28

本文共 961 字,大约阅读时间需要 3 分钟。

  hot3.png

大家有没有接触过这样的需求,采集历史数据库中或者其他数据库中的某些信息,这些信息是另一个服务器需要执行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;

转载于:https://my.oschina.net/jackin/blog/232826

你可能感兴趣的文章
朝花夕拾:linux CentOS 7 安装mysql 5.7.13
查看>>
MyBatis学习总结(五)——实现关联表查询
查看>>
Java基础学习总结(22)——异常处理
查看>>
Java项目命名规范
查看>>
Maven学习总结(二)——Maven项目构建过程练习
查看>>
nginx相同端口多站点配置
查看>>
运维人员监控web服务器常用命令
查看>>
注销Apache
查看>>
修改redo_logfile组成员和大小
查看>>
Maven学习总结(九)——使用Nexus搭建Maven私服
查看>>
Uva 1606
查看>>
普加项目管理甘特图使用--安装部署
查看>>
RabbitMQ学习总结(3)——入门实例教程详解
查看>>
chmod 命令详解
查看>>
鸟哥的linux私房菜-首次登陆与在线求助1
查看>>
layui模板引擎和Tab标签一起使用
查看>>
FastDFS集群(一张图)
查看>>
shell编程(三)--- 条件判断之中括号和整数测试
查看>>
唯一索引和非唯一索引的区别简析
查看>>
JavaScript中几个特殊的对象:window对象、this对象、global对象
查看>>