MYSQL中的CREATE TEMPORARY TABLE

2023-10-27

记录一下今天的一个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 SQLEXCEPTION BEGIN
             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 … 有以下特点:
    1. 跟在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后报错。
    2. 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。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MYSQL中的CREATE TEMPORARY TABLE 的相关文章

  • Scala 中抛出异常,什么是“官方规则”

    我正在 Coursera 上学习 Scala 课程 我也开始阅读 Odersky 的 Scala 书 我经常听到的是 在函数式语言中抛出异常不是一个好主意 因为它破坏了控制流 并且我们通常返回一个失败或成功的 Either Scala 2
  • PDO 库比本机 MySQL 函数更快吗?

    我已经阅读了几个与此相关的问题 但我担心它们可能已经过时 因为自这些问题得到解答以来 更新版本的 PDO 库已经发布 我编写了一个 MySQL 类 它构建查询并转义参数 然后根据查询返回结果 目前这个类正在使用内置的mysql函数 我很清楚
  • SQL:将现有列设置为 MySQL 中的主键

    我有一个包含 3 列的数据库 id name somethingelse 该表没有设置索引 我收到 未定义索引 在 phpmyadmin 中id 是一个 7 位字母数字值 每行都是唯一的 我想将 Drugid 设置为主键 索引 我不知道有没
  • 使用子查询与 LEFT JOIN 一起选择 MAX 值

    我有一个获取搜索结果的查询 效果很好 查询成功示例 SELECT individuals individual id individuals unique id TIMESTAMPDIFF YEAR individuals day of b
  • MySQL 连接不工作:2002 没有这样的文件或目录

    我正在尝试设置 WordPress 我已经运行了 Apache 和 MySQL 并且帐户和数据库都已设置 我尝试建立一个简单的连接 我总是得到这个 错误 2002 没有这样的文件或 目录 它正在谈论什么文件或目录 我使用的是 OS X Sn
  • 使用 Python 开发时保护 MySQL 密码?

    我正在编写一个使用本地托管的 MySQL 数据库的 Python 脚本 该程序将以源代码形式提供 这样 MySQL 密码就肉眼可见 有没有好的办法来保护这个呢 这个想法是为了防止一些顽皮的人查看源代码 直接访问 MySQL 并做一些事情 好
  • 我应该保留远程数据库的本地副本吗?

    我正在开发一个应用程序 基本上允许人们创建 加入和管理其他人的群组 群组内的人也可以互相发送消息 我一直在想哪条路会更好 保留包含所有信息的远程数据库 包括发送给用户和从用户发送的消息 并让应用程序在每次需要信息时查询服务器 甚至是它以前见
  • _mysql_connector.MySQLInterfaceError:命令不同步;您现在无法运行此命令 python msql.connector

    我有一个功能 您可以在下面看到 如果运行此函数 我将收到您在标题中看到的错误 您能帮助我吗 不久前我能够用锁解决这个问题 但现在它们不起作用 我知道这与我的连接有关 但我不知道如何解决这个问题 def insertNewValues sel
  • MySQL 查询获取每小时计数

    我需要统计每小时发生的操作次数 我的数据库按操作的时间戳保存日志 我明白我可以做一个 SELECT table time COUNT table time from table t group by t time 然而 也有一段时间没有采取
  • 测验程序的 MySql 数据库设计

    我目前正在开发一个项目 主要是创建一个测验应用程序 它将能够进行包含 10 到 20 个问题的多项选择题或简答题的测验 它需要能够根据正确答案检查用户的答案 然后对用户的答案进行评分 稍后 我可能会实现一个后端功能来在线创建测验 但现在我将
  • MySQL:记录之间的平均间隔

    假设这张表 id date 1 2010 12 12 2 2010 12 13 3 2010 12 18 4 2010 12 22 5 2010 12 23 如何仅使用 MySQL 查询找到这些日期之间的平均间隔 例如 此表上的计算将是 2
  • dalvikvm中Android异常

    当我在手机上启动应用程序时 我从日志中收到很多以下错误 E dalvikvm 2052 No free temp registers E dalvikvm 2052 Jit aborting trace compilation revert
  • 错误代码:1822(当数据类型匹配且具有复合键时)

    得到一个 错误代码 1822 添加外键约束失败 丢失的 引用表中约束 subject ibfk 1 的索引 注册 当尝试创建subject桌子 问题是 错误并没有出现在上一张表上student 数据类型相同 并且定义了主键 两者都会出现此错
  • Navicat utf8 不适用于 mysql 数据库

    我目前正在尝试合并两个不同步的表达式引擎数据库之间的数据更改 为此我选择使用 navicat 该网站在模板中大量使用希腊字符集 当我在 phpmyadmin 中查看希腊语表字段数据时 我按预期看到了希腊语字符 当我将它们加载到 Navica
  • 如何删除非空约束?

    假设创建了一个表 如下所示 create table testTable colA int not null 您将如何删除非空约束 我正在寻找类似的东西 ALTER TABLE testTable ALTER COLUMN colA DRO
  • 在关系数据库中存储树结构的已知方法有哪些? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PHP mysql_num_rows 死错误

    我想创建一个页面 用户可以在其中添加他们的信息 我已经创建了该页面 但我真正的问题是代码 我有一些问题 这部分代码
  • Java/Hibernate - 异常:内部连接池已达到其最大大小,当前没有可用的连接

    我第一次在大学项目中使用 Hibernate 而且我还是个新手 我想我遵循了我的教授和我阅读的一些教程给出的所有指示 但我不断收到标题中的异常 Exception in thread main org hibernate Hibernate
  • mysql中的按位移位

    如何在 MySQL 中进行按位移位 有没有具体的指令或者操作符 如果不是 如何最佳地模拟它 看一下按位运算符MySQL first http dev mysql com doc refman 5 0 en bit functions htm
  • 如何使组合键唯一?

    I am making a database of students in one school Here is what I have so far 如果您不喜欢阅读 请跳至 简而言之 部分 问题是我对这个设计并不满意 我想要的组合gra

随机推荐

  • odoo查看用户有没有某个权限

    查看用户在不在某个权限组 self env user has group 模块名 权限组id 或者 self user has groups 模块名 权限组id 示例
  • Mybatis 面试题,你想知道的都在这里了!

    1 和 的区别是什么 注 这道题是面试官面试我同事的 答 是 P r o p e r t
  • 对比学习系列论文COST(二):

    快速预览 0 ABSTRACT 0 1逐句翻译 0 2总结 1 INTRODUCTION 1 1 逐句翻译 第一段 介绍序列流预测的事情 现在都用强有力的非线性层来进行学习并取得好效果 第二段 但是这些逐渐复杂的网络 加剧了过拟合等问题 因
  • QSharedMemory

    QSharedMemory 类提供了对一段共享内存的访问 既提供了被多进程和多线程共享的一段内存的访问 也为单线程或单进程锁定内存以实现互斥访问提供了方法 这个类在不同操作系统的使用是有差异的 这里只说下载windows下的 在window
  • ant-design-vue的兼容问题2

    问题 ant design vue不兼容ie浏览器 要求 ie兼容 gt 9 环境 vue cli 4 5 4 ant design vue 1 6 4 之前写了一篇博文解决ant design vue的兼容 由于 vue cli搭建项目升
  • S7 200 smart高速计数功能应用

    高速计数功能应用 https ke qq com course package 26452 单相 只有一个输入 I0 0 进高速计数端 用于频率比较高的场景 双相 有两个输入 I0 0 I0 1 一个是增计数 一个是减计数 A B相 适用于
  • pytorch和GPU有关操作(CUDA)

    使用GPU前 我们首先需要查看GPU信息 这可以通过如下命令实现 watch nvidia smi 输出如下 可以看到总共有两块3090显卡 一 设定计算设备 默认情况下Pytorch将数据创建在内存 然后利用CPU进行计算 所以我们我们需
  • PL/SQL中执行按钮变为灰色后如何恢复【已解决】

    PL SQL中执行按钮变为灰色后如何恢复 已解决 最近向数据库中导数据 结果PL SQL卡住半天没有反应 我就杀死了PL SQL的进程 再一次打开数据时 发现执行按钮被置灰了 没有办法执行sql 解决方法 随便写一行sql语句 按下键盘F8
  • Vue3 模糊搜索

    1
  • 爬虫基础入门(4)简单模拟登录

    本节我们介绍使用爬虫进行美食杰网站的模拟登录 首先我们找到美食杰的登录界面的url以及headers cookie from urllib import request 首先我们导入request库和cookie库 from http co
  • Bubble冒泡排序

    原谅我偷懒 是真的没有什么写的内容了啊 我都好怀疑他们那些大佬是怎么那么多的文章和技术分享的 我要自闭了 时间复杂度O n2 C 的内置排序函数使用的并非冒泡而是快排 Git地址 public override void SortOrder
  • chatGPT写小游戏1分钟一个,快到起飞

    猜数字游戏的规则是电脑随机生成一个1到100之间的整数 玩家需要猜测这个数字是多少 电脑会提示玩家猜的数字是偏大还是偏小 直到猜中为止 下面是代码示例 import random num random randint 1 100 guess
  • argparse模块的用法

    argparse模块的用法 示例 创建解析器 添加参数 解析参数 ArgumentParser对象 编程 用法 说明 parents formatter class 版本3 5中的新功能 版本 3 2中的新功能 源代码 Lib argpar
  • 用神经辐射场在大场景中漫游

    目录 前言 介绍 背景 改进 NeRF 以编码大型场景 在训练数据中获得足够的观点 动态对象移除 应用 结论 参考 前言 最近一直在做NeRF相关工作 偶然看到台湾智慧实验室一篇文章 Hovering Around a Large Scen
  • 毕业设计 基于单片机的多功能遥控器设计

    0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求 为了大家能够顺利以及最少的精力通过毕设 学长分享优质毕业设计项
  • unity 获取复杂物体(模型)中心点

    Unity 获取复杂物体 模型 中心点 1 获取物体中心点 public Vector3 GetCenter GameObject target Renderer mrs target gameObject GetComponentsInC
  • 阿里云云效:代码提交使用

    最近采用阿里云的云效作为管理工具之一 确实蛮不错自动化部署自动化合并代码 但是还是有一定的不同之处 比如我今天提交代码 编码五分钟提交大半天 找了别人也不清楚什么问题 其实是搞错了人家的代码发布流程 首先提交代码第一步 云效创建分支 云效最
  • CSS实现旋转风车

    CSS实现旋转风车 使用css实现旋转风车主要是运用border和css动画来实现的 效果图如下 一 制作风车 首先观察风车是由8个相等形状大小的三角形旋转组成的 可以发现都是围绕一个中心点旋转组成的 所以我们可以先用border画出一个中
  • 系统管理员设置了系统策略禁止进行此安装怎么解决

    最近一位用户在电脑下载安装软件时 系统出现提示 系统管理员设置了系统策略 禁止进行此安装 这该怎么办呢 既然系统管理员禁止了程序安装 那么我们只要开启相应的安装权限就可以了 下面 小编给大家讲解系统管理员设置了系统策略禁止进行此安装的处理方
  • MYSQL中的CREATE TEMPORARY TABLE

    Posted on 八月 19 2008 by arrowpig1979 记录一下今天的一个BUG FIXING 早上收到一个BUG 说有一个到模块A的调用B 多执行几次以后就会出错 错误信息显示SQL ERROR 因为CDC SBE就我最