原标题:利用 MySQL 自身错误诊断区域-爱可生

背景

本篇文章来源于今天客户问的一个问题。

问题大概意思是:我正在从 Oracle 迁移到 MySQL,数据已经转换为单纯的 INSERT 语句。由于语句很多,每次导入的时候不知道怎么定位到错误的语句。 如果 INSERT 语句少也就罢了,我可以手工看,不过 INSERT 语句很多,我怎么定位到是哪些语句出错了,我好改正呢?总不能每次遇到的错误的时候改一下,再重新运行继续改正吧?有没有简单点的方法。

其实 MySQL 自身就有错误诊断区域,如果能好好利用,则事半功倍。

演示

下面我来简单说下怎么使用错误诊断区域。

比如说我要插入的表结构为 n3,保存错误信息的日志表为 error_log 两个表结构如下:

-- tables definition.

[ytt]>create table n3 (id int not null, id2 int generated always as ((mod(id,10))));

Query OK, 0 rows affected (0.04 sec)

[ytt]>create table error_log (sqltext text, error_no int unsigned, error_message text);

Query OK, 0 rows affected (0.04 sec)

假设插入的语句,为了演示,我这里仅仅简单写了 8 条语句。

-- statements body.

set @a1 = "INSERT INTO n3 (id) VALUES(100)";

set @a2 = "INSERT INTO n3 (id) VALUES('test')";

set @a3 = "INSERT INTO n3 (id) VALUES('test123')";

set @a4 = "INSERT INTO n3 (id) VALUES('123test')";

set @a5 = "INSERT INTO n3 (id) VALUES(200)";

set @a6 = "INSERT INTO n3 (id) VALUES(500)";

set @a7 = "INSERT INTO n3 (id) VALUES(null)";

set @a8 = "INSERT INTO n3 (id) VALUES(10000000000000)";

MySQL 的错误代码很多,不过总体归为三类:

sqlwarning SQLSTATE 代码开始为 '01'

not found SQLSTATE 代码开始为 '02'

sqlexception SQLSTATE 代码开始非 '00','01','02' 的所有错误代码。

为了简单方便,我们写这些代码到存储过程里。以下为示例存储过程。

-- stored routines body.

drop procedure if exists sp_insert_simple;

delimiter ||

create procedure sp_insert_simple()

l1:begin

DECLARE i,j TINYINT DEFAULT 1; -- loop counter.

DECLARE v_errcount,v_errno INT DEFAULT 0; -- error count and error number.

DECLARE v_msg TEXT; -- error details.

declare v_sql json; -- store statements list.

declare v_sql_keys varchar(100); -- array index.

declare v_sql_length int unsigned; -- array length.

-- Handler declare.

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND -- exception in mysql routines.

l2:BEGIN

get stacked diagnostics v_errcount = number;

set j = 1;

WHILE j <= v_errcount

do

GET stacked DIAGNOSTICS CONDITION j v_errno = MYSQL_ERRNO, v_msg = MESSAGE_TEXT;

-- record error messages into table.

INSERT INTO error_log(sqltext,error_no,error_message) VALUES (@sqltext, v_errno,v_msg);

SET j = j + 1;

END WHILE;

end;

-- sample statements array.

set v_sql = '{

"a1": "INSERT INTO n3 (id) VALUES(100)",

"a2": "INSERT INTO n3 (id) VALUES(''test'')",

"a3": "INSERT INTO n3 (id) VALUES(''test123'')",

"a4": "INSERT INTO n3 (id) VALUES(''123test'')",

"a5": "INSERT INTO n3 (id) VALUES(200)",

"a6": "INSERT INTO n3 (id) VALUES(500)",

"a7": "INSERT INTO n3 (id) VALUES(null)",

"a8": "INSERT INTO n3 (id) VALUES(10000000000000)"

}';

set i = 1;

set v_sql_length = json_length(v_sql);

while i <=v_sql_length do

set v_sql_keys = concat('$.a',i);

set @sqltext = replace(json_extract(v_sql,v_sql_keys),'"','');

prepare s1 from @sqltext;

execute s1;

set i = i + 1;

end while;

drop prepare s1;

-- invoke procedure.

-- call sp_insert_simple;

end;

delimiter ;

我们来调用这个存储过程看下结果。

[(none)]>use ytt

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

[ytt]>call sp_insert_simple;

Query OK, 0 rows affected (0.05 sec)

表N3的结果。

[ytt]>select * from n3;

+-----+------+

| id | id2 |

+-----+------+

| 100 | 0 |

| 200 | 0 |

| 500 | 0 |

+-----+------+

3 rows in set (0.00 sec)

错误日志记录了所有错误的语句。

[ytt]>select * from error_log;

+--------------------------------------------+----------+-------------------------------------------------------------+

| sqltext | error_no | error_message |

+--------------------------------------------+----------+-------------------------------------------------------------+

| INSERT INTO n3 (id) VALUES('test') | 1366 | Incorrect integer value: 'test' for column 'id' at row 1 |

| INSERT INTO n3 (id) VALUES('test123') | 1366 | Incorrect integer value: 'test123' for column 'id' at row 1 |

| INSERT INTO n3 (id) VALUES('123test') | 1265 | Data truncated for column 'id' at row 1 |

| INSERT INTO n3 (id) VALUES(null) | 1048 | Column 'id' cannot be null |

| INSERT INTO n3 (id) VALUES(10000000000000) | 1264 | Out of range value for column 'id' at row 1 |

+--------------------------------------------+----------+-------------------------------------------------------------+

5 rows in set (0.00 sec)

其实这个问题如果用 Python 或 PHP 等外部语言来说,将会更简单,思路差不多。

关键字:爱可生、MySQL数据库、数据库运维管理、开源数据库解决方案返回搜狐,查看更多

责任编辑:

mysql insert 错误码_利用 MySQL 自身错误诊断区域-爱可生相关推荐

  1. mysql报错注入_关于Mysql注入过程中的三种报错方式

    放点原来的笔记,Mysql在执行语句的时候会抛出异常信息信息,而php+mysql架构的网站往往又将错误代码显示在页面上,这样可以通过构造如下三种方法获取特定数据. 实际测试环境: Default m ...

  2. mysql触发器生成流水_利用mysql触发器生成流水号

    http://blog.csdn.net/bluestream/article/details/5755176 利用mysql触发器可以生成如日期(20100721)+编号(0001)的流水号,编号每 ...

  3. mysql小王 保密_利用mysql的注射点得到更多mysql的信息

    当注射mysql库的输入点的时候,我们可以通过version()/user()/database()/password()等内置函数来得到mysql的相关信息,其实我们在注射的时候可以利用mysql内 ...

  4. mysql 读取data文件_利用mysql的LOAD DATA INFILE的功能读取客户端文件

    前言:今天在浏览某知论坛时,看到某大佬在渗透过程中使用伪造的MySQL服务端读取客户端文件,此大佬在利用过程中描述得不是很详细,作为小白的我看不懂啊,由此产生了此篇文章. 某大佬文章:https:// ...

  5. mysql报错乱码_连接mysql服务器报错时,出现乱码

    页头用了 header('content-type:text/html;charset=utf-8'); try { $this->dbo=new PDO($dsn,$dbuser,$dbpas ...

  6. mysql insert 乐观锁_【mysql】关于乐观锁

    一.乐观锁介绍 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检,乐观锁适用于 ...

  7. 什么是mysql显错注入_十种MYSQL显错注入原理讲解(三)

    这回间隔时间有点长了,年前年后忙的头晕眼花,外加大病.下面我继续讲解. 1.multipolygon() select * from test where id=1 and multipolygon( ...

  8. mysql 添加int列_在MySQL中现有的int列的值中添加字符?

    要将字符添加到现有的int列值中,请使用MySQL CONCAT().让我们首先创建一个表-mysql> create table DemoTable ( Amount int ); 使用插入命 ...

  9. mysql zerofill设置方法_在MySQL中使用ZEROFILL设置自定义自动增量

    让我们首先创建一个表.这里.我们使用ZEROFILL和AUTO_INCREMENT设置了UserId列mysql> create table DemoTable1831 ( UserId int ...

最新文章

  1. 树莓派上操作环境安装配置
  2. php 服务器方案,分享几种常见WEB服务器配置方案
  3. Maven工程的分类
  4. 函数计算 GB 镜像秒级启动:下一代软硬件架构协同优化
  5. 把字符串按照某几个字符切割成数组
  6. 使用CablleStatement调用存储过程
  7. mongodb之索引使用小结
  8. 1. jenkins常见错误及解决方法
  9. 西安交大传热学大作业matlab,西安交通大学传热学大作业二维温度场热电比拟实验.doc...
  10. Qt5 自创简单音乐视频播放器(基础版)
  11. Python 【问题描述】按照世卫组织的标准: 男性:(身高cm-80)×70%=标准体重 女性:(身高cm-70)×60%=标准体重 标准体重正负10%为正常体重(含10%) 标准体重正负1
  12. Blue Coat:2015年数据安全趋势七大预测
  13. 我是如何一步步获取房东的WiFi后台管理密码的【社工思路】
  14. 虚幻引擎_矢量场初探
  15. html的详情页面设计,HTML5+CSS3网页设计与制作实用教程 单元7 网页特效与制作商品详情页面(105页)-原创力文档...
  16. Java - Set 接口
  17. JAVA使用JCO实现调用SAP接口方法
  18. Centos 7.x yum安装php5.6.X
  19. iPhone 4与iPad开发基础教程
  20. 中国科学与技术大学计算机考研,中国科学技术大学计算机技术怎么样

热门文章

  1. oracle必须声明标识符函数,引用变量时需要必须声明标识符
  2. oracle—ebs_采购功能点操作手册,oracle—EBS_采购功能点操作手册
  3. [转载] 你真的会用 Java 中的三目运算符吗
  4. [转载] python与c/c++相比有哪些优势
  5. python中 numpy_Python中的Numpy
  6. LTNS的完整形式是什么?
  7. Java FilePermission getActions()方法与示例
  8. jsonp请求html页面,JavaScript中的JSON和JSONP
  9. ucharts 折线 点_ucharts图表引入的两种方式
  10. 使用 Redis 如何实现延迟队列?