mysql temporary_MYSQL中的CREATE TEMPORARY TABLE
记录一下今天的一个BUG FIXING。早上收到一个BUG,说有一个到模块A的调用B,多执行几次以后就会出错。错误信息显示SQL ERROR。因为CDC SBE就我最近改过模块A的代码,就把BUG塞给我了。
Trouble Shooting的过程:
先检查error log, 没有发现明显问题。于是我把debug log打开后重起模块A,然后手动执行那个调用B,于是我从debug log中拿到了调用B所对应的函数名称。
拿到模块A中的函数名称,我搜索源代码,检查最近有没有人修改过这部分代码。发现没有人改过。查看源代码(当然debug log中也有记录)拿到函数调用B所invoke的store procedure call — CALL SP_arrowpig(30, 1, @retCode); 检查最近有没有人修改了和SP_arrowpig有关的SQL,发现也没有。所以我把这个BUG转嫁给别的替罪羊的想法告吹。(因为如果我发现有谁最近修改了跟出错部分相关的代码的话,我就可以把他拖进来跟我一起查)
现在只能靠自己了。这时候anusheel同学忽然跳进来,说他已经把那个出错的store procedure在command下运行了好几次,头几次是好的,多运行几次就出错了,怀疑是 mysql本身的bug,并且说以前在production环境下也碰到过,他们解决问题的方法是重新启动mysql服务进程。
我也执行了一下,确实像anusheel同学说的那样子,出错信息是这样的:
mysql> CALL SP_arrowpig(30,0,@retCode); select @retCode;
+————–+—————-+———————+
| ErrorPattern | ErrorName | ErrorStr |
+————–+—————-+———————+
| SQL Error | SP_arrowpig | When Doing Task 1 |
+————–+—————————————+
1 row in set (0.01 sec)
Query OK, 0 rows affected, 2 warnings (0.01 sec)
+———-+
| @retCode |
+———-+
| 1 |
+———-+
1 row in set (0.00 sec)
@retCode=1,确实是出错了,我们的编程惯例是retCode=0表示成功的。然后我开始看源代码:
DROP PROCEDURE IF EXISTS SP_arrowpig//
CREATE PROCEDURE SP_arrowpig(IN id INT, IN mode INT, OUT status INT)
…
BEGIN
DECLARE current_id INT;
DECLARE err_str CHAR(255);
DECLARE EXIT HANDLER FOR SQLEXCEPTIONBEGIN
SET status = 1; CALL SP_errmsg("SQL Error","SP_arrowpig",err_str); –和上面的出错信息匹配上了
END;
SET status=0;
SET current_id=id;
arrowpig_label: LOOP
BEGIN
IF mode=1 THEN
SET err_str="When Doing Task 1"; — 出错信息
CREATE TEMPORARY TABLE IF NOT EXISTS sp_output_tmp ENGINE = MEMORY SELECT …from … where ID=current_id;
ELSE
SET err_str="When Doing Task 2"; — 出错信息
CREATE TEMPORARY TABLE IF NOT EXISTS sp_output_tmp ENGINE = MEMORY SELECT ..from … where ID=current_id;
END IF;
SET @parent_id=NULL;
SELECT `Parent` INTO @parent_id FROM … WHERE `Uid`=current_id; — 找到父亲节点后继续循环
SET current_id=@parent_id;
IF ISNULL(current_id) THEN LEAVE arrowpig_label; END IF;
END;
END LOOP; –一个Loop循环
END //
结合源代码和出错信息,我有了以下结论:
程序出错是因为遇到了SQL Exception而产生的。
出错语句是mode=1中的那个create temporary table if not exists…
这里是个Loop循环,为了确定出错的时候current_id的值,我在每次循环进来的地方放了一条select current_id;然后我得到在出错的时候current_id=31。
因为SQL Exception没有给我更多的信息,在我得到了current_id=30以后,我手工运行了下面的SQL:
mysql> create temporary table if not exists sp_output_tmp engine=memory select … from … where ID=31;
ERROR 1114 (HY000): The table ‘sp_output_tmp’ is full
这个时候Alex上线了,我让他登录到同样的server上看看,但是Alex跟我说运行同样的sp,他没有看到任何错误,我晕!
我很奇怪,sp_output_tmp怎么会full的呢,Alex跟我运行同样的东东,怎么就没有错呢?我查了一下mysql的文档,发现create temporary table if not exists … engine=memory select … 有以下特点:跟在create table if not exists sp_output_tmp后面的select语句实际上的效果就是往sp_output_tmp里面插入记录。如果没有sp_output_tmp表,就创建一个,如果该表已经存在,就插入。我用desc sp_output_tmp看了一下,没有任何约束。而且在SP_arrowpig中我没有看到任何drop或者truncate的操作,我不放心,grep了整个SQL文件,都没有看到drop/truncate的操作。这就是说,每次调用SP_arrowpig,sp_output_tmp表都会长大,直到full后报错。
temporary表只对当前连接有效,也就是说当我log off的时候,从我log in的那刻起所创建的任何temporary table都会报废。temporary table是connection的私有财产。所以说当Alex log in后,他看到的sp_output_tmp和我看到的不是同一个实例,虽然表名字是一样的。于是我要求Alex再多调用几次SP_arrowpig后,他也看到了同样的错误了。
最后的解决其实很简单:我在SP_arrowpig中进入循环之前,放了一条:
DROP TEMPORARY TABLE IF EXISTS sp_output_tmp;
我们就再也没有看到那条错误了,这里要说明一点,我为什么使用drop而不是 truncate呢?原因是在mode=1和<>1的时候,代码中select的字段是不一样的。truncate的时候不会更改表结构,为了能让参数mode在不同的值得时候都能正常工作,我使用了drop。
mysql temporary_MYSQL中的CREATE TEMPORARY TABLE相关推荐
- mysql temporary table select_MYSQL中的CREATE TEMPORARY TABLE | 学步园
记录一下今天的一个BUG FIXING.早上收到一个BUG,说有一个到模块A的调用B,多执行几次以后就会出错.错误信息显示SQL ERROR.因为CDC SBE就我最近改过模块A的代码,就把BUG塞给 ...
- mysql temporary_MySQL中临时表(TEMPORARY)
首先来看看官网给的有关MySQL的临时表的简介: In MySQL, a temporary table is a special type of table that allows you to s ...
- mysql temporary_MySQL中的两种临时表
http://mysql.taobao.org/monthly/2016/06/07/ 外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表.这种临时表 ...
- spark报错:CREATE TEMPORARY TABLE
异常信息: 2022-02-09 03:14:01 INFO Error in query: 2022-02-09 03:14:01 INFO CREATE TEMPORARY TABLE is no ...
- mysql中temporary_MySQL的复制和临时表(Temporary Table)
当你创建临时表的时候,你可以使用temporary关键字.如: create temporary table tmp_table(name varchar(10) not null,passwd ch ...
- mysql temporary_mysql – 如何在同一个查询中多次引用TEMPORARY表?
MySQL文档说:"你不能在同一个查询中多次引用TEMPORARY表." 我知道之前有人问过这件事.但我无法找到以下具体解决方案. 我正在预选一张临时表 CREATE TEMPOR ...
- mysql global temporary table_【转】MySQL Temporary Table相关问题的探究
本文转载自:http://itindex.net/detail/10901-mysql-temporary-table 问题的引入 让我们先来观察几条非常简单的MySQL语句: mysql> c ...
- mysql 建表 title create table_mysql中create命令建表sql语句
MySQL中create table语句的基本语法是: 代码如下 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definiti ...
- 简单聊聊MySQL临时表(TEMPORARY TABLE)
目录什么的也不需要 一.什么是临时表 二.临时表有哪些类型 1.内部临时表: 2.外部临时表: 三.对外部临时表说两句 四.执行验证 一.什么是临时表 MySQL临时表在很多场景中都会用到,MySQL ...
最新文章
- 如何在谷歌云平台上部署可解释性模型
- codeforce 570 problem E 51Nod-1503-猪和回文
- 如何打造高效的多任务、高并发的网络服务器系统?
- LeetCode 51 N 皇后
- java程序在内存中的存储分配
- springboot templates读取不到_精通 Spring Boot 系列 04
- 《大道至简》最后两章读后感
- 从数据库中获得表的字段和描述信息
- 2009年统考计算机考研真题
- jupyter notebook安装后无法连接到ubuntu gpu环境
- 机器视觉——目标跟踪
- 机器人操作系统ROS简介
- bugku never_give_up file_get_contents()有php://input漏洞 eregi \x00绕过
- 论文阅读——INSIDER:Designing In-Storage Computing System for Emerging High-Performance Drive
- _snprintf_s与_snprintf
- 十大python培训机构
- [转]:职场不得不知的4大潜规则
- Python玩家使用B站开源项目Real-CUGAN修复动漫图片、视频
- 修改项目启动输出日志格式
- 微软2019校招面试题
热门文章
- 微信可以找回删除的好友吗?
- 飞扬的小鸟JavaScript实现
- 一键清除本地缓存的所有无用的docker镜像命令
- WS_EX_TOOLWINDOW导致的窗口一直不能在前面
- Python打开读文件:UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xed in position 7014: invalid conti
- Keil MDK使用第11篇---keil炫酷颜色主题
- java连接数据库用户 'sa' 登录失败。 ClientConnectionId:解决方法
- 部门来了个跳槽出来的测试开发,听说是00后,上来一顿操作给我看呆了...
- android 闹钟运行原理,简单 闹钟 实现 原理
- java仿QQ微信聊天室