mysql故障不完全小结

最近处理了一个mysql的故障。记录下来备忘。

原因是看我们的服务器的时候发现mysql被配置成了developer-machine,对于服务器而言,配置成这样的却是不应该的。于是顺手用MySQL Server Instance Config Wizard reconfig了一下。

问题就来了,具体表现在网站不能访问数据库(dizcuz,wordpress),因为历史遗留问题,网站配置数据库的时候都用root进行连接。而且这台服务器是专用的数据库服务器,没有iis之类不能用phpmyadmin.

先检查 mysql的user表,看看root有没有远程访问的权限。

use mysql
select user,host from user;

看看远程host有没有访问权限。

如果没有,可以添加相关权限。用insert插入太麻烦,字段太多(有很多字段虽然有默认值,但是插入的是N,没有多少权限的)。推荐用grant授权。

顺便记录下网上查到的一些命令集合。

把localhost改为%授权给全部,个人不推荐把localhost的授权改掉,因为会有问题,导致本地不能登录。下面会说。

mysql>use mysql;
mysql>update user set host = "%" where user = "root";
mysql>select host, user from user;

授权。

mysql>GRANT ALL PRIVILEGES ON *.* TO "root"@"%"
           IDENTIFIED BY "123456" WITH GRANT OPTION;

或者

mysql>GRANT ALL PRIVILEGES ON *.* TO "root"@"192.168.1.1"
              IDENTIFIED BY "123456" WITH GRANT OPTION;

最后

FLUSH PRIVILEGES

就能生效。

因为处理过程中不小心删除了localhost ,或者忘记root密码,或者删除root帐户,导致本地不能登录。可以关掉 mysqld进程,cmd进入mysql的bin目录,用

mysqld --skip-grant-tables 

?跳过权限检查,然后就可以直接进入mysql建立帐户。

用下面的命令修改密码。(不过特别注意如果有多个root的授权的话,必须在where里添加一个约束条件,不然多个授权的密码都会修改。更推荐网站连接不用root帐户。

mysql>use mysql
mysql>update user set password=password("new_pass") where user="root";
mysql>flush privileges;

回到问题上来,修改上述配置之后,本地登录应该没问题了,但是网站还是不能正常访问。

具体表现在? 非常慢,不能打开网页,知道请求失败,连续几次之后iis报告500(php错误次数过多),更诡异的是mysql启动的瞬间还能打开1-2次网页。

在数据库服务器授权所有主机访问myaql,在我的电脑上使用mysql进行远程连接,发现非常慢,几次都忍不住手动ctrl+c,最后发现连接失败,错误报告为

#2013 - Lost connection to MySQL server at 'reading initial communication packet

百度它,就可以找到解决方案。

  1. 在my.ini中[mysqld]段里添加一行。

    skip-name-resolve
    ?

  2. 在主机的hosts里为每个user表里的授权host添加映射ip。

关于这个选项,是为了更好的管理授权,对ip进行dns反查,当然这个如果在主机的hosts里没有的话,查询就会比较慢,经常慢到网页卡死。

如果登陆到mysql,查看进程的信息
show processlist;
发现大量的进程的状态为 login
因为mysql会对这个ip做dns反向查询,导致大量的连接处于 login状态.....

用网上的一张图片描述就是:

因此,如果关掉dns反查,而且在mysql的user表里不用hostname而用ip地址作为host的话,连接登录至少能快很多。

?

附:MySQL常见错误代码说明
1005:创建表失败?
1006:创建数据库失败?
1007:数据库已存在,创建数据库失败?
1008:数据库不存在,删除数据库失败?
1009:不能删除数据库文件导致删除数据库失败?
1010:不能删除数据目录导致删除数据库失败?
1011:删除数据库文件失败?
1012:不能读取系统表中的记录?
1020:记录已被其他用户修改?
1021:硬盘剩余空间不足,请加大硬盘可用空间?
1022:关键字重复,更改记录失败?
1023:关闭时发生错误?
1024:读文件错误?
1025:更改名字时发生错误?
1026:写文件错误?
1032:记录不存在?
1036:数据表是只读的,不能对它进行修改?
1037:系统内存不足,请重启数据库或重启服务器?
1038:用于排序的内存不足,请增大排序缓冲区?
1040:已到达数据库的最大连接数,请加大数据库可用连接数?
1041:系统内存不足?
1042:无效的主机名?
1043:无效连接?
1044:当前用户没有访问数据库的权限?
1045:不能连接数据库,用户名或密码错误?
1048:字段不能为空?
1049:数据库不存在?
1050:数据表已存在?
1051:数据表不存在?
1054:字段不存在?
1065:无效的SQL语句,SQL语句为空?
1081:不能建立Socket连接?
1114:数据表已满,不能容纳任何记录?
1116:打开的数据表太多?
1129:数据库出现异常,请重启数据库?
1130:连接数据库失败,没有连接数据库的权限?
1133:数据库用户不存在?
1141:当前用户无权访问数据库?
1142:当前用户无权访问数据表?
1143:当前用户无权访问数据表中的字段?
1146:数据表不存在?
1147:未定义用户对数据表的访问权限?
1149:SQL语句语法错误?
1158:网络错误,出现读错误,请检查网络连接状况?
1159:网络错误,读超时,请检查网络连接状况?
1160:网络错误,出现写错误,请检查网络连接状况?
1161:网络错误,写超时,请检查网络连接状况?
1062:字段值重复,入库失败?
1169:字段值重复,更新记录失败?
1177:打开数据表失败?
1180:提交事务失败?
1181:回滚事务失败?
1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库?
1205:加锁超时?
1211:当前用户没有创建用户的权限?
1216:外键约束检查失败,更新子表记录失败?
1217:外键约束检查失败,删除或修改主表记录失败?
1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器?
1227:权限不足,您无权进行此操作?
1235:MySQL版本过低,不具有本功能



文章来源:http://blog.xujif.com/archives/solution-of-mysql/
原文地址:https://www.cnblogs.com/xujif/p/2391717.html