IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

concat和outfile妙用

MySQLOPS 数据库与运维自动化技术分享 2012-03-11 22:44:36 累计浏览 1,796 次
本机暂存

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

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,252)
  2. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,401)
  3. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  4. Mysql监控指南 (累计阅读 21,352)
  5. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,523)
  6. 如何查找消耗资源较大的SQL (累计阅读 15,212)
  7. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 13,058)
  8. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  9. 浅谈MySQL索引背后的数据结构及算法 (累计阅读 11,909)
  10. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,709)