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

📄 manual_problems.html

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

<h3><a NAME="Blocked_host" HREF="manual_toc.html#Blocked_host">18.2.3<code> Host '...' is 
blocked</code>错误</a></h3>

<p>如果你得到象这样的一个错误:</p>

<pre>Host 'hostname' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
</pre>

<p>这意味着,<code>mysqld</code>已经得到了大量(<code>max_connect_errors</code>)的主机<code>'hostname'</code>的在中途被中断了的连接请求。在<code>max_connect_errors</code>次失败请求后,<code>mysqld</code>认定出错了(象来字一个黑客的攻击),并且阻止该站点进一步的连接,直到某人执行命令<code>mysqladmin 
flush-hosts</code>。</p>

<p>缺省地,<code>mysqld</code>在10个连接错误后阻塞一台主机。你可以通过象这样启动服务器很容易地调整它:</p>

<pre>shell&gt; safe_mysqld -O max_connect_errors=10000 &amp;
</pre>

<p>注意,对给定的主机,如果得到这条错误消息,你应该首先检查该主机的TCP/IP连接有没有问题。如果你的TCP/IP连接不在运行,增加<code>max_connect_errors</code>变量的值对你也不会有帮助!</p>

<h3><a NAME="Too_many_connections" HREF="manual_toc.html#Too_many_connections">18.2.4<code> 
Too many connections</code>错误</a></h3>

<p>如果在你试土连接<strong>MySQL</strong>时,你得到错误<code>Too many 
connections</code>,这意味着已经有<code>max_connections</code>个客户连接了mysqld服务器。</p>

<p>如果你需要比缺省(100)更多的连接,那么你应该重启<code>mysqld</code>,用更大的 
max_connections 变量值。</p>

<p>注意,<code>mysqld</code>实际上允许(max_connections+1)个客户连接。最后一个连接是为一个用<code>Process</code>权限的用户保留的。通过不把这个权限给一般用户(他们不应该需要它),有这个权限一个管理员可以登录并且使用<code>SHOW 
PROCESSLIST</code>找出什么可能出错。见<a HREF="manual_Reference.html#SHOW">7.21<code> 
SHOW</code>句法(得到表,列的信息)</a>。</p>

<h3><a NAME="Out_of_memory" HREF="manual_toc.html#Out_of_memory">18.2.5<code> Out of 
memory</code>错误</a></h3>

<p>如果你发出查询并且得到类似于下面的错误: </p>

<pre>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
</pre>

<p>注意,错误指向了<strong>MySQL</strong>客<code>户mysql</code>。这个错误的原因很简单,客户没有足够的内存存储全部结果。</p>

<p>为了修正这个问题,首先检查你的查询是否正确。它应该返回这么多的行,这合理吗?如果是这样,你可以使用<code>mysql 
--quick</code>,它使用<code>mysql_use_result()</code>检索结果集合。这将较少的负担放在了客户端(只是服务器更多)。</p>

<h3><a NAME="Packet_too_large" HREF="manual_toc.html#Packet_too_large">18.2.6<code> Packet 
too large</code>错误</a></h3>

<p>当一个<strong>MySQL</strong>客户或<code>mysqld</code>服务器得到一个比<code>max_allowed_packet</code>个字节长的包,它发出一个<code>Packet 
too large</code>错误并终止连接。</p>

<p>如果你正在使用<code>mysql</code>客户,你可以通过用<code>mysql 
--set-variable=max_allowed_packet=8M</code>指定一个更大的缓冲区来启动客户程序。</p>

<p>如果你正在使用不允许你指定最大包大小的其他客户(例如<code> DBI</code>),你需要在你启动服务器时设置包大小。你可以使用<code>mysqld</code>的命令行选项设置<code>max_allowed_packet</code>为一个更大的尺寸。例如,如果你正期望将一个全长的<code>BLOB</code>存入一张表中,你将需要用<code>--set-variable=max_allowed_packet=24M</code>选项来启动服务器。</p>

<p> </p>

<h3><a NAME="Full_table" HREF="manual_toc.html#Full_table">18.2.7<code> The table is full</code>错误</a></h3>

<p>这个错误发生在内存临时表变得比<code>tmp_table_size</code>字节大时。为了避免这个问题,你可以使用<code>mysqld</code>的<code>-O 
tmp_table_size=#</code>选项来增加临时表的大小,或在你发出有疑问的查询之前使用SQL选项<code>SQL_BIG_TABLES</code>。见<a HREF="manual_Reference.html#SET_OPTION">7.25<code> SET OPTION</code>句法</a>。</p>

<p>你也可以使用<code>--big-tables</code>选项启动<code>mysqld</code>。这与为所有查询使用<code>SQL_BIG_TABLES</code>完全相同。</p>

<p><a NAME="IDX684"></a> </p>

<h3><a NAME="Commands_out_of_sync" HREF="manual_toc.html#Commands_out_of_sync">18.2.8<code> 
Commands out of sync</code> in client错误</a></h3>

<p>如果你在你的客户代码中得到<code>Commands out of sync; You can't run this 
command now</code>,你正在以错误的次序调用客户函数!</p>

<p>这可能发生,例如,如果你正在使用<code>mysql_use_result()</code>并且在你已经调用了<code>mysql_free_result()</code>之前试图执行新查询。如果你在<code>mysql_use_result()</code>或<code>mysql_store_result()</code>之间试图执行返回数据的2个查询,它也可能发生。</p>

<h3><a NAME="Ignoring_user" HREF="manual_toc.html#Ignoring_user">18.2.9<code> Ignoring 
user</code>错误</a></h3>

<p>如果你得到下列错误: </p>

<p><code>Found wrong password for user: 'some_user@some_host'; Ignoring user</code> </p>

<p>这意味着在<code>mysqld</code>启动时或在它再次装载权限表时,它在<code>user</code>表中找到了一个有一个无效口令的条目。结果,条目简单地被权限系统忽略。</p>

<p>可能导致这个问题的原因和修正: 

<ul>
  <li>你可能正在运行一个有一个老的<code>user</code>表的新版本<code>mysqld</code>。你可以通过执行<code>mysqlshow 
    mysql user</code>看看口令字段是否少于 16个字符来检查它。如果是这样,你可以通过运行<code>scripts/add_long_password</code>脚本改正这种情况。</li>
  <li>用户有一个老式的口令(8个字符长)并且你没使用<code>--old-protocol</code>选项启动<code>mysqld</code>。用一个新口令更新在<code>user</code>表中的用户或用<code>--old-protocol</code>重启<code>mysqld</code>。</li>
  <li><a NAME="IDX685"></a>你没有使用<code>PASSWORD()</code>函数在在<code>user</code>表中指定了一个口令。使用<code>mysql</code>以一个新口令更新在<code>user</code>表中的用户。确保使用<code>PASSWORD()</code>函数:<pre>mysql&gt; update user set password=PASSWORD('your password')
           where user='XXX';
</pre>
  </li>
</ul>

<h3><a NAME="Cannot_find_table" HREF="manual_toc.html#Cannot_find_table">18.2.10<code> 
Table 'xxx' doesn't exist</code>错误</a></h3>

<p>如果你得到错误<code>Table 'xxx' doesn't exist</code>或<code>Can't find file: 
'xxx' (errno: 2)</code>,这意味着在当前数据库中没有名为<code>xxx</code>的表存在。</p>

<p>注意,因为<strong>MySQL</strong>使用目录和文件存储数据库和表,数据库和表名件是<strong>区分大小写的</strong>!(在Win32上,数据库和表名不是区分大小写的,但是在查询中对所有表的引用必须使用相同的大小写!)</p>

<p>你可以用<code>SHOW TABLES</code>检查你在当前数据库中有哪个表。见<a HREF="manual_Reference.html#SHOW">7.21<code> SHOW</code>句法(得到表、列的信息)</a>。 
</p>

<p><a NAME="IDX686"></a> <a NAME="IDX687"></a> </p>

<h2><a NAME="Full_disk" HREF="manual_toc.html#Full_disk">18.3 MySQL怎样处理一个溢出的磁盘</a></h2>

<p>当出现一个磁盘溢出的情况时,<strong>MySQL</strong>做下列事情: 

<ul>
  <li>它每分钟检查一次看是否有足够空间写入当前行。如果有足够的空间,它继续好像发生什么事情。</li>
  <li>每6分钟它将有关磁盘溢出的警告写入日志文件。</li>
</ul>

<p>为了缓和这个问题,你可以采取下列行动: 

<ul>
  <li>继续,你只需释放足够的空闲磁盘空间以便插入所有记录。</li>
  <li>放弃线程,你必须发一个<code>mysqladmin kill</code>到线程。在下一次检查磁盘时,线程将被放弃(在1分钟内)。</li>
  <li>注意,其他线程可能正在等待引起“磁盘溢出”条件的表。如果你有几个“锁定的”的线程,杀死正在等待磁盘溢出条件的那个线程将允许其他线程继续。</li>
</ul>

<h2><a NAME="Multiple_sql_commands" HREF="manual_toc.html#Multiple_sql_commands">18.4 
如何从一个文本文件运行SQL命令</a></h2>

<p>一般地,<code>mysql</code>客户被交互性地使用,象这样:</p>

<pre>shell&gt; mysql database</pre>

<p>然而,也可以把你的SQL命令放在一个文件中并且告诉<code>mysql</code>从该文件读取其输入。要想这样做,创造一个文本文件<tt>“text_file”</tt>,它包含你想要执行的命令。然后如下那样调用<code>mysql</code>:</p>

<pre>shell&gt; mysql database &lt; text_file
</pre>

<p>你也能启动有一个<code>USE db_name</code>语句的文本文件。在这种情况下,在命令行上指定数据库名是不必要的:</p>

<pre>shell&gt; mysql &lt; text_file
</pre>

<pre>见<a HREF="manual_Tools.html#Programs">12.1 不同的MySQL程序概述</a>。 </pre>

<h2><a NAME="Temporary_files" HREF="manual_toc.html#Temporary_files">18.5 MySQL在哪儿存储临时文件</a></h2>

<p><strong>MySQL</strong>使用<code>TMPDIR</code>环境变量的值作为存储临时文件的目录的路径名。如果你没有设置<code>TMPDIR</code>,<strong>MySQL</strong>使用系统缺省值,它通常是<tt>“/tmp”</tt>或<tt>“/usr/tmp”</tt>。如果包含你的临时文件目录的文件系统太小,你应该编辑<code>safe_mysqld</code>设定<code>TMPDIR</code>指向你有足够空间的一个文件系统!你也可以使用<code>mysqld的--tmpdir</code>选项目设置临时目录。</p>

<p><strong>MySQL</strong>以“隐含文件”创建所有临时文件。这保证了如果<code>mysqld</code>被终止,临时文件也将被删除。使用隐含文件的缺点是你将看不到一个大的临时文件填满了临时文件目录所在的文件系统。</p>

<p>当排序(<code>ORDER BY</code>或<code>GROUP BY</code>)时,<strong>MySQL</strong>通常使用一个或两个临时文件。最大磁盘空间需求是:</p>

<pre>
(存储东西的长度 + sizeof (数据库指针))
* 匹配的行数
* 2
</pre>

<p><code>sizeof(数据库指针)</code>通常是4,但是在未来对确实很大的表可能增加。</p>

<p>对一些<code>SELECT</code>查询,<strong>MySQL</strong>也创建临时SQL表。这些没被隐含且有<tt>“SQL_*”</tt>格式的名字。</p>

⌨️ 快捷键说明

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