附录B错误,错误代码,及常见问题

目录

B.1错误信息来源
B类错误值
3服务器错误代码和消息
B客户端错误代码和消息
B问题和常见错误
b.5.1如何确定是什么原因造成的问题
b.5.2常见错误使用MySQL的程序
b.5.3管理相关问题
b.5.4查询相关问题
b.5.5优化器的相关问题
b.5.6表定义的相关问题
b.5.7已知问题在MySQL

本附录列出了常见的问题和可能出现的错误和潜在的决议,除了上市,可能会出现当您从任何主机语言MySQL错误。第一部分包括问题的解决。提供错误的详细信息:一个列表显示服务器错误信息。另一个列表显示客户端程序的消息。

B.1错误信息来源

在MySQL错误信息的几个来源:

服务器和客户端的错误描述了本附录后。关于错误的相关信息InnoDB,看到第15.20.4,“InnoDB错误处理”

B类错误值

在MySQL中出现错误时,服务器返回的两类误差值:

  • MySQL特定的错误代码。这个值是数字。它是无法移植到其他数据库系统。

  • SQLSTATE值。值为15个字符的字符串(例如,'42S02')。该值是从ANSI SQL和ODBC和更加规范。

A message String that provides a Textual description of the error is also available at also available at .

当错误发生时,MySQL错误代码,SQLSTATE值和消息字符串可以使用C API函数:

为编制报表,相应的误差函数mysql_stmt_errno()mysql_stmt_sqlstate(),和mysql_stmt_error()。所有错误的功能进行了27.7节,“MySQL C API”

错误,警告的数量,和以前的声明可以通过调用mysql_warning_count()。看到第27.7.7.82,“mysql_warning_count()”

一个SQLSTATE值的前两个字符显示错误类:

  • Class ='00'成功的标志

  • Class ='01'表明了警告

  • Class ='02'指示没有找到这是有关在游标的语境和用于控制当光标到达数据集的最后。这种情况也会发生SELECT ... INTO var_list语句检索没有行

  • '02'表示一个例外

3服务器错误代码和消息

MySQL的程序有几种类型的错误信息时,服务器会返回一个错误。例如,在MySQL客户端程序使用下面的格式显示错误:

shell> SELECT * FROM no_such_table;
ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist

显示的信息包含三类信息:

  • 一个数字错误代码(1146)。这个数字是MySQL特定的和不可移植到其他数据库系统。

  • 15个字符的SQLSTATE值('42S02')。该值是从ANSI SQL和ODBC和更加规范。不是所有的MySQL错误数都有相应的SQLSTATE值。在这些情况下,“hy000”(一般使用错误)

  • 一个信息压力,它提供了一个对误差的质地描述。

检查错误,使用错误代码,没有错误信息。错误信息不会经常改变,但它是可能的。如果数据库管理员更改语言设置,影响错误消息的语言。

错误代码是稳定在给定的MySQL系列GA释放。一系列达到GA之前,新的代码仍然可以与学科化发展下。

服务器错误信息来自下面的源文件。有关错误信息的定义方式的细节,看MySQL内部手册

  • 错误信息中列出share/errmsg-utf8.txt文件% d%s代表数字和字符串,分别被替换到消息时,显示值。

  • 上市的误差值share/errmsg-utf8.txt用于生成定义包括/ mysqld_error。Hinclude/mysqld_ername.hMySQL的源文件

  • 上市的SQLSTATE值share/errmsg-utf8.txt用于生成定义包括_ state.h / SQLMySQL的源文件

由于更新频繁,这是可能的,这些文件将包含额外的错误信息没有列在这里。

B客户端错误代码和消息

客户端错误信息来自下面的源文件:

  • 误差值,括号中的符号对应于定义在include/errmsg.hMySQL的源文件

  • 消息值对应中列出的错误消息libmysql/errmsg.c文件% d%s代表数字和字符串,分别被替换到消息时显示。

由于更新频繁,这是可能的,这些文件将包含额外的错误信息没有列在这里。

B问题和常见错误

本节列出了一些常见的问题和错误,你可能会遇到的消息。它描述了如何确定问题产生的原因及如何解决。

b.5.1如何确定是什么原因造成的问题

当你遇到一个问题,你应该做的第一件事是找出哪些程序或设备造成的:

  • 如果你有下列症状,则可能是硬件问题(如内存、主板、CPU、或硬盘)或核心问题:

    • 键盘不工作。这通常可以通过按下Caps Lock键检查。如果Caps Lock灯不改变,你必须更换你的键盘。(在此之前,你应该试着重新启动计算机并检查所有电缆的键盘。)

    • 鼠标指针不动

    • 机器不回答到远程机器的扫描。

    • 其他的程序,是不相关的MySQL不正确的行为。

    • 你的系统重新启动意外。(一个错误的用户级程序应该永远无法取下你的系统。)

    在这种情况下,你应该先检查你所有的电缆和运行一些诊断工具来检查你的硬件!你也应该检查是否有任何补丁,更新,或为你的操作系统可能会解决你的问题的服务包。检查你所有的库(如glibc)是最新的

    使用ECC内存的机器内存的问题早发现总是好的。

  • 如果您的键盘锁,你可以登录到你的机器从另一台机器执行恢复kbd_mode -a

  • 请检查你的系统日志文件(/var/log/messages或类似的)为你的问题的原因。如果你认为问题在MySQL,你还应该检查MySQL的日志文件。看到5.4节,“MySQL服务器日志”

  • 如果你认为你没有硬件问题,你应该尝试找出哪个程序引起的问题。尝试使用上衣PS,任务管理器,或一些类似的程序,检查程序是把所有的CPU或是锁机。

  • 使用上衣DF,或类似的程序来检查是否你的内存,磁盘空间,文件描述符,或者其他一些关键的资源。

  • 如果问题是逃跑的过程中,你总是可以尝试杀死它。如果它不想死去,有可能是在操作系统中的错误。

如果你已经检查了所有其它的可能性,你认为MySQL服务器或客户端是造成这一问题,现在是时候创建一个邮件列表或我们的支持团队的错误报告。在bug报告,试图给出一个非常详细的描述了系统是如何表现的,你认为什么是发生。你也应该说明为什么你认为MySQL引起问题。考虑到本章的所有情况。国家的任何问题,他们是如何出现在你检查你的系统。使用复制和粘贴方法对任何输出和错误消息和日志文件的程序。

尽量详细描述的程序不能正常工作,你看到的所有症状。我们在过去已经收到了很多的bug报告,国家只系统不工作这提供了我们没有什么可以问题的信息。

如果一个项目失败,它知道以下信息始终是有益的:

  • 问题的程序做了一个分割故障(没有堆芯)?

  • 是程序占用所有可用的CPU时间?检查上衣。让程序运行一段时间,它可能只是一些计算密集型的评价。

  • 如果mysqld服务器造成的问题,你能得到任何回应,它mysqladmin U根平mysqladmin U根列表

  • 什么是一个客户端程序说当你试图连接到MySQL服务器吗?(试着用MySQL,例如。)客户端的果酱吗?你可以从程序的任何输出?

当发送错误报告,你应该遵循的轮廓描述1.7节,“如何报告错误或问题”

b.5.2常见错误使用MySQL的程序

本节列出了一些错误,用户经常遇到运行MySQL的程序。虽然问题显示了当您尝试运行客户端程序,许多问题的解决方案涉及改变MySQL服务器的配置。

b.5.2.1拒绝访问

一个Access denied错误的原因有很多。通常问题是MySQL帐户服务器允许客户端程序连接时使用相关。看到6.2节,“MySQL的权限系统”,和第6.2.9”故障,连接到MySQL”问题

b.5.2.2无法连接到MySQL服务器[局部]

在UNIX MySQL客户端可以连接到mysqld在两种不同的方式:利用UNIX套接字服务器通过文件在文件系统中的文件(默认连接/tmp/mysql.sock),或通过使用TCP/IP连接通过一个端口号。UNIX套接字文件连接比TCP / IP更快,但可以连接在同一台计算机上的服务器时使用。UNIX套接字文件如果不指定主机名或如果您指定的特殊使用的主机名本地服务器

如果MySQL服务器运行的是Windows,你可以使用TCP / IP连接。如果服务器开始的--enable-named-pipe的选择,你也可以用命名管道连接如果你运行客户端主机上的服务器运行的位置。该命名管道的名称MySQL默认情况下。如果你不给一个主机名时,连接mysqld首先,MySQL客户端试图连接到命名管道。如果不工作,它连接到TCP / IP端口。你可以通过使用命名管道的力量在Windows的使用.作为主机名称

错误(2002年)Can't connect to ...通常意味着没有MySQL服务器在系统或您正在使用不正确的UNIX套接字文件名或TCP / IP端口号当试图连接到服务器上运行。你也应该检查一下,你使用的是TCP/IP端口没有被防火墙或端口阻塞服务。

错误(2003年)Can't connect to MySQL server on 'server' (10061)表明网络连接被拒绝。你应该检查是否有一个MySQL服务器上运行,它具有网络连接功能,以及您所指定的网络端口是一个服务器上配置。

先检查是否有一个过程称为mysqld在你的服务器主机上运行。(使用PS XA | grep mysqld在UNIX或Windows任务管理器。)如果没有这样的过程,你应该启动服务器。看到第2.9.2“启动服务器”

如果一个mysqld进程正在运行,你可以通过尝试以下命令。端口号或UNIX套接字文件名可能是你设置的不同。host_ip代表本机的IP地址,服务器运行。

内核>mysqladmin version内核>mysqladmin variables内核>mysqladmin -h `hostname` version variables内核>mysqladmin -h `hostname` --port=3306 version内核>mysqladmin -h host_ip version内核>mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version

注意引号的使用而不是用了引号主机名这些导致输出命令;主机名(即当前主机名)被取代成mysqladmin命令。如果你没有主机名命令或在Windows上运行,你可以手动输入你的机器的主机名(不带引号)后-h选项。你也可以尝试H 127.0.0.1与TCP/IP本地主机连接。

确保服务器没有配置为忽略网络连接(如果您试图远程连接),它没有被配置为只听本地网络接口。如果服务器启动--skip-networking,它不会接受TCP/IP连接在所有。如果服务器启动--bind-address=127.0.0.1,它将侦听TCP/IP只有本地环回接口连接和不接受远程连接。

检查以确保没有防火墙阻止访问MySQL。你的防火墙的配置可能对正在执行的应用程序的基础上,或由MySQL用于通信的端口号(默认为3306)。Linux或Unix下,检查你的IP表(或类似的)配置确保端口没有被封锁。在Windows环境下,应用如ZoneAlarm或者Windows防火墙可能需要配置不阻止MySQL端口。

这里有一些原因Can't connect to local MySQL server错误可能发生:

  • mysqld不在本地主机上运行。检查你的操作系统的进程列表以确保mysqld过程是存在的

  • 你正在运行的许多TCP/IP连接MySQL服务器在Windows。如果你正在经历的,往往你的客户得到的错误,你可以在这里找到一个解决方案:第b.5.2.2.1,“连接到MySQL服务器失败的窗口”

  • 有人把UNIX套接字文件mysqld采用(/tmp/mysql.sock默认情况下)。例如,你可能有一个cron工作,删除旧的文件从/tmp目录你总是可以运行mysqladmin版本检查是否UNIX套接字文件mysqladmin试图用真的存在。在这种情况下,解决办法是改变cron工作不删除mysql.sock或将socket文件其他地方。看到第b.5.3.6,“如何保护或更改MySQL的Unix套接字文件”

  • 你已经开始了mysqld服务器与--socket=/path/to/socket选项,但忘了告诉客户端的socket文件的新名称。如果你改变了插座的路径名称服务器,您还必须通知MySQL客户端。你可以通过提供相同的--socket当你运行客户端程序选项。你还需要确保用户有权限访问文件发现那里的套接字文件,你可以做:

    shell> netstat -ln | grep mysql
    

    看到第b.5.3.6,“如何保护或更改MySQL的Unix套接字文件”

  • 你使用的是Linux和一个服务器线程已经死了(被芯)。在这种情况下,你必须杀了对方mysqld线程(例如,用杀死)之前,你可以重新启动MySQL服务器。看到第b.5.3.3,“做什么如果MySQL总是死机”

  • 服务器或客户端程序可能不认为Unix套接字文件或套接字文件本身的目录有适当的访问权限。在这种情况下,您必须更改访问权限的目录或socket文件使服务器和客户端可以访问它们,或重新启动mysqld用一个--socket选项指定一个socket文件名的目录服务器可以创建它并在客户端程序可以访问它。

如果你得到错误消息Can't connect to MySQL server on some_host,你可以尝试以下的东西来找出是什么问题:

  • 检查服务器是否在运行主机上执行telnet some_host 3306然后按回车键几次。(三三六是MYSQL默认端口号。如果你的服务器是听一个不同的端口值更改。)如果有一个MySQL服务器运行和听口,你应该得到一个响应,包括服务器的版本号。如果你得到一个错误,如Telnet:无法连接到远程主机:连接被拒绝,然后没有服务器在特定的端口上运行。

  • 如果服务器在本地主机上运行,尝试使用mysqladmin H本地变量使用Unix套接字文件连接。验证TCP / IP,服务器配置为侦听端口号(它的价值port变量

  • 如果您运行的是Linux下的安全增强的Linux(SELinux)启用,确保你有残疾人SELinux保护mysqld过程

b.5.2.2.1连接到MySQL服务器未在Windows

当你跑步时许多TCP/IP连接到Windows的MySQL服务器,和你所经历的,往往你的客户得到一个Can't connect to MySQL server错误的原因可能是Windows不允许足够的短暂的(短期)港口服务的连接。

目的TIME_WAIT是保持连接,即使接受数据包的连接已关闭。这是因为互联网路由可导致数据包需要一个缓慢的路线到目的地,它可能在双方已经同意关闭到。如果端口是用于一个新的连接,从旧的连接,数据包可能会打破协议或妥协的个人信息从原来的连接。这个time_wait延迟防止通过确保端口不能直到一段时间后,已经对那些延迟的数据包到达允许重复使用。

它是安全的减少TIME_WAIT大大在局域网连接因为有数据包到达很长时间延误的机会很小,因为他们可以通过互联网以其相对大的距离和延迟。

Windows允许短暂的(短期)TCP端口的用户。在任何端口关闭它将保持在一个TIME_WAIT120秒的状态。港口将不可用,直到这段时间结束。端口号默认的范围取决于Windows的版本,有更多的限制在旧版本的端口号:

  • Windows通过服务器2003:端口范围1025–5000

  • Windows Vista,Server 2008和更新:端口范围49152–65535

一小堆可用的TCP端口(5000)和大量的TCP端口被打开和关闭在很短的时间内,随着TIME_WAIT状态你有跑出来的港口的一个很好的机会。有两种方法来解决这个问题:

  • 降低TCP端口快速调查池或持久连接尽可能连接消耗数

  • 调整一些设置在Windows注册表(见下文)

重要

下面的过程涉及到修改Windows注册表。在修改注册表之前,请确保备份和确保您了解如何发生问题时恢复。有关如何备份,还原,和编辑注册表,查看微软知识库文章:http://support.microsoft.com/kb/256986/en-us/

  1. 启动注册表编辑器(Regedt32.exe

  2. 找到以下注册表中:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
    
  3. Edit菜单,点击增加价值,然后添加以下注册表值:

    Value Name: MaxUserPort
    Data Type: REG_DWORD
    Value: 65534
    

    这套临时端口提供给任何用户的数量。有效的范围是5000和65534之间(十进制)。默认值是0x1388(十进制的5000)。

  4. Edit菜单,点击增加价值,然后添加以下注册表值:

    Value Name: TcpTimedWaitDelay
    Data Type: REG_DWORD
    Value: 30
    

    这套秒数举行一个TCP端口连接TIME_WAIT在关闭状态。有效的范围是30和300之间的小数,虽然你可能要检查与微软最新的允许值。默认值是0x78(十进制的120)。

  5. 退出注册表编辑器

  6. 重新启动机器

注:以上应撤消删除你创建的注册表项简单。

b.5.2.3丢失连接到MySQL服务器

有三个可能的原因,这个错误信息。

它通常表示网络连接的麻烦,你应该如果经常发生这种错误检查你的网络状况。如果错误消息包括在查询,这可能是你正在经历的情况。

有时在查询形式发生在数百万行作为一个或多个查询的一部分发送。如果你知道这正在发生,你应该尝试增加net_read_timeout从30秒到60秒或更长时间的默认,足够的数据传输来完成。

更罕见的是,它可以发生在客户端尝试连接到服务器的初始。在这种情况下,如果你的connect_timeout值设置为只有几秒钟的时间,你可以通过增加到十秒钟解决问题,如果你有一个很长的距离或速度很慢的连接。你可以决定你是否使用体验更少见的原因像“aborted_connects”表明全球地位。这将增加一个初始连接请求,服务器中止。你可能会看到阅读授权包作为错误信息的一部分;如果是这样,那也表明这是你需要的解决方案。

如果原因是刚才所描述的人,你可能会遇到一个问题BLOB在大于价值max_allowed_packet,可引起此错误和一些客户。有时候你可能会看到一个ER_NET_PACKET_TOO_LARGE错误,这表明你需要增加max_allowed_packet

b.5.2.4密码失败时,键入

MySQL客户端程序提示输入密码时调用一个--passwordP选项没有以下密码值:

shell> mysql -u user_name -p
Enter password:

在某些系统上,你可能会发现你的密码工作时指定一个选项文件或在命令行上,而不是当你进入它的交互的Enter password:提示。这是发生在图书馆提供的系统读取密码限制密码值的一个小数量的字符(通常为八)。是与系统库的问题,不是用MySQL。围绕它的工作,改变你的MySQL密码的值是八或更少的字符,或者把你的密码在一个选项文件。

b.5.2.5主机host_name”受阻

如果出现以下错误发生,这意味着mysqld从给定的主机,在中间打断,收到许多连接请求:

Host 'host_name' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'

的价值max_connect_errors系统变量决定了有多少连续中断连接请求允许。(见第5.1.7,服务器“系统变量”后。)max_connect_errors失败的请求没有连接成功,mysqld假设的东西是错的(例如,有人正在试图打破),和块的主机连接到你的问题进一步FLUSH HOSTS语句或执行mysqladmin冲洗主机命令

默认情况下,mysqld块主机100连接错误之后。你可以通过设置调整值max_connect_errors在服务器启动:

内核>mysqld_safe --max_connect_errors=10000 &

值也可以在运行时设置:

mysql> SET GLOBAL max_connect_errors=10000;

如果你得到的Host 'host_name' is blocked错误信息,对于一个给定的主机,你应该首先验证无误的TCP / IP的主机的连接。如果你有网络问题,增加的价值,这对你没有好处max_connect_errors变量

b.5.2.6连接太多

如果你得到一个Too many connections错误当您尝试连接到mysqld服务器,这意味着所有可用的连接正在使用的其他客户。

连接允许控制的数量max_connections系统变量。默认值为151时提高性能,采用MySQL和Apache Web服务器。(此前,默认为100。)如果你需要支持更多的连接,你应该设置这个变量的值越大。

mysqld其实证max_connections+1客户端连接。额外的连接预留使用账户,有CONNECTION_ADMINSUPER特权。通过给予管理者和非普通用户特权(那些不需要的),管理员也有PROCESS特权可以连接到服务器并使用SHOW PROCESSLIST诊断问题即使没有特权的用户连接数达到最大。看到第13.7.6.29,“显示列表的语法”

The maximum number of connections MySQL supports depends on the quality of the thread library on a given platform, the amount of RAM available, how much RAM is used for each connection, the workload from each connection, and the desired response time. Linux or Solaris should be able to support at least 500 to 1000 simultaneous connections routinely and as many as 10,000 connections if you have many gigabytes of RAM available and the workload from each is low or the response time target undemanding. Windows is limited to (open tables × 2 + open connections) < 2048 due to the Posix compatibility layer used on that platform.

增加的open-files-limit可能是必要的。也看到了2.5节,“installing MySQL是Linux”,对于如何提高操作系统限制多少处理可以使用MySQL。

b.5.2.7内存不足

如果你发出一个查询使用MySQL客户端程序并收到一个错误像下面的一个,这意味着MySQL没有足够的内存来存储整个查询结果:

mysql: Out of memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory

为了解决这个问题,首先检查是否您的查询是正确的。它应该返回多少行是合理的吗?如果没有正确的查询并再次尝试。否则,你可以调用MySQL--quick选项这使得它的使用mysql_use_result()C API函数检索结果集,这地方不在客户端负载(但更多的服务器上)。

b.5.2.8 MySQL服务器已经走了

本节还涉及相关Lost connection to server during query误差

为最常见的原因MySQL server has gone away错误:服务器超时和关闭连接。在这种情况下,你通常会有下列错误代码(你得到的取决于操作系统)。

错误代码描述
CR_SERVER_GONE_ERROR客户端无法发送到服务器的问题。
CR_SERVER_LOST客户没有得到错误写入服务器时,却没有得到一个完整的答案(或答案)的问题。

默认情况下,服务器关闭连接后八小时,如果什么都没有发生。你可以改变时间限制设置wait_timeout可当你开始mysqld。看到第5.1.7,服务器“系统变量”

如果你有一个脚本,你只需要执行查询,再次为客户做一个自动重连。这是假设你在客户端自动重连功能(这是默认的mysql命令行客户端)

对于其他一些常见的原因MySQL server has gone away误差:

  • 你(或数据库管理员)与杀死了正在运行的线程KILL声明或mysqladmin杀命令

  • 您试图运行一个查询关闭连接到服务器后。这表明一个逻辑错误,必须修改应用。

  • 在不同的主机上运行的客户端应用程序没有连接到该主机的MySQL服务器所必需的权限。

  • 你从客户端上的TCP/IP连接有一个超时。也许如果你一直使用的命令发生:mysql_options(..., MYSQL_OPT_READ_TIMEOUT,...)mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...)。在这种情况下增加超时可能帮助解决问题。

  • 你遇到了在服务器端和客户端超时自动重新连接被禁用(的reconnect国旗在MySQL结构是等于0)

  • 你用的是Windows客户端和服务器已连接(可能是因为wait_timeout过期)之前就发出命令。

    在Windows的问题是,在一些情况下,MySQL不从操作系统时,通过TCP/IP连接到服务器收到一个错误,而是有错误时,试图从连接中读取答案。

    这个解决方案是要么做mysql_ping()在连接如果有自上次查询时间长(这是连接器/ ODBC一样)或集wait_timeoutmysqld服务器很高,它在实践中没有时间了。

  • 你也可以发送一个查询的服务器错误或太大,把这些错误。如果mysqld收到的包太大或出故障,它假定了一些与客户的错误和关闭连接。如果你需要大的查询(例如,如果你正在使用大BLOB列),你可以通过设置服务器的增加查询限制max_allowed_packet可变,具有64MB的默认值。您可能还需要增加客户端的最大数据包大小。设置数据包大小的更多信息了第b.5.2.9,“包太大”

    一个INSERTREPLACE语句,插入很多行也会导致这些错误。这些陈述的任何一个发送一个请求到服务器,不论行数插入;因此,你经常可以通过减少每行发送数量避免错误INSERTREPLACE

  • 也有可能如果主机名查找失败时出现此错误(例如,如果DNS服务器在您的服务器或网络依赖下去)。这是因为MySQL是依赖于主机系统解析主机名,但无法知道它是否正在从MySQL的角度看问题是从任何其他网络超时没有区别。

    你也可以看到MySQL server has gone away如果MySQL错误入手--skip-networking选项

    另一个网络问题也会导致这个错误发生,如果MySQL端口(默认为3306)是由你的防火墙阻塞,从而防止任何连接到MySQL服务器。

  • 你也可以遇到这个错误的应用程序,叉子进程,所有这些尝试使用相同的连接到MySQL服务器。这可以通过使用一个单独的连接的每一个孩子的过程中避免。

  • 你遇到一个bug,服务器执行查询时死亡。

您可以检查是否死亡和重新启动MySQL服务器执行mysqladmin版检查服务器的正常运行时间。如果客户端连接中断是因为mysqld崩溃和重启,你应该集中精力寻找失事的原因。先检查是否发出查询的服务器又再次杀死。看到第b.5.3.3,“做什么如果MySQL总是死机”

你可以开始得到关于失去连接的更多信息mysqldlog_error_verbosity系统变量设置为3。这个日志的一些断开的信息hostname.err文件看到5.4.2部分,“错误日志”

如果你想创建一个关于这个问题的错误报告,确保你包括以下信息:

参见第b.5.2.10,“通信错误和失败的连接”,和1.7节,“如何报告错误或问题”

b.5.2.9包太大

通信数据包是一个SQL语句发送到MySQL服务器,单排,发送给客户端,或二进制日志事件从主复制服务器发送一个奴隶。

这可以从MySQL 8的服务器或客户端发送或最大包为1GB。

当MySQL客户端or themysqld服务器接收到一个数据包大于max_allowed_packet字节,它的问题ER_NET_PACKET_TOO_LARGE错误和关闭连接。有些客户,你也可能会得到一个在查询过程中丢失连接到MySQL服务器错误如果通信包太大

客户端和服务器都有自己的max_allowed_packet可变的,所以如果你想处理大数据包,你必须增加这个变量在客户端和服务器。

如果你使用的是MySQL客户端程序,默认max_allowed_packet变为16MB。设置一个更大的价值,开始MySQL这样地:

shell> mysql --max_allowed_packet=32M

设置数据包大小为32MB。

服务器的默认max_allowed_packet价值是64mb。你可以增加这个如果服务器需要处理大的查询(例如,如果你正在使用大BLOB列)。例如,设置变量为128MB,启动服务器,这样:

内核&#62;mysqld --max_allowed_packet=128M

你也可以使用一个选项文件设置max_allowed_packet。例如,设置服务器128MB大小,添加一个选项文件如下:

[mysqld]max_allowed_packet=128M

它是安全的增加这个变量的值因为额外的分配内存,只在需要的时候。例如,mysqld分配更多的内存,只有当你发出一个查询或时长mysqld必须返回大量结果的行。该变量的默认值是预防小到不正确的数据包的客户端和服务器端,也确保你不会耗尽内存使用大数据包偶然间。

你也可以使用大把大数据包的奇怪的问题BLOB值,但没有给出mysqld获取足够的内存来处理查询。如果你怀疑是这种情况,尝试加入ulimit D 256000在开始_ mysqld safe脚本和重新启动mysqld

b.5.2.10通信错误和失败的关系

如果连接出现问题,如通信错误或中止连接,使用这些信息来诊断问题:

如果服务器有log_error_verbosity系统变量设置为3,你会发现这样的消息在你的错误日志:

[注]中止连接854分贝:“雇员”用户:&#39;乔&#39;

如果客户端无法连接,服务器增量Aborted_connects状态变量。不成功的连接尝试可能的原因如下:

如果这些事情发生,这可能表明,有人试图闯入你的服务器!如果通用查询日志启用,这类问题的消息记录到它。

如果客户端成功连接后断开连接不当或终止,服务器增量Aborted_clients状态变量,和日志中止连接消息错误日志。原因可以是以下的任何:

对于中止或终止客户连接问题的其他原因:

  • 这个max_allowed_packet变量的值太小或查询需要比你分配更多的内存mysqld。看到第b.5.2.9,“包太大”

  • 使用Linux以太网协议,半和全双工。一些Linux网卡驱动有bug。你应该测试这个bug用FTP客户机和服务器之间传输大文件。如果转会突发暂停突然暂停模式,你正在经历一个Linux双证。开关的双工模式为您的网卡和集线器/交换机为全双工或半双工和试验结果确定最佳设置。

  • 用线程库,导致问题中断读取。

  • 错误配置的TCP / IP。

  • 错误的以太网集线器,交换机,电缆,等等。这只能通过更换硬件诊断正确。

参见第b.5.2.8,MySQL服务器已经走了”

b.5.2.11桌上摆满了

如果一个全表出现错误,可能是磁盘已满或该表已达到其最大尺寸。有效最大表大小的MySQL数据库通常是由操作系统对文件大小的限制决定的,不是由MySQL内部限制。看到第c.10.3,“限制表的大小”

b.5.2.12不能创建/写入文件

如果你有下列一些查询类型错误,这意味着MySQL无法创建临时目录设置在结果的临时文件:

Can't create/write to file '\\sqla3fe_0.ism'.

前面的错误是Windows的一个典型的信息;UNIX消息是相似的。

一个解决办法是启动mysqld--tmpdir选择或添加选项的[ mysqld ]您选择文件段。例如,可以指定一个目录C:\temp使用这些线:

[mysqld]tmpdir=C:/temp

这个C:\temp目录必须存在,并且有足够的空间用于MySQL服务器写。看到第4.2.6、“使用选项文件”

此错误的另一个原因可能是权限问题。确保MySQL服务器写入tmpdir目录

检查错误代码,你perror。一个原因不能写一个表格,文件系统已满:

shell> perror 28
OS error code  28:  No space left on device

如果你有以下类型的启动过程中的错误,提示系统文件或目录用于存储数据文件的写保护。只要写错误是一个测试文件,错误不严重,可以忽略。

Can't create test file /usr/local/mysql/data/master.lower-test

b.5.2.13命令

如果你得到Commands out of sync; you can't run this command now在客户端代码中,你是在错误的顺序调用客户端的功能。

这可能发生,例如,如果你使用的是mysql_use_result()试图执行一个新的查询之前你有叫mysql_free_result()。它也可以如果您试图执行的查询返回的数据的两没发生mysql_use_result()mysql_store_result()在之间

b.5.2.14忽略用户

如果你收到以下错误,它意味着当mysqld开始或当它加载授权表,它在发现一个帐户user表中有一个无效的密码。

Found wrong password for user 'some_user'@'some_host'; ignoring user

因此,该帐户是由许可制度。为了解决这个问题,分配一个新的、有效的密码的帐户。

b.5.2.15表“tbl_name”不存在

如果你有下列错误,这通常意味着不存在表格中具有给定名称的默认数据库:

Table 'tbl_name' doesn't exist
Can't find file: 'tbl_name' (errno: 2)

在某些情况下,它可能是表存在但是你指的是不正确的:

  • 因为MySQL使用目录和文件来存储数据库和表,数据库和表的名称是区分大小写的如果它们位于文件系统是区分大小写的文件名。

  • 即使是不区分大小写的文件系统,如Windows,所有引用给定的表在查询中必须使用相同的lettercase。

你可以检查表是在默认的数据库SHOW TABLES。看到第13.7.6,“语法”

b.5.2.16无法初始化字符集

你可能如果你有字符集问题,看到这样的错误:

MySQL Connection Failed: Can't initialize character set charset_name

这个错误可能有以下原因:

  • 字符集是一个多字节字符集和你有不支持的字符集在客户端。在这种情况下,你需要重新编译客户端运行CMake-DDEFAULT_CHARSET=charset_name选项看到2.8.4”部分,MySQL源配置选项”

    所有标准的MySQL的二进制文件与所有支持多字节字符集编译。

  • 字符集是一个简单的字符集,不编译成mysqld,和字符集定义文件不在的地方,客户希望能找到他们。

    在这种情况下,你需要使用下面的方法来解决问题:

    • 重新编译客户端与支持的字符集。看到2.8.4”部分,MySQL源配置选项”

    • 指定客户端目录里的字符集定义文件的位置。对于很多客户,你可以这样做的--character-sets-dir选项

    • 复制字符定义文件的客户希望他们能够得到的路径。

b.5.2.17文件没有找到类似的错误

如果你得到ERROR 'file_name' not found (errno: 23)无法打开文件:file_name(errno:24),或任何其他的错误errno 23errno 24从MySQL,它意味着你还没有分配足够的MySQL服务器的文件描述符。你可以使用perror效用得到什么的描述错误数:

shell> perror 23
OS error code  23:  File table overflow
shell> perror 24
OS error code  24:  Too many open files
shell> perror 11
OS error code  11:  Resource temporarily unavailable

这里的问题是,mysqld试图保持打开太多文件同时。你可以告诉mysqld不要同时打开很多文件或增加可用文件描述符的数量mysqld

告诉mysqld保持开放的较少的文件时,你可以通过减少表缓存的值小table_open_cache系统变量(默认值为64)。这也许不能完全阻止运行的文件描述符,在某些情况下,服务器可能会试图扩展缓存大小是暂时的,如第8.4.3.1,“MySQL如何打开和关闭表”。减少的价值max_connections也减少了打开文件的数目(默认值是100)。

改变可用文件描述符的数量mysqld,您可以使用--open-files-limit选项_ mysqld safe或设置open_files_limit系统变量。见第5.1.7,服务器“系统变量”。设置这些值的最简单的方法是增加一个选项,您选择的文件。看到第4.2.6、“使用选项文件”。如果你有一个旧版本mysqld不支持设置打开文件的限制,你可以编辑_ mysqld safe脚本。有一个开始我ulimit 256在脚本。你可以删除#文字注释掉这行,和数的变化二百五十六设置可用的文件描述符的数量mysqld

--open-files-limit文件描述符可以增加文件描述符的数量,但最多只能由操作系统的限制。也有一个限制可以重写,只要你开始_ mysqld safemysqld作为root(记住,你还需要在启动服务器--user选择在这种情况下,它不会继续运行root在它启动)。如果你需要增加文件描述符提供给每个进程数操作系统限制,请参考文档为你的系统。

笔记

如果你运行tcsh内核,文件描述符不工作!tcsh还报告了不正确的价值观,当你要求的电流限制。在这种情况下,你应该开始_ mysqld safe使用SH

b.5.2.18表腐败问题

如果你已经开始mysqld--myisam-recover-optionsMySQL的自动检查,并试图修复MyISAM表如果他们被标记为&#39;不正常关闭”或“坠毁”。如果发生这种情况,MySQL写在一个条目hostname.err文件“警告:检查表……”这是其次Warning: Repairing table如果桌子需要修理。如果你得到了很多这些错误,没有mysqld在意外死亡之前,那么什么是错的,需要进一步调查。

当服务器检测MyISAM表损坏,它写的额外信息的错误日志,如源文件的名称和行号和线程访问的表的列表。例子:Got an error from thread_id=1, mi_dynrec.c:368。这是包含在错误报告中的有用信息。

参见第5.1.6、“服务器选项”,和第28.5.1.7”做试验,如果你经验表腐败”

b.5.3管理相关问题

b.5.3.1问题文件权限

如果你的文件权限的问题,UMASKumask _目录环境变量设置不正确时,可能mysqld开始.例如,MySQL会发出以下错误消息当您创建一个表:

ERROR: Can't find file: 'path/with/file_name' (Errcode: 13)

默认的UMASKumask _目录06400750,分别。MySQL的假设值UMASKumask _目录在八进制如果一开始是10。例如,设置UMASK=0600相当于UMASK=384因为0600的八进制十进制的384。

更改默认的UMASK价值,开始_ mysqld safe如下:

shell> UMASK=384  # = 600 in octal
shell> export UMASK
shell> mysqld_safe &

默认情况下,MySQL创建数据库目录的访问权限值0750。修改此行为,设置umask _目录变量。如果你设置它的值,结合创建新目录UMASKumask _目录价值观。例如,给集团获得的所有新的目录,开始_ mysqld safe如下:

shell> UMASK_DIR=504  # = 770 in octal
shell> export UMASK_DIR
shell> mysqld_safe &

额外的细节,看4.9节,“MySQL程序环境变量”

b.5.3.2如何重置root密码

如果你没有指定一个rootMySQL服务器的密码,不需要密码的所有连接为root。然而,这是不安全的。在分配一个密码指令,看第2.9.4,”保证初始MySQL账户”

如果你知道root密码和想要改变它,看第13.7.1.1,“改变用户的语法”,和第13.7.1.10,“设置密码语法”

如果你指定了一个root密码之前却忘记了它,你可以指定一个新的密码。以下各节提供Windows和UNIX和类UNIX系统的说明,以及通用的指令,适用于任何系统。

b.5.3.2.1重置密码:Windows系统

在Windows中,使用以下步骤重置MySQL的密码'root'@'localhost'账户要改变一个密码root用一个不同的主机名部分帐户,修改指令使用的主机名。

  1. 登录到您的系统管理员联系。

  2. 如果它是运行停止MySQL服务器。一台服务器正在运行一个Windows服务,去服务经理:从开始菜单,选择控制面板,然后管理工具,然后服务。找到列表中的MySQL服务停止。

    如果您的服务器没有运行作为一项服务,你可能需要使用任务管理器来迫使它停止。

  3. 创建一个包含在一个单一的线密码赋值语句的文本文件。那你想使用的密码替换密码。

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
    
  4. 保存文件。这个例子假设你的文件名C:\mysql-init.txt

  5. 打开一个控制台窗口进入命令提示符:从开始菜单,选择运行,然后输入cmd作为命令来运行

  6. 用特殊的启动MySQL服务器--init-file选项(注意在期权价值的反斜杠是一倍):

    C:\>cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"C:\>mysqld --init-file=C:\\mysql-init.txt

    如果你安装MySQL的不同位置,调整CD相应的命令

    服务器执行指定文件的内容--init-file选择在启动时,改变root @本地主机帐户密码

    有服务器的输出出现在控制台窗口,而不是在一个日志文件,添加--console选择的mysqld命令

    如果你安装MySQL使用MySQL安装向导,您可能需要指定一个--defaults-file选项。例如:

    C:\>mysqld--defaults-file="C:\\ProgramData\\MySQL\\MySQL Server 8.0\\my.ini"--init-file=C:\\mysql-init.txt

    适当的--defaults-file设置可以使用服务经理发现:从开始菜单,选择控制面板,然后管理工具,然后服务。发现在列表中,MySQL服务右击它,选择Properties选项这个可执行文件的路径字段包含--defaults-file设置

  7. 在服务器启动成功,删除C:\mysql-init.txt

你现在应该能够连接到MySQL服务器root使用新的密码。停止MySQL服务器并重启正常。如果你运行的服务器的一种服务,它从Windows服务窗口启动。如果你手动启动服务器,使用什么命令你通常使用的。

b.5.3.2.2重置密码:UNIX和类UNIX系统

在Unix系统中,使用以下步骤重置MySQL的密码'root'@'localhost'账户要改变一个密码root用一个不同的主机名部分帐户,修改指令使用的主机名。

说明假定您将启动MySQL服务器从Unix登录帐户,您通常使用运行。例如,如果你运行的服务器使用mysql登录帐户,你应该登录MySQL使用说明。或者,你可以登录root,但在这种情况下,你必须开始mysqld--user=mysql选项如果你启动服务器root不使用--user=mysql,服务器可以创建root所有的文件在数据目录,如日志文件,这些可能对未来造成服务器的初创公司许可的相关问题。如果发生这种情况,你需要更改文件的所有权mysql或删除它们

  1. 登录到您的系统的Unix用户,MySQL服务器运行的(例如,mysql

  2. 如果它是运行停止MySQL服务器。定位.pid文件包含服务器进程ID。该文件的确切位置和名称取决于您的配置,主机名和配置。常见的位置是/无功/自由/ MySQL //var/run/mysqld/,和本地/ MySQL / usr /日期/ /。一般来说,文件名的扩展.pid故事的开始是mysqld或您的系统的主机名

    通过发送一个正常停止MySQL服务器kill(不杀- 9)的mysqld处理器。使用目前的模式.pid在下面的命令文件:

    内核&#62;kill `cat /mysql-data-directory/host_name.pid`

    使用引号(没有引号)与cat命令。这些导致输出被取代成kill命令

  3. 创建一个包含在一个单一的线密码赋值语句的文本文件。那你想使用的密码替换密码。

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
    
  4. 保存文件。这个例子假设你的文件名/home/me/mysql-init。该文件包含密码,所以不救它,它可以被其他用户阅读。如果你还没有登录为MySQL(用户的服务器运行),确保文件的权限,允许mysql读它

  5. 用特殊的启动MySQL服务器--init-file选项:

    内核&#62;mysqld --init-file=/home/me/mysql-init &

    服务器执行指定文件的内容--init-file选择在启动时,改变root @本地主机帐户密码

    其他选项可能是必要的,这取决于你如何正常启动你的服务器。例如,--defaults-file可能需要在--init-file

  6. 在服务器启动成功,删除/home/me/mysql-init

你现在应该能够连接到MySQL服务器root使用新的密码。停止并重新启动服务器,它通常。

b.5.3.2.3重置root密码:通用指令

前面的章节提供密码重置专门为Windows和UNIX和类UNIX系统说明。另外,在任何平台上,你可以重置密码的使用MySQL客户端(但这种方法是不安全的):

  1. 如果需要停止MySQL服务器,然后重新启动它的--skip-grant-tables选项这使得任何人连接无密码和所有的特权,并禁用帐户管理报表等ALTER USERSET PASSWORD。因为这是不安全的,如果服务器开始的--skip-grant-tables选项,它使--skip-networking自动进行远程连接

  2. 连接到MySQL服务器使用MySQL客户;没有密码是必要的因为服务器启动--skip-grant-tables

    内核&#62;mysql
  3. mysql客户端告诉服务器重新加载授权表,账户管理报表工作:

    MySQL的&#62;FLUSH PRIVILEGES;

    然后改变'root'@'localhost'帐户密码。那你想使用的密码替换密码。要改变一个密码root用一个不同的主机名部分帐户,修改指令使用的主机名。

    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
    

你现在应该能够连接到MySQL服务器root使用新的密码。停止并重新启动服务器,它通常(不--skip-grant-tables--skip-networking选项)

b.5.3.3如果MySQL死机

每个MySQL版本测试平台在发布前。这并不意味着有无错误,如果有错误,他们应该很少,很难找到。如果你有一个问题,如果你试图找出到底崩溃你的系统总是有帮助的,因为你有一个更好的机会得到问题的迅速解决。

首先,你应该找出问题是否是mysqld服务器死了或你的问题是否跟你的客户。您可以检查您多久mysqld服务器已被执行mysqladmin版。如果mysqld已经死了,重新启动,你可以通过查看服务器的错误日志中找到原因。看到5.4.2部分,“错误日志”

在某些系统上,你可以在错误日志里找到一个堆栈跟踪mysqld死了,你可以解决的resolve_stack_dump程序看到28.5节,“调试和移植MySQL”。注意变量的值写入错误日志可能并不总是100的正确率。

许多服务器崩溃所造成的损坏的数据文件或索引文件。MySQL的更新磁盘上的文件与write()每一个SQL语句和之前的客户通知有关结果后呼叫系统。(如果你运行的是这不是真的--delay-key-write在这种情况下,数据文件写但不索引文件。)这意味着数据文件中的内容,即使是安全的mysqld崩溃,因为操作系统可确保未刷新的数据写入磁盘。你可以强迫MySQL冲洗到磁盘上的一切,每个SQL语句的开始后mysqld--flush选项

前面意味着你通常不应该损坏的表,除非有下列情况:

  • MySQL服务器或服务器主机在一个更新中死亡。

  • 你发现了一个bugmysqld导致它死在更新中

  • 一些外部程序操作数据文件或索引文件在同一时间mysqld不锁表正确

  • 你正在运行的许多mysqld使用相同的数据目录的系统上不支持好的文件系统锁服务器(由正常办理lockd锁管理器),或你与外部锁定禁用运行多个服务器。

  • 你有一个坠毁的数据文件或索引文件包含损坏的数据,很迷茫mysqld

  • 你会发现在数据存储的代码的bug。这是不可能的,但它至少是可能的。在这种情况下,你可以尝试使用存储引擎转换到另一个引擎ALTER TABLE我们修理了copy of the table。

因为它很难知道为什么事情崩溃,先检查是否为他人工作崩溃你的东西。尝试下面的事情:

  • 停止mysqld服务器关闭,运行片名:神话从数据目录检查所有MyISAM表,并重新启动mysqld。这将确保你从一个干净的运行状态。看到5章,MySQL服务器管理

  • 开始mysqld与一般查询日志启用(见5.4.3节,“通用查询日志”)。然后确定从信息写入到日志中是否有一些特定的查询杀死服务器。关于95的所有的错误都是一个特定的查询相关的。通常情况下,这仅仅是在服务器重启一个日志文件中的最后一个查询。看到5.4.3节,“通用查询日志”。如果你能多次与特定查询杀死MySQL,即使你已经检查了所有表之前发布它,然后你有孤立的缺陷和应提交一个bug报告吧。看到1.7节,“如何报告错误或问题”

  • 试着做一个测试案例,我们可以使用重复的问题。看到28.5节,“调试和移植MySQL”

  • 试试fork_big.pl脚本(它位于测试源分布目录。)

  • 为调试配置MySQL使得它更容易收集有关可能的错误信息如果出错。配置MySQL的-DWITH_DEBUG=1选项CMake然后重组See28.5节,“调试和移植MySQL”

  • 确保您已经应用了最新的补丁为您的操作系统。

  • 使用--skip-external-locking选项mysqld。在一些系统上的lockd锁管理器不能正常工作的;--skip-external-locking选项告诉mysqld不使用外部锁定。(这意味着你不能跑两mysqld服务器在相同的数据目录,你必须小心,如果你使用myisamchk。不过,可以尝试选择作为测试的指导。)

  • 如果mysqld似乎运行但没有响应,尝试mysqladmin U根列表。有时mysqld是不是挂即使似乎反应迟钝。这个问题可能是所有的连接都在使用中,或可能会有一些内部锁问题。mysqladmin U根列表通常会在这些情况下进行连接,并能提供有关当前连接数和状态的有用信息。

  • 运行命令在5 mysqladmin状态mysqladmin - 5 - R的状态在单独的窗口中运行其他查询统计而产生。

  • 试试下面的:

    1. 开始mysqldGDB(或另一个调试器)。看到28.5节,“调试和移植MySQL”

    2. 运行测试脚本

    3. 打印的回溯和最低的三个层次的局部变量。进入GDB,你可以用下面的命令时mysqld已经坠毁在GDB

      backtrace
      info local
      up
      info local
      up
      info local
      

      GDB,还可以检查线程的存在info threads和切换到一个特定的线程线N,在那里N是线程ID

  • 试着用一个Perl脚本迫使MySQL崩溃或行为不端,模拟你的应用。

  • 把一个正常的错误报告。看到1.7节,“如何报告错误或问题”。会比平时更详细。因为MySQL的作品对许多人来说,事故可能造成的东西,只存在于你的计算机(例如,一个错误,是您的特定系统库相关)。

  • 如果你有一个问题包含动态长度行的表,您只使用VARCHAR列(不BLOBTEXT列),你可以试着改变一切VARCHARCHARALTER TABLE。这迫使MySQL使用固定大小的行。固定大小的行花一点额外的空间,但更宽容腐败。

    目前的动态行代码已经使用了几年很少有问题,但动态长度行的性质更容易出现错误,那么可以尝试这种策略来看看是否可以是一个好主意。

  • 考虑硬件故障的可能性诊断问题的时候。有缺陷的硬件可以是数据损坏的原因。特别注意你的内存和磁盘子系统时,硬件故障。

b.5.3.4 MySQL如何处理一个完整的磁盘

本节介绍了MySQL如何磁盘已满错误反应(如设备上没有剩余空间),对超过配额的错误(如写失败用户块达到极限

这部分是有关写MyISAM表它也适用于写入二进制日志文件和二进制日志索引文件,惟有关唱片应理解为事件

当一个完整的条件被发现时,MySQL does the following:

  • 它的每一分钟检查一次,看是否有足够的空间来写当前行。如果有足够的空间,它继续若无其事。

  • 每10分钟写一个进入日志文件的磁盘已满的状态报警。

为了缓解这个问题,采取以下行动:

  • 继续,你只需要释放足够的磁盘空间来插入的所有记录。

  • 另外,中止线程,使用mysqladmin杀。线程终止下次检查磁盘(一分钟)。

  • 其他线程可能等待导致磁盘满状况表。如果你有几个锁定线程,杀一个线程正在等待磁盘满条件使其他线程继续。

前款行为的例外是当你使用REPAIR TABLEOPTIMIZE TABLE在创建索引后,一批LOAD DATA INFILE或在ALTER TABLE声明。所有这些陈述可能创造大量的临时文件,如果留给自己,将其余的系统造成大问题。如果磁盘已满,MySQL是做任何操作,它消除了大的临时文件和马克桌上坠毁。例外的是,ALTER TABLE,旧表保持不变

b.5.3.5 MySQL存储临时文件的地方

在Unix上,MySQL使用的价值TMPDIR环境变量中的目录的路径名来存储临时文件。如果TMPDIR没有设置,MySQL使用系统默认的,这通常是/tmp/是/ TMP,或/usr/tmp

在Windows中,MySQL检查订单的价值TMPDIR临时雇员,和TMP环境变量。对于第一个发现是,MySQL的使用它,不检查这些剩下的。如果没有TMPDIRTEMP,或TMP设置,MySQL使用windows系统默认的,这通常是C:\windows\temp\

如果包含你的临时文件目录的文件系统太小,你可以使用mysqld--tmpdir选项指定文件系统中的目录,你有足够的空间。在复制的奴隶,你可以使用--slave-load-tmpdir对持有临时文件复制时指定一个单独的目录LOAD DATA INFILE声明.

这个--tmpdir选项可以设置一系列的路径是用于循环的方式。路径应该是由冒号分隔()在UNIX和分号(;)是Windows操作系统。

笔记

分散负载,这些路径必须位于不同的身体的磁盘分区,不同的磁盘。

如果MySQL服务器作为复制的奴隶,你应该确保设置--slave-load-tmpdir不指向一个目录,是一个基于内存的文件系统或目录被清除时,服务器主机重启。复制的奴隶需要一些临时文件的生存机器,它可以复制临时表或重启LOAD DATA INFILE运营如果在从临时文件目录文件服务器重启时丢失了,复制失败。

MySQL的安排,临时文件被删除如果mysqld终止。在支持平台(如UNIX),这是通过拆分后的文件打开它。这个缺点是,名字没有出现在目录列表中,你不会看到一个大的临时性文件,填补了该临时文件目录所在的文件系统。(在这种情况下,lsof L1对于大文件相关的有帮助mysqld。)

当排序(ORDER BY),MySQL通常使用一个或两个临时文件。最大磁盘空间要求是由下式确定:

(length of what is sorted + sizeof(row pointer))
* number of matched rows
* 2

行指针的大小通常是四字节,但可能在未来成长为真正的大表。

对于一些SELECT查询,MySQL也创建临时表SQL。这些都不是隐藏的表单名SQL _ *

DDL操作重建表并没有进行在线使用ALGORITHM=INPLACE技术创造一个原始表的临时副本在同一目录下的原始表。

在线DDL操作可以使用临时日志文件记录并行DML,临时排序文件创建索引时,临时中间表文件重建时表。有关更多信息,参见第15.12.3,“在线DDL空间要求”

InnoDB用户创建临时表和硬盘内部临时表在创建临时表空间文件命名ibtmp1在MySQL数据目录。有关更多信息,参见第15.4.11,临时表空间”

b.5.3.6如何保护或更改MySQL的Unix套接字文件

该服务器采用与当地客户沟通Unix套接字文件的默认位置/tmp/mysql.sock。(一些分布格式,目录可能不同,如/无功/ lib / MySQL为转速)

在一些UNIX版本,任何人都可以删除的文件/tmp目录或其他类似的目录用于临时文件。如果套接字文件位于您的系统这样一个目录,这可能会导致问题。

对Unix的大多数版本,你可以保护你/tmp目录,文件只能由业主或超级用户删除(root)。为此,设置sticky点上/tmp目录登录为root使用下面的命令:

内核&#62;chmod +t /tmp

你可以检查是否sticky位设置的执行LS—LD /甲氧苄啶。如果最后的权限角色t,该位设置

另一种方法是改变服务器创建UNIX套接字文件的地方。如果你这样做,你也应该让客户端知道文件的新位置。你可以用不同的方法来指定文件的位置:

你可以测试是否新的插座位置的作品,试图连接到该命令的服务器:

shell> mysqladmin --socket=/path/to/socket version

b.5.3.7时区问题

如果你有问题SELECT NOW()返回值不在UTC与本地时间,你要告诉服务器你的当前时区。同样,如果UNIX_TIMESTAMP()返回错误值。这应该是在服务器运行环境下完成的;例如,在_ mysqld safemysql.server。看到4.9节,“MySQL程序环境变量”

你可以为你的服务器设置时区--timezone=timezone_name选项_ mysqld safe。你也可以把它设置TZ环境变量,在你开始之前mysqld

允许的值--timezoneTZ系统依赖性。咨询你的操作系统文档看价值是什么可以接受。

b.5.4查询相关问题

b.5.4.1案例敏感字符串搜索

在多进制字符串CHARVARCHARTEXT),字符串搜索使用的操作数的排序比较。对于二进制字符串(BINARYVARBINARYBLOB),比较操作数使用的字节的数值;这意味着字母,将比较敏感。

一个二进制字符串和二进制字符串之间的比较作为二进制字符串的比较。

简单的比较运算(>=, >, =, <, <=、排序、分组)是基于每个角色的排序值与同类型值的字符将被视为相同的字符。例如,如果e具有相同的排序值在一个给定的排序,他们相等。

默认的字符集和字符是utf8mb4我们的_ _ utf8mb4 _ 0900小时,所以非二进制字符串比较是区分大小写的默认。这意味着如果你搜索col_name LIKE 'a%',你得到的所有列的值,从a。让这个搜索区分大小写,确保一个操作数为敏感或二进制排序规则。例如,如果你比较一柱和一个字符串,都有utf8mb4字符集,您可以使用COLLATE经营者为了使任何一个有utf8mb4_0900_as_csutf8mb4_bincollation:

col_name整理utf8mb4_0900_as_cs LIKE &#39;a%col_name像“一%”整理utf8mb4_0900_as_cscol_name整理utf8mb4_bin LIKE &#39;a%col_name像“一%”整理utf8mb4_bin

如果你想要一个栏目一直是大小写敏感的方式处理,宣布它的情况敏感或二进制排序规则。看到第13.1.18,“创建表的语法

导致案件敏感比较二进制字符串不区分大小写,使用COLLATE两名病例collation钝感。弦在下面以案例normally是敏感的,但整理变化是不区分大小写的比较:

mysql> SET NAMES 'utf8mb4';
mysql> SET @s1 = 'MySQL' COLLATE utf8mb4_bin,
           @s2 = 'mysql' COLLATE utf8mb4_bin;
mysql> SELECT @s1 = @s2;
+-----------+
| @s1 = @s2 |
+-----------+
|         0 |
+-----------+
mysql> SELECT @s1 COLLATE utf8mb4_0900_ai_ci = @s2;
+--------------------------------------+
| @s1 COLLATE utf8mb4_0900_ai_ci = @s2 |
+--------------------------------------+
|                                    1 |
+--------------------------------------+

二进制字符串是区分大小写的比较。比较字符串不区分大小写,将它转换成一个二进制字符串并使用COLLATE两名病例:钝感的collation

MySQL的&#62;SET @s = BINARY 'MySQL';MySQL的&#62;SELECT @s = 'mysql';+--------------+| @s = 'mysql' |+--------------+|            0 |+--------------+mysql>SELECT CONVERT(@s USING utf8mb4) COLLATE utf8mb4_0900_ai_ci = 'mysql';+----------------------------------------------------------------+| CONVERT(@s USING utf8mb4) COLLATE utf8mb4_0900_ai_ci = 'mysql' |+----------------------------------------------------------------+|                                                              1 |+----------------------------------------------------------------+

确定值是否会比作为一个二进制或二进制字符串,使用COLLATION()功能。这个例子表明,VERSION()返回一个字符串,不区分大小写的整理,所以比较是不区分大小写:

MySQL的&#62;SELECT COLLATION(VERSION());不不不不不不不不不不不不不不不不不不不不

对于二进制字符串,校勘价值binary,所以比较会区分大小写。在这种背景下你会看到二元的是压缩功能,将二进制字符串作为一般规则:字符串:

mysql> SELECT COLLATION(COMPRESS('x'));
+--------------------------+
| COLLATION(COMPRESS('x')) |
+--------------------------+
| binary                   |
+--------------------------+

检查一个字符串的排序值的WEIGHT_STRING()可能会有帮助。看到12.5节,“字符串函数”

b.5.4.2问题使用日期列

一个格式DATEYYYYY - DD。根据标准的SQL,没有其他格式是允许的。你应该使用这个格式UPDATE表达式中哪里条款SELECT声明.例如:

SELECT * FROM t1 WHERE date >= '2003-05-05';

为方便起见,MySQL会自动转换为日期,如果日期是一些用于数字环境,反之亦然。MySQL也允许轻松的字符串格式更新时,在WHERE条款比较日期到DATEDATETIME,或TIMESTAMP专栏轻松的格式意味着任何标点符号可以作为零件之间的分隔符。例如,'2004-08-15'2004 # 08 # 15是等价的。MySQL也可以将一个字符串不包含分隔符(如'20040815'),提供有道理为日期。

当你比较DATETIMEDATETIME,或TIMESTAMP一个常量字符串的<<==>=&#62;,或BETWEEN运营商,MySQL通常将字符串转换为更快的比较内部长整数(也为更多一点轻松的字符串检查)。然而,这种转换是受以下例外:

这些例外,比较是通过将对象的字符串和字符串比较做表演。

为了安全起见,假定字符串比较字符串,如果你想比较的时间值为字符串使用适当的字符串函数。

特殊的日期'0000-00-00'可以存储和检索“0000-00-00”。当一个'0000-00-00'日期是通过连接器/ ODBC,它会自动转换成无效的由于ODBC不能处理这种日期。

因为MySQL执行上述转换,以下陈述工作(假设idate是一个DATE柱):

INSERT INTO t1 (idate) VALUES (19970505);INSERT INTO t1 (idate) VALUES ('19970505');INSERT INTO t1 (idate) VALUES ('97-05-05');INSERT INTO t1 (idate) VALUES ('1997.05.05');INSERT INTO t1 (idate) VALUES ('1997 05 05');INSERT INTO t1 (idate) VALUES ('0000-00-00');SELECT idate FROM t1 WHERE idate >= '1997-05-05';SELECT idate FROM t1 WHERE idate >= 19970505;SELECT MOD(idate,100) FROM t1 WHERE idate >= 19970505;SELECT idate FROM t1 WHERE idate >= '19970505';

然而,下面的语句不工作:

SELECT idate FROM t1 WHERE STRCMP(idate,'20030505')=0;

STRCMP()是一个字符串的函数,所以它转换IDATE一个字符串'YYYY-MM-DD'格式和执行字符串比较。它不会转换“20030505”的日期'2003-05-05'执行日期比较

如果你启用了ALLOW_INVALID_DATESMySQL的SQL模式,允许你储存,只给出有限的检查日期:MySQL只需要一天的范围是从1到31和月的范围是从1到12。这使得MySQL为Web应用程序在你获得的年、月、日很方便,在三个不同的领域,你想存储什么用户插入(无日期的确认)。

MySQL允许你储存的日期在一天或一个月和日都是零。如果你想存储的生日在这方便DATE柱,你只知道日期部分。不允许零月或一天的部分时间,使NO_ZERO_IN_DATE模式

MySQL允许你保存价值'0000-00-00'作为一个虚拟的日期这是在某些情况下比使用更方便NULL价值观。如果数据被存储在一个DATE柱不能转换为任何合理的值,MySQL存储“0000-00-00”。不允许'0000-00-00',使NO_ZERO_DATE模式

有MySQL检查日期和接受日期(除非被法律IGNORE),设置sql_mode系统变量“no_zero_in_date,no_zero_date”

b.5.4.3问题空值

的概念NULL价值是新人SQL混乱的常见来源,他们认为无效的是为空字符串相同''。这是没有的情况下。例如,下面的语句是完全不同的:

MySQL的&#62;INSERT INTO my_table (phone) VALUES (NULL);MySQL的&#62;INSERT INTO my_table (phone) VALUES ('');

语句插入一个值phone柱,但第一插入无效的值和第二插入空字符串。第一次的意义可以被视为电话号码是不知道的和第二的意义可以视为人是已知的有没有电话,所以没有电话号码。

为了帮助NULL处理,你可以使用IS NULLIS NOT NULL运营商和IFNULL()功能

在SQL中,的NULL价值是任何其他值比较不真实,甚至无效的。一个表达式,包含NULL总是产生无效的值,除非另有说明文档中的运算符和函数表达式中。在下面的例子中返回所有字段NULL

MySQL的&#62;SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);

搜索,列值NULL,你不能使用expr = NULL测试下面的语句不返回任何行,因为expr = NULL从来没有真正的任何表达:

MySQL的&#62;SELECT * FROM my_table WHERE phone = NULL;

寻找NULL值,必须使用IS NULL测试下面的语句显示了如何找到无效的电话号码和电话号码的空:

mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = '';

看到第3.3.4.6,“空值”,提供更多的信息和例子。

你可以添加一个列上有索引NULL如果您使用的是价值观MyISAMInnoDB,或内存存储引擎。否则,你必须声明一个索引的列NOT NULL,你不能插入无效的插入列

读取数据时LOAD DATA INFILE,空的或缺少的列被更新&#39; &#39;。加载NULL值为一列,使用\n在数据文件中。直译词NULL也可能在某些情况下使用。看到第13.2.7、“LOAD DATA INFILE语法”

当使用DISTINCT,或ORDER BY,所有的无效的值被视为相等

当使用ORDER BY无效的价值观是第一,或最后如果你指定DESC按照降序排序

骨料(摘要)等功能COUNT()MIN(),和SUM()忽略无效的价值观。例外的是COUNT(*),计数行和不是单个列的值。例如,下面的语句产生两个数。首先是一个统计表中的行数,第二是数非数—无效的中的值age专栏

MySQL的&#62;SELECT COUNT(*), COUNT(age) FROM person;

对于某些数据类型,MySQL处理NULL价值观特别。如果你插入无效的TIMESTAMP柱,插入当前的日期和时间。如果你插入无效的为整数或浮点列有AUTO_INCREMENT属性,插入序列中的下一个数。

随着b.5.4.4列别名问题

别名可以在查询中使用选择列表给列一个不同的名字。你可以使用别名GROUP BY顺序,或HAVING条款指柱:

选择sqrt(A×B)为根tbl_name有根>0根组;选择ID,计数(*)作为碳纳米管从tbl_name通过ID具有碳纳米管&#62; 0组;选择ID为“客户身份”tbl_name

标准的SQL不允许列别名参考文献WHERE条款.这是因为当施加的限制哪里条款进行评估,该列的值可能尚未确定。例如,下面的查询是非法的:

SELECT id, COUNT(*) AS cnt FROM tbl_name
  WHERE cnt > 0 GROUP BY id;

这个WHERE条款确定哪些行应包含在条款,但它指的是一个,直到一行被选中称列值的别名,和分组的GROUP BY

在一个查询的选择列表,一个引用的列别名可以指定使用的标识符或字符串引用字符:

SELECT 1 AS `one`, 2 AS 'two';

在另外的场合,引用引用别名必须使用标识符引用或参考作为一个字符串。例如,这一声明的值在列组id,使用别名引用是承包

SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
  GROUP BY `a`;

但这一说法组的字符串'a'不象预期的那样工作:

选择编号为“A”,计数(*)作为碳纳米管从tbl_name集团通过“A”;

b.5.4.5回滚失败的非事务表

如果你收到以下消息当试图执行一个ROLLBACK,这意味着一个或更多的你在交易中使用的表不支持事务:

警告:一些非事务表不能回滚的变化

这些非事务表不受影响ROLLBACK声明

如果你不是故意混合事务和非事务表中的事务,这一消息的最可能的原因是一台你认为交易实际上是不。可如果你尝试使用事务性存储引擎,不支持您创建一个表,发生mysqld服务器(或者说是一个启动选项禁用)。如果mysqld不支持的存储引擎,它反而造成表为MyISAM这是非事务表

你可以检查存储引擎的表通过使用这些语句:

SHOW TABLE STATUS LIKE 'tbl_name';
SHOW CREATE TABLE tbl_name;

看到第13.7.6.36,“显示表状态语法”,和第13.7.6.10,“显示创建表的语法

检查你的存储引擎mysqld服务器支持,使用这条语句:

SHOW ENGINES;

看到第13.7.6.16,“显示引擎语法”的全部细节

b.5.4.6相关表中删除行

If the total length of theDELETE声明related_table以上的默认值max_allowed_packet系统变量,你应该把它分成更小的部分,执行多个DELETE声明.你可能会得到最快的DELETE通过指定只有100到1000related_column如果每个声明价值related_column索引。如果related_column没有索引,速度是独立的参数的数量IN条款.

b.5.4.7解决问题不匹配的行

如果你有一个复杂的查询,使用多个表但不返回任何行,你应该使用下面的过程来找出什么是错的:

  1. 测试查询EXPLAIN检查是否可以找到的东西,显然是错误的。看到第13.8.2,”解释语法”

  2. 只选择那些列中使用WHERE条款.

  3. 删除一个表的查询时间直到它返回的行。如果表很大,这是一个好主意,使用LIMIT 10与查询

  4. 问题SELECT那应该匹配一行在桌子上,最后从查询中删除列。

  5. 如果你是比较FLOATDOUBLE有小数的数字列,你不能用平等(=)的比较。这个问题在大多数计算机语言是常见的因为并不是所有的浮点值可以存储精确。在某些情况下,改变FLOAT一个DOUBLE修复了这个。看到第b.5.4.8,“浮点数”的问题

  6. 如果你还不知道什么是错的,创建一个最小的测试,可以运行mysql test < query.sql指出你的问题。你可以通过倾销的表创建一个测试文件mysqldump -快速_ DB Nametbl_name_1tbl_name_nquery.sql &#62;。在编辑器中打开文件,删除一些插入线(如果有多个需要证明的问题),并添加你的SELECTstatement at the end of the file。

    确认测试文件的执行这些命令显示的问题:

    shell> mysqladmin create test2
    shell> mysql test2 < query.sql
    

    将测试文件错误报告,您可以使用说明文件1.7节,“如何报告错误或问题”

浮点值b.5.4.8问题

浮点数有时造成混乱,因为他们都是近似的,不精确的值存储。一个浮点值写在一个SQL语句可能不相同的值的内部表示。试图把浮点值为精确比较可能导致的问题。他们也受到平台或实现的依赖性。这个FLOATDOUBLE数据类型是受这些问题。为DECIMAL列,MySQL执行与65精度的十进制数字运算,这应该可以解决最常见的不准确的问题。

下面的示例使用DOUBLE演示如何计算都是使用浮点运算进行浮点运算误差。

MySQL的&#62;CREATE TABLE t1 (i INT, d1 DOUBLE, d2 DOUBLE);MySQL的&#62;INSERT INTO t1 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00),-&#62;(2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40),-&#62;(2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00),-&#62;(4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00),-&#62;(5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20),-&#62;(6, 0.00, 0.00), (6, -51.40, 0.00);MySQL的&#62;SELECT i, SUM(d1) AS a, SUM(d2) AS b-&#62;FROM t1 GROUP BY i HAVING a <> b;??????------- |)|的| B??????| ------- | 1 | 21.4 | 21.4 | | 2 | 76.8 | 76.8 | | 3 | 7.4 7.4 | | | 4 | 15.4 15.4 | | | 5 | 7.2 7.2 | | | 6 | - 51.4 | | ------- 0??????

结果是正确的。虽然第一个记录看起来不应该满足(价值观的比较aB似乎没有不同),他们可以这样做,因为数字之间的差异显示了在第十位左右,这取决于因素如计算机体系结构和编译版本或优化水平。例如,不同的CPU可以评估浮点数不同。

如果列d1D2被定义为DECIMAL而不是DOUBLE的结果,SELECT查询将只包含一行最后一个上面。

做浮点数比较正确的方法是首先要确定的数字然后做对公差值比较差异的可接受性。例如,如果我们同意,浮点数应视相同,如果相同的精度内的一万个(0.0001),比较应写入找到差异大于公差值:

mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1
    -> GROUP BY i HAVING ABS(a - b) > 0.0001;
+------+-------+------+
| i    | a     | b    |
+------+-------+------+
|    6 | -51.4 |    0 |
+------+-------+------+
1 row in set (0.00 sec)

相反,得到的行数是一样的,测试应在公差值找到差异:

mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1
    -> GROUP BY i HAVING ABS(a - b) <= 0.0001;
+------+------+------+
| i    | a    | b    |
+------+------+------+
|    1 | 21.4 | 21.4 |
|    2 | 76.8 | 76.8 |
|    3 |  7.4 |  7.4 |
|    4 | 15.4 | 15.4 |
|    5 |  7.2 |  7.2 |
+------+------+------+
5 rows in set (0.03 sec)

浮点值受平台或实现的依赖性。假设你执行以下语句:

CREATE TABLE t1(c1 FLOAT(53,0), c2 FLOAT(53,0));
INSERT INTO t1 VALUES('1e+52','-1e+52');
SELECT * FROM t1;

在一些平台上,这SELECT语句返回INF-inf。对其他人,它返回-0

上述问题的一个含义是,如果你试图通过倾销表内容与创建一个复制的奴隶mysqldump在主和重载转储文件为奴隶,包含浮点列的表可以在两台主机之间的不同。

b.5.5优化器的相关问题

MySQL使用基于成本的优化,确定最佳的方式来解决一个查询。在许多情况下,MySQL可以计算最佳的查询计划,但有时MySQL没有手头的数据足够的信息,使有教养的guesses有关的数据。

为例,当MySQL不做“正确”的事,你可以帮助MySQL工具:

b.5.6表定义的相关问题

b.5.6.1问题表

如果你得到一个重复键错误时使用ALTER TABLE改变一个字符列的字符集和整理,原因是新列排序规则映射到相同的值或表损坏的两把钥匙。在后一种情况下,你应该运行REPAIR TABLE上表REPAIR TABLE作品MyISAMARCHIVE,和CSV

如果你使用ALTER TABLE在一个事务表,或者如果你使用的是Windows,ALTER TABLE打开表,如果你已经做了LOCK TABLE在这。这样做是因为InnoDB这些操作系统不能删除表,使用。

b.5.6.2临时表的问题

临时表的创建CREATE TEMPORARY TABLE有以下限制:

  • TEMPORARY表只由支持InnoDBMEMORYMyISAM,和MERGE存储引擎

  • 这个SHOW TABLES声明没有列出临时

  • 重命名TEMPORARY桌子,重命名表不工作。使用ALTER TABLE相反:

    修改表old_name重命名new_name;
  • 你不能指TEMPORARY表不止一次在同一查询。例如,以下不工作:

    SELECT * FROM temp_table加入temp_table T2;

    语句产生这个错误:

    ERROR 1137: Can't reopen table: 'temp_table'
    

    你可以解决这个问题如果你的查询允许使用公用表表达式(CTE)而不是TEMPORARY表例如,失败的不能打开表误差:

    CREATE TEMPORARY TABLE t SELECT 1 AS col_a, 2 AS col_b;
    SELECT * FROM t AS t1 JOIN t AS t2;
    

    要避免错误,使用WITH子句定义的热膨胀系数,而不是临时

    WITH cte AS (SELECT 1 AS col_a, 2 AS col_b)
    SELECT * FROM cte AS t1 JOIN cte AS t2;
    
  • 这个不能打开表如果你是一个临时表中多次存储功能在不同的别名也发生错误,即使引用发生在不同的语句在函数。它可能发生的临时表存储功能外创建跨多个主叫和被叫称功能。

  • 在使用临时表的复制有已知问题。看到第17.4.1.31,“复制与临时表”为更多的信息

b.5.7已知问题在MySQL

本节列出MySQL新版本的已知问题。

关于平台的具体问题的信息,查看安装和移植说明2.1节,“一般安装指导”,和28.5节,“调试和移植MySQL”

下面的问题是众所周知的:

  • 子查询优化IN是不是同样有效=

  • 即使你使用lower_case_table_names=2(使MySQL记得箱用于数据库和表的名称),MySQL不记得用于功能数据库名称的情况DATABASE()或在各种日志(不区分大小写的系统)。

  • 落下FOREIGN KEY约束不工作在复制因为约束可能对奴隶的另一个名字。

  • REPLACE(和LOAD DATAREPLACE选项)不触发级联删除

  • DISTINCT顺序不在里面工作GROUP_CONCAT()如果你不使用所有这些列在不同的列表

  • 插入一个大整数的值时(在2六十三和2六十四?1)转换成十进制或弦柱,它是插入负值因为数是有符号整数的背景下进行评估。

  • 基于二进制日志记录语句,大师写的查询执行的二进制日志。这是一个非常快速、紧凑、高效的测井方法,完美的作品在大多数情况下。然而,在主人和奴隶的数据,如果查询是在这样一种方式,数据修改是不确定性的不同设计成为可能(一般不推荐的做法,甚至复制之外的)。

    例如:

    如果前面的查询没有ORDER BY条款保证确定性的秩序

    例如,对于INSERT ... SELECT没有顺序,的SELECT可以返回一个不同的命令行(导致一行有不同的等级,从而获得在不同数量汽车列),取决于在主人和奴隶的优化器的选择。

    查询优化不同的主人和奴隶只有:

    • 该表存储使用不同的存储引擎在主不是奴隶。(可能使用不同的存储引擎在主人和奴隶。例如,您可以使用InnoDB在主,但MyISAM在奴隶的奴隶如果不可用的磁盘空间。)

    • MySQL的缓冲区大小(key_buffer_size,等等)都在主人和奴隶的不同。

    • 主机和从机运行不同的版本,而这些版本之间的不同的优化代码。

    这个问题也可能影响数据库恢复使用mysqlbinlog | MySQL

    为了避免这个问题,最简单的方法是添加一个ORDER BY条款上述不确定性查询以确保行始终存储或同一阶修正。使用基于行的或混合的日志格式也可以避免这个问题。

  • 日志文件名称是基于服务器主机名称,如果你不使用启动选项指定一个文件名。保持同一个日志文件的名字,如果你改变了你的主机名和其他的东西,你必须显式地使用期权等--log-bin=old_host_name-bin。看到第5.1.6、“服务器选项”。另外,重命名旧文件,以反映您的主机名称的变化。如果这些二进制日志,您必须编辑二进制日志索引文件和固定的二进制日志文件名称有作为。(这同样适用于继电器对从属服务器。日志)

  • mysqlbinlog不删除临时文件后离开LOAD DATA INFILE声明。看到4.6.8“,”mysqlbinlog用于处理二进制日志文件实用程序”

  • RENAME不工作临时used in a表或表MERGE

  • 当使用SET CHARACTER SET,你不能在数据库中,使用翻译人物表和列名。

  • 你不能使用_%ESCAPE进入LIKE ... ESCAPE

  • 服务器只使用第一max_sort_length当比较值的字节数据。这意味着价值不能可靠地用于ORDER BY,或不同的后的第一个不同,如果他们只max_sort_length字节。为了解决这个问题,增加变量的值。默认值max_sort_length1024、可以在服务器启动时间或在运行时改变。

  • 数值计算完成BIGINTDOUBLE(通常64位长)。你得到的精度取决于功能。一般的规则是,BIT功能进行BIGINT精度,IF()ELT()BIGINTDOUBLE精度和休息DOUBLE精度。你应该尽量避免使用unsigned long long值,如果他们决心要大于63位(922337203685477580)以外的任何位字段。

  • 你可以有多达255ENUMSET在一个表中的列

  • 进入MIN()MAX(),和其他聚合函数,MySQL目前比较ENUMSET列的字符串值而不是集合中的字符串的相对位置。

  • 在一个UPDATE更新声明,列从左到右。如果你指的是一个更新的栏目,你得到更新后的值代替原有的价值。例如,下面的语句的增量钥匙21

    MySQL的&#62;UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;
  • 你可以在同一查询多个临时表,但你不能把任何临时表不止一次。例如,以下不工作:

    mysql> SELECT * FROM temp_table, temp_table AS t2;
    ERROR 1137: Can't reopen table: 'temp_table'
    
  • 优化器可以办理DISTINCT当你使用不同的隐藏在联接柱比你不在时。在加入,隐藏的列数作为结果的一部分(即使他们不显示),而正常的查询,隐藏列不参与DISTINCT比较

    这方面的一个例子是:

    SELECT DISTINCT mp3id FROM band_downloads
           WHERE userid = 9 ORDER BY id DESC;
    

    SELECT DISTINCT band_downloads.mp3id
           FROM band_downloads,band_mp3
           WHERE band_downloads.userid = 9
           AND band_mp3.id = band_downloads.mp3id
           ORDER BY band_downloads.id DESC;
    

    在第二种情况下,你可能得到的结果完全相同的两个行集(因为在隐藏的价值id柱过程中可能differ)。

    注意,这种情况只有在查询,没有ORDER BY在结果列

  • 如果你执行一个PROCEDURE对一个查询,返回一个空集合,在某些情况下程序不改造列

  • 一桌式创作MERGE不检查是否有潜在的表兼容类型。

  • 如果你使用ALTER TABLE添加一个独特在aMERGE表,然后添加一个正常指标研究合并表,如果有一个老的关键点是不同的表,非—UNIQUE关键在表。这是因为ALTER TABLE独特指标在正常指标能够尽早检测重复键。