MySQL常见问题总结

  1. Can’t connect to MySQL server on ‘localhost’ (10061)

     分析:这说明“localhost”计算机是存在的,但在这台机器上却没提供MySQL服务。
    
    需要启动这台机器上的MySQL服务,如果机子负载太高没空相应请求也会产生这个错误。
    
    解决:既然没有启动那就去启动这台机子的mysql。如果启动不成功,多数是因为你的my.ini配置的有问题。重新配置其即可。
    
    如果觉得mysql负载异常,可以到mysql/bin 的目录下执行mysqladmin -uroot -p123 processlist来查看mysql当前的进程。
    
  2. Access denied for user: ‘red@localhost’ to database ‘newbbs’

    分析:这个提示和问题三是不同的。那个是在连接数据库的时候就被阻止了,而这个错误是在对数据库进行操作时引起的。比如在select update等等。这个是因为该用户没有操作数据库相应的权力。比如select 这个操作在mysql.user.Select_priv里记录 Y 可以操作N 不可以操作。
    
    解决:如果是自己的独立主机那么更新mysql.user 的相应用户记录,比如这里要更新的用户为red 。或者直接修改 ./config.inc.php 为其配置一个具有对数据库操作权限的用户
    
    或者通过如下的命令来更新授权grant all privileges on dbname.* to ‘user’@’localhost’ identified by ‘password’
    
    提示:更新了mysql库中的记录一定要重启mysql服务器才能使更新生效
    
    FLUSH PRIVILEGES;
    
  3. Can’t open file: ‘xxx_forums.MYI’. (errno: 145)

     这种情况是不能打开 cdb_forums.MYI 造成的,引起这种情况可能的原因有:
    
    《1》、服务器非正常关机,数据库所在空间已满,或一些其它未知的原因,对数据库表造成了损坏。
    
    《2》、类 unix 操作系统下直接将数据库文件拷贝移动会因为文件的属组问题而产生这个错误。
    
    解决方法:
    《1》、修复数据表
    
    可以使用下面的两种方式修复数据表:(第一种方法仅适合独立主机用户)
    
    1)使用 myisamchk ,MySQL 自带了专门用户数据表检查和修复的工具 —— myisamchk 。更改当前目录到 MySQL/bin 下面,一般情况下只有在这个下面才能运行 myisamchk 命令。常用的修复命令为:myisamchk -r 数据文件目录/数据表名.MYI;
    
    2)通过 phpMyAdmin 修复, phpMyAdmin 带有修复数据表的功能,进入到某一个表中后,点击“操作”,在下方的“表维护”中点击“修复表”即可。
    
    注意:以上两种修复方式在执行前一定要备份数据库。
    
    《2》、修改文件的属组(仅适合独立主机用户)
    
    1)复制数据库文件的过程中没有将数据库文件设置为 MySQL 运行的帐号可读写(一般适用于 Linux 和 FreeBSD 用户)。
    

    3 . Unknown system variable ‘NAMES’

    分析:Mysql版本不支持字符集设定,此时强行设定字符集就会出现这个错误。

    解决: 将sql语句中的SET NAMES ‘xxx’ 语句去掉。

4 . Lost connection to MySQL server during query

    分析:远程连接数据库是有时会有这个问题。MySQL服务器在执行一条sql语句的时候失去了连接造成的。

    解决: 一般不需要怎么去处理,如果频繁的出现那么考虑改善硬件环境。

5.User ‘red’ has exceeded the ‘max_updates’ resource (current value: 500)

翻译:msql用户red已经超过了’max_updates’(最大更新次数),’max_questions’(最大查询次数),’max_connections’(最大连接数),当前设定为500

分析:在mysql数据库的下有一个库为mysql,它其中有一个表为user这里面的纪录每一条都对应为一个mysql用户的授权。其中字段 max_questions max_updates max_connections分别记录着最大查询次数 最大更新数 最大连接数,当目前的任何一个参数大于任何一个设定的值就会产生这个错误。

解决: 独立主机用户可以直接修改授权表。修改完之后重启mysql或者跟新授权表,进入mysql提示符下执行

FLUSH PRIVILEGES;

记得后面要有分号’;’

虚拟主机的用户如果总是出现这个问题可找空间商协商解决。

6.Too many connections (1040)链接过多

问题分析:

连接数超过了mysql设置的值,与max_connections 和wait_timeout 都有关系。wait_timeout的值越大,连接的空闲等待就越长,这样就会造成当前连接数越大

解决方法:

1.虚拟主机用户请联系空间商优化 MySQL 服务器的配置;

2.独立主机用户请联系服务器管理员优化 MySQL 服务器的配置,可参考:

修改 MySQL 配置文件 my.ini 或者 my.cnf 中的参数:

max_connections= 1000

wait_timeout = 10

修改后重启 MySQL ,如果经常性的报此错误,请做一下服务器的整体优化。

7 . Got error 28 from table handler
error.:1030

数据库所在磁盘空间已满。
增加 MySQL 所在的磁盘空间或者清理一些无用文件。

8 . Can’t create a new thread; if you are not out of available memory, you can consult the manual for a possible OS-dependent bug。

数据库服务器问题,数据库操作无法创建新线程。一般是两个原因:

1.服务器系统内存溢出。

2.环境软件损坏或系统损坏。

解决方法:检查服务器的内存和系统是否正常,如果服务器内存紧张,请检查一下哪些进程消耗了服务器的内存,同时考虑是否增加服务器的内存来提高整个的负载能力。

9.Error: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’

error.:2002

问题分析:

出现这个错误一般情况下是因为下面两个原因:

1.MySQL 服务器没有开启。

2.MySQL 服务器开启了,但不能找到 socket 文件。

解决方法:请检查一下 MySQL 服务是否已经开启,没有开启,请启动 MySQL 服务;如果已经开启,并且是 Linux 系统,请检查一下 MySQL 的 socket 的路径,然后打开 config.inc.php 找到

$dbhost = ‘localhost'; 在 hostname 后面加冒号‘:’和 MySQL 的 socket 的路径。

比如 MySQL 服务器为 localhost

MySQL 的 socket 的路径为 /tmp/mysql.sock

那么就改成如下:

$dbhost = ‘localhost:/temp/mysql.sock';

10.master 执行的语句在 slave 上执行失败怎么办?

  1. 确定是否从服务器的表与主服务器的不同。尽力了解发生的原因。然后让从服务器的 表与主服务器的一样并运行START SLAVE。
  2. 如果前面的步骤不工作或不适合,尽力了解手动更新是否安全(如果需要),然后忽视 来自主服务器的下一个语句。如果你确定可以跳过来自主服务器的下一个语句,执行 下面的语句:
    mysql> SET GLOBAL SQL_slave_SKIP_COUNTER = n;
    mysql> START SLAVE;

11.Slave 上现出 log event entry exceeded max_allowed_packet 错误怎么办?

在主从服务器上增加 max_allowed_packet 参数的大小: 
 mysql> SET @@global.max_allowed_packet=16777216;
同时在 my.cnf 里,设置 max_allowed_packet = 16M, 保证下次重新启动后继续有效。

12.怎么样知道 slave 上现在复制到什么地方了?

可以查看 SHOW SLAVE STATUS 语句的 Seconds_Behind_Master 列的结果。

13.多主复制时,自动增长变量的冲突问题。

在单主复制时,系统参数 auto_increment_increment 和 auto_increment_offset 可以 采用默认设置,但是多主复制时,要定制 auto_increment_increment 和 auto_increment_offset 的设置,保证多主之间不会有重复冲突。比如两个 master 的情况 可以如下设置:
Master1 上: auto_increment_increment = 2 , auto_increment_offset = 1 ; (1,3,5,7...序列)
Master2 上: auto_increment_increment = 2 , auto_increment_offset = 0 ; (0,2,4,6...序列

14.表损坏如何处理?

    一张损坏的表的症状通常是查询意外中断并且能看到下述错误: “tbl_name.frm”被锁定不能更改。
不能找到文件“tbl_name.MYI”(Errcode:nnn)。 文件意外结束。
记录文件被毁坏。
从表处理器得到错误nnn
解决方法如下: 方法一:
    myisamchk -r tablename 上面的方法几乎能解决所有问题,如果不行,则使用: myisamchk -o tablename
方法二:
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
     option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
 REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE
     tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]

15.数据目录磁盘空间不足怎么办?

如果建表前时候预测到 data 目录下的空间不足, 则在建表时用如下选项指定数据目 录和索引目录到磁盘充足的空间:
    DATA DIRECTORY = 'absolute path to directory'
    INDEX DIRECTORY = 'absolute path to directory'
如果表已经创建, 则可以将表的数据文件和索引文件mv到磁盘充足的分区上, 然后在原文件处创建符号链接即可。当然,mv前最好停机或者将表锁定,以防止表的更改。

16.如何禁止 DNS 反向解析?

show processlist 命令出现了非常多个进程,但是这些进程很奇怪,类似于: unauthenticated user | 192.168.5.71:57857 | NULL | Connect | NULL | login | NULL
这些并不是我们正常的进程, 原 来这是mysql 的一个 bug, 是 由于反复解析ip 和 dns 造成的,启动的时候加上--skip-name-resolve 选项就可以避免。

17.mysql.sock 丢失后怎么连接数据库?

请注意,如果你指定 localhost 作为一个主机名, mysqladmin 默认使用 Unix 套接字文件连接,而不是 TCP/IP。从 MySQL 4.1 开始,通过 --protocol= TCP | SOCKET | PIPE | MEMORY}选项,你可以显示地指定连接协议 ,举例如下: socket 连接:
[zzx@zzx mysql]$ mysql -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/home/zzx/mysql/mysql.sock' (2)
tcp 连接:
 [zzx@zzx mysql]$ mysql --protocol=TCP -uroot -p -P3307 -hlocalhost Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 73 to server version: 5.0.15-standard Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>

18.MySQL Server has gone away

在运行SQL脚本过程中,出现了这样的错误:ERROR : (2006, 'MySQL server has gone away')
由于长时间执行批量的MySQL语句,SQL运行时间长,insert 插入数据比较多,传送的数据太大引起的,最常见的原因是采集或新旧数据的转化。
    解决方案:
    >show global variables like '%timeout';
  >set wait_timeout=2880000;
  >set interactive_timeout=2880000;
  >show global variables like 'max_allowed_packet';
  >set global max_allowed_packet=1024*1024*16;
 然后source d.sql;再次进行备份,顺利解决,不会再出现以上问题。

19.一则连接池泄露事件的排查过程(http://www.iteye.com/topic/1120641)

20.一则MySQL连接异常排查过程的例子(http://www.2cto.com/database/201505/402016.html)

21.记一次 MySQL 数据库问题排查(http://blog.jobbole.com/99479/)

22其他常见MySQL错误(http://www.open-open.com/lib/view/open1455251014933.html).

你可能感兴趣的:(MySQL常见问题总结)