concat和outfile妙用

你们有没有接触过这样的需求,采集历史数据库中或者其余数据库中的某些信息,这些信息是另外一个服务器须要执行sql的条件。一般咱们的处理手段是把这个信息经过sql找出来或导出,而后使用脚本或者手工拼凑新的新的sql语句。在不少紧急状况下(产品bug、数据错乱)会产生这样的需求,这个时候处理的是在线数据库,不能有一点马虎、若是数据量稍微大一点,DBA们就够焦头烂额了。我以前也屡次碰见这种状况,我把一些经验介绍给你们。 mysql

其实这种状况下使用concat+out file会获得事半功倍的效果。 sql

好比咱们须要找到user表中昨天登陆过的用户,而后修改修改他们的garbage中某个物品的属性。 数据库

因为数据库的结构,只记录用户最后一次登陆的时间,因此当前的数据库中不能肯定昨天哪些用户登陆过。咱们须要从备份中去挖出哪些用户昨天登陆过,而后再 服务器

update garbage set data=value where id=xxx and num=value;

咱们一般的作法是经过sql在备份数据中找到对应的用户id,而后导出到一个文件中,经过脚原本循环取id,自动生成要执行的sql,或者手工生成要执行的sql。 工具

如今咱们使用concat+out file来实现。 code

在重现备份数据的服务器上。 orm

select concat('update garbage set data=value where id=',id,'and num=value;') from user into outfile '/tmp/a.txt';

检查生成的文件之后,在线上服务器直接执行 ssl

source /tmp/a.txt;

这个语句还有一个妙用,用来杀掉processlist中的某些链接,索然maatkit提供了相似的工具,可是仍是没有mysql本身来完成方便。 产品

生成杀链接的语句,固然你能够使用where条件过滤某些类型的链接。 it

select concat('KILL ',id,';') from information_schema.processlist into outfile '/tmp/kill.txt';
source /tmp/kill.txt;
相关文章
相关标签/搜索