十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
MySQL的异常处理分析如下:
创新互联是一家专注于成都网站制作、做网站与策划设计,扶绥网站建设哪家好?创新互联做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:扶绥等地区。扶绥做网站价格咨询:18980820575
标准格式
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
列表
更多错误列表见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,
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,
rows
affected
(0.00
sec)
mysql
DELIMITER
;
mysql
call
handlerdemo();
Query
OK,
rows
affected
(0.00
sec)
mysql
select
@x;
+------+
|
@x
|
+------+
|
2
|
+------+
1
row
in
set
(0.00
sec)
mysql
call
handlerdemo();
Query
OK,
rows
affected
(0.00
sec)
mysql
select
@x;
+------+
|
@x
|
+------+
|
1
|
+------+
1
row
in
set
(0.00
sec)
mysql
现在来看一下遇到错误继续的情况
mysql
truncate
table
t;
Query
OK,
rows
affected
(0.01
sec)
mysql
DELIMITER
$$
mysql
DROP
PROCEDURE
IF
EXISTS
`t_girl`.`handlerdemo`$$
Query
OK,
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,
rows
affected
(0.01
sec)
mysql
DELIMITER
;
mysql
call
handlerdemo();
Query
OK,
rows
affected
(0.00
sec)
mysql
select
@x;
+------+
|
@x
|
+------+
|
3
|
+------+
1
row
in
set
(0.00
sec)
mysql
call
handlerdemo();
Query
OK,
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,
rows
affected
(0.01
sec)
Records:
Duplicates:
Warnings:
此列没有默认值,插入的时候会出现警告或者1364错误提示。
mysql
DELIMITER
$$
mysql
DROP
PROCEDURE
IF
EXISTS
`t_girl`.`handlerdemo`$$
Query
OK,
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,
rows
affected
(0.00
sec)
mysql
DELIMITER
;
mysql
call
handlerdemo();
Query
OK,
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)
一、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 带有修复数据表的功能,进入到某一个表中后,点击“操作”,在下方的“表维护”中点击“修复表”即可。
注意:以上两种修复方式在执行前一定要备份数据库。
以MySQL 8.0 来说,通过查看 8.0 的官方文档得知,8.0 的临时表空间分为会话临时表空间和全局临时表空间,会话临时表空间存储用户创建的临时表和当 InnoDB 配置为磁盘内部临时表的存储引擎时由优化器创建的内部临时表,当会话断开连接时,其临时表空间将被截断并释放回池中;也就是说,在 8.0 中有一个专门的会话临时表空间,当会话被杀掉后,可以回收磁盘空间;而原来的 ibtmp1 是现在的全局临时表空间,存放的是对用户创建的临时表进行更改的回滚段,在 5.7 中 ibtmp1 存放的是用户创建的临时表和磁盘内部临时表;
也就是在 8.0 和 5.7 中 ibtmp1 的用途发生了变化,5.7 版本临时表的数据存放在 ibtmp1 中,在 8.0 版本中临时表的数据存放在会话临时表空间,如果临时表发生更改,更改的 undo 数据存放在 ibtmp1 中;
实验验证:将之前的查询结果保存成临时表,对应会话是 45 号,通过查看对应字典表,可知 45 号会话使用了 temp_8.ibt 这个表空间,通过把查询保存成临时表,可以用到会话临时表空间,如下图:
下一步杀掉 45 号会话,发现 temp_8.ibt 空间释放了,变为了初始大小,状态为非活动的,证明在 mysql8.0 中可以通过杀掉会话来释放临时表空间。
总结:在 mysql5.7 时,杀掉会话,临时表会释放,但是仅仅是在 ibtmp 文件里标记一下,空间是不会释放回操作系统的。如果要释放空间,需要重启数据库;在 mysql8.0 中可以通过杀掉会话来释放临时表空间。
正常的下载和安装教程网上很多,在此不赘述了,下面聊一下碰到的异常情况。
点击execute后,出现图中的叉叉后,不要慌,复制requirement下面的英文名称,在网上搜索下载后,手动安装,安装完成后,再点击back,返回到上一步;然后再点击next,红叉叉全消失了。
下载地址:
尽管满屏广告,但不用担心下载下来后,安装一大堆垃圾!
python正常下载和安装即可,vs如果到官网下,可能速度会很慢很慢,而且那几个版本的文件都比较大,搞不好,会让你下载到怀疑人生,当然,从别的渠道还是能找到资源的。
总结:1、安装的过程中,首先要了解一点英文,否则是很难安装下去的
2、碰到了异常,分析异常产生的原因,能否用其他方法解决?多去思考,多去尝试
3、如果没把握,最好先备份好系统
4、在折腾中提高