error

error

ERROR 1442 (HY000): Can't update table '...' in stored function/trigger because it is already used

Mysqlliuliangsong 发表了文章 • 0 个评论 • 402 次浏览 • 2016-12-22 16:31 • 来自相关话题

一、MySQL错误现象:MySQL执行创建的触发器时,报如下错误:ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 下面为错误触发器的创建过程:1、创建测试表格:drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)2、创建一个MySQL触发器:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;3、测试触发效果:mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 二、错误原因:  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 三、解决方案:1、将触发器的创建SQL语句改成如下并执行创建即可:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ; 触发器测试效果:aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec) 查看全部

一、MySQL错误现象:

MySQL执行创建的触发器时,报如下错误:
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

 下面为错误触发器的创建过程:

1、创建测试表格:

drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)

2、创建一个MySQL触发器:

DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;

3、测试触发效果:

mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 

二、错误原因:

  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 

三、解决方案:

1、将触发器的创建SQL语句改成如下并执行创建即可:
DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ;
 触发器测试效果:
aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec)

ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist

Mysqlliuliangsong 发表了文章 • 0 个评论 • 787 次浏览 • 2016-12-22 16:08 • 来自相关话题

一、MySQL错误现象:  执行创建的存储过程或者触发器报:ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist 二、错误原因:  这样由于创建存储过程或者触发器时间,指定的DEFINER为'root'@'%',而在MySQL的权限表(mysql.user)中,并不存在相关的user和host:mysql> select host,user,password from mysql.user;
+-------------------------+------+----------+
| host | user | password |
+-------------------------+------+----------+
| localhost | root | |
| aiezu | root | |
| 127.0.0.1 | root | |
| ::1 | root | |
| localhost | | |
| aiezu | | |
+-------------------------+------+----------+ 三、解决方案:  执行下面SQL语句,为'root'@'%'授权即可:grant all privileges on *.* to 'root'@'%' identified by ".";
flush privileges;

select host,user,password from mysql.user; 
执行效果: 查看全部

一、MySQL错误现象:

  执行创建的存储过程或者触发器报:
ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist
 

二、错误原因:

  这样由于创建存储过程或者触发器时间,指定的DEFINER'root'@'%',而在MySQL的权限表(mysql.user)中,并不存在相关的userhost
mysql> select host,user,password from mysql.user;
+-------------------------+------+----------+
| host | user | password |
+-------------------------+------+----------+
| localhost | root | |
| aiezu | root | |
| 127.0.0.1 | root | |
| ::1 | root | |
| localhost | | |
| aiezu | | |
+-------------------------+------+----------+
 

三、解决方案:

  执行下面SQL语句,为'root'@'%'授权即可:
grant all privileges on *.* to 'root'@'%' identified by ".";
flush privileges;

select host,user,password from mysql.user;
 
执行效果:
mysql_error_1449_hy000.png

Starting MySQL. ERROR! The server quit without updating PID file

Linuxliuliangsong 发表了文章 • 0 个评论 • 612 次浏览 • 2016-11-30 17:59 • 来自相关话题

  今天安装好MySQL数据库后,在启动数据库时提示下面错误:[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid). 
解决思路:
  遇到问题,在错误信息显示得不够完善的情况下,我们第一个应该想到的是看日志;mysql的日志在哪里呢?看“/etc/my.cnf”配置文件中的“log-error=”项,如“log-error=/var/log/mysqld.log”则日志文件在“/var/log/mysqld.log”。

  在日志文件中,我们看到了类似下列信息:2016-11-30 22:53:29 2908 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)
2016-11-30 22:53:29 2908 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
2016-11-30 22:53:29 2908 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
2016-11-30 22:53:29 2908 [ERROR] InnoDB: The system tablespace must be writable!
...日志中出现了类似“Permission denied”、“Can't determine file permissions”等信息,可以确定是“mysqld”访问文件权限的问题。导致此问题可能的原因有:磁盘空间问题、文件夹权限、setlinux权限的问题,下面是我的解决方法。
 
1、检查磁盘空间:
  使用“df -h”命令查看空间使用情况,尤其是空间占用达到90%以上的:[root@aiezu.com ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 13G 3.8G 9.2G 30% /
devtmpfs 362M 0 362M 0% /dev
tmpfs 371M 0 371M 0% /dev/shm
tmpfs 371M 9.6M 362M 3% /run
tmpfs 371M 0 371M 0% /sys/fs/cgroup
/dev/sda1 497M 102M 396M 21% /boot  使用“df -i”命令查看“Inode”的使用情况,如果“Inode”不足,也会无法创建文件:[root@aiezu.com ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 13598720 41755 13556965 1% /
devtmpfs 92526 334 92192 1% /dev
tmpfs 94889 1 94888 1% /dev/shm
tmpfs 94889 359 94530 1% /run
tmpfs 94889 13 94876 1% /sys/fs/cgroup
/dev/sda1 512000 329 511671 1% /boot 
2、文件系统权限:
  mysql的数据目录需要对“mysql”用户有读写执行:[root@aiezu.com ~]# chown -R mysql.mysql /storage/mysql/
[root@aiezu.com ~]# ll /storage/mysql/
总用量 110600
-rw-rw----. 1 mysql mysql 12582912 11月 30 17:49 ibdata1
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:49 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:48 ib_logfile1
drwx------. 2 mysql mysql 4096 11月 30 17:49 mysql
drwx------. 2 mysql mysql 4096 11月 30 17:49 performance_schema
drwx------. 2 mysql mysql 6 11月 30 17:48 test 
3、selinux权限问题:
  如果希望判断是不是由于“selinux”导致的,可以使用“setenforce 0”命令暂时关闭“selinux”,再启动mysql服务试试:[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# getenforce
Enforcing
[root@aiezu.com ~]# setenforce 0
[root@aiezu.com ~]# getenforce
Permissive
[root@aiezu.com ~]# service mysql start
Starting MySQL... SUCCESS!  确定是由“selinux”引起后,由于“setenforce 0”只能暂时关闭“selinux”,重启后又会打开,有两种方式解决:在“/etc/sysconfig/selinux”(CentOS7以下版本)或“/etc/selinux/config”(CentOS7及以上版本)文件中将“SELINUX=enforcing”改成“SELINUX=disabled”,永久关闭“selinux”;使用“chcon”命令配置“selinux”,使“selinux”对mysql相关目录开放权限;[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/mysql
[root@aiezu.com ~]# service mysql start
Starting MySQL. SUCCESS!关于MySQL的SeLinux更多信息,请参考:http://aiezu.com/article/mysql_selinux_config.html 查看全部
  今天安装好MySQL数据库后,在启动数据库时提示下面错误:
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
 
解决思路:
  遇到问题,在错误信息显示得不够完善的情况下,我们第一个应该想到的是看日志;mysql的日志在哪里呢?看“/etc/my.cnf”配置文件中的“log-error=”项,如“log-error=/var/log/mysqld.log”则日志文件在“/var/log/mysqld.log”。

  在日志文件中,我们看到了类似下列信息:
2016-11-30 22:53:29 2908 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)
2016-11-30 22:53:29 2908 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
2016-11-30 22:53:29 2908 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
2016-11-30 22:53:29 2908 [ERROR] InnoDB: The system tablespace must be writable!
...
日志中出现了类似“Permission denied”、“Can't determine file permissions”等信息,可以确定是“mysqld”访问文件权限的问题。导致此问题可能的原因有:磁盘空间问题、文件夹权限、setlinux权限的问题,下面是我的解决方法。
 
1、检查磁盘空间:
  使用“df -h”命令查看空间使用情况,尤其是空间占用达到90%以上的:
[root@aiezu.com ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 13G 3.8G 9.2G 30% /
devtmpfs 362M 0 362M 0% /dev
tmpfs 371M 0 371M 0% /dev/shm
tmpfs 371M 9.6M 362M 3% /run
tmpfs 371M 0 371M 0% /sys/fs/cgroup
/dev/sda1 497M 102M 396M 21% /boot
  使用“df -i”命令查看“Inode”的使用情况,如果“Inode”不足,也会无法创建文件:
[root@aiezu.com ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 13598720 41755 13556965 1% /
devtmpfs 92526 334 92192 1% /dev
tmpfs 94889 1 94888 1% /dev/shm
tmpfs 94889 359 94530 1% /run
tmpfs 94889 13 94876 1% /sys/fs/cgroup
/dev/sda1 512000 329 511671 1% /boot
 
2、文件系统权限:
  mysql的数据目录需要对“mysql”用户有读写执行:
[root@aiezu.com ~]# chown -R mysql.mysql /storage/mysql/
[root@aiezu.com ~]# ll /storage/mysql/
总用量 110600
-rw-rw----. 1 mysql mysql 12582912 11月 30 17:49 ibdata1
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:49 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:48 ib_logfile1
drwx------. 2 mysql mysql 4096 11月 30 17:49 mysql
drwx------. 2 mysql mysql 4096 11月 30 17:49 performance_schema
drwx------. 2 mysql mysql 6 11月 30 17:48 test
 
3、selinux权限问题:
  如果希望判断是不是由于“selinux”导致的,可以使用“setenforce 0”命令暂时关闭“selinux”,再启动mysql服务试试:
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# getenforce
Enforcing
[root@aiezu.com ~]# setenforce 0
[root@aiezu.com ~]# getenforce
Permissive
[root@aiezu.com ~]# service mysql start
Starting MySQL... SUCCESS!
  确定是由“selinux”引起后,由于“setenforce 0”只能暂时关闭“selinux”,重启后又会打开,有两种方式解决:
  1. 在“/etc/sysconfig/selinux”(CentOS7以下版本)或“/etc/selinux/config”(CentOS7及以上版本)文件中将“SELINUX=enforcing”改成“SELINUX=disabled”,永久关闭“selinux”;
  2. 使用“chcon”命令配置“selinux”,使“selinux”对mysql相关目录开放权限;
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/mysql
[root@aiezu.com ~]# service mysql start
Starting MySQL. SUCCESS!
关于MySQL的SeLinux更多信息,请参考:http://aiezu.com/article/mysql_selinux_config.html

FATAL ERROR: please install the following Perl modules before executing

回复

CentOSliuliangsong 回复了问题 • 0 人关注 • 1 个回复 • 971 次浏览 • 2016-11-30 17:51 • 来自相关话题

Lost connection to MySQL server at 'reading initial communication packet', system error: 0

Mysqlliuliangsong 发表了文章 • 0 个评论 • 591 次浏览 • 2016-11-23 13:29 • 来自相关话题

连接MySQL提示:ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0这是由于库文件初始化连接MySQL时连接失败引起的。
 
导致此错误的原因有:mysql设置文件中“bind-address”值的问题;访问权限限制问题;防火墙、杀毒软件阻拦的问题(特别是Windows);负载过大、最大连接限制了访问(特别正式提供服务的mysql) 
 
1、mysql设置文件的问题:
  在mysql数据库一些版本,为了保证安全,mysql安装后,默认只监听本机ip的“127.0.0.1”,如下:


  这时表现为连接“127.0.0.1”或“localhost”可以连通,连接局域网ip和公网IP无法连通。这时我们将“/etc/my.cnf”文件中的“bind-address”行前添加一个“#”号注释掉,并重启mysqld服务即可:[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1  注:linux下mysql配置文件默认在“/etc/my.cnf”,Windows平台mysql配置文件在安装目录下的“my.ini”。
 
2、访问权限的问题:
  ①、默认mysql的账户只允许本机登录的,要给账户授权通过“ip+端口”进行远程访问,需要先在mysql服务器上授权。在服务器桑登录到mysql,执行下面SQL语句授权:use mysql;
-- 将数据库"aiezu"的所有权限授权给"root"通过密码"123456"在"8.8.8.8"上进行访问;
grant all privileges on aiezu.* to 'root'@'8.8.8.8' identified by '123456';

-- 将数据库"test"的所有权限授权给"aiezu"通过密码"123321"在任何主机上进行访问;
grant all privileges on test.* to 'aiezu'@'%' identified by '123321';

--刷新权限表
flush privileges;
   ②、 在mysql客户端连接到服务端时,服务端会根据客户端的ip,尝试将客户端的ip解析为“主机名”,再通过“主机名”去检查mysql的权限表,这项功能叫“name-resolv”。由于此功能的某些原因,也会导致我们文章标题中的错误,还有就是会导致连接数据库变慢,所以需要将吃功能禁用。
  禁用方法:在mysql设置文件“[mysqld]”选项组下一行“skip-name-resolve”;[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1
skip-name-resolve 
  ③、如果是linux,修改“/etc/hosts.allow”文件,在文件的末尾添加下面内容,允许所有主机访问本机的“mysql”服务:mysqld : ALL : ALLOW
mysqld-max : ALL : ALLOW 
3、防火墙和杀毒软件:
  关闭杀毒软件和防火墙试试,windows方面:关闭系统防火墙,中国人常用的QQ电脑管家、360安全卫士、QQ医生、金山毒霸、卡巴斯基等;linux方便,检查iptables、ipfire系统自带防火墙的设置。
 
4、服务过载的问题:
  ①、mysql服务过载:执行“show processlist;”SQL命令看是否当前打开的连接过多; 使用“show variables like '%connect_timeout%';”语句的设置值,改成一个稍大的值,如20:“SET GLOBAL connect_timeout = 20;”使用“SHOW STATUS like 'aborted_%';”语句查询异常终止的连接和失败的连接;
 
  ②、系统过载:使用shell命令“top”观察mysql占有的内存、cpu情况;使用shell命令“free -h”看内存占有情况;使用shell命令“uptime”看cpu负载情况;使用shell命令“df -h”看磁盘空间使用率,特别占用率100%的情况;
  查看全部
连接MySQL提示:
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
这是由于库文件初始化连接MySQL时连接失败引起的。
 
导致此错误的原因有:
  • mysql设置文件中“bind-address”值的问题;
  • 访问权限限制问题;
  • 防火墙、杀毒软件阻拦的问题(特别是Windows);
  • 负载过大、最大连接限制了访问(特别正式提供服务的mysql)
 
 
1、mysql设置文件的问题:
  在mysql数据库一些版本,为了保证安全,mysql安装后,默认只监听本机ip的“127.0.0.1”,如下:
reading_initial_communication_packet.png
  这时表现为连接“127.0.0.1”或“localhost”可以连通,连接局域网ip和公网IP无法连通。这时我们将“/etc/my.cnf”文件中的“bind-address”行前添加一个“#”号注释掉,并重启mysqld服务即可:
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1
  注:linux下mysql配置文件默认在“/etc/my.cnf”,Windows平台mysql配置文件在安装目录下的“my.ini”。
 
2、访问权限的问题:
  ①、默认mysql的账户只允许本机登录的,要给账户授权通过“ip+端口”进行远程访问,需要先在mysql服务器上授权。在服务器桑登录到mysql,执行下面SQL语句授权:
use mysql;
-- 将数据库"aiezu"的所有权限授权给"root"通过密码"123456"在"8.8.8.8"上进行访问;
grant all privileges on aiezu.* to 'root'@'8.8.8.8' identified by '123456';

-- 将数据库"test"的所有权限授权给"aiezu"通过密码"123321"在任何主机上进行访问;
grant all privileges on test.* to 'aiezu'@'%' identified by '123321';

--刷新权限表
flush privileges;

   ②、 在mysql客户端连接到服务端时,服务端会根据客户端的ip,尝试将客户端的ip解析为“主机名”,再通过“主机名”去检查mysql的权限表,这项功能叫“name-resolv”。由于此功能的某些原因,也会导致我们文章标题中的错误,还有就是会导致连接数据库变慢,所以需要将吃功能禁用。
  禁用方法:在mysql设置文件“[mysqld]”选项组下一行“skip-name-resolve”;
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1
skip-name-resolve
 
  ③、如果是linux,修改“/etc/hosts.allow”文件,在文件的末尾添加下面内容,允许所有主机访问本机的“mysql”服务:
mysqld : ALL : ALLOW
mysqld-max : ALL : ALLOW
 
3、防火墙和杀毒软件:
  关闭杀毒软件和防火墙试试,windows方面:关闭系统防火墙,中国人常用的QQ电脑管家、360安全卫士、QQ医生、金山毒霸、卡巴斯基等;linux方便,检查iptables、ipfire系统自带防火墙的设置。
 
4、服务过载的问题:
  ①、mysql服务过载:
  • 执行“show processlist;”SQL命令看是否当前打开的连接过多;
 
  • 使用“show variables like '%connect_timeout%';”语句的设置值,改成一个稍大的值,如20:“SET GLOBAL connect_timeout = 20;”
  • 使用“SHOW STATUS like 'aborted_%';”语句查询异常终止的连接和失败的连接;

 
  ②、系统过载:
  • 使用shell命令“top”观察mysql占有的内存、cpu情况;
  • 使用shell命令“free -h”看内存占有情况;
  • 使用shell命令“uptime”看cpu负载情况;
  • 使用shell命令“df -h”看磁盘空间使用率,特别占用率100%的情况;

 

mysql错误ERROR 1064 (42000)

回复

Mysqllinyu520 回复了问题 • 1 人关注 • 1 个回复 • 652 次浏览 • 2016-11-18 12:41 • 来自相关话题

CentOS使用Yum为PHP安装Xdebug调试神器

PHPlinyu520 发表了文章 • 0 个评论 • 1144 次浏览 • 2016-11-17 22:10 • 来自相关话题

一、实验环境:操作系统:CentOS Linux release 7.2.1511 (Core)PHP版本:PHP 5.4.16 (cli) ,Yum方式安装Xdebug版本:2.2.7-1.el7 
  
二、安装前准备:
  不管是Lamp环境还是Lnmp环境,这里不讲述安装过程,这里只讲述Xdebug的安装。虽然使用yum方式安装Xdebug比较简单,但是还是建议在实验环境测试,安装前最好备份数据。
 
三、安装:
1、使用yum安装xdebug:[root@aiezu.com ~]# yum list|grep xdebug
php-pecl-xdebug.x86_64 2.2.7-1.el7 @epel
[root@aiezu.com ~]# yum install php-pecl-xdebug安装完成后,会生成“/etc/php.d/xdebug.ini”配置文件,配置文件中已经设置好xdebug的so文件,我们在这配置文件中设置xdebug设置参数。
 
四、配置Xdebug:
1、创建日志目录:
  我们创建/tmp/xdebug做为日志存储目录:[root@aiezu.com ~]# mkdir -p /tmp/xdebug
[root@aiezu.com ~]# chmod -R 777 /tmp/xdebug 
2、配置xdebug参数:
  修改“/etc/php.d/xdebug.ini”文件,根据你的需求配置参数,详细参数见附件中的《Xdebug详细参数表》。; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

;启用代码自动跟踪
xdebug.auto_trace = On
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir = /tmp/xdebug
;PHP代码跟踪日志文件名格式
xdebug.trace_output_name = trace.%c.%H
;启用性能检测分析
xdebug.profiler_enable=On
;允许收集传递给函数的参数变量
xdebug.collect_params= 4
;允许收集函数调用的返回值
xdebug.collect_return=On
;是否收集include、require的文件
xdebug.collect_includes = On
;是否收集内存的增加还是减少
;xdebug.show_mem_delta = On
;是否打印函数调用的最外围中的所有局部变量
;xdebug.show_local_vars = On
xdebug.profiler_enable = Off
;xdebug.profiler_output_dir = /tmp/xdebug
;xdebug.profiler_output_name = cachegrind.out.%H注:设置“xdebug.auto_trace = On”时,将会在执行所有PHP脚本之前先自动启用跟踪;另外,你也可以设置为“xdebug.auto_trace = 0”,并在PHP脚本开头和结尾分别调用xdebug_start_trace()和 xdebug_stop_trace()函数开启和结束跟踪。如:<?php
xdebug_start_trace();
//要追踪的代码
xdebug_stop_trace(); 
五、查看追踪日志:
  设置好配置文件后,并重启httpd服务,如果开启自动追踪,或者在脚本中使用xdebug_start_trace()和xdebug_stop_trace()函数开启追踪,那么在“/tmp/xdebug”命令下就可以看到追踪日志了。你可以使用vim查看他们,找出脚本中的问题。

附件:Xdebug详细参数表:选项名类型默认值参数选项描述xdebug.auto_tracebooleanOff是否在脚本运行之前自动调用相关追踪函数。xdebug.cli_colorinteger0如果值=1:
  当处于CLI模式或连接虚拟控制台时,Xdebug将高亮显示var_dumps()和堆栈输出;在Windows中,这需要安装ANSICON工具。
如果值=2:
  不管是否处于CLI模式或连接虚拟控制台,Xdebug都会高亮显示var_dumps()或堆栈输出;这种情况下,你可能会看到转义后的代码。
该参数自2.2版本开始引入。xdebug.collect_assignmentsbooleanOff用于控制是否为函数跟踪添加变量赋值功能。
该参数自2.1版本开始引入。xdebug.collect_includesbooleanOn控制是否在跟踪文件中写入include()、include_once()、require()、require_once()等函数中用到的文件名。xdebug.collect_paramsinteger0控制在调用函数时,是否收集传递给函数的参数信息。
  如果值=0,则不显示任何信息。
  如果值=1,只显示类型和大小信息,例如:string(6)、array(8)。
  如果值=2,将显示类型和大小,以及全部信息的工具提示。
  如果值=3,将显示变量的全部内容。
  如果值=4,将显示变量的全部内容和变量名。
如果参数值过大,这可能会占用大量的内存;不过,在Xdebug 2中不会出现该问题,因为Xdebug 2将相关数据写入磁盘中,而不是占用内存。xdebug.collect_returnbooleanOff控制是否在追踪文件中写入函数调用的返回值。xdebug.collect_varsbooleanOff控制是否收集指定作用域中的变量信息。由于需要反向工程PHP的操作码数组,因此Xdebug的分析速度可能比较慢。xdebug.coverage_enablebooleanOn控制是否允许通过设置内部结构来启用代码覆盖率功能。
该参数自2.2版本开始引入。xdebug.default_enablebooleanOn当发生异常或错误时,是否默认显示堆栈信息。xdebug.dump.*stringEmpty这里的*可以是COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一个。用于指定发生错误时是否显示超全局变量数组中的索引变量信息。比如,你想要显示请求的IP地址和请求方式,可以设置为xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD多个索引变量用英文逗号隔开,如果要输出其中的所有变量,可以直接用*,例如:xdebug.dump.GET=*xdebug.dump_globalsbooleanOn控制是否显示通过xdebug.dump.*定义的所有超全局变量的信息。xdebug.dump_oncebooleanOn如果出现多个错误,控制超全局变量信息是在所有错误中显示,还是只在第一个错误中显示。xdebug.dump_undefinedbooleanOn控制是否显示超全局变量中未定义的值。xdebug.extended_infointeger1是否强制进入PHP解析器的"extended_info"模式,这将允许Xdebug以远程调试器对文件或行添加断点。开启此模式将拖慢脚本的允许速度,该参数只能在php.ini中设置。xdebug.file_link_formatstring,用于指定堆栈信息中用到的文件名称的链接样式,这允许IDE通过设置链接协议,直接点击堆栈信息中的文件名称,即可快速打开指定的文件。
例如:ZendStudio://%f@%l(%f表示文件路径,%f表示行号)。
自2.2版本开始引入。xdebug.force_display_errorsinteger0是否强制显示错误信息。
自2.3版本开始引入。xdebug.force_error_reportinginteger0是否强制显示所有错误级别的信息。
自2.3版本开始引入。xdebug.halt_levelinteger0指定出现那些错误级别的错误时,中止程序运行。例如:xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE(也仅支持上述4种错误级别)。
自2.3版本开始引入。xdebug.idekeystring*complex*指定传递给DBGp调试器处理程序的IDE Key。xdebug.manual_urlstringhttp://www.php.net用于指定从函数堆栈和错误信息链接到的帮助手册的基本URL。
仅2.2.1以下版本可用。xdebug.max_nesting_levelinteger100指定递归的嵌套层级数。xdebug.overload_var_dumpbooleanOn当php.ini中的html_error设为1时,Xdebug是否默认使用自身的改进版本来重载var_dump()。
自2.2版本开始引入。xdebug.profiler_appendinteger0当多个请求映射到相同文件时,指定是覆盖之前的调试信息文件还是追加内容到该文件中。xdebug.profiler_enableinteger0指定是否启用Xdebug的性能分析,并创建性能信息文件。xdebug.profiler_output_dirstring/tmp指定性能分析信息文件的输出目录xdebug.profiler_output_namestringcachegrind.out.%p

 指定性能分析信息文件的名称xdebug.remote_enablebooleanOff是否开启远程调试xdebug.remote_handlerstringdbgp指定远程调试的处理协议xdebug.remote_hoststringlocalhost指定远程调试的主机名xdebug.remote_logstring 指定远程调试的日志文件名xdebug.remote_modestringreq可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。xdebug.remote_portinteger9000指定远程调试的端口号xdebug.trace_optionsinteger0指定对于之后的请求,追踪文件是追加内容还是覆盖之前内容。xdebug.trace_output_dirstring/tmp指定追踪文件的存放目录xdebug.trace_output_namestringtrace.%c指定追踪文件的名称xdebug.show_exception_tracebooleanOff是否开启异常跟踪xdebug.show_mem_deltabooleanOff是否追踪内存的变化xdebug.show_local_varsbooleanOff是否显示局部变量  查看全部
一、实验环境:
  • 操作系统:CentOS Linux release 7.2.1511 (Core)
  • PHP版本:PHP 5.4.16 (cli) ,Yum方式安装
  • Xdebug版本:2.2.7-1.el7 

  
二、安装前准备:
  不管是Lamp环境还是Lnmp环境,这里不讲述安装过程,这里只讲述Xdebug的安装。虽然使用yum方式安装Xdebug比较简单,但是还是建议在实验环境测试,安装前最好备份数据。
 
三、安装:
1、使用yum安装xdebug:
[root@aiezu.com ~]# yum list|grep xdebug
php-pecl-xdebug.x86_64 2.2.7-1.el7 @epel
[root@aiezu.com ~]# yum install php-pecl-xdebug
安装完成后,会生成“/etc/php.d/xdebug.ini”配置文件,配置文件中已经设置好xdebug的so文件,我们在这配置文件中设置xdebug设置参数。
 
四、配置Xdebug:
1、创建日志目录:
  我们创建/tmp/xdebug做为日志存储目录:
[root@aiezu.com ~]# mkdir -p /tmp/xdebug
[root@aiezu.com ~]# chmod -R 777 /tmp/xdebug
 
2、配置xdebug参数:
  修改“/etc/php.d/xdebug.ini”文件,根据你的需求配置参数,详细参数见附件中的《Xdebug详细参数表》。
; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

;启用代码自动跟踪
xdebug.auto_trace = On
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir = /tmp/xdebug
;PHP代码跟踪日志文件名格式
xdebug.trace_output_name = trace.%c.%H
;启用性能检测分析
xdebug.profiler_enable=On
;允许收集传递给函数的参数变量
xdebug.collect_params= 4
;允许收集函数调用的返回值
xdebug.collect_return=On
;是否收集include、require的文件
xdebug.collect_includes = On
;是否收集内存的增加还是减少
;xdebug.show_mem_delta = On
;是否打印函数调用的最外围中的所有局部变量
;xdebug.show_local_vars = On
xdebug.profiler_enable = Off
;xdebug.profiler_output_dir = /tmp/xdebug
;xdebug.profiler_output_name = cachegrind.out.%H
注:设置“xdebug.auto_trace = On”时,将会在执行所有PHP脚本之前先自动启用跟踪;另外,你也可以设置为“xdebug.auto_trace = 0”,并在PHP脚本开头和结尾分别调用xdebug_start_trace()和 xdebug_stop_trace()函数开启和结束跟踪。如:
<?php
xdebug_start_trace();
//要追踪的代码
xdebug_stop_trace();
 
五、查看追踪日志:
  设置好配置文件后,并重启httpd服务,如果开启自动追踪,或者在脚本中使用xdebug_start_trace()和xdebug_stop_trace()函数开启追踪,那么在“/tmp/xdebug”命令下就可以看到追踪日志了。你可以使用vim查看他们,找出脚本中的问题。

附件:Xdebug详细参数表:
选项名类型默认值参数选项描述
xdebug.auto_tracebooleanOff是否在脚本运行之前自动调用相关追踪函数。
xdebug.cli_colorinteger0如果值=1:
  当处于CLI模式或连接虚拟控制台时,Xdebug将高亮显示var_dumps()和堆栈输出;在Windows中,这需要安装ANSICON工具。
如果值=2:
  不管是否处于CLI模式或连接虚拟控制台,Xdebug都会高亮显示var_dumps()或堆栈输出;这种情况下,你可能会看到转义后的代码。
该参数自2.2版本开始引入。
xdebug.collect_assignmentsbooleanOff用于控制是否为函数跟踪添加变量赋值功能。
该参数自2.1版本开始引入。
xdebug.collect_includesbooleanOn控制是否在跟踪文件中写入include()、include_once()、require()、require_once()等函数中用到的文件名。
xdebug.collect_paramsinteger0控制在调用函数时,是否收集传递给函数的参数信息。
  如果值=0,则不显示任何信息。
  如果值=1,只显示类型和大小信息,例如:string(6)、array(8)。
  如果值=2,将显示类型和大小,以及全部信息的工具提示。
  如果值=3,将显示变量的全部内容。
  如果值=4,将显示变量的全部内容和变量名。
如果参数值过大,这可能会占用大量的内存;不过,在Xdebug 2中不会出现该问题,因为Xdebug 2将相关数据写入磁盘中,而不是占用内存。
xdebug.collect_returnbooleanOff控制是否在追踪文件中写入函数调用的返回值。
xdebug.collect_varsbooleanOff控制是否收集指定作用域中的变量信息。由于需要反向工程PHP的操作码数组,因此Xdebug的分析速度可能比较慢。
xdebug.coverage_enablebooleanOn控制是否允许通过设置内部结构来启用代码覆盖率功能。
该参数自2.2版本开始引入。
xdebug.default_enablebooleanOn当发生异常或错误时,是否默认显示堆栈信息。
xdebug.dump.*stringEmpty这里的*可以是COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一个。用于指定发生错误时是否显示超全局变量数组中的索引变量信息。比如,你想要显示请求的IP地址和请求方式,可以设置为xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD多个索引变量用英文逗号隔开,如果要输出其中的所有变量,可以直接用*,例如:xdebug.dump.GET=*
xdebug.dump_globalsbooleanOn控制是否显示通过xdebug.dump.*定义的所有超全局变量的信息。
xdebug.dump_oncebooleanOn如果出现多个错误,控制超全局变量信息是在所有错误中显示,还是只在第一个错误中显示。
xdebug.dump_undefinedbooleanOn控制是否显示超全局变量中未定义的值。
xdebug.extended_infointeger1是否强制进入PHP解析器的"extended_info"模式,这将允许Xdebug以远程调试器对文件或行添加断点。开启此模式将拖慢脚本的允许速度,该参数只能在php.ini中设置。
xdebug.file_link_formatstring,用于指定堆栈信息中用到的文件名称的链接样式,这允许IDE通过设置链接协议,直接点击堆栈信息中的文件名称,即可快速打开指定的文件。
例如:ZendStudio://%f@%l(%f表示文件路径,%f表示行号)。
自2.2版本开始引入。
xdebug.force_display_errorsinteger0是否强制显示错误信息。
自2.3版本开始引入。
xdebug.force_error_reportinginteger0是否强制显示所有错误级别的信息。
自2.3版本开始引入。
xdebug.halt_levelinteger0指定出现那些错误级别的错误时,中止程序运行。例如:xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE(也仅支持上述4种错误级别)。
自2.3版本开始引入。
xdebug.idekeystring*complex*指定传递给DBGp调试器处理程序的IDE Key。
xdebug.manual_urlstringhttp://www.php.net用于指定从函数堆栈和错误信息链接到的帮助手册的基本URL。
仅2.2.1以下版本可用。
xdebug.max_nesting_levelinteger100指定递归的嵌套层级数。
xdebug.overload_var_dumpbooleanOn当php.ini中的html_error设为1时,Xdebug是否默认使用自身的改进版本来重载var_dump()。
自2.2版本开始引入。
xdebug.profiler_appendinteger0当多个请求映射到相同文件时,指定是覆盖之前的调试信息文件还是追加内容到该文件中。
xdebug.profiler_enableinteger0指定是否启用Xdebug的性能分析,并创建性能信息文件。
xdebug.profiler_output_dirstring/tmp指定性能分析信息文件的输出目录
xdebug.profiler_output_namestringcachegrind.out.%p

 
指定性能分析信息文件的名称
xdebug.remote_enablebooleanOff是否开启远程调试
xdebug.remote_handlerstringdbgp指定远程调试的处理协议
xdebug.remote_hoststringlocalhost指定远程调试的主机名
xdebug.remote_logstring 指定远程调试的日志文件名
xdebug.remote_modestringreq可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。
xdebug.remote_portinteger9000指定远程调试的端口号
xdebug.trace_optionsinteger0指定对于之后的请求,追踪文件是追加内容还是覆盖之前内容。
xdebug.trace_output_dirstring/tmp指定追踪文件的存放目录
xdebug.trace_output_namestringtrace.%c指定追踪文件的名称
xdebug.show_exception_tracebooleanOff是否开启异常跟踪
xdebug.show_mem_deltabooleanOff是否追踪内存的变化
xdebug.show_local_varsbooleanOff是否显示局部变量 

PHP自定义异常处理函数

PHPlinyu520 发表了文章 • 0 个评论 • 303 次浏览 • 2016-11-16 13:56 • 来自相关话题

  我们常需要根据项目的不同,对代码运行日志记录有不同的需求。这不同的需求包含,需要记录的内容不同、记录的格式不同、日志的输出方式(写如文件、发EMail、发短信等)不同。这时,我们可以将自己的日志记录需求实现方法定义到一个类中,然后再通过下面这些函数,将类的方法注册到对应的事件,这样当事件发生时,系统自定会按我们的需求将日志记录到指定的地方。

一、register_shutdown_function函数:
  register_shutdown_function()函数用来设置当PHP脚本执行完成、或者exit()退出时要调用的函数。register_shutdown_function(array('Err','shutdown_function'));  
二、set_error_handler函数:
  set_error_handler函数使用来设置脚本发生错误时调用的函数,用法如下:set_error_handler(array('Err','error_handler'));通过 set_error_handler() 函数设置用户自定义的错误处理程序,然后触发错误(通过 trigger_error()):

三、set_exception_handler函数:set_exception_handler(array('Err','appException'));
简单示例:<?php
date_default_timezone_set('PRC');
register_shutdown_function(array('Err','successHandle'));
set_error_handler(array('Err','errorHandler'));
set_exception_handler(array('Err','exceptionHandle'));
class Err {
private static $logFile = 'log.txt';
//脚本发生错误
public static function errorHandler($errno, $errstr, $errfile, $errline){
$msg = sprintf("Error: %s %s %s:%s", $errno, $errstr, $errfile, $errline);
self::writeLog($msg);
}

//脚本执行完成
public static function successHandle() {
self::writeLog("Success.");
}

//脚本抛出异常
public static function exceptionHandle($exception) {
$msg = sprintf("Exception: %s", $exception->getMessage());
self::writeLog($msg);
}

//写日志
private static function writeLog( $msg ) {
$msg = sprintf("%s %s\t%s\n", date('Y-m-d H:i:s'), $_SERVER['REMOTE_ADDR'], $msg);
file_put_contents(self::$logFile, $msg, FILE_APPEND);
}
}

throw new Exception("发生异常啦"); 查看全部
  我们常需要根据项目的不同,对代码运行日志记录有不同的需求。这不同的需求包含,需要记录的内容不同、记录的格式不同、日志的输出方式(写如文件、发EMail、发短信等)不同。这时,我们可以将自己的日志记录需求实现方法定义到一个类中,然后再通过下面这些函数,将类的方法注册到对应的事件,这样当事件发生时,系统自定会按我们的需求将日志记录到指定的地方。

一、register_shutdown_function函数:
  register_shutdown_function()函数用来设置当PHP脚本执行完成、或者exit()退出时要调用的函数。
register_shutdown_function(array('Err','shutdown_function'));
  
二、set_error_handler函数:
  set_error_handler函数使用来设置脚本发生错误时调用的函数,用法如下:
set_error_handler(array('Err','error_handler'));
通过 set_error_handler() 函数设置用户自定义的错误处理程序,然后触发错误(通过 trigger_error()):

三、set_exception_handler函数:
set_exception_handler(array('Err','appException'));

简单示例:
<?php
date_default_timezone_set('PRC');
register_shutdown_function(array('Err','successHandle'));
set_error_handler(array('Err','errorHandler'));
set_exception_handler(array('Err','exceptionHandle'));
class Err {
private static $logFile = 'log.txt';
//脚本发生错误
public static function errorHandler($errno, $errstr, $errfile, $errline){
$msg = sprintf("Error: %s %s %s:%s", $errno, $errstr, $errfile, $errline);
self::writeLog($msg);
}

//脚本执行完成
public static function successHandle() {
self::writeLog("Success.");
}

//脚本抛出异常
public static function exceptionHandle($exception) {
$msg = sprintf("Exception: %s", $exception->getMessage());
self::writeLog($msg);
}

//写日志
private static function writeLog( $msg ) {
$msg = sprintf("%s %s\t%s\n", date('Y-m-d H:i:s'), $_SERVER['REMOTE_ADDR'], $msg);
file_put_contents(self::$logFile, $msg, FILE_APPEND);
}
}

throw new Exception("发生异常啦");

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)

Mysqlllslx520 发表了文章 • 0 个评论 • 10519 次浏览 • 2016-11-04 16:50 • 来自相关话题

  有时候,当我们使用“mysql”、“mysqladmin”、“mysqldump”等命令管理数据库时,服务器抛出类似如下错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)这个错误是由于什么原因导致的呢?请看后面爱E族(aiezu.com)为您提供的分析。 一、错误现场还原:下面我们通过三种方式来连接,然后观察提示的错误信息:1、直接使用“mysql”命令,不带主机名参数;2、使用带了主机名“localhost”参数的“mysql -h localhost”命令;3、使用带了主机名“127.0.0.1”参数的“mysql -h 127.0.0.1”命令。[root@aiezu.com ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h localhost
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h 127.0.0.1
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)  通过上面实验可以看出,前面两种方式都能产生标题中的错误,而第三种方式连接是不会产生标题中的错误的(第三种方式这里产生的是由于密码问题拒绝访问的错误信息)(爱E族)。 二、错误产生原因解析:   这是由于我们连接数据库使用的主机名参数为“localhost”,或者未使用主机名参数、服务器默认使用“localhost”做为主机名(爱E族)。 使用主机名参数为“localhost”连接mysql服务端时,mysql客户端会认为是连接本机,所以会尝试以socket文件方式进行连接(socket文件连接方式,比“ip:端口”方式效率更高),这时根据配置文件“/etc/my.cnf”的路径,未找到相应的socket文件,就会引发此错误。
   三、修复故障前准备:1、看mysql服务是否在运行:  由于“socket”文件是由mysql服务运行时创建的,如果提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”,找不到“socket”文件,我们首先要确认的是mysql服务是否正在运行。# 1、 端口是否打开
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 12207 mysql 14u IPv4 52350 0t0 TCP *:mysql (LISTEN)

# 2、mysqld服务是否正在运行
[root@aiezu.com ~]# service mysqld status
mysqld (pid 4717) is running...

# 3、如果mariadb,同样方法查服务是否正在运行:
[root@aiezu.com ~]# service mariadb status
Redirecting to /bin/systemctl status mariadb.service
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2016-11-03 13:47:37 CST; 23min ago  2、确定“socket”文件正确位置:  确定mysql服务正常运行后,产生此错误的原因只剩下“socket”文件路径不正确了,我们可以使用“find”命令或者“lsof”命令来确定socket文件的正确路径:[root@aiezu.com ~]# lsof -c mysqld|grep sock$
mysqld 4717 mysql 12u unix 0xffff88010a655b80 0t0 77474827 /storage/db/mysql/mysql.sock

[root@aiezu.com ~]# find / -name '*.sock'
/storage/db/mysql/mysql.sock 四、故障解决方法:解决方案一:  修改“/etc/my.cnf”配置文件,在配置文件中添加“[client]”选项和“[mysql]”选项,并使用这两个选项下的“socket”参数值,与“[mysqld]”选项下的“socket”参数值,指向的socket文件路径完全一致。如下: [mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
...省略n行(爱E族)...

[client]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock

[mysql]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock修改完后,重启mysqld服务,即可解决此问题。
 解决方案二:  使用“ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock”命令,将正确的socket文件位置,软链接到提示错误的socket文件路径位置,即可解决此问题:[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
ls: cannot access /var/lib/mysql/mysql.sock: No such file or directory
[root@aiezu.com ~]# ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sock   五、后序:  这篇文章只讲述了mysql提供的“mysql”、“mysqldump”、“mysqladmin”等命令提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”的解决方法,如果需要解决“php”、“perl”、“python”等脚本语言提示此错误的问题,请参考爱E族的另外一篇文章:http://aiezu.com/article/mysql_php_connect_through_socket.html 查看全部
  有时候,当我们使用“mysql”、“mysqladmin”、“mysqldump”等命令管理数据库时,服务器抛出类似如下错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
这个错误是由于什么原因导致的呢?请看后面爱E族(aiezu.com)为您提供的分析。

 

一、错误现场还原:

下面我们通过三种方式来连接,然后观察提示的错误信息:
  • 1、直接使用“mysql”命令,不带主机名参数;
  • 2、使用带了主机名“localhost”参数的“mysql -h localhost”命令;
  • 3、使用带了主机名“127.0.0.1”参数的“mysql -h 127.0.0.1”命令。
[root@aiezu.com ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h localhost
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h 127.0.0.1
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
  通过上面实验可以看出,前面两种方式都能产生标题中的错误,而第三种方式连接是不会产生标题中的错误的(第三种方式这里产生的是由于密码问题拒绝访问的错误信息)(爱E族)。

 

二、错误产生原因解析:

   这是由于我们连接数据库使用的主机名参数为“localhost”,或者未使用主机名参数、服务器默认使用“localhost”做为主机名(爱E族)。 使用主机名参数为“localhost”连接mysql服务端时,mysql客户端会认为是连接本机,所以会尝试以socket文件方式进行连接(socket文件连接方式,比“ip:端口”方式效率更高),这时根据配置文件“/etc/my.cnf”的路径,未找到相应的socket文件,就会引发此错误。
   

三、修复故障前准备:

1、看mysql服务是否在运行:

  由于“socket”文件是由mysql服务运行时创建的,如果提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”,找不到“socket”文件,我们首先要确认的是mysql服务是否正在运行。
# 1、 端口是否打开
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 12207 mysql 14u IPv4 52350 0t0 TCP *:mysql (LISTEN)

# 2、mysqld服务是否正在运行
[root@aiezu.com ~]# service mysqld status
mysqld (pid 4717) is running...

# 3、如果mariadb,同样方法查服务是否正在运行:
[root@aiezu.com ~]# service mariadb status
Redirecting to /bin/systemctl status mariadb.service
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2016-11-03 13:47:37 CST; 23min ago
  

2、确定“socket”文件正确位置:

  确定mysql服务正常运行后,产生此错误的原因只剩下“socket”文件路径不正确了,我们可以使用“find”命令或者“lsof”命令来确定socket文件的正确路径:
[root@aiezu.com ~]# lsof  -c mysqld|grep sock$
mysqld 4717 mysql 12u unix 0xffff88010a655b80 0t0 77474827 /storage/db/mysql/mysql.sock

[root@aiezu.com ~]# find / -name '*.sock'
/storage/db/mysql/mysql.sock
 

四、故障解决方法:

解决方案一:

  修改“/etc/my.cnf”配置文件,在配置文件中添加“[client]”选项和“[mysql]”选项,并使用这两个选项下的“socket”参数值,与“[mysqld]”选项下的“socket”参数值,指向的socket文件路径完全一致。如下: 
[mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
...省略n行(爱E族)...

[client]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock

[mysql]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock
修改完后,重启mysqld服务,即可解决此问题。
 

解决方案二:

  使用“ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock”命令,将正确的socket文件位置,软链接到提示错误的socket文件路径位置,即可解决此问题:
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
ls: cannot access /var/lib/mysql/mysql.sock: No such file or directory
[root@aiezu.com ~]# ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sock

  

 五、后序:

  这篇文章只讲述了mysql提供的“mysql”、“mysqldump”、“mysqladmin”等命令提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”的解决方法,如果需要解决“php”、“perl”、“python”等脚本语言提示此错误的问题,请参考爱E族的另外一篇文章:http://aiezu.com/article/mysql_php_connect_through_socket.html

PHP自动记录站点所有错误异常到日志文件

回复

PHP匿名用户 回复了问题 • 1 人关注 • 1 个回复 • 423 次浏览 • 2016-10-31 16:25 • 来自相关话题

ERROR 1442 (HY000): Can't update table '...' in stored function/trigger because it is already used

Mysqlliuliangsong 发表了文章 • 0 个评论 • 402 次浏览 • 2016-12-22 16:31 • 来自相关话题

一、MySQL错误现象:MySQL执行创建的触发器时,报如下错误:ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 下面为错误触发器的创建过程:1、创建测试表格:drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)2、创建一个MySQL触发器:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;3、测试触发效果:mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 二、错误原因:  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 三、解决方案:1、将触发器的创建SQL语句改成如下并执行创建即可:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ; 触发器测试效果:aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec) 查看全部

一、MySQL错误现象:

MySQL执行创建的触发器时,报如下错误:
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

 下面为错误触发器的创建过程:

1、创建测试表格:

drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)

2、创建一个MySQL触发器:

DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;

3、测试触发效果:

mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 

二、错误原因:

  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 

三、解决方案:

1、将触发器的创建SQL语句改成如下并执行创建即可:
DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ;
 触发器测试效果:
aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec)

Starting MySQL. ERROR! The server quit without updating PID file

Linuxliuliangsong 发表了文章 • 0 个评论 • 612 次浏览 • 2016-11-30 17:59 • 来自相关话题

  今天安装好MySQL数据库后,在启动数据库时提示下面错误:[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid). 
解决思路:
  遇到问题,在错误信息显示得不够完善的情况下,我们第一个应该想到的是看日志;mysql的日志在哪里呢?看“/etc/my.cnf”配置文件中的“log-error=”项,如“log-error=/var/log/mysqld.log”则日志文件在“/var/log/mysqld.log”。

  在日志文件中,我们看到了类似下列信息:2016-11-30 22:53:29 2908 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)
2016-11-30 22:53:29 2908 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
2016-11-30 22:53:29 2908 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
2016-11-30 22:53:29 2908 [ERROR] InnoDB: The system tablespace must be writable!
...日志中出现了类似“Permission denied”、“Can't determine file permissions”等信息,可以确定是“mysqld”访问文件权限的问题。导致此问题可能的原因有:磁盘空间问题、文件夹权限、setlinux权限的问题,下面是我的解决方法。
 
1、检查磁盘空间:
  使用“df -h”命令查看空间使用情况,尤其是空间占用达到90%以上的:[root@aiezu.com ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 13G 3.8G 9.2G 30% /
devtmpfs 362M 0 362M 0% /dev
tmpfs 371M 0 371M 0% /dev/shm
tmpfs 371M 9.6M 362M 3% /run
tmpfs 371M 0 371M 0% /sys/fs/cgroup
/dev/sda1 497M 102M 396M 21% /boot  使用“df -i”命令查看“Inode”的使用情况,如果“Inode”不足,也会无法创建文件:[root@aiezu.com ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 13598720 41755 13556965 1% /
devtmpfs 92526 334 92192 1% /dev
tmpfs 94889 1 94888 1% /dev/shm
tmpfs 94889 359 94530 1% /run
tmpfs 94889 13 94876 1% /sys/fs/cgroup
/dev/sda1 512000 329 511671 1% /boot 
2、文件系统权限:
  mysql的数据目录需要对“mysql”用户有读写执行:[root@aiezu.com ~]# chown -R mysql.mysql /storage/mysql/
[root@aiezu.com ~]# ll /storage/mysql/
总用量 110600
-rw-rw----. 1 mysql mysql 12582912 11月 30 17:49 ibdata1
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:49 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:48 ib_logfile1
drwx------. 2 mysql mysql 4096 11月 30 17:49 mysql
drwx------. 2 mysql mysql 4096 11月 30 17:49 performance_schema
drwx------. 2 mysql mysql 6 11月 30 17:48 test 
3、selinux权限问题:
  如果希望判断是不是由于“selinux”导致的,可以使用“setenforce 0”命令暂时关闭“selinux”,再启动mysql服务试试:[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# getenforce
Enforcing
[root@aiezu.com ~]# setenforce 0
[root@aiezu.com ~]# getenforce
Permissive
[root@aiezu.com ~]# service mysql start
Starting MySQL... SUCCESS!  确定是由“selinux”引起后,由于“setenforce 0”只能暂时关闭“selinux”,重启后又会打开,有两种方式解决:在“/etc/sysconfig/selinux”(CentOS7以下版本)或“/etc/selinux/config”(CentOS7及以上版本)文件中将“SELINUX=enforcing”改成“SELINUX=disabled”,永久关闭“selinux”;使用“chcon”命令配置“selinux”,使“selinux”对mysql相关目录开放权限;[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/mysql
[root@aiezu.com ~]# service mysql start
Starting MySQL. SUCCESS!关于MySQL的SeLinux更多信息,请参考:http://aiezu.com/article/mysql_selinux_config.html 查看全部
  今天安装好MySQL数据库后,在启动数据库时提示下面错误:
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
 
解决思路:
  遇到问题,在错误信息显示得不够完善的情况下,我们第一个应该想到的是看日志;mysql的日志在哪里呢?看“/etc/my.cnf”配置文件中的“log-error=”项,如“log-error=/var/log/mysqld.log”则日志文件在“/var/log/mysqld.log”。

  在日志文件中,我们看到了类似下列信息:
2016-11-30 22:53:29 2908 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)
2016-11-30 22:53:29 2908 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
2016-11-30 22:53:29 2908 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
2016-11-30 22:53:29 2908 [ERROR] InnoDB: The system tablespace must be writable!
...
日志中出现了类似“Permission denied”、“Can't determine file permissions”等信息,可以确定是“mysqld”访问文件权限的问题。导致此问题可能的原因有:磁盘空间问题、文件夹权限、setlinux权限的问题,下面是我的解决方法。
 
1、检查磁盘空间:
  使用“df -h”命令查看空间使用情况,尤其是空间占用达到90%以上的:
[root@aiezu.com ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 13G 3.8G 9.2G 30% /
devtmpfs 362M 0 362M 0% /dev
tmpfs 371M 0 371M 0% /dev/shm
tmpfs 371M 9.6M 362M 3% /run
tmpfs 371M 0 371M 0% /sys/fs/cgroup
/dev/sda1 497M 102M 396M 21% /boot
  使用“df -i”命令查看“Inode”的使用情况,如果“Inode”不足,也会无法创建文件:
[root@aiezu.com ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 13598720 41755 13556965 1% /
devtmpfs 92526 334 92192 1% /dev
tmpfs 94889 1 94888 1% /dev/shm
tmpfs 94889 359 94530 1% /run
tmpfs 94889 13 94876 1% /sys/fs/cgroup
/dev/sda1 512000 329 511671 1% /boot
 
2、文件系统权限:
  mysql的数据目录需要对“mysql”用户有读写执行:
[root@aiezu.com ~]# chown -R mysql.mysql /storage/mysql/
[root@aiezu.com ~]# ll /storage/mysql/
总用量 110600
-rw-rw----. 1 mysql mysql 12582912 11月 30 17:49 ibdata1
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:49 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:48 ib_logfile1
drwx------. 2 mysql mysql 4096 11月 30 17:49 mysql
drwx------. 2 mysql mysql 4096 11月 30 17:49 performance_schema
drwx------. 2 mysql mysql 6 11月 30 17:48 test
 
3、selinux权限问题:
  如果希望判断是不是由于“selinux”导致的,可以使用“setenforce 0”命令暂时关闭“selinux”,再启动mysql服务试试:
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# getenforce
Enforcing
[root@aiezu.com ~]# setenforce 0
[root@aiezu.com ~]# getenforce
Permissive
[root@aiezu.com ~]# service mysql start
Starting MySQL... SUCCESS!
  确定是由“selinux”引起后,由于“setenforce 0”只能暂时关闭“selinux”,重启后又会打开,有两种方式解决:
  1. 在“/etc/sysconfig/selinux”(CentOS7以下版本)或“/etc/selinux/config”(CentOS7及以上版本)文件中将“SELINUX=enforcing”改成“SELINUX=disabled”,永久关闭“selinux”;
  2. 使用“chcon”命令配置“selinux”,使“selinux”对mysql相关目录开放权限;
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/mysql
[root@aiezu.com ~]# service mysql start
Starting MySQL. SUCCESS!
关于MySQL的SeLinux更多信息,请参考:http://aiezu.com/article/mysql_selinux_config.html

Lost connection to MySQL server at 'reading initial communication packet', system error: 0

Mysqlliuliangsong 发表了文章 • 0 个评论 • 591 次浏览 • 2016-11-23 13:29 • 来自相关话题

连接MySQL提示:ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0这是由于库文件初始化连接MySQL时连接失败引起的。
 
导致此错误的原因有:mysql设置文件中“bind-address”值的问题;访问权限限制问题;防火墙、杀毒软件阻拦的问题(特别是Windows);负载过大、最大连接限制了访问(特别正式提供服务的mysql) 
 
1、mysql设置文件的问题:
  在mysql数据库一些版本,为了保证安全,mysql安装后,默认只监听本机ip的“127.0.0.1”,如下:


  这时表现为连接“127.0.0.1”或“localhost”可以连通,连接局域网ip和公网IP无法连通。这时我们将“/etc/my.cnf”文件中的“bind-address”行前添加一个“#”号注释掉,并重启mysqld服务即可:[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1  注:linux下mysql配置文件默认在“/etc/my.cnf”,Windows平台mysql配置文件在安装目录下的“my.ini”。
 
2、访问权限的问题:
  ①、默认mysql的账户只允许本机登录的,要给账户授权通过“ip+端口”进行远程访问,需要先在mysql服务器上授权。在服务器桑登录到mysql,执行下面SQL语句授权:use mysql;
-- 将数据库"aiezu"的所有权限授权给"root"通过密码"123456"在"8.8.8.8"上进行访问;
grant all privileges on aiezu.* to 'root'@'8.8.8.8' identified by '123456';

-- 将数据库"test"的所有权限授权给"aiezu"通过密码"123321"在任何主机上进行访问;
grant all privileges on test.* to 'aiezu'@'%' identified by '123321';

--刷新权限表
flush privileges;
   ②、 在mysql客户端连接到服务端时,服务端会根据客户端的ip,尝试将客户端的ip解析为“主机名”,再通过“主机名”去检查mysql的权限表,这项功能叫“name-resolv”。由于此功能的某些原因,也会导致我们文章标题中的错误,还有就是会导致连接数据库变慢,所以需要将吃功能禁用。
  禁用方法:在mysql设置文件“[mysqld]”选项组下一行“skip-name-resolve”;[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1
skip-name-resolve 
  ③、如果是linux,修改“/etc/hosts.allow”文件,在文件的末尾添加下面内容,允许所有主机访问本机的“mysql”服务:mysqld : ALL : ALLOW
mysqld-max : ALL : ALLOW 
3、防火墙和杀毒软件:
  关闭杀毒软件和防火墙试试,windows方面:关闭系统防火墙,中国人常用的QQ电脑管家、360安全卫士、QQ医生、金山毒霸、卡巴斯基等;linux方便,检查iptables、ipfire系统自带防火墙的设置。
 
4、服务过载的问题:
  ①、mysql服务过载:执行“show processlist;”SQL命令看是否当前打开的连接过多; 使用“show variables like '%connect_timeout%';”语句的设置值,改成一个稍大的值,如20:“SET GLOBAL connect_timeout = 20;”使用“SHOW STATUS like 'aborted_%';”语句查询异常终止的连接和失败的连接;
 
  ②、系统过载:使用shell命令“top”观察mysql占有的内存、cpu情况;使用shell命令“free -h”看内存占有情况;使用shell命令“uptime”看cpu负载情况;使用shell命令“df -h”看磁盘空间使用率,特别占用率100%的情况;
  查看全部
连接MySQL提示:
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
这是由于库文件初始化连接MySQL时连接失败引起的。
 
导致此错误的原因有:
  • mysql设置文件中“bind-address”值的问题;
  • 访问权限限制问题;
  • 防火墙、杀毒软件阻拦的问题(特别是Windows);
  • 负载过大、最大连接限制了访问(特别正式提供服务的mysql)
 
 
1、mysql设置文件的问题:
  在mysql数据库一些版本,为了保证安全,mysql安装后,默认只监听本机ip的“127.0.0.1”,如下:
reading_initial_communication_packet.png
  这时表现为连接“127.0.0.1”或“localhost”可以连通,连接局域网ip和公网IP无法连通。这时我们将“/etc/my.cnf”文件中的“bind-address”行前添加一个“#”号注释掉,并重启mysqld服务即可:
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1
  注:linux下mysql配置文件默认在“/etc/my.cnf”,Windows平台mysql配置文件在安装目录下的“my.ini”。
 
2、访问权限的问题:
  ①、默认mysql的账户只允许本机登录的,要给账户授权通过“ip+端口”进行远程访问,需要先在mysql服务器上授权。在服务器桑登录到mysql,执行下面SQL语句授权:
use mysql;
-- 将数据库"aiezu"的所有权限授权给"root"通过密码"123456"在"8.8.8.8"上进行访问;
grant all privileges on aiezu.* to 'root'@'8.8.8.8' identified by '123456';

-- 将数据库"test"的所有权限授权给"aiezu"通过密码"123321"在任何主机上进行访问;
grant all privileges on test.* to 'aiezu'@'%' identified by '123321';

--刷新权限表
flush privileges;

   ②、 在mysql客户端连接到服务端时,服务端会根据客户端的ip,尝试将客户端的ip解析为“主机名”,再通过“主机名”去检查mysql的权限表,这项功能叫“name-resolv”。由于此功能的某些原因,也会导致我们文章标题中的错误,还有就是会导致连接数据库变慢,所以需要将吃功能禁用。
  禁用方法:在mysql设置文件“[mysqld]”选项组下一行“skip-name-resolve”;
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1
skip-name-resolve
 
  ③、如果是linux,修改“/etc/hosts.allow”文件,在文件的末尾添加下面内容,允许所有主机访问本机的“mysql”服务:
mysqld : ALL : ALLOW
mysqld-max : ALL : ALLOW
 
3、防火墙和杀毒软件:
  关闭杀毒软件和防火墙试试,windows方面:关闭系统防火墙,中国人常用的QQ电脑管家、360安全卫士、QQ医生、金山毒霸、卡巴斯基等;linux方便,检查iptables、ipfire系统自带防火墙的设置。
 
4、服务过载的问题:
  ①、mysql服务过载:
  • 执行“show processlist;”SQL命令看是否当前打开的连接过多;
 
  • 使用“show variables like '%connect_timeout%';”语句的设置值,改成一个稍大的值,如20:“SET GLOBAL connect_timeout = 20;”
  • 使用“SHOW STATUS like 'aborted_%';”语句查询异常终止的连接和失败的连接;

 
  ②、系统过载:
  • 使用shell命令“top”观察mysql占有的内存、cpu情况;
  • 使用shell命令“free -h”看内存占有情况;
  • 使用shell命令“uptime”看cpu负载情况;
  • 使用shell命令“df -h”看磁盘空间使用率,特别占用率100%的情况;

 

CentOS使用Yum为PHP安装Xdebug调试神器

PHPlinyu520 发表了文章 • 0 个评论 • 1144 次浏览 • 2016-11-17 22:10 • 来自相关话题

一、实验环境:操作系统:CentOS Linux release 7.2.1511 (Core)PHP版本:PHP 5.4.16 (cli) ,Yum方式安装Xdebug版本:2.2.7-1.el7 
  
二、安装前准备:
  不管是Lamp环境还是Lnmp环境,这里不讲述安装过程,这里只讲述Xdebug的安装。虽然使用yum方式安装Xdebug比较简单,但是还是建议在实验环境测试,安装前最好备份数据。
 
三、安装:
1、使用yum安装xdebug:[root@aiezu.com ~]# yum list|grep xdebug
php-pecl-xdebug.x86_64 2.2.7-1.el7 @epel
[root@aiezu.com ~]# yum install php-pecl-xdebug安装完成后,会生成“/etc/php.d/xdebug.ini”配置文件,配置文件中已经设置好xdebug的so文件,我们在这配置文件中设置xdebug设置参数。
 
四、配置Xdebug:
1、创建日志目录:
  我们创建/tmp/xdebug做为日志存储目录:[root@aiezu.com ~]# mkdir -p /tmp/xdebug
[root@aiezu.com ~]# chmod -R 777 /tmp/xdebug 
2、配置xdebug参数:
  修改“/etc/php.d/xdebug.ini”文件,根据你的需求配置参数,详细参数见附件中的《Xdebug详细参数表》。; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

;启用代码自动跟踪
xdebug.auto_trace = On
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir = /tmp/xdebug
;PHP代码跟踪日志文件名格式
xdebug.trace_output_name = trace.%c.%H
;启用性能检测分析
xdebug.profiler_enable=On
;允许收集传递给函数的参数变量
xdebug.collect_params= 4
;允许收集函数调用的返回值
xdebug.collect_return=On
;是否收集include、require的文件
xdebug.collect_includes = On
;是否收集内存的增加还是减少
;xdebug.show_mem_delta = On
;是否打印函数调用的最外围中的所有局部变量
;xdebug.show_local_vars = On
xdebug.profiler_enable = Off
;xdebug.profiler_output_dir = /tmp/xdebug
;xdebug.profiler_output_name = cachegrind.out.%H注:设置“xdebug.auto_trace = On”时,将会在执行所有PHP脚本之前先自动启用跟踪;另外,你也可以设置为“xdebug.auto_trace = 0”,并在PHP脚本开头和结尾分别调用xdebug_start_trace()和 xdebug_stop_trace()函数开启和结束跟踪。如:<?php
xdebug_start_trace();
//要追踪的代码
xdebug_stop_trace(); 
五、查看追踪日志:
  设置好配置文件后,并重启httpd服务,如果开启自动追踪,或者在脚本中使用xdebug_start_trace()和xdebug_stop_trace()函数开启追踪,那么在“/tmp/xdebug”命令下就可以看到追踪日志了。你可以使用vim查看他们,找出脚本中的问题。

附件:Xdebug详细参数表:选项名类型默认值参数选项描述xdebug.auto_tracebooleanOff是否在脚本运行之前自动调用相关追踪函数。xdebug.cli_colorinteger0如果值=1:
  当处于CLI模式或连接虚拟控制台时,Xdebug将高亮显示var_dumps()和堆栈输出;在Windows中,这需要安装ANSICON工具。
如果值=2:
  不管是否处于CLI模式或连接虚拟控制台,Xdebug都会高亮显示var_dumps()或堆栈输出;这种情况下,你可能会看到转义后的代码。
该参数自2.2版本开始引入。xdebug.collect_assignmentsbooleanOff用于控制是否为函数跟踪添加变量赋值功能。
该参数自2.1版本开始引入。xdebug.collect_includesbooleanOn控制是否在跟踪文件中写入include()、include_once()、require()、require_once()等函数中用到的文件名。xdebug.collect_paramsinteger0控制在调用函数时,是否收集传递给函数的参数信息。
  如果值=0,则不显示任何信息。
  如果值=1,只显示类型和大小信息,例如:string(6)、array(8)。
  如果值=2,将显示类型和大小,以及全部信息的工具提示。
  如果值=3,将显示变量的全部内容。
  如果值=4,将显示变量的全部内容和变量名。
如果参数值过大,这可能会占用大量的内存;不过,在Xdebug 2中不会出现该问题,因为Xdebug 2将相关数据写入磁盘中,而不是占用内存。xdebug.collect_returnbooleanOff控制是否在追踪文件中写入函数调用的返回值。xdebug.collect_varsbooleanOff控制是否收集指定作用域中的变量信息。由于需要反向工程PHP的操作码数组,因此Xdebug的分析速度可能比较慢。xdebug.coverage_enablebooleanOn控制是否允许通过设置内部结构来启用代码覆盖率功能。
该参数自2.2版本开始引入。xdebug.default_enablebooleanOn当发生异常或错误时,是否默认显示堆栈信息。xdebug.dump.*stringEmpty这里的*可以是COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一个。用于指定发生错误时是否显示超全局变量数组中的索引变量信息。比如,你想要显示请求的IP地址和请求方式,可以设置为xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD多个索引变量用英文逗号隔开,如果要输出其中的所有变量,可以直接用*,例如:xdebug.dump.GET=*xdebug.dump_globalsbooleanOn控制是否显示通过xdebug.dump.*定义的所有超全局变量的信息。xdebug.dump_oncebooleanOn如果出现多个错误,控制超全局变量信息是在所有错误中显示,还是只在第一个错误中显示。xdebug.dump_undefinedbooleanOn控制是否显示超全局变量中未定义的值。xdebug.extended_infointeger1是否强制进入PHP解析器的"extended_info"模式,这将允许Xdebug以远程调试器对文件或行添加断点。开启此模式将拖慢脚本的允许速度,该参数只能在php.ini中设置。xdebug.file_link_formatstring,用于指定堆栈信息中用到的文件名称的链接样式,这允许IDE通过设置链接协议,直接点击堆栈信息中的文件名称,即可快速打开指定的文件。
例如:ZendStudio://%f@%l(%f表示文件路径,%f表示行号)。
自2.2版本开始引入。xdebug.force_display_errorsinteger0是否强制显示错误信息。
自2.3版本开始引入。xdebug.force_error_reportinginteger0是否强制显示所有错误级别的信息。
自2.3版本开始引入。xdebug.halt_levelinteger0指定出现那些错误级别的错误时,中止程序运行。例如:xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE(也仅支持上述4种错误级别)。
自2.3版本开始引入。xdebug.idekeystring*complex*指定传递给DBGp调试器处理程序的IDE Key。xdebug.manual_urlstringhttp://www.php.net用于指定从函数堆栈和错误信息链接到的帮助手册的基本URL。
仅2.2.1以下版本可用。xdebug.max_nesting_levelinteger100指定递归的嵌套层级数。xdebug.overload_var_dumpbooleanOn当php.ini中的html_error设为1时,Xdebug是否默认使用自身的改进版本来重载var_dump()。
自2.2版本开始引入。xdebug.profiler_appendinteger0当多个请求映射到相同文件时,指定是覆盖之前的调试信息文件还是追加内容到该文件中。xdebug.profiler_enableinteger0指定是否启用Xdebug的性能分析,并创建性能信息文件。xdebug.profiler_output_dirstring/tmp指定性能分析信息文件的输出目录xdebug.profiler_output_namestringcachegrind.out.%p

 指定性能分析信息文件的名称xdebug.remote_enablebooleanOff是否开启远程调试xdebug.remote_handlerstringdbgp指定远程调试的处理协议xdebug.remote_hoststringlocalhost指定远程调试的主机名xdebug.remote_logstring 指定远程调试的日志文件名xdebug.remote_modestringreq可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。xdebug.remote_portinteger9000指定远程调试的端口号xdebug.trace_optionsinteger0指定对于之后的请求,追踪文件是追加内容还是覆盖之前内容。xdebug.trace_output_dirstring/tmp指定追踪文件的存放目录xdebug.trace_output_namestringtrace.%c指定追踪文件的名称xdebug.show_exception_tracebooleanOff是否开启异常跟踪xdebug.show_mem_deltabooleanOff是否追踪内存的变化xdebug.show_local_varsbooleanOff是否显示局部变量  查看全部
一、实验环境:
  • 操作系统:CentOS Linux release 7.2.1511 (Core)
  • PHP版本:PHP 5.4.16 (cli) ,Yum方式安装
  • Xdebug版本:2.2.7-1.el7 

  
二、安装前准备:
  不管是Lamp环境还是Lnmp环境,这里不讲述安装过程,这里只讲述Xdebug的安装。虽然使用yum方式安装Xdebug比较简单,但是还是建议在实验环境测试,安装前最好备份数据。
 
三、安装:
1、使用yum安装xdebug:
[root@aiezu.com ~]# yum list|grep xdebug
php-pecl-xdebug.x86_64 2.2.7-1.el7 @epel
[root@aiezu.com ~]# yum install php-pecl-xdebug
安装完成后,会生成“/etc/php.d/xdebug.ini”配置文件,配置文件中已经设置好xdebug的so文件,我们在这配置文件中设置xdebug设置参数。
 
四、配置Xdebug:
1、创建日志目录:
  我们创建/tmp/xdebug做为日志存储目录:
[root@aiezu.com ~]# mkdir -p /tmp/xdebug
[root@aiezu.com ~]# chmod -R 777 /tmp/xdebug
 
2、配置xdebug参数:
  修改“/etc/php.d/xdebug.ini”文件,根据你的需求配置参数,详细参数见附件中的《Xdebug详细参数表》。
; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

;启用代码自动跟踪
xdebug.auto_trace = On
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir = /tmp/xdebug
;PHP代码跟踪日志文件名格式
xdebug.trace_output_name = trace.%c.%H
;启用性能检测分析
xdebug.profiler_enable=On
;允许收集传递给函数的参数变量
xdebug.collect_params= 4
;允许收集函数调用的返回值
xdebug.collect_return=On
;是否收集include、require的文件
xdebug.collect_includes = On
;是否收集内存的增加还是减少
;xdebug.show_mem_delta = On
;是否打印函数调用的最外围中的所有局部变量
;xdebug.show_local_vars = On
xdebug.profiler_enable = Off
;xdebug.profiler_output_dir = /tmp/xdebug
;xdebug.profiler_output_name = cachegrind.out.%H
注:设置“xdebug.auto_trace = On”时,将会在执行所有PHP脚本之前先自动启用跟踪;另外,你也可以设置为“xdebug.auto_trace = 0”,并在PHP脚本开头和结尾分别调用xdebug_start_trace()和 xdebug_stop_trace()函数开启和结束跟踪。如:
<?php
xdebug_start_trace();
//要追踪的代码
xdebug_stop_trace();
 
五、查看追踪日志:
  设置好配置文件后,并重启httpd服务,如果开启自动追踪,或者在脚本中使用xdebug_start_trace()和xdebug_stop_trace()函数开启追踪,那么在“/tmp/xdebug”命令下就可以看到追踪日志了。你可以使用vim查看他们,找出脚本中的问题。

附件:Xdebug详细参数表:
选项名类型默认值参数选项描述
xdebug.auto_tracebooleanOff是否在脚本运行之前自动调用相关追踪函数。
xdebug.cli_colorinteger0如果值=1:
  当处于CLI模式或连接虚拟控制台时,Xdebug将高亮显示var_dumps()和堆栈输出;在Windows中,这需要安装ANSICON工具。
如果值=2:
  不管是否处于CLI模式或连接虚拟控制台,Xdebug都会高亮显示var_dumps()或堆栈输出;这种情况下,你可能会看到转义后的代码。
该参数自2.2版本开始引入。
xdebug.collect_assignmentsbooleanOff用于控制是否为函数跟踪添加变量赋值功能。
该参数自2.1版本开始引入。
xdebug.collect_includesbooleanOn控制是否在跟踪文件中写入include()、include_once()、require()、require_once()等函数中用到的文件名。
xdebug.collect_paramsinteger0控制在调用函数时,是否收集传递给函数的参数信息。
  如果值=0,则不显示任何信息。
  如果值=1,只显示类型和大小信息,例如:string(6)、array(8)。
  如果值=2,将显示类型和大小,以及全部信息的工具提示。
  如果值=3,将显示变量的全部内容。
  如果值=4,将显示变量的全部内容和变量名。
如果参数值过大,这可能会占用大量的内存;不过,在Xdebug 2中不会出现该问题,因为Xdebug 2将相关数据写入磁盘中,而不是占用内存。
xdebug.collect_returnbooleanOff控制是否在追踪文件中写入函数调用的返回值。
xdebug.collect_varsbooleanOff控制是否收集指定作用域中的变量信息。由于需要反向工程PHP的操作码数组,因此Xdebug的分析速度可能比较慢。
xdebug.coverage_enablebooleanOn控制是否允许通过设置内部结构来启用代码覆盖率功能。
该参数自2.2版本开始引入。
xdebug.default_enablebooleanOn当发生异常或错误时,是否默认显示堆栈信息。
xdebug.dump.*stringEmpty这里的*可以是COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一个。用于指定发生错误时是否显示超全局变量数组中的索引变量信息。比如,你想要显示请求的IP地址和请求方式,可以设置为xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD多个索引变量用英文逗号隔开,如果要输出其中的所有变量,可以直接用*,例如:xdebug.dump.GET=*
xdebug.dump_globalsbooleanOn控制是否显示通过xdebug.dump.*定义的所有超全局变量的信息。
xdebug.dump_oncebooleanOn如果出现多个错误,控制超全局变量信息是在所有错误中显示,还是只在第一个错误中显示。
xdebug.dump_undefinedbooleanOn控制是否显示超全局变量中未定义的值。
xdebug.extended_infointeger1是否强制进入PHP解析器的"extended_info"模式,这将允许Xdebug以远程调试器对文件或行添加断点。开启此模式将拖慢脚本的允许速度,该参数只能在php.ini中设置。
xdebug.file_link_formatstring,用于指定堆栈信息中用到的文件名称的链接样式,这允许IDE通过设置链接协议,直接点击堆栈信息中的文件名称,即可快速打开指定的文件。
例如:ZendStudio://%f@%l(%f表示文件路径,%f表示行号)。
自2.2版本开始引入。
xdebug.force_display_errorsinteger0是否强制显示错误信息。
自2.3版本开始引入。
xdebug.force_error_reportinginteger0是否强制显示所有错误级别的信息。
自2.3版本开始引入。
xdebug.halt_levelinteger0指定出现那些错误级别的错误时,中止程序运行。例如:xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE(也仅支持上述4种错误级别)。
自2.3版本开始引入。
xdebug.idekeystring*complex*指定传递给DBGp调试器处理程序的IDE Key。
xdebug.manual_urlstringhttp://www.php.net用于指定从函数堆栈和错误信息链接到的帮助手册的基本URL。
仅2.2.1以下版本可用。
xdebug.max_nesting_levelinteger100指定递归的嵌套层级数。
xdebug.overload_var_dumpbooleanOn当php.ini中的html_error设为1时,Xdebug是否默认使用自身的改进版本来重载var_dump()。
自2.2版本开始引入。
xdebug.profiler_appendinteger0当多个请求映射到相同文件时,指定是覆盖之前的调试信息文件还是追加内容到该文件中。
xdebug.profiler_enableinteger0指定是否启用Xdebug的性能分析,并创建性能信息文件。
xdebug.profiler_output_dirstring/tmp指定性能分析信息文件的输出目录
xdebug.profiler_output_namestringcachegrind.out.%p

 
指定性能分析信息文件的名称
xdebug.remote_enablebooleanOff是否开启远程调试
xdebug.remote_handlerstringdbgp指定远程调试的处理协议
xdebug.remote_hoststringlocalhost指定远程调试的主机名
xdebug.remote_logstring 指定远程调试的日志文件名
xdebug.remote_modestringreq可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。
xdebug.remote_portinteger9000指定远程调试的端口号
xdebug.trace_optionsinteger0指定对于之后的请求,追踪文件是追加内容还是覆盖之前内容。
xdebug.trace_output_dirstring/tmp指定追踪文件的存放目录
xdebug.trace_output_namestringtrace.%c指定追踪文件的名称
xdebug.show_exception_tracebooleanOff是否开启异常跟踪
xdebug.show_mem_deltabooleanOff是否追踪内存的变化
xdebug.show_local_varsbooleanOff是否显示局部变量 

PHP自定义异常处理函数

PHPlinyu520 发表了文章 • 0 个评论 • 303 次浏览 • 2016-11-16 13:56 • 来自相关话题

  我们常需要根据项目的不同,对代码运行日志记录有不同的需求。这不同的需求包含,需要记录的内容不同、记录的格式不同、日志的输出方式(写如文件、发EMail、发短信等)不同。这时,我们可以将自己的日志记录需求实现方法定义到一个类中,然后再通过下面这些函数,将类的方法注册到对应的事件,这样当事件发生时,系统自定会按我们的需求将日志记录到指定的地方。

一、register_shutdown_function函数:
  register_shutdown_function()函数用来设置当PHP脚本执行完成、或者exit()退出时要调用的函数。register_shutdown_function(array('Err','shutdown_function'));  
二、set_error_handler函数:
  set_error_handler函数使用来设置脚本发生错误时调用的函数,用法如下:set_error_handler(array('Err','error_handler'));通过 set_error_handler() 函数设置用户自定义的错误处理程序,然后触发错误(通过 trigger_error()):

三、set_exception_handler函数:set_exception_handler(array('Err','appException'));
简单示例:<?php
date_default_timezone_set('PRC');
register_shutdown_function(array('Err','successHandle'));
set_error_handler(array('Err','errorHandler'));
set_exception_handler(array('Err','exceptionHandle'));
class Err {
private static $logFile = 'log.txt';
//脚本发生错误
public static function errorHandler($errno, $errstr, $errfile, $errline){
$msg = sprintf("Error: %s %s %s:%s", $errno, $errstr, $errfile, $errline);
self::writeLog($msg);
}

//脚本执行完成
public static function successHandle() {
self::writeLog("Success.");
}

//脚本抛出异常
public static function exceptionHandle($exception) {
$msg = sprintf("Exception: %s", $exception->getMessage());
self::writeLog($msg);
}

//写日志
private static function writeLog( $msg ) {
$msg = sprintf("%s %s\t%s\n", date('Y-m-d H:i:s'), $_SERVER['REMOTE_ADDR'], $msg);
file_put_contents(self::$logFile, $msg, FILE_APPEND);
}
}

throw new Exception("发生异常啦"); 查看全部
  我们常需要根据项目的不同,对代码运行日志记录有不同的需求。这不同的需求包含,需要记录的内容不同、记录的格式不同、日志的输出方式(写如文件、发EMail、发短信等)不同。这时,我们可以将自己的日志记录需求实现方法定义到一个类中,然后再通过下面这些函数,将类的方法注册到对应的事件,这样当事件发生时,系统自定会按我们的需求将日志记录到指定的地方。

一、register_shutdown_function函数:
  register_shutdown_function()函数用来设置当PHP脚本执行完成、或者exit()退出时要调用的函数。
register_shutdown_function(array('Err','shutdown_function'));
  
二、set_error_handler函数:
  set_error_handler函数使用来设置脚本发生错误时调用的函数,用法如下:
set_error_handler(array('Err','error_handler'));
通过 set_error_handler() 函数设置用户自定义的错误处理程序,然后触发错误(通过 trigger_error()):

三、set_exception_handler函数:
set_exception_handler(array('Err','appException'));

简单示例:
<?php
date_default_timezone_set('PRC');
register_shutdown_function(array('Err','successHandle'));
set_error_handler(array('Err','errorHandler'));
set_exception_handler(array('Err','exceptionHandle'));
class Err {
private static $logFile = 'log.txt';
//脚本发生错误
public static function errorHandler($errno, $errstr, $errfile, $errline){
$msg = sprintf("Error: %s %s %s:%s", $errno, $errstr, $errfile, $errline);
self::writeLog($msg);
}

//脚本执行完成
public static function successHandle() {
self::writeLog("Success.");
}

//脚本抛出异常
public static function exceptionHandle($exception) {
$msg = sprintf("Exception: %s", $exception->getMessage());
self::writeLog($msg);
}

//写日志
private static function writeLog( $msg ) {
$msg = sprintf("%s %s\t%s\n", date('Y-m-d H:i:s'), $_SERVER['REMOTE_ADDR'], $msg);
file_put_contents(self::$logFile, $msg, FILE_APPEND);
}
}

throw new Exception("发生异常啦");

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)

Mysqlllslx520 发表了文章 • 0 个评论 • 10519 次浏览 • 2016-11-04 16:50 • 来自相关话题

  有时候,当我们使用“mysql”、“mysqladmin”、“mysqldump”等命令管理数据库时,服务器抛出类似如下错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)这个错误是由于什么原因导致的呢?请看后面爱E族(aiezu.com)为您提供的分析。 一、错误现场还原:下面我们通过三种方式来连接,然后观察提示的错误信息:1、直接使用“mysql”命令,不带主机名参数;2、使用带了主机名“localhost”参数的“mysql -h localhost”命令;3、使用带了主机名“127.0.0.1”参数的“mysql -h 127.0.0.1”命令。[root@aiezu.com ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h localhost
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h 127.0.0.1
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)  通过上面实验可以看出,前面两种方式都能产生标题中的错误,而第三种方式连接是不会产生标题中的错误的(第三种方式这里产生的是由于密码问题拒绝访问的错误信息)(爱E族)。 二、错误产生原因解析:   这是由于我们连接数据库使用的主机名参数为“localhost”,或者未使用主机名参数、服务器默认使用“localhost”做为主机名(爱E族)。 使用主机名参数为“localhost”连接mysql服务端时,mysql客户端会认为是连接本机,所以会尝试以socket文件方式进行连接(socket文件连接方式,比“ip:端口”方式效率更高),这时根据配置文件“/etc/my.cnf”的路径,未找到相应的socket文件,就会引发此错误。
   三、修复故障前准备:1、看mysql服务是否在运行:  由于“socket”文件是由mysql服务运行时创建的,如果提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”,找不到“socket”文件,我们首先要确认的是mysql服务是否正在运行。# 1、 端口是否打开
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 12207 mysql 14u IPv4 52350 0t0 TCP *:mysql (LISTEN)

# 2、mysqld服务是否正在运行
[root@aiezu.com ~]# service mysqld status
mysqld (pid 4717) is running...

# 3、如果mariadb,同样方法查服务是否正在运行:
[root@aiezu.com ~]# service mariadb status
Redirecting to /bin/systemctl status mariadb.service
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2016-11-03 13:47:37 CST; 23min ago  2、确定“socket”文件正确位置:  确定mysql服务正常运行后,产生此错误的原因只剩下“socket”文件路径不正确了,我们可以使用“find”命令或者“lsof”命令来确定socket文件的正确路径:[root@aiezu.com ~]# lsof -c mysqld|grep sock$
mysqld 4717 mysql 12u unix 0xffff88010a655b80 0t0 77474827 /storage/db/mysql/mysql.sock

[root@aiezu.com ~]# find / -name '*.sock'
/storage/db/mysql/mysql.sock 四、故障解决方法:解决方案一:  修改“/etc/my.cnf”配置文件,在配置文件中添加“[client]”选项和“[mysql]”选项,并使用这两个选项下的“socket”参数值,与“[mysqld]”选项下的“socket”参数值,指向的socket文件路径完全一致。如下: [mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
...省略n行(爱E族)...

[client]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock

[mysql]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock修改完后,重启mysqld服务,即可解决此问题。
 解决方案二:  使用“ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock”命令,将正确的socket文件位置,软链接到提示错误的socket文件路径位置,即可解决此问题:[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
ls: cannot access /var/lib/mysql/mysql.sock: No such file or directory
[root@aiezu.com ~]# ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sock   五、后序:  这篇文章只讲述了mysql提供的“mysql”、“mysqldump”、“mysqladmin”等命令提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”的解决方法,如果需要解决“php”、“perl”、“python”等脚本语言提示此错误的问题,请参考爱E族的另外一篇文章:http://aiezu.com/article/mysql_php_connect_through_socket.html 查看全部
  有时候,当我们使用“mysql”、“mysqladmin”、“mysqldump”等命令管理数据库时,服务器抛出类似如下错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
这个错误是由于什么原因导致的呢?请看后面爱E族(aiezu.com)为您提供的分析。

 

一、错误现场还原:

下面我们通过三种方式来连接,然后观察提示的错误信息:
  • 1、直接使用“mysql”命令,不带主机名参数;
  • 2、使用带了主机名“localhost”参数的“mysql -h localhost”命令;
  • 3、使用带了主机名“127.0.0.1”参数的“mysql -h 127.0.0.1”命令。
[root@aiezu.com ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h localhost
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h 127.0.0.1
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
  通过上面实验可以看出,前面两种方式都能产生标题中的错误,而第三种方式连接是不会产生标题中的错误的(第三种方式这里产生的是由于密码问题拒绝访问的错误信息)(爱E族)。

 

二、错误产生原因解析:

   这是由于我们连接数据库使用的主机名参数为“localhost”,或者未使用主机名参数、服务器默认使用“localhost”做为主机名(爱E族)。 使用主机名参数为“localhost”连接mysql服务端时,mysql客户端会认为是连接本机,所以会尝试以socket文件方式进行连接(socket文件连接方式,比“ip:端口”方式效率更高),这时根据配置文件“/etc/my.cnf”的路径,未找到相应的socket文件,就会引发此错误。
   

三、修复故障前准备:

1、看mysql服务是否在运行:

  由于“socket”文件是由mysql服务运行时创建的,如果提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”,找不到“socket”文件,我们首先要确认的是mysql服务是否正在运行。
# 1、 端口是否打开
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 12207 mysql 14u IPv4 52350 0t0 TCP *:mysql (LISTEN)

# 2、mysqld服务是否正在运行
[root@aiezu.com ~]# service mysqld status
mysqld (pid 4717) is running...

# 3、如果mariadb,同样方法查服务是否正在运行:
[root@aiezu.com ~]# service mariadb status
Redirecting to /bin/systemctl status mariadb.service
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2016-11-03 13:47:37 CST; 23min ago
  

2、确定“socket”文件正确位置:

  确定mysql服务正常运行后,产生此错误的原因只剩下“socket”文件路径不正确了,我们可以使用“find”命令或者“lsof”命令来确定socket文件的正确路径:
[root@aiezu.com ~]# lsof  -c mysqld|grep sock$
mysqld 4717 mysql 12u unix 0xffff88010a655b80 0t0 77474827 /storage/db/mysql/mysql.sock

[root@aiezu.com ~]# find / -name '*.sock'
/storage/db/mysql/mysql.sock
 

四、故障解决方法:

解决方案一:

  修改“/etc/my.cnf”配置文件,在配置文件中添加“[client]”选项和“[mysql]”选项,并使用这两个选项下的“socket”参数值,与“[mysqld]”选项下的“socket”参数值,指向的socket文件路径完全一致。如下: 
[mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
...省略n行(爱E族)...

[client]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock

[mysql]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock
修改完后,重启mysqld服务,即可解决此问题。
 

解决方案二:

  使用“ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock”命令,将正确的socket文件位置,软链接到提示错误的socket文件路径位置,即可解决此问题:
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
ls: cannot access /var/lib/mysql/mysql.sock: No such file or directory
[root@aiezu.com ~]# ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sock

  

 五、后序:

  这篇文章只讲述了mysql提供的“mysql”、“mysqldump”、“mysqladmin”等命令提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”的解决方法,如果需要解决“php”、“perl”、“python”等脚本语言提示此错误的问题,请参考爱E族的另外一篇文章:http://aiezu.com/article/mysql_php_connect_through_socket.html

FATAL ERROR: please install the following Perl modules before executing

回复

CentOSliuliangsong 回复了问题 • 0 人关注 • 1 个回复 • 971 次浏览 • 2016-11-30 17:51 • 来自相关话题

mysql错误ERROR 1064 (42000)

回复

Mysqllinyu520 回复了问题 • 1 人关注 • 1 个回复 • 652 次浏览 • 2016-11-18 12:41 • 来自相关话题

PHP自动记录站点所有错误异常到日志文件

回复

PHP匿名用户 回复了问题 • 1 人关注 • 1 个回复 • 423 次浏览 • 2016-10-31 16:25 • 来自相关话题

ERROR 1442 (HY000): Can't update table '...' in stored function/trigger because it is already used

Mysqlliuliangsong 发表了文章 • 0 个评论 • 402 次浏览 • 2016-12-22 16:31 • 来自相关话题

一、MySQL错误现象:MySQL执行创建的触发器时,报如下错误:ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 下面为错误触发器的创建过程:1、创建测试表格:drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)2、创建一个MySQL触发器:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;3、测试触发效果:mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 二、错误原因:  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 三、解决方案:1、将触发器的创建SQL语句改成如下并执行创建即可:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ; 触发器测试效果:aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec) 查看全部

一、MySQL错误现象:

MySQL执行创建的触发器时,报如下错误:
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

 下面为错误触发器的创建过程:

1、创建测试表格:

drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)

2、创建一个MySQL触发器:

DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;

3、测试触发效果:

mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 

二、错误原因:

  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 

三、解决方案:

1、将触发器的创建SQL语句改成如下并执行创建即可:
DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ;
 触发器测试效果:
aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec)

ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist

Mysqlliuliangsong 发表了文章 • 0 个评论 • 787 次浏览 • 2016-12-22 16:08 • 来自相关话题

一、MySQL错误现象:  执行创建的存储过程或者触发器报:ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist 二、错误原因:  这样由于创建存储过程或者触发器时间,指定的DEFINER为'root'@'%',而在MySQL的权限表(mysql.user)中,并不存在相关的user和host:mysql> select host,user,password from mysql.user;
+-------------------------+------+----------+
| host | user | password |
+-------------------------+------+----------+
| localhost | root | |
| aiezu | root | |
| 127.0.0.1 | root | |
| ::1 | root | |
| localhost | | |
| aiezu | | |
+-------------------------+------+----------+ 三、解决方案:  执行下面SQL语句,为'root'@'%'授权即可:grant all privileges on *.* to 'root'@'%' identified by ".";
flush privileges;

select host,user,password from mysql.user; 
执行效果: 查看全部

一、MySQL错误现象:

  执行创建的存储过程或者触发器报:
ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist
 

二、错误原因:

  这样由于创建存储过程或者触发器时间,指定的DEFINER'root'@'%',而在MySQL的权限表(mysql.user)中,并不存在相关的userhost
mysql> select host,user,password from mysql.user;
+-------------------------+------+----------+
| host | user | password |
+-------------------------+------+----------+
| localhost | root | |
| aiezu | root | |
| 127.0.0.1 | root | |
| ::1 | root | |
| localhost | | |
| aiezu | | |
+-------------------------+------+----------+
 

三、解决方案:

  执行下面SQL语句,为'root'@'%'授权即可:
grant all privileges on *.* to 'root'@'%' identified by ".";
flush privileges;

select host,user,password from mysql.user;
 
执行效果:
mysql_error_1449_hy000.png

Starting MySQL. ERROR! The server quit without updating PID file

Linuxliuliangsong 发表了文章 • 0 个评论 • 612 次浏览 • 2016-11-30 17:59 • 来自相关话题

  今天安装好MySQL数据库后,在启动数据库时提示下面错误:[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid). 
解决思路:
  遇到问题,在错误信息显示得不够完善的情况下,我们第一个应该想到的是看日志;mysql的日志在哪里呢?看“/etc/my.cnf”配置文件中的“log-error=”项,如“log-error=/var/log/mysqld.log”则日志文件在“/var/log/mysqld.log”。

  在日志文件中,我们看到了类似下列信息:2016-11-30 22:53:29 2908 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)
2016-11-30 22:53:29 2908 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
2016-11-30 22:53:29 2908 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
2016-11-30 22:53:29 2908 [ERROR] InnoDB: The system tablespace must be writable!
...日志中出现了类似“Permission denied”、“Can't determine file permissions”等信息,可以确定是“mysqld”访问文件权限的问题。导致此问题可能的原因有:磁盘空间问题、文件夹权限、setlinux权限的问题,下面是我的解决方法。
 
1、检查磁盘空间:
  使用“df -h”命令查看空间使用情况,尤其是空间占用达到90%以上的:[root@aiezu.com ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 13G 3.8G 9.2G 30% /
devtmpfs 362M 0 362M 0% /dev
tmpfs 371M 0 371M 0% /dev/shm
tmpfs 371M 9.6M 362M 3% /run
tmpfs 371M 0 371M 0% /sys/fs/cgroup
/dev/sda1 497M 102M 396M 21% /boot  使用“df -i”命令查看“Inode”的使用情况,如果“Inode”不足,也会无法创建文件:[root@aiezu.com ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 13598720 41755 13556965 1% /
devtmpfs 92526 334 92192 1% /dev
tmpfs 94889 1 94888 1% /dev/shm
tmpfs 94889 359 94530 1% /run
tmpfs 94889 13 94876 1% /sys/fs/cgroup
/dev/sda1 512000 329 511671 1% /boot 
2、文件系统权限:
  mysql的数据目录需要对“mysql”用户有读写执行:[root@aiezu.com ~]# chown -R mysql.mysql /storage/mysql/
[root@aiezu.com ~]# ll /storage/mysql/
总用量 110600
-rw-rw----. 1 mysql mysql 12582912 11月 30 17:49 ibdata1
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:49 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:48 ib_logfile1
drwx------. 2 mysql mysql 4096 11月 30 17:49 mysql
drwx------. 2 mysql mysql 4096 11月 30 17:49 performance_schema
drwx------. 2 mysql mysql 6 11月 30 17:48 test 
3、selinux权限问题:
  如果希望判断是不是由于“selinux”导致的,可以使用“setenforce 0”命令暂时关闭“selinux”,再启动mysql服务试试:[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# getenforce
Enforcing
[root@aiezu.com ~]# setenforce 0
[root@aiezu.com ~]# getenforce
Permissive
[root@aiezu.com ~]# service mysql start
Starting MySQL... SUCCESS!  确定是由“selinux”引起后,由于“setenforce 0”只能暂时关闭“selinux”,重启后又会打开,有两种方式解决:在“/etc/sysconfig/selinux”(CentOS7以下版本)或“/etc/selinux/config”(CentOS7及以上版本)文件中将“SELINUX=enforcing”改成“SELINUX=disabled”,永久关闭“selinux”;使用“chcon”命令配置“selinux”,使“selinux”对mysql相关目录开放权限;[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/mysql
[root@aiezu.com ~]# service mysql start
Starting MySQL. SUCCESS!关于MySQL的SeLinux更多信息,请参考:http://aiezu.com/article/mysql_selinux_config.html 查看全部
  今天安装好MySQL数据库后,在启动数据库时提示下面错误:
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
 
解决思路:
  遇到问题,在错误信息显示得不够完善的情况下,我们第一个应该想到的是看日志;mysql的日志在哪里呢?看“/etc/my.cnf”配置文件中的“log-error=”项,如“log-error=/var/log/mysqld.log”则日志文件在“/var/log/mysqld.log”。

  在日志文件中,我们看到了类似下列信息:
2016-11-30 22:53:29 2908 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)
2016-11-30 22:53:29 2908 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
2016-11-30 22:53:29 2908 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
2016-11-30 22:53:29 2908 [ERROR] InnoDB: The system tablespace must be writable!
...
日志中出现了类似“Permission denied”、“Can't determine file permissions”等信息,可以确定是“mysqld”访问文件权限的问题。导致此问题可能的原因有:磁盘空间问题、文件夹权限、setlinux权限的问题,下面是我的解决方法。
 
1、检查磁盘空间:
  使用“df -h”命令查看空间使用情况,尤其是空间占用达到90%以上的:
[root@aiezu.com ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 13G 3.8G 9.2G 30% /
devtmpfs 362M 0 362M 0% /dev
tmpfs 371M 0 371M 0% /dev/shm
tmpfs 371M 9.6M 362M 3% /run
tmpfs 371M 0 371M 0% /sys/fs/cgroup
/dev/sda1 497M 102M 396M 21% /boot
  使用“df -i”命令查看“Inode”的使用情况,如果“Inode”不足,也会无法创建文件:
[root@aiezu.com ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 13598720 41755 13556965 1% /
devtmpfs 92526 334 92192 1% /dev
tmpfs 94889 1 94888 1% /dev/shm
tmpfs 94889 359 94530 1% /run
tmpfs 94889 13 94876 1% /sys/fs/cgroup
/dev/sda1 512000 329 511671 1% /boot
 
2、文件系统权限:
  mysql的数据目录需要对“mysql”用户有读写执行:
[root@aiezu.com ~]# chown -R mysql.mysql /storage/mysql/
[root@aiezu.com ~]# ll /storage/mysql/
总用量 110600
-rw-rw----. 1 mysql mysql 12582912 11月 30 17:49 ibdata1
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:49 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:48 ib_logfile1
drwx------. 2 mysql mysql 4096 11月 30 17:49 mysql
drwx------. 2 mysql mysql 4096 11月 30 17:49 performance_schema
drwx------. 2 mysql mysql 6 11月 30 17:48 test
 
3、selinux权限问题:
  如果希望判断是不是由于“selinux”导致的,可以使用“setenforce 0”命令暂时关闭“selinux”,再启动mysql服务试试:
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# getenforce
Enforcing
[root@aiezu.com ~]# setenforce 0
[root@aiezu.com ~]# getenforce
Permissive
[root@aiezu.com ~]# service mysql start
Starting MySQL... SUCCESS!
  确定是由“selinux”引起后,由于“setenforce 0”只能暂时关闭“selinux”,重启后又会打开,有两种方式解决:
  1. 在“/etc/sysconfig/selinux”(CentOS7以下版本)或“/etc/selinux/config”(CentOS7及以上版本)文件中将“SELINUX=enforcing”改成“SELINUX=disabled”,永久关闭“selinux”;
  2. 使用“chcon”命令配置“selinux”,使“selinux”对mysql相关目录开放权限;
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/mysql
[root@aiezu.com ~]# service mysql start
Starting MySQL. SUCCESS!
关于MySQL的SeLinux更多信息,请参考:http://aiezu.com/article/mysql_selinux_config.html

Lost connection to MySQL server at 'reading initial communication packet', system error: 0

Mysqlliuliangsong 发表了文章 • 0 个评论 • 591 次浏览 • 2016-11-23 13:29 • 来自相关话题

连接MySQL提示:ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0这是由于库文件初始化连接MySQL时连接失败引起的。
 
导致此错误的原因有:mysql设置文件中“bind-address”值的问题;访问权限限制问题;防火墙、杀毒软件阻拦的问题(特别是Windows);负载过大、最大连接限制了访问(特别正式提供服务的mysql) 
 
1、mysql设置文件的问题:
  在mysql数据库一些版本,为了保证安全,mysql安装后,默认只监听本机ip的“127.0.0.1”,如下:


  这时表现为连接“127.0.0.1”或“localhost”可以连通,连接局域网ip和公网IP无法连通。这时我们将“/etc/my.cnf”文件中的“bind-address”行前添加一个“#”号注释掉,并重启mysqld服务即可:[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1  注:linux下mysql配置文件默认在“/etc/my.cnf”,Windows平台mysql配置文件在安装目录下的“my.ini”。
 
2、访问权限的问题:
  ①、默认mysql的账户只允许本机登录的,要给账户授权通过“ip+端口”进行远程访问,需要先在mysql服务器上授权。在服务器桑登录到mysql,执行下面SQL语句授权:use mysql;
-- 将数据库"aiezu"的所有权限授权给"root"通过密码"123456"在"8.8.8.8"上进行访问;
grant all privileges on aiezu.* to 'root'@'8.8.8.8' identified by '123456';

-- 将数据库"test"的所有权限授权给"aiezu"通过密码"123321"在任何主机上进行访问;
grant all privileges on test.* to 'aiezu'@'%' identified by '123321';

--刷新权限表
flush privileges;
   ②、 在mysql客户端连接到服务端时,服务端会根据客户端的ip,尝试将客户端的ip解析为“主机名”,再通过“主机名”去检查mysql的权限表,这项功能叫“name-resolv”。由于此功能的某些原因,也会导致我们文章标题中的错误,还有就是会导致连接数据库变慢,所以需要将吃功能禁用。
  禁用方法:在mysql设置文件“[mysqld]”选项组下一行“skip-name-resolve”;[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1
skip-name-resolve 
  ③、如果是linux,修改“/etc/hosts.allow”文件,在文件的末尾添加下面内容,允许所有主机访问本机的“mysql”服务:mysqld : ALL : ALLOW
mysqld-max : ALL : ALLOW 
3、防火墙和杀毒软件:
  关闭杀毒软件和防火墙试试,windows方面:关闭系统防火墙,中国人常用的QQ电脑管家、360安全卫士、QQ医生、金山毒霸、卡巴斯基等;linux方便,检查iptables、ipfire系统自带防火墙的设置。
 
4、服务过载的问题:
  ①、mysql服务过载:执行“show processlist;”SQL命令看是否当前打开的连接过多; 使用“show variables like '%connect_timeout%';”语句的设置值,改成一个稍大的值,如20:“SET GLOBAL connect_timeout = 20;”使用“SHOW STATUS like 'aborted_%';”语句查询异常终止的连接和失败的连接;
 
  ②、系统过载:使用shell命令“top”观察mysql占有的内存、cpu情况;使用shell命令“free -h”看内存占有情况;使用shell命令“uptime”看cpu负载情况;使用shell命令“df -h”看磁盘空间使用率,特别占用率100%的情况;
  查看全部
连接MySQL提示:
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
这是由于库文件初始化连接MySQL时连接失败引起的。
 
导致此错误的原因有:
  • mysql设置文件中“bind-address”值的问题;
  • 访问权限限制问题;
  • 防火墙、杀毒软件阻拦的问题(特别是Windows);
  • 负载过大、最大连接限制了访问(特别正式提供服务的mysql)
 
 
1、mysql设置文件的问题:
  在mysql数据库一些版本,为了保证安全,mysql安装后,默认只监听本机ip的“127.0.0.1”,如下:
reading_initial_communication_packet.png
  这时表现为连接“127.0.0.1”或“localhost”可以连通,连接局域网ip和公网IP无法连通。这时我们将“/etc/my.cnf”文件中的“bind-address”行前添加一个“#”号注释掉,并重启mysqld服务即可:
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1
  注:linux下mysql配置文件默认在“/etc/my.cnf”,Windows平台mysql配置文件在安装目录下的“my.ini”。
 
2、访问权限的问题:
  ①、默认mysql的账户只允许本机登录的,要给账户授权通过“ip+端口”进行远程访问,需要先在mysql服务器上授权。在服务器桑登录到mysql,执行下面SQL语句授权:
use mysql;
-- 将数据库"aiezu"的所有权限授权给"root"通过密码"123456"在"8.8.8.8"上进行访问;
grant all privileges on aiezu.* to 'root'@'8.8.8.8' identified by '123456';

-- 将数据库"test"的所有权限授权给"aiezu"通过密码"123321"在任何主机上进行访问;
grant all privileges on test.* to 'aiezu'@'%' identified by '123321';

--刷新权限表
flush privileges;

   ②、 在mysql客户端连接到服务端时,服务端会根据客户端的ip,尝试将客户端的ip解析为“主机名”,再通过“主机名”去检查mysql的权限表,这项功能叫“name-resolv”。由于此功能的某些原因,也会导致我们文章标题中的错误,还有就是会导致连接数据库变慢,所以需要将吃功能禁用。
  禁用方法:在mysql设置文件“[mysqld]”选项组下一行“skip-name-resolve”;
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

#bind-address=127.0.0.1
skip-name-resolve
 
  ③、如果是linux,修改“/etc/hosts.allow”文件,在文件的末尾添加下面内容,允许所有主机访问本机的“mysql”服务:
mysqld : ALL : ALLOW
mysqld-max : ALL : ALLOW
 
3、防火墙和杀毒软件:
  关闭杀毒软件和防火墙试试,windows方面:关闭系统防火墙,中国人常用的QQ电脑管家、360安全卫士、QQ医生、金山毒霸、卡巴斯基等;linux方便,检查iptables、ipfire系统自带防火墙的设置。
 
4、服务过载的问题:
  ①、mysql服务过载:
  • 执行“show processlist;”SQL命令看是否当前打开的连接过多;
 
  • 使用“show variables like '%connect_timeout%';”语句的设置值,改成一个稍大的值,如20:“SET GLOBAL connect_timeout = 20;”
  • 使用“SHOW STATUS like 'aborted_%';”语句查询异常终止的连接和失败的连接;

 
  ②、系统过载:
  • 使用shell命令“top”观察mysql占有的内存、cpu情况;
  • 使用shell命令“free -h”看内存占有情况;
  • 使用shell命令“uptime”看cpu负载情况;
  • 使用shell命令“df -h”看磁盘空间使用率,特别占用率100%的情况;

 

CentOS使用Yum为PHP安装Xdebug调试神器

PHPlinyu520 发表了文章 • 0 个评论 • 1144 次浏览 • 2016-11-17 22:10 • 来自相关话题

一、实验环境:操作系统:CentOS Linux release 7.2.1511 (Core)PHP版本:PHP 5.4.16 (cli) ,Yum方式安装Xdebug版本:2.2.7-1.el7 
  
二、安装前准备:
  不管是Lamp环境还是Lnmp环境,这里不讲述安装过程,这里只讲述Xdebug的安装。虽然使用yum方式安装Xdebug比较简单,但是还是建议在实验环境测试,安装前最好备份数据。
 
三、安装:
1、使用yum安装xdebug:[root@aiezu.com ~]# yum list|grep xdebug
php-pecl-xdebug.x86_64 2.2.7-1.el7 @epel
[root@aiezu.com ~]# yum install php-pecl-xdebug安装完成后,会生成“/etc/php.d/xdebug.ini”配置文件,配置文件中已经设置好xdebug的so文件,我们在这配置文件中设置xdebug设置参数。
 
四、配置Xdebug:
1、创建日志目录:
  我们创建/tmp/xdebug做为日志存储目录:[root@aiezu.com ~]# mkdir -p /tmp/xdebug
[root@aiezu.com ~]# chmod -R 777 /tmp/xdebug 
2、配置xdebug参数:
  修改“/etc/php.d/xdebug.ini”文件,根据你的需求配置参数,详细参数见附件中的《Xdebug详细参数表》。; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

;启用代码自动跟踪
xdebug.auto_trace = On
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir = /tmp/xdebug
;PHP代码跟踪日志文件名格式
xdebug.trace_output_name = trace.%c.%H
;启用性能检测分析
xdebug.profiler_enable=On
;允许收集传递给函数的参数变量
xdebug.collect_params= 4
;允许收集函数调用的返回值
xdebug.collect_return=On
;是否收集include、require的文件
xdebug.collect_includes = On
;是否收集内存的增加还是减少
;xdebug.show_mem_delta = On
;是否打印函数调用的最外围中的所有局部变量
;xdebug.show_local_vars = On
xdebug.profiler_enable = Off
;xdebug.profiler_output_dir = /tmp/xdebug
;xdebug.profiler_output_name = cachegrind.out.%H注:设置“xdebug.auto_trace = On”时,将会在执行所有PHP脚本之前先自动启用跟踪;另外,你也可以设置为“xdebug.auto_trace = 0”,并在PHP脚本开头和结尾分别调用xdebug_start_trace()和 xdebug_stop_trace()函数开启和结束跟踪。如:<?php
xdebug_start_trace();
//要追踪的代码
xdebug_stop_trace(); 
五、查看追踪日志:
  设置好配置文件后,并重启httpd服务,如果开启自动追踪,或者在脚本中使用xdebug_start_trace()和xdebug_stop_trace()函数开启追踪,那么在“/tmp/xdebug”命令下就可以看到追踪日志了。你可以使用vim查看他们,找出脚本中的问题。

附件:Xdebug详细参数表:选项名类型默认值参数选项描述xdebug.auto_tracebooleanOff是否在脚本运行之前自动调用相关追踪函数。xdebug.cli_colorinteger0如果值=1:
  当处于CLI模式或连接虚拟控制台时,Xdebug将高亮显示var_dumps()和堆栈输出;在Windows中,这需要安装ANSICON工具。
如果值=2:
  不管是否处于CLI模式或连接虚拟控制台,Xdebug都会高亮显示var_dumps()或堆栈输出;这种情况下,你可能会看到转义后的代码。
该参数自2.2版本开始引入。xdebug.collect_assignmentsbooleanOff用于控制是否为函数跟踪添加变量赋值功能。
该参数自2.1版本开始引入。xdebug.collect_includesbooleanOn控制是否在跟踪文件中写入include()、include_once()、require()、require_once()等函数中用到的文件名。xdebug.collect_paramsinteger0控制在调用函数时,是否收集传递给函数的参数信息。
  如果值=0,则不显示任何信息。
  如果值=1,只显示类型和大小信息,例如:string(6)、array(8)。
  如果值=2,将显示类型和大小,以及全部信息的工具提示。
  如果值=3,将显示变量的全部内容。
  如果值=4,将显示变量的全部内容和变量名。
如果参数值过大,这可能会占用大量的内存;不过,在Xdebug 2中不会出现该问题,因为Xdebug 2将相关数据写入磁盘中,而不是占用内存。xdebug.collect_returnbooleanOff控制是否在追踪文件中写入函数调用的返回值。xdebug.collect_varsbooleanOff控制是否收集指定作用域中的变量信息。由于需要反向工程PHP的操作码数组,因此Xdebug的分析速度可能比较慢。xdebug.coverage_enablebooleanOn控制是否允许通过设置内部结构来启用代码覆盖率功能。
该参数自2.2版本开始引入。xdebug.default_enablebooleanOn当发生异常或错误时,是否默认显示堆栈信息。xdebug.dump.*stringEmpty这里的*可以是COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一个。用于指定发生错误时是否显示超全局变量数组中的索引变量信息。比如,你想要显示请求的IP地址和请求方式,可以设置为xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD多个索引变量用英文逗号隔开,如果要输出其中的所有变量,可以直接用*,例如:xdebug.dump.GET=*xdebug.dump_globalsbooleanOn控制是否显示通过xdebug.dump.*定义的所有超全局变量的信息。xdebug.dump_oncebooleanOn如果出现多个错误,控制超全局变量信息是在所有错误中显示,还是只在第一个错误中显示。xdebug.dump_undefinedbooleanOn控制是否显示超全局变量中未定义的值。xdebug.extended_infointeger1是否强制进入PHP解析器的"extended_info"模式,这将允许Xdebug以远程调试器对文件或行添加断点。开启此模式将拖慢脚本的允许速度,该参数只能在php.ini中设置。xdebug.file_link_formatstring,用于指定堆栈信息中用到的文件名称的链接样式,这允许IDE通过设置链接协议,直接点击堆栈信息中的文件名称,即可快速打开指定的文件。
例如:ZendStudio://%f@%l(%f表示文件路径,%f表示行号)。
自2.2版本开始引入。xdebug.force_display_errorsinteger0是否强制显示错误信息。
自2.3版本开始引入。xdebug.force_error_reportinginteger0是否强制显示所有错误级别的信息。
自2.3版本开始引入。xdebug.halt_levelinteger0指定出现那些错误级别的错误时,中止程序运行。例如:xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE(也仅支持上述4种错误级别)。
自2.3版本开始引入。xdebug.idekeystring*complex*指定传递给DBGp调试器处理程序的IDE Key。xdebug.manual_urlstringhttp://www.php.net用于指定从函数堆栈和错误信息链接到的帮助手册的基本URL。
仅2.2.1以下版本可用。xdebug.max_nesting_levelinteger100指定递归的嵌套层级数。xdebug.overload_var_dumpbooleanOn当php.ini中的html_error设为1时,Xdebug是否默认使用自身的改进版本来重载var_dump()。
自2.2版本开始引入。xdebug.profiler_appendinteger0当多个请求映射到相同文件时,指定是覆盖之前的调试信息文件还是追加内容到该文件中。xdebug.profiler_enableinteger0指定是否启用Xdebug的性能分析,并创建性能信息文件。xdebug.profiler_output_dirstring/tmp指定性能分析信息文件的输出目录xdebug.profiler_output_namestringcachegrind.out.%p

 指定性能分析信息文件的名称xdebug.remote_enablebooleanOff是否开启远程调试xdebug.remote_handlerstringdbgp指定远程调试的处理协议xdebug.remote_hoststringlocalhost指定远程调试的主机名xdebug.remote_logstring 指定远程调试的日志文件名xdebug.remote_modestringreq可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。xdebug.remote_portinteger9000指定远程调试的端口号xdebug.trace_optionsinteger0指定对于之后的请求,追踪文件是追加内容还是覆盖之前内容。xdebug.trace_output_dirstring/tmp指定追踪文件的存放目录xdebug.trace_output_namestringtrace.%c指定追踪文件的名称xdebug.show_exception_tracebooleanOff是否开启异常跟踪xdebug.show_mem_deltabooleanOff是否追踪内存的变化xdebug.show_local_varsbooleanOff是否显示局部变量  查看全部
一、实验环境:
  • 操作系统:CentOS Linux release 7.2.1511 (Core)
  • PHP版本:PHP 5.4.16 (cli) ,Yum方式安装
  • Xdebug版本:2.2.7-1.el7 

  
二、安装前准备:
  不管是Lamp环境还是Lnmp环境,这里不讲述安装过程,这里只讲述Xdebug的安装。虽然使用yum方式安装Xdebug比较简单,但是还是建议在实验环境测试,安装前最好备份数据。
 
三、安装:
1、使用yum安装xdebug:
[root@aiezu.com ~]# yum list|grep xdebug
php-pecl-xdebug.x86_64 2.2.7-1.el7 @epel
[root@aiezu.com ~]# yum install php-pecl-xdebug
安装完成后,会生成“/etc/php.d/xdebug.ini”配置文件,配置文件中已经设置好xdebug的so文件,我们在这配置文件中设置xdebug设置参数。
 
四、配置Xdebug:
1、创建日志目录:
  我们创建/tmp/xdebug做为日志存储目录:
[root@aiezu.com ~]# mkdir -p /tmp/xdebug
[root@aiezu.com ~]# chmod -R 777 /tmp/xdebug
 
2、配置xdebug参数:
  修改“/etc/php.d/xdebug.ini”文件,根据你的需求配置参数,详细参数见附件中的《Xdebug详细参数表》。
; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

;启用代码自动跟踪
xdebug.auto_trace = On
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir = /tmp/xdebug
;PHP代码跟踪日志文件名格式
xdebug.trace_output_name = trace.%c.%H
;启用性能检测分析
xdebug.profiler_enable=On
;允许收集传递给函数的参数变量
xdebug.collect_params= 4
;允许收集函数调用的返回值
xdebug.collect_return=On
;是否收集include、require的文件
xdebug.collect_includes = On
;是否收集内存的增加还是减少
;xdebug.show_mem_delta = On
;是否打印函数调用的最外围中的所有局部变量
;xdebug.show_local_vars = On
xdebug.profiler_enable = Off
;xdebug.profiler_output_dir = /tmp/xdebug
;xdebug.profiler_output_name = cachegrind.out.%H
注:设置“xdebug.auto_trace = On”时,将会在执行所有PHP脚本之前先自动启用跟踪;另外,你也可以设置为“xdebug.auto_trace = 0”,并在PHP脚本开头和结尾分别调用xdebug_start_trace()和 xdebug_stop_trace()函数开启和结束跟踪。如:
<?php
xdebug_start_trace();
//要追踪的代码
xdebug_stop_trace();
 
五、查看追踪日志:
  设置好配置文件后,并重启httpd服务,如果开启自动追踪,或者在脚本中使用xdebug_start_trace()和xdebug_stop_trace()函数开启追踪,那么在“/tmp/xdebug”命令下就可以看到追踪日志了。你可以使用vim查看他们,找出脚本中的问题。

附件:Xdebug详细参数表:
选项名类型默认值参数选项描述
xdebug.auto_tracebooleanOff是否在脚本运行之前自动调用相关追踪函数。
xdebug.cli_colorinteger0如果值=1:
  当处于CLI模式或连接虚拟控制台时,Xdebug将高亮显示var_dumps()和堆栈输出;在Windows中,这需要安装ANSICON工具。
如果值=2:
  不管是否处于CLI模式或连接虚拟控制台,Xdebug都会高亮显示var_dumps()或堆栈输出;这种情况下,你可能会看到转义后的代码。
该参数自2.2版本开始引入。
xdebug.collect_assignmentsbooleanOff用于控制是否为函数跟踪添加变量赋值功能。
该参数自2.1版本开始引入。
xdebug.collect_includesbooleanOn控制是否在跟踪文件中写入include()、include_once()、require()、require_once()等函数中用到的文件名。
xdebug.collect_paramsinteger0控制在调用函数时,是否收集传递给函数的参数信息。
  如果值=0,则不显示任何信息。
  如果值=1,只显示类型和大小信息,例如:string(6)、array(8)。
  如果值=2,将显示类型和大小,以及全部信息的工具提示。
  如果值=3,将显示变量的全部内容。
  如果值=4,将显示变量的全部内容和变量名。
如果参数值过大,这可能会占用大量的内存;不过,在Xdebug 2中不会出现该问题,因为Xdebug 2将相关数据写入磁盘中,而不是占用内存。
xdebug.collect_returnbooleanOff控制是否在追踪文件中写入函数调用的返回值。
xdebug.collect_varsbooleanOff控制是否收集指定作用域中的变量信息。由于需要反向工程PHP的操作码数组,因此Xdebug的分析速度可能比较慢。
xdebug.coverage_enablebooleanOn控制是否允许通过设置内部结构来启用代码覆盖率功能。
该参数自2.2版本开始引入。
xdebug.default_enablebooleanOn当发生异常或错误时,是否默认显示堆栈信息。
xdebug.dump.*stringEmpty这里的*可以是COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一个。用于指定发生错误时是否显示超全局变量数组中的索引变量信息。比如,你想要显示请求的IP地址和请求方式,可以设置为xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD多个索引变量用英文逗号隔开,如果要输出其中的所有变量,可以直接用*,例如:xdebug.dump.GET=*
xdebug.dump_globalsbooleanOn控制是否显示通过xdebug.dump.*定义的所有超全局变量的信息。
xdebug.dump_oncebooleanOn如果出现多个错误,控制超全局变量信息是在所有错误中显示,还是只在第一个错误中显示。
xdebug.dump_undefinedbooleanOn控制是否显示超全局变量中未定义的值。
xdebug.extended_infointeger1是否强制进入PHP解析器的"extended_info"模式,这将允许Xdebug以远程调试器对文件或行添加断点。开启此模式将拖慢脚本的允许速度,该参数只能在php.ini中设置。
xdebug.file_link_formatstring,用于指定堆栈信息中用到的文件名称的链接样式,这允许IDE通过设置链接协议,直接点击堆栈信息中的文件名称,即可快速打开指定的文件。
例如:ZendStudio://%f@%l(%f表示文件路径,%f表示行号)。
自2.2版本开始引入。
xdebug.force_display_errorsinteger0是否强制显示错误信息。
自2.3版本开始引入。
xdebug.force_error_reportinginteger0是否强制显示所有错误级别的信息。
自2.3版本开始引入。
xdebug.halt_levelinteger0指定出现那些错误级别的错误时,中止程序运行。例如:xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE(也仅支持上述4种错误级别)。
自2.3版本开始引入。
xdebug.idekeystring*complex*指定传递给DBGp调试器处理程序的IDE Key。
xdebug.manual_urlstringhttp://www.php.net用于指定从函数堆栈和错误信息链接到的帮助手册的基本URL。
仅2.2.1以下版本可用。
xdebug.max_nesting_levelinteger100指定递归的嵌套层级数。
xdebug.overload_var_dumpbooleanOn当php.ini中的html_error设为1时,Xdebug是否默认使用自身的改进版本来重载var_dump()。
自2.2版本开始引入。
xdebug.profiler_appendinteger0当多个请求映射到相同文件时,指定是覆盖之前的调试信息文件还是追加内容到该文件中。
xdebug.profiler_enableinteger0指定是否启用Xdebug的性能分析,并创建性能信息文件。
xdebug.profiler_output_dirstring/tmp指定性能分析信息文件的输出目录
xdebug.profiler_output_namestringcachegrind.out.%p

 
指定性能分析信息文件的名称
xdebug.remote_enablebooleanOff是否开启远程调试
xdebug.remote_handlerstringdbgp指定远程调试的处理协议
xdebug.remote_hoststringlocalhost指定远程调试的主机名
xdebug.remote_logstring 指定远程调试的日志文件名
xdebug.remote_modestringreq可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。
xdebug.remote_portinteger9000指定远程调试的端口号
xdebug.trace_optionsinteger0指定对于之后的请求,追踪文件是追加内容还是覆盖之前内容。
xdebug.trace_output_dirstring/tmp指定追踪文件的存放目录
xdebug.trace_output_namestringtrace.%c指定追踪文件的名称
xdebug.show_exception_tracebooleanOff是否开启异常跟踪
xdebug.show_mem_deltabooleanOff是否追踪内存的变化
xdebug.show_local_varsbooleanOff是否显示局部变量 

PHP自定义异常处理函数

PHPlinyu520 发表了文章 • 0 个评论 • 303 次浏览 • 2016-11-16 13:56 • 来自相关话题

  我们常需要根据项目的不同,对代码运行日志记录有不同的需求。这不同的需求包含,需要记录的内容不同、记录的格式不同、日志的输出方式(写如文件、发EMail、发短信等)不同。这时,我们可以将自己的日志记录需求实现方法定义到一个类中,然后再通过下面这些函数,将类的方法注册到对应的事件,这样当事件发生时,系统自定会按我们的需求将日志记录到指定的地方。

一、register_shutdown_function函数:
  register_shutdown_function()函数用来设置当PHP脚本执行完成、或者exit()退出时要调用的函数。register_shutdown_function(array('Err','shutdown_function'));  
二、set_error_handler函数:
  set_error_handler函数使用来设置脚本发生错误时调用的函数,用法如下:set_error_handler(array('Err','error_handler'));通过 set_error_handler() 函数设置用户自定义的错误处理程序,然后触发错误(通过 trigger_error()):

三、set_exception_handler函数:set_exception_handler(array('Err','appException'));
简单示例:<?php
date_default_timezone_set('PRC');
register_shutdown_function(array('Err','successHandle'));
set_error_handler(array('Err','errorHandler'));
set_exception_handler(array('Err','exceptionHandle'));
class Err {
private static $logFile = 'log.txt';
//脚本发生错误
public static function errorHandler($errno, $errstr, $errfile, $errline){
$msg = sprintf("Error: %s %s %s:%s", $errno, $errstr, $errfile, $errline);
self::writeLog($msg);
}

//脚本执行完成
public static function successHandle() {
self::writeLog("Success.");
}

//脚本抛出异常
public static function exceptionHandle($exception) {
$msg = sprintf("Exception: %s", $exception->getMessage());
self::writeLog($msg);
}

//写日志
private static function writeLog( $msg ) {
$msg = sprintf("%s %s\t%s\n", date('Y-m-d H:i:s'), $_SERVER['REMOTE_ADDR'], $msg);
file_put_contents(self::$logFile, $msg, FILE_APPEND);
}
}

throw new Exception("发生异常啦"); 查看全部
  我们常需要根据项目的不同,对代码运行日志记录有不同的需求。这不同的需求包含,需要记录的内容不同、记录的格式不同、日志的输出方式(写如文件、发EMail、发短信等)不同。这时,我们可以将自己的日志记录需求实现方法定义到一个类中,然后再通过下面这些函数,将类的方法注册到对应的事件,这样当事件发生时,系统自定会按我们的需求将日志记录到指定的地方。

一、register_shutdown_function函数:
  register_shutdown_function()函数用来设置当PHP脚本执行完成、或者exit()退出时要调用的函数。
register_shutdown_function(array('Err','shutdown_function'));
  
二、set_error_handler函数:
  set_error_handler函数使用来设置脚本发生错误时调用的函数,用法如下:
set_error_handler(array('Err','error_handler'));
通过 set_error_handler() 函数设置用户自定义的错误处理程序,然后触发错误(通过 trigger_error()):

三、set_exception_handler函数:
set_exception_handler(array('Err','appException'));

简单示例:
<?php
date_default_timezone_set('PRC');
register_shutdown_function(array('Err','successHandle'));
set_error_handler(array('Err','errorHandler'));
set_exception_handler(array('Err','exceptionHandle'));
class Err {
private static $logFile = 'log.txt';
//脚本发生错误
public static function errorHandler($errno, $errstr, $errfile, $errline){
$msg = sprintf("Error: %s %s %s:%s", $errno, $errstr, $errfile, $errline);
self::writeLog($msg);
}

//脚本执行完成
public static function successHandle() {
self::writeLog("Success.");
}

//脚本抛出异常
public static function exceptionHandle($exception) {
$msg = sprintf("Exception: %s", $exception->getMessage());
self::writeLog($msg);
}

//写日志
private static function writeLog( $msg ) {
$msg = sprintf("%s %s\t%s\n", date('Y-m-d H:i:s'), $_SERVER['REMOTE_ADDR'], $msg);
file_put_contents(self::$logFile, $msg, FILE_APPEND);
}
}

throw new Exception("发生异常啦");

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)

Mysqlllslx520 发表了文章 • 0 个评论 • 10519 次浏览 • 2016-11-04 16:50 • 来自相关话题

  有时候,当我们使用“mysql”、“mysqladmin”、“mysqldump”等命令管理数据库时,服务器抛出类似如下错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)这个错误是由于什么原因导致的呢?请看后面爱E族(aiezu.com)为您提供的分析。 一、错误现场还原:下面我们通过三种方式来连接,然后观察提示的错误信息:1、直接使用“mysql”命令,不带主机名参数;2、使用带了主机名“localhost”参数的“mysql -h localhost”命令;3、使用带了主机名“127.0.0.1”参数的“mysql -h 127.0.0.1”命令。[root@aiezu.com ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h localhost
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h 127.0.0.1
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)  通过上面实验可以看出,前面两种方式都能产生标题中的错误,而第三种方式连接是不会产生标题中的错误的(第三种方式这里产生的是由于密码问题拒绝访问的错误信息)(爱E族)。 二、错误产生原因解析:   这是由于我们连接数据库使用的主机名参数为“localhost”,或者未使用主机名参数、服务器默认使用“localhost”做为主机名(爱E族)。 使用主机名参数为“localhost”连接mysql服务端时,mysql客户端会认为是连接本机,所以会尝试以socket文件方式进行连接(socket文件连接方式,比“ip:端口”方式效率更高),这时根据配置文件“/etc/my.cnf”的路径,未找到相应的socket文件,就会引发此错误。
   三、修复故障前准备:1、看mysql服务是否在运行:  由于“socket”文件是由mysql服务运行时创建的,如果提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”,找不到“socket”文件,我们首先要确认的是mysql服务是否正在运行。# 1、 端口是否打开
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 12207 mysql 14u IPv4 52350 0t0 TCP *:mysql (LISTEN)

# 2、mysqld服务是否正在运行
[root@aiezu.com ~]# service mysqld status
mysqld (pid 4717) is running...

# 3、如果mariadb,同样方法查服务是否正在运行:
[root@aiezu.com ~]# service mariadb status
Redirecting to /bin/systemctl status mariadb.service
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2016-11-03 13:47:37 CST; 23min ago  2、确定“socket”文件正确位置:  确定mysql服务正常运行后,产生此错误的原因只剩下“socket”文件路径不正确了,我们可以使用“find”命令或者“lsof”命令来确定socket文件的正确路径:[root@aiezu.com ~]# lsof -c mysqld|grep sock$
mysqld 4717 mysql 12u unix 0xffff88010a655b80 0t0 77474827 /storage/db/mysql/mysql.sock

[root@aiezu.com ~]# find / -name '*.sock'
/storage/db/mysql/mysql.sock 四、故障解决方法:解决方案一:  修改“/etc/my.cnf”配置文件,在配置文件中添加“[client]”选项和“[mysql]”选项,并使用这两个选项下的“socket”参数值,与“[mysqld]”选项下的“socket”参数值,指向的socket文件路径完全一致。如下: [mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
...省略n行(爱E族)...

[client]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock

[mysql]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock修改完后,重启mysqld服务,即可解决此问题。
 解决方案二:  使用“ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock”命令,将正确的socket文件位置,软链接到提示错误的socket文件路径位置,即可解决此问题:[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
ls: cannot access /var/lib/mysql/mysql.sock: No such file or directory
[root@aiezu.com ~]# ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sock   五、后序:  这篇文章只讲述了mysql提供的“mysql”、“mysqldump”、“mysqladmin”等命令提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”的解决方法,如果需要解决“php”、“perl”、“python”等脚本语言提示此错误的问题,请参考爱E族的另外一篇文章:http://aiezu.com/article/mysql_php_connect_through_socket.html 查看全部
  有时候,当我们使用“mysql”、“mysqladmin”、“mysqldump”等命令管理数据库时,服务器抛出类似如下错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
这个错误是由于什么原因导致的呢?请看后面爱E族(aiezu.com)为您提供的分析。

 

一、错误现场还原:

下面我们通过三种方式来连接,然后观察提示的错误信息:
  • 1、直接使用“mysql”命令,不带主机名参数;
  • 2、使用带了主机名“localhost”参数的“mysql -h localhost”命令;
  • 3、使用带了主机名“127.0.0.1”参数的“mysql -h 127.0.0.1”命令。
[root@aiezu.com ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h localhost
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@aiezu.com ~]# mysql -h 127.0.0.1
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
  通过上面实验可以看出,前面两种方式都能产生标题中的错误,而第三种方式连接是不会产生标题中的错误的(第三种方式这里产生的是由于密码问题拒绝访问的错误信息)(爱E族)。

 

二、错误产生原因解析:

   这是由于我们连接数据库使用的主机名参数为“localhost”,或者未使用主机名参数、服务器默认使用“localhost”做为主机名(爱E族)。 使用主机名参数为“localhost”连接mysql服务端时,mysql客户端会认为是连接本机,所以会尝试以socket文件方式进行连接(socket文件连接方式,比“ip:端口”方式效率更高),这时根据配置文件“/etc/my.cnf”的路径,未找到相应的socket文件,就会引发此错误。
   

三、修复故障前准备:

1、看mysql服务是否在运行:

  由于“socket”文件是由mysql服务运行时创建的,如果提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”,找不到“socket”文件,我们首先要确认的是mysql服务是否正在运行。
# 1、 端口是否打开
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 12207 mysql 14u IPv4 52350 0t0 TCP *:mysql (LISTEN)

# 2、mysqld服务是否正在运行
[root@aiezu.com ~]# service mysqld status
mysqld (pid 4717) is running...

# 3、如果mariadb,同样方法查服务是否正在运行:
[root@aiezu.com ~]# service mariadb status
Redirecting to /bin/systemctl status mariadb.service
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2016-11-03 13:47:37 CST; 23min ago
  

2、确定“socket”文件正确位置:

  确定mysql服务正常运行后,产生此错误的原因只剩下“socket”文件路径不正确了,我们可以使用“find”命令或者“lsof”命令来确定socket文件的正确路径:
[root@aiezu.com ~]# lsof  -c mysqld|grep sock$
mysqld 4717 mysql 12u unix 0xffff88010a655b80 0t0 77474827 /storage/db/mysql/mysql.sock

[root@aiezu.com ~]# find / -name '*.sock'
/storage/db/mysql/mysql.sock
 

四、故障解决方法:

解决方案一:

  修改“/etc/my.cnf”配置文件,在配置文件中添加“[client]”选项和“[mysql]”选项,并使用这两个选项下的“socket”参数值,与“[mysqld]”选项下的“socket”参数值,指向的socket文件路径完全一致。如下: 
[mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
...省略n行(爱E族)...

[client]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock

[mysql]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock
修改完后,重启mysqld服务,即可解决此问题。
 

解决方案二:

  使用“ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock”命令,将正确的socket文件位置,软链接到提示错误的socket文件路径位置,即可解决此问题:
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
ls: cannot access /var/lib/mysql/mysql.sock: No such file or directory
[root@aiezu.com ~]# ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock
[root@aiezu.com ~]# ls /var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sock

  

 五、后序:

  这篇文章只讲述了mysql提供的“mysql”、“mysqldump”、“mysqladmin”等命令提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”的解决方法,如果需要解决“php”、“perl”、“python”等脚本语言提示此错误的问题,请参考爱E族的另外一篇文章:http://aiezu.com/article/mysql_php_connect_through_socket.html

连接Mysql提示Can’t connect to local MySQL server through socket的解决方法

Mysqlliuliangsong 发表了文章 • 0 个评论 • 785 次浏览 • 2016-10-19 11:35 • 来自相关话题

mysql、mysqldump、mysqladmin、php连接mysql服务常会提示下面错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)   这是由于当使用host参数为“localhost”连接Mysql服务时,会优先使用“sock文件”进行连接,而不是使用“IP:端口”进行连接,而mysql尝试使用“sock文件”进行连接时,却无法获取“sock文件”的位置。
 
要解决此错误,有两种解决方法:将连接参数“host”的值由“localhost”改成“127.0.0.1”;按下面方法,在“/etc/mysql.cnf”中指定“sock文件”位置。 一、查看mysql服务的socket文件位置:  mysql socket文件的位置是在/etc/my.cnf中设置的,cat /etc/my.cnf内容如下:[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock
user=mysql  其中socket等于的路径就是socket文件的位置,我们只要修改my.cnf文件,告诉mysql,mysqldump,mysqladmin等mysql服务的socket位置在哪里就可以了,文件中可以看出,我的socket文件位置为:"/storage/aiezu.com/mysql/mysql.sock"。
 二、修改my.cnf文件解决问题:  在/etc/my.cnf文件中添加如下内容,并重启mysqld服务,即可解决mysql、mysqldump、mysqladmin的“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'”问题:[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

[mysql]
socket=/storage/aiezu.com/mysql/mysql.sock

[client]
socket=/storage/aiezu.com/mysql/mysql.sock

[mysqldump]
socket=/storage/aiezu.com/mysql/mysql.sock

[mysqladmin]
socket=/storage/aiezu.com/mysql/mysql.sock 三、php连接mysql服务提示"Can't connect to local MySQL server through socket..."的解决方法:  有时候mysql服务正常运行,用户名密码也完全正确,使用php的mysql_connect函数却连接不了mysql,调用php的mysql_error()函数提示“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'”,这是我们需要修改/etc/php.ini文件。
  在/etc/php.ini文件中"[MySQL]"项下找到"mysql.default_socket",并设置其值指向正确的mysql服务socket文件即可,如:[MySQL]
...省略n行...
mysql.default_socket = "/storage/aiezu.com/mysql/mysql.sock" 四、python连接mysql提示"Can't connect to local MySQL server through socket..."的解决方法:  在连接mysql数据库函数中指定socket文件,如下:#!/usr/bin/python
from MySQLdb import connect
conn = connect(db="pzy", user="root", host="localhost", unix_socket="/storage/aiezu.com/mysql/mysql.sock")
cur = conn.cursor()
count=cur.execute("show databases")
print 'there has %s dbs' % count
conn.commit()
conn.close() 五、 php pdo连接mysql提示"Can't connect to local MySQL server through socket..."的解决方法:  同样在连接字符串添加mysql socket文件的位置即可,如下:<?php
$dsn = "mysql:host=localhost;dbname=pzy;unix_socket=/storage/aiezu.com/mysql/mysql.sock";
$db = new PDO($dsn, 'root', '');
$rs = $db->query("SELECT * FROM qrtest");
while($row = $rs->fetch()){
print_r($row);
}
?> 
六、相关页面:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2) 查看全部
mysql、mysqldump、mysqladmin、php连接mysql服务常会提示下面错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
   这是由于当使用host参数为“localhost”连接Mysql服务时,会优先使用“sock文件”进行连接,而不是使用“IP:端口”进行连接,而mysql尝试使用“sock文件”进行连接时,却无法获取“sock文件”的位置。
 
要解决此错误,有两种解决方法:
  • 将连接参数“host”的值由“localhost”改成“127.0.0.1”;
  • 按下面方法,在“/etc/mysql.cnf”中指定“sock文件”位置。
 

一、查看mysql服务的socket文件位置:

  mysql socket文件的位置是在/etc/my.cnf中设置的,cat /etc/my.cnf内容如下:
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock
user=mysql
  其中socket等于的路径就是socket文件的位置,我们只要修改my.cnf文件,告诉mysql,mysqldump,mysqladmin等mysql服务的socket位置在哪里就可以了,文件中可以看出,我的socket文件位置为:"/storage/aiezu.com/mysql/mysql.sock"。
 

二、修改my.cnf文件解决问题:

  在/etc/my.cnf文件中添加如下内容,并重启mysqld服务,即可解决mysql、mysqldump、mysqladmin的“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'”问题:
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock

[mysql]
socket=/storage/aiezu.com/mysql/mysql.sock

[client]
socket=/storage/aiezu.com/mysql/mysql.sock

[mysqldump]
socket=/storage/aiezu.com/mysql/mysql.sock

[mysqladmin]
socket=/storage/aiezu.com/mysql/mysql.sock

 

三、php连接mysql服务提示"Can't connect to local MySQL server through socket..."的解决方法:

  有时候mysql服务正常运行,用户名密码也完全正确,使用php的mysql_connect函数却连接不了mysql,调用php的mysql_error()函数提示“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'”,这是我们需要修改/etc/php.ini文件。
  在/etc/php.ini文件中"[MySQL]"项下找到"mysql.default_socket",并设置其值指向正确的mysql服务socket文件即可,如:
[MySQL]
...省略n行...
mysql.default_socket = "/storage/aiezu.com/mysql/mysql.sock"
 

四、python连接mysql提示"Can't connect to local MySQL server through socket..."的解决方法:

  在连接mysql数据库函数中指定socket文件,如下:
#!/usr/bin/python
from MySQLdb import connect
conn = connect(db="pzy", user="root", host="localhost", unix_socket="/storage/aiezu.com/mysql/mysql.sock")
cur = conn.cursor()
count=cur.execute("show databases")
print 'there has %s dbs' % count
conn.commit()
conn.close()
 

五、 php pdo连接mysql提示"Can't connect to local MySQL server through socket..."的解决方法:

  同样在连接字符串添加mysql socket文件的位置即可,如下:
<?php
$dsn = "mysql:host=localhost;dbname=pzy;unix_socket=/storage/aiezu.com/mysql/mysql.sock";
$db = new PDO($dsn, 'root', '');
$rs = $db->query("SELECT * FROM qrtest");
while($row = $rs->fetch()){
print_r($row);
}
?>
 
六、相关页面: