⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 manual_problems.html

📁 关于mysql学习的 中文教程
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<html>

<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<title>MySQL中文参考手册-18 问题和常见错误</title>
<style type="text/css">
<!--
.p14{font-size:14.8px;font-family:宋体;line-height:14pt;}
.p5{ border: 1px solid rgb(146,201,201) }
.a:hover{color:red;}
a.t1:visited{color:red;}
-->
</style>
</head>

<body BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#101090" VLINK="#7030B0" class="p4">

<h1><img src="Img/mysql-logo.gif" alt="mysql-logo.gif (3082 bytes)" WIDTH="127" HEIGHT="60"><font color="#FF0000">MySQL中文参考手册</font></h1>

<p>翻译:<a href="mailto:clyan@sohu.com">晏子</a>(yanzi) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主页:<a href="http://linuxdn.yeah.net">http://linuxdb.yeah.net</a></p>

<hr>

<p><a HREF="manual_Introduction.html">第一章</a>, <a HREF="manual_Common_programs.html">前一章</a>, 
<a HREF="manual_Common_problems.html">下一章</a>, <a HREF="manual_Concept_Index.html">最后一章</a>,<a HREF="manual_toc.html">目录</a>. </p>

<hr>

<h1><a NAME="Problems" HREF="manual_toc.html#Problems">18 问题和常见错误</a></h1>

<h2><a NAME="Crashing" HREF="manual_toc.html#Crashing">18.1 如果MySQL总是崩溃怎么办</a></h2>

<p>所有<strong>MySQL</strong>在发布它们之前,在许多平台上被测试。这并不意味着在<strong>MySQL</strong>中没有任何错误,但是如果有错误,它们是很少的并且很能难发现。如果你有一个问题并且如果你尝试找出究竟是什么摧毁了你的系统,它将总是有帮助的,因为你将有一个更好机会使得它被快速修复。</p>

<p>首先你应该试着找出问题<code>mysqld</code>守护进程是否死掉或你的问题是否与你的客户有关。你可以用<code>mysqladmin 
version</code>检查你的<code>mysqld</code>服务器正常执行了多长时间,如果<code>mysqld</code>死了,你可以在文件<tt>“mysql-data-directory/'hostname'.err”</tt>中找到其原因。 
</p>

<p>因为很难知道一些东西为什么崩溃,首先试着检查为其它人工作的东西是否使你崩溃。请尝试下列事情: 

<ul>
  <li>与<code>mysqladmin shutdown</code>停止<code>mysqld</code>守护进程,在所有表上运行<code>myisamchk 
    --silent --force */*.MYI</code>并重启<code>mysqld</code>守护经进程。这将保证你从一个干净的状态运行。见<a HREF="manual_Maintenance.html#Maintenance">13 维护MySQL安装</a>。</li>
  <li>使用<code>mysqld --log</code>并且试着从日志信息确定是否是某个特定的查询杀死了服务器。全部错误的95%与特定的查询有关!通常它是在日志文件中就在<strong>MySQL</strong>重启之前的最后查询之一。你也许可以使用下列过程验证它:<ul>
      <li>停止<strong>MySQL</strong>守护进程(用<code>mysqladmin shutdown</code>)。</li>
      <li>在<strong>MySQL</strong>数据库目录下做文件的一个备份。 </li>
      <li>与<code>myisamchk -s */*.MYI</code>检查表以验证所有表是正确的。如果有任何表被损坏,用<code>myisamchk 
        -r path-to-table.MYI</code>修复它。</li>
      <li>从<strong>MySQL</strong>数据目录删除(或移走)任何旧的日志文件。 </li>
      <li>用<code>safe_mysql --log</code>启动服务器。</li>
      <li>如果<code>mysqld</code>现在死掉,你可以通过恢复备份并执行<code>mysql 
        &lt; mysql-log-file</code>来测试问题是否是一个特定的查询引起的。当然你可以通过用<code>safe_mysqld 
        --data=path-to-backup-directory</code>启动另一个<strong>MySQL</strong>服务器,在某个其他目录而不是标准<strong>MySQL</strong>数据库目录下做后面的测试。</li>
    </ul>
  </li>
  <li>你试用了基准测试吗?他们应该很好地测试<strong>MySQL</strong>。你也可以增加代码模拟你的应用程序!基准程序可在源代码分发的<tt>“bench”</tt>目录下找到,或对二进制分发,在你的<strong>MySQL</strong>安装目录下<tt>“sql-bench”</tt>目录。 
  </li>
  <li>试一下<code>fork_test.pl</code>和<code>fork2_test.pl</code>。</li>
  <li>对任何错误检查文件<tt>“mysql-data-directory/'hostname'.err”</tt>。 </li>
  <li>如果你配置<strong>MySQL</strong>以便调试,如果出错,收集可能的错误信息将更容易。使用<code>--with-debug</code>选项的<code>configure</code>重新配置<strong>MySQL</strong>然后重新编译。见<a HREF="manual_Porting.html#Debugging_server">G.1 调试一个 MySQL 服务器</a>。</li>
  <li>为调试而配置<strong>MySQL</strong>使它包含一个安全的内存分配器以便能发现一些错误。它也提供关于正在发生什么的大量输出。</li>
  <li>你为你的操作系统使用了最新的补丁吗? </li>
  <li>使用<code>mysql</code>的<code>--skip-locking</code>选项.在一些系统上,<code>lockd</code>锁管理器不能正确工作;<code>--skip-locking</code>选项告诉<code>mysqld</code>不使用外部锁。(这意味着你不能在同一个数据上运行两个<code>mysqld</code>服务器而且如果你使用<code>myisamchk</code>,你一定要小心,但是它对为了测试试用选项可能有益。)</li>
  <li>当<code>mysqld</code>好象正在运行但没有反应时,你尝试过<code>mysqladmin 
    -u root processlist</code>吗?有时<code>mysqld</code>不是毫无反应,尽管你可能这样认为。问题可能是所有在用的连接,或可能用内部锁定问题。<code>mysqladmin 
    processlist</code>甚至在这些情况下将通常可以进行一个连接,并且能提供有关当前连接数量及其状态的有用信息。</li>
  <li>在你运行其他查询时,在一个单独窗口中运行命令<code>mysqladmin -i 5 
    status</code>,产生统计。</li>
  <li>尝试下列步骤: <ol>
      <li>通过<code>gdb</code>(或其他调试器)启动<code>mysqld</code>。</li>
      <li>运行你的测试脚本。 </li>
      <li>当<code>mysqld</code>核心倾倒(core dump),做<code>back</code>(或你调试器中的回溯-backtrace命令)。</li>
    </ol>
  </li>
  <li>尝试用一个Perl脚本模拟你的应用程序以强制<strong>MySQL</strong>崩溃或表现不正确。</li>
  <li>或发一份正式的错误报告。见<a HREF="manual_Questions.html#Bug_reports">2.3 
    如何报告错误或问题</a>,但是要不平常更详细。因为<strong>MySQL</strong>为很多人的工作,导致崩溃的东西可能只存在于你的计算机上(例如,与你的特定系统库有关的一个错误)。</li>
  <li>如果你的问题有具有动态长度行的表有关,并且你不使用<code>BLOB/TEXT</code>列(但是仅<code>VARCHAR</code>列),你可以用<code>ALTER 
    TABLE</code>试着将全部<code>VARCHAR</code>改为<code>CHAR</code>,这将强制<strong>MySQL</strong>使用固定尺寸的行。固定尺寸的行占据很小的额外空间,但是更能容忍崩溃!当前动态行的代码在 
    TCX 至少使用3 
    年的时间,没有任何问题,但是从本质上讲,动态长度的行对错误更敏感,因此如果上述对你有帮助,尝试一下可能是一个好主意!</li>
</ul>

<h2><a NAME="Common_errors" HREF="manual_toc.html#Common_errors">18.2 使用MySQL时的一些常见错误</a></h2>

<h3><a NAME="Gone_away" HREF="manual_toc.html#Gone_away">18.2.1<code> MySQL server has 
gone away</code>错误</a></h3>

<p>本小节也涉及有关<code>Lost connection to server during query</code>的错误。</p>

<p>对<code>MySQL server has gone away</code>错误最常见的原因是服务器超时了并且关闭了连接。缺省地,如果没有事情发生,服务器在 
8个小时后关闭连接。你可在启动mysqld时通过设置<code>wait_timeout</code>变量改变时间限制。</p>

<p>你可以通过执行<code>mysqladmin version</code>并且检验正常运行的时间来检查<strong>MySQL</strong>还没死掉。</p>

<p>如果你有一个脚本,你只须再发出查询让客护进行一次自动的重新连接。</p>

<p>在这种请下,你通常能获得下列错误代码(你得到的是OS相关的):</p>

<table BORDER="1" WIDTH="100%" NOSAVE="#101090" class="p4">
  <tr>
    <td><code>CR_SERVER_GONE_ERROR</code> </td>
    <td>客户不能发送一个问题给服务器。 </td>
  </tr>
  <tr>
    <td><code>CR_SERVER_LOST</code> </td>
    <td>当写服务器时,客户没有出错,但是它没有得到对问题的一个完整的答案(或任何答案)。 
    </td>
  </tr>
</table>

<p>如果你向服务器发送不正确的或太大的查询,你也可能得到这些错误。如果<code>mysqld</code>得到一个太大或不正常的包,它认为客户出错了并关闭连接。如果你需要较大的查询(例如,如果你正在处理较大的<code>BLOB</code>列),你可以使用<code>-O 
max_allowed_packet=#</code>选项(缺省1M)启动<code>mysqld</code>以增加查询限制。多余的内存按需分配,这样<code>mysqld</code>只有在你发出较大差询时或<code>mysqld</code>必须返回较大的结果行时,才使用更多的内存!</p>

<h3><a NAME="Can_not_connect_to_server" HREF="manual_toc.html#Can_not_connect_to_server">18.2.2<code> 
Can't connect to [local] MySQL server</code>错误</a></h3>

<p>一个<strong>MySQL</strong>客户可以两种不同的方式连接<code>mysqld</code>服务器:Unix套接字,它通过在文件系统中的一个文件(缺省<tt>“/tmp/mysqld.sock”</tt>)进行连接;或TCP/IP,它通过一个端口号连接。Unix套接字比TCP/IP更快,但是只有用在连接同一台计算机上的服务器。如果你不指定主机名或如果你指定特殊的主机名<code>localhost</code>,使用Unix套接字。</p>

<p>错误(2002)<code>Can't connect to ...</code>通常意味着没有一个<strong>MySQL</strong>服务器运行在系统上或当试图连接<code>mysqld</code>服务器时,你正在使用一个错误的套接字文件或TCP/IP端口。 
</p>

<p>由检查(使用<code>ps</code>)在你的服务器上有一个名为<code>mysqld</code>的进程启动!如果没有任何<code>mysqld</code>过程,你应该启动一个。见<a HREF="manual_Installing.html#Starting_server">4.15.2 启动MySQL服务器的问题</a>。</p>

<p>如果一个<code>mysqld</code>过程正在运行,你可以通过尝试这些不同的连接来检查服务器(当然,端口号和套接字路径名可能在你的安装中是不同的):</p>

<pre>shell&gt; mysqladmin version
shell&gt; mysqladmin variables
shell&gt; mysqladmin -h `hostname` version variables
shell&gt; mysqladmin -h `hostname` --port=3306 version
shell&gt; mysqladmin -h 'ip for your host' version
shell&gt; mysqladmin --socket=/tmp/mysql.sock version
</pre>

<p>注意<code>hostname</code>命令使用反引号“`”而非正引号“'”;这些导致<code>hostname</code>输出(即,当前主机名)被代替进<code>mysqladmin</code>命令中。</p>

<p>这是可能造成<code>Can't connect to local MySQL server</code>错误的一些原因: 

<ul>
  <li><code>mysqld</code>不在运行。 </li>
  <li>你正在使用MIT-pthreads的一个系统上运行。如果正在运行在一个没有原生线程的系统上,<code>mysqld</code>使用 
    MIT-pthreads 软件包。见<a HREF="manual_Installing.html#Which_OS">4.2 由MySQL支持的操作系统</a>。然而,MIT-pthreads不支持Unix套接字,因此当与服务器连接时,在这样一个系统上,你总是必须明确地指定主机名。试试使用这个命令检查到服务器的连接:<pre>shell&gt; mysqladmin -h `hostname` version
</pre>
  </li>
  <li>某人删除了<code>mysqld</code>使用的Unix套接字(缺省<tt>“/tmp/mysqld.sock”</tt>)。你可能有一个<code>cron</code>任务删除了<strong>MySQL</strong>套接字(例如,一个把旧文件从<tt>“/tmp”</tt>目录中删除的任务)。你总是可以运行<code>mysqladmin 
    version</code>并且检查<code>mysqladmin</code>正在试图使用的套接字确实存在。在这种情况下,修复方法是删除<code>cron</code>任务而不删除<tt>“mysqld.sock 
    </tt>或将套接字放在其他地方。你能用这个命令在<strong>MySQL</strong>配置时指定一个不同的套接字地点:<pre>shell&gt; ./configure --with-unix-socket-path=/path/to/socket
</pre>
    <p>你也可以使用<code>--socket=/path/to/socket</code>选项启动<code>safe_mysqld</code>和在启动你的<strong>MySQL</strong>客户前设置环境变量<code>MYSQL_UNIX_PORT</code>为套接字路径名。你可用<code>--socket=/path/to/socket</code>选项启动<code>mysqld</code>服务器。如果你改变了服务器的套接字路径名,你也必须通知<strong>MySQL</strong>客户关于新路径的情况。你可以通过设置环境变量<code>MYSQL_UNIX_PORT</code>为套接字路径名或由提供套接字路径名作为客户的参数做到。你可用这个命令测试套接字:</p>
    <pre>shell&gt; mysqladmin --socket=/path/to/socket version
</pre>
  </li>
  <li>你正在使用 Linux和线程已经死了(核心倾倒了)。在这种情况中,你必须杀死其它<code>mysqld</code>线程(例如在启动一个新的<strong>MySQL</strong>服务器之前,可以用<code>mysql_zap</code>脚本)。见<a HREF="manual_Problems.html#Crashing">18.1 如果MySQL总是崩溃怎么办</a>。</li>
</ul>

<p>如果你得到错误<code>Can't connect to MySQL server on some_hostname</code>,你可以尝试下列步骤找出问题是什么: 

<ul>
  <li>通过执行<code>telnet your-host-name tcp-ip-port-number</code>并且按几次回车来检查服务器是否正常运行。如果有一个<strong>MySQL</strong>运行在这个端口上,你应该得到一个包含正在运行的<strong>MySQL</strong>服务器的版本号的应答。如果你得到类似于<code>telnet: 
    Unable to connect to remote host: Connection refused</code>的一个错误,那么没有服务器在使用的端口上运行。</li>
  <li>尝试连接本地机器上的<code>mysqld</code>守护进程,并用<code>mysqladmin 
    variables</code>检查mysqld被配置使用的TCP/IP端口(变量<code>port</code>)。 </li>
  <li>检查你的<code>mysqld</code>服务器没有用<code>--skip-networking</code>选项启动。 
  </li>
</ul>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -