MySQL异常处理浅析

MySQL异常处理浅析,第1张

MySQL的异常处理分析如下:

标准格式

DECLARE

handler_type

HANDLER

FOR

condition_value[,...]

statement

handler_type:

CONTINUE

|

EXIT

|

UNDO

--这个暂时不支持

condition_value:

SQLSTATE

[VALUE]

sqlstate_value

|

condition_name

|

SQLWARNING

|

NOT

FOUND

|

SQLEXCEPTION

|

mysql_error_code

condition_value细节

1、常用MYSQL

ERROR

CODE

列表

http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html

更多错误列表见MySQL安装路径下

比如我的/usr/local/mysql/share/mysql/errmsg.txt

说明一下:SQLSTATE

[VALUE]

sqlstate_value这种格式是专门为ANSI

SQL

ODBC以及其他的标准.

并不是所有的MySQL

ERROR

CODE

都映射到SQLSTATE。

2、如果你不想插ERROR

CODE的话,就用速记条件来代替

SQLWARNING

代表所有以01开头的错误代码

NOT

FOUND

代表所有以02开头的错误代码,当然也可以代表一个游标到达数据集的末尾。

SQLEXCEPTION

代表除了SQLWARNING和NOT

FOUND

的所有错误代码

3、我们现在就用手册上的例子

CREATE

TABLE

t

(s1

int,primary

key

(s1))

mysql>

use

t_girl

Database

changed

mysql>

CREATE

TABLE

t

(s1

int,primary

key

(s1))

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

mysql>

mysql>

DELIMITER

||

mysql>

CREATE

PROCEDURE

handlerdemo

()

->

BEGIN

->

DECLARE

EXIT

HANDLER

FOR

SQLSTATE

'23000'

BEGIN

END

--

遇到重复键值就退出

->

SET

@x

=

1

->

INSERT

INTO

t

VALUES

(1)

->

SET

@x

=

2

->

INSERT

INTO

t

VALUES

(1)

->

SET

@x

=

3

->

END||

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

DELIMITER

mysql>

call

handlerdemo()

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

select

@x

+------+

|

@x

|

+------+

|

2

|

+------+

1

row

in

set

(0.00

sec)

mysql>

call

handlerdemo()

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

select

@x

+------+

|

@x

|

+------+

|

1

|

+------+

1

row

in

set

(0.00

sec)

mysql>

现在来看一下遇到错误继续的情况

mysql>

truncate

table

t

Query

OK,

0

rows

affected

(0.01

sec)

mysql>

DELIMITER

$$

mysql>

DROP

PROCEDURE

IF

EXISTS

`t_girl`.`handlerdemo`$$

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

CREATE

DEFINER=`root`@`localhost`

PROCEDURE

`handlerdemo`()

->

BEGIN

->

DECLARE

CONTINUE

HANDLER

FOR

SQLSTATE

'23000'

BEGIN

END

->

SET

@x

=

1

->

INSERT

INTO

t

VALUES

(1)

->

SET

@x

=

2

->

INSERT

INTO

t

VALUES

(1)

->

SET

@x

=

3

->

END$$

Query

OK,

0

rows

affected

(0.01

sec)

mysql>

DELIMITER

mysql>

call

handlerdemo()

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

select

@x

+------+

|

@x

|

+------+

|

3

|

+------+

1

row

in

set

(0.00

sec)

mysql>

call

handlerdemo()

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

select

@x

+------+

|

@x

|

+------+

|

3

|

+------+

1

row

in

set

(0.00

sec)

mysql>

可以看到,始终执行到最后。

当然,上面的SQLSTATE

'23000'可以替换为1062

我们来看一下警告。

mysql>

alter

table

t

add

s2

int

not

null

Query

OK,

0

rows

affected

(0.01

sec)

Records:

0

Duplicates:

0

Warnings:

0

此列没有默认值,插入的时候会出现警告或者1364错误提示。

mysql>

DELIMITER

$$

mysql>

DROP

PROCEDURE

IF

EXISTS

`t_girl`.`handlerdemo`$$

Query

OK,

0

rows

affected,

1

warning

(0.00

sec)

mysql>

CREATE

DEFINER=`root`@`localhost`

PROCEDURE

`handlerdemo`()

->

BEGIN

->

DECLARE

CONTINUE

HANDLER

FOR

1062

BEGIN

END

->

DECLARE

CONTINUE

HANDLER

FOR

SQLWARNING

->

BEGIN

->

update

t

set

s2

=

2

->

END

->

DECLARE

CONTINUE

HANDLER

FOR

1364

->

BEGIN

->

INSERT

INTO

t(s1,s2)

VALUES

(1,3)

->

END

->

SET

@x

=

1

->

INSERT

INTO

t(s1)

VALUES

(1)

->

SET

@x

=

2

->

INSERT

INTO

t(s1)

VALUES

(1)

->

SET

@x

=

3

->

END$$

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

DELIMITER

mysql>

call

handlerdemo()

Query

OK,

0

rows

affected

(0.00

sec)

mysql>

select

*

from

t

+----+----+

|

s1

|

s2

|

+----+----+

|

1

|

3

|

+----+----+

1

row

in

set

(0.00

sec)

遇到错误的时候插入的新记录。

mysql>

select

@x

+------+

|

@x

|

+------+

|

3

|

+------+

1

row

in

set

(0.00

sec)

 服务器错误信息来自下述源文件:

· 错误消息信息列在share/errmsg.txt文件中。“%d”和“%s”分别代表编号和字符串,显示时,它们将被消息值取代。

错误值列在share/errmsg.txt文件中,用于生成include/mysqld_error.h和include/mysqld_ername.h

MySQL源文件中的定义。

· SQLSTATE值列在share/errmsg.txt文件中,用于生成include/sql_state.h

MySQL源文件中的定义。

由于更新很频繁,这些文件中可能包含这里未列出的额外错误消息。

· 错误:1000 SQLSTATE:

HY000 (ER_HASHCHK)

消息:hashchk

· 错误:1001 SQLSTATE: HY000

(ER_NISAMCHK)

消息:isamchk

· 错误:1002 SQLSTATE: HY000 (ER_NO)

消息:NO

· 错误:1003 SQLSTATE: HY000 (ER_YES)

消息:YES

· 错误:1004 SQLSTATE: HY000 (ER_CANT_CREATE_FILE)

消息:无法创建文件'%s'

(errno: %d)

· 错误:1005 SQLSTATE: HY000 (ER_CANT_CREATE_TABLE)

消息:无法创建表'%s' (errno: %d)

· 错误:1006 SQLSTATE: HY000

(ER_CANT_CREATE_DB)

消息:无法创建数据库'%s' (errno: %d)

· 错误:1007

SQLSTATE: HY000 (ER_DB_CREATE_EXISTS)

消息:无法创建数据库'%s',数据库已存在。

·

错误:1008 SQLSTATE: HY000 (ER_DB_DROP_EXISTS)

消息:无法撤销数据库'%s',数据库不存在。

· 错误:1009 SQLSTATE: HY000 (ER_DB_DROP_DELETE)

消息:撤销数据库时出错(无法删除'%s',errno: %d)

· 错误:1010 SQLSTATE: HY000

(ER_DB_DROP_RMDIR)

消息:撤销数据库时出错(can't rmdir '%s', errno: %d)

·

错误:1011 SQLSTATE: HY000 (ER_CANT_DELETE_FILE)

消息:删除'%s'时出错 (errno: %d)

· 错误:1012 SQLSTATE: HY000 (ER_CANT_FIND_SYSTEM_REC)

消息:无法读取系统表中的记录。

· 错误:1013 SQLSTATE: HY000 (ER_CANT_GET_STAT)

消息:无法获取'%s'的状态(errno: %d)

· 错误:1014 SQLSTATE: HY000

(ER_CANT_GET_WD)

消息:无法获得工作目录(errno: %d)

· 错误:1015 SQLSTATE:

HY000 (ER_CANT_LOCK)

消息:无法锁定文件(errno: %d)

· 错误:1016 SQLSTATE:

HY000 (ER_CANT_OPEN_FILE)

消息:无法打开文件:'%s' (errno: %d)

· 错误:1017

SQLSTATE: HY000 (ER_FILE_NOT_FOUND)

消息:无法找到文件: '%s' (errno: %d)

· 错误:1018 SQLSTATE: HY000 (ER_CANT_READ_DIR)

消息:无法读取'%s'的目录

(errno: %d)

· 错误:1019 SQLSTATE: HY000 (ER_CANT_SET_WD)

消息:无法为'%s'更改目录 (errno: %d)

· 错误:1020 SQLSTATE: HY000

(ER_CHECKREAD)

消息:自上次读取以来表'%s'中的记录已改变。

· 错误:1021 SQLSTATE: HY000

(ER_DISK_FULL)

消息:磁盘满(%s);等待某人释放一些空间...

· 错误:1022 SQLSTATE:

23000 (ER_DUP_KEY)

消息:无法写入;复制表'%s'的 键。

· 错误:1023 SQLSTATE: HY000

(ER_ERROR_ON_CLOSE)

消息:关闭'%s'时出错 (errno: %d)

· 错误:1024 SQLSTATE:

HY000 (ER_ERROR_ON_READ)

消息:读取文件'%s'时出错 (errno: %d)

· 错误:1025

SQLSTATE: HY000 (ER_ERROR_ON_RENAME)

消息:将'%s'重命名为'%s'时出错 (errno: %d)

· 错误:1026 SQLSTATE: HY000 (ER_ERROR_ON_WRITE)

消息:写入文件'%s'时出错

(errno: %d)

· 错误:1027 SQLSTATE: HY000 (ER_FILE_USED)

消息:'%s'已锁定,拒绝更改。

· 错误:1028 SQLSTATE: HY000 (ER_FILSORT_ABORT)

消息:分类失败

· 错误:1029 SQLSTATE: HY000 (ER_FORM_NOT_FOUND)

消息:对于'%s',视图'%s'不存在。

· 错误:1030 SQLSTATE: HY000 (ER_GET_ERRNO)

消息:从存储引擎中获得错误%d。

· 错误:1031 SQLSTATE: HY000 (ER_ILLEGAL_HA)

消息:关于'%s'的表存储引擎不含该选项。

· 错误:1032 SQLSTATE: HY000

(ER_KEY_NOT_FOUND)

消息:无法在'%s'中找到记录。

· 错误:1033 SQLSTATE: HY000

(ER_NOT_FORM_FILE)

消息:文件中的不正确信息:'%s'

· 错误:1034 SQLSTATE: HY000

(ER_NOT_KEYFILE)

消息:对于表'%s', 键文件不正确,请尝试修复。

· 错误:1035 SQLSTATE:

HY000 (ER_OLD_KEYFILE)

消息:旧的键文件,对于表'%s',请修复之!

· 错误:1036

SQLSTATE: HY000 (ER_OPEN_AS_READONLY)

消息:表'%s'是只读的。

· 错误:1037

SQLSTATE: HY001 (ER_OUTOFMEMORY)

消息:内存溢出,重启服务器并再次尝试(需要%d字节)。

·

错误:1038 SQLSTATE: HY001 (ER_OUT_OF_SORTMEMORY)

消息:分类内存溢出,增加服务器的分类缓冲区大小。

· 错误:1039 SQLSTATE: HY000 (ER_UNEXPECTED_EOF)

消息:读取文件'%s'时出现意外EOF (errno: %d)

· 错误:1040 SQLSTATE: 08004

(ER_CON_COUNT_ERROR)

消息:连接过多。

· 错误:1041 SQLSTATE: HY000

(ER_OUT_OF_RESOURCES)

消息:内存溢出,请检查是否mysqld或其他进程使用了所有可用内存,如不然,或许应使用'ulimit'允许mysqld使用更多内存,或增加交换空间的大小。

· 错误:1042 SQLSTATE: 08S01 (ER_BAD_HOST_ERROR)

消息:无法获得该地址给出的主机名。

· 错误:1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR)

消息:不良握手

·

错误:1044 SQLSTATE: 42000 (ER_DBACCESS_DENIED_ERROR)

消息:拒绝用户'%s'@'%s'访问数据库'%s'。

· 错误:1045 SQLSTATE: 28000

(ER_ACCESS_DENIED_ERROR)

消息:拒绝用户'%s'@'%s'的访问(使用密码:%s)

· 错误:1046

SQLSTATE: 3D000 (ER_NO_DB_ERROR)

消息:未选择数据库。

· 错误:1047 SQLSTATE:

08S01 (ER_UNKNOWN_COM_ERROR)

消息:未知命令。

· 错误:1048 SQLSTATE: 23000

(ER_BAD_NULL_ERROR)

消息:列'%s'不能为空。

· 错误:1049 SQLSTATE: 42000

(ER_BAD_DB_ERROR)

消息:未知数据库'%s'。

· 错误:1050 SQLSTATE: 42S01

(ER_TABLE_EXISTS_ERROR)

消息:表'%s'已存在。

· 错误:1051 SQLSTATE: 42S02

(ER_BAD_TABLE_ERROR)

消息:未知表'%s'。

· 错误:1052 SQLSTATE: 23000

(ER_NON_UNIQ_ERROR)

消息:%s中的列'%s'不明确。

· 错误:1053 SQLSTATE: 08S01

(ER_SERVER_SHUTDOWN)

消息:在 *** 作过程中服务器关闭。

· 错误:1054 SQLSTATE: 42S22

(ER_BAD_FIELD_ERROR)

消息:'%s'中的未知列'%s'。

· 错误:1055 SQLSTATE: 42000

(ER_WRONG_FIELD_WITH_GROUP)

消息:'%s'不在GROUP BY中。

· 错误:1056

SQLSTATE: 42000 (ER_WRONG_GROUP_FIELD)

消息:无法在'%s'上创建组。

· 错误:1057

SQLSTATE: 42000 (ER_WRONG_SUM_SELECT)

消息:语句中有sum函数和相同语句中的列。

·

错误:1058 SQLSTATE: 21S01 (ER_WRONG_VALUE_COUNT)

消息:列计数不匹配值计数。

·

错误:1059 SQLSTATE: 42000 (ER_TOO_LONG_IDENT)

消息:ID名称'%s'过长。

·

错误:1060 SQLSTATE: 42S21 (ER_DUP_FIELDNAME)

消息:重复列名'%s'。

·

错误:1061 SQLSTATE: 42000 (ER_DUP_KEYNAME)

消息:重复键名称'%s'。

· 错误:1062

SQLSTATE: 23000 (ER_DUP_ENTRY)

消息:键%d的重复条目'%s'。

· 错误:1063

SQLSTATE: 42000 (ER_WRONG_FIELD_SPEC)

消息:对于列'%s',列分类符不正确。

·

错误:1064 SQLSTATE: 42000 (ER_PARSE_ERROR)

消息:在行%d上,%s靠近'%s'。

·

错误:1065 SQLSTATE: 42000 (ER_EMPTY_QUERY)

消息:查询为空。

· 错误:1066

SQLSTATE: 42000 (ER_NONUNIQ_TABLE)

消息:非唯一的表/别名:'%s'

· 错误:1067

SQLSTATE: 42000 (ER_INVALID_DEFAULT)

消息:关于'%s'的无效默认值。

· 错误:1068

SQLSTATE: 42000 (ER_MULTIPLE_PRI_KEY)

消息:定义了多个主键。

一、Can’t connect to MySQL server on ‘localhost’ (10061)

翻译:不能连接到 localhost 上的mysql

分析:这说明“localhost”计算机是存在的,但在这台机器上却没提供MySQL服务。

需要启动这台机器上的MySQL服务,如果机子负载太高没空相应请求也会产生这个错误。

解决:既然没有启动那就去启动这台机子的mysql。如果启动不成功,多数是因为你的my.ini配置的有问题。重新配置其即可。

如果觉得mysql负载异常,可以到mysql/bin 的目录下执行mysqladmin -uroot -p123 processlist来查看mysql当前的进程。

二、Unknown MySQL Server Host ‘localhosadst’ (11001)

翻译:未知的MySQL服务器 localhosadst

分析:服务器 localhosasdst 不存在。或者根本无法连接

解决:仔细检查自己论坛下面的 ./config.inc.php 找到$dbhost重新设置为正确的mysql 服务器地址。

三、Access denied for user: ‘roota@localhost’ (Using password: YES)

翻译:用户 roota 访问 localhost 被拒绝(没有允许通过)

分析:造成这个错误一般数据库用户名和密码相对mysql服务器不正确

解决:仔细检查自己论坛下面的 ./config.inc.php 找到$dbuser、$dbpw核实后重新设置保存即可。

四、Access denied for user: ‘red@localhost’ to database ‘newbbs’

翻译:用户 red 在localhost 服务器上没有权限 *** 作数据库newbbs

分析:这个提示和问题三是不同的。那个是在连接数据库的时候就被阻止了,而这个错误是在对数据库进行 *** 作时引起的。比如在select update等等。这个是因为该用户没有 *** 作数据库相应的权力。比如select 这个 *** 作在mysql.user.Select_priv里记录 Y 可以 *** 作N 不可以 *** 作。

解决:如果是自己的独立主机那么更新mysql.user 的相应用户记录,比如这里要更新的用户为red 。或者直接修改 ./config.inc.php 为其配置一个具有对数据库 *** 作权限的用户

或者通过如下的命令来更新授权grant all privileges on dbname.* to ‘user’@’localhost’ identified by ‘password’

提示:更新了mysql库中的记录一定要重启mysql服务器才能使更新生效

FLUSH PRIVILEGES

五、No Database Selected

翻译:没有数据库被选择上

分析:产生的原因有两种

config.inc.php 里面$dbname设置的不对。致使数据库根本不存在,所以在 $db->select_db($dbname)时返回了false

和上面问题四是一样的,数据库用户没有select权限,同样会导致这样的错误。当你发现config.inc.php的设置没有任何问题,但还是提示这个错误,那一定就是这种情况了。

解决:对症下药

打开config.inc.php 找到$dbname核实重新配置并保存

同问题四的解决方法

六、Can’t open file: ‘xxx_forums.MYI’. (errno: 145)

翻译:不能打开xxx_forums.MYI

问题分析:

这种情况是不能打开 cdb_forums.MYI 造成的,引起这种情况可能的原因有:

1、服务器非正常关机,数据库所在空间已满,或一些其它未知的原因,对数据库表造成了损坏。

2、类 unix *** 作系统下直接将数据库文件拷贝移动会因为文件的属组问题而产生这个错误。

解决方法:

1、修复数据表

可以使用下面的两种方式修复数据表:(第一种方法仅适合独立主机用户)

1)使用 myisamchk ,MySQL 自带了专门用户数据表检查和修复的工具 —— myisamchk 。更改当前目录到 MySQL/bin 下面,一般情况下只有在这个下面才能运行 myisamchk 命令。常用的修复命令为:myisamchk -r 数据文件目录/数据表名.MYI;

2)通过 phpMyAdmin 修复, phpMyAdmin 带有修复数据表的功能,进入到某一个表中后,点击“ *** 作”,在下方的“表维护”中点击“修复表”即可。

注意:以上两种修复方式在执行前一定要备份数据库。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7529751.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存