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

📄 manual_maintenance.html

📁 这是一部完整的MYSQL中文参考手册,里面详尽的介绍了MYSQL的使用方法.
💻 HTML
📖 第 1 页 / 共 3 页
字号:
  <dt><code>Empty space</code> </dt>
  <dd>数据文件未被使用的百分比。 </dd>
  <dt><code>Blocks/Record</code> </dt>
  <dd>每个记录的平均块数 (即,一个碎片记录由多少个连接组成)。对固定格式表,这总是1。该值应该尽可能保持接近1.0。如果它变得太大,你可用<code>myisamchk</code>重新组织表。见<a HREF="manual_Maintenance.html#Optimization">13.4.3 表优化</a>。 </dd>
  <dt><code>Recordblocks</code> </dt>
  <dd>多少块(连接)被使用。对固定格式,它与记录的个数相同。 </dd>
  <dt><code>Deleteblocks</code> </dt>
  <dd>多少块(连接)被删除。 </dd>
  <dt><code>Recorddata</code> </dt>
  <dd>在数据文件中使用了多少字节。 </dd>
  <dt><code>Deleted data</code> </dt>
  <dd>在数据文件中多少字节被删除(未使用)。 </dd>
  <dt><code>Lost space</code> </dt>
  <dd>如果一个记录被改为更短的长度,就损失了一些空间。这是所有这样的损失之和,以字节计。 
  </dd>
  <dt><code>Linkdata</code> </dt>
  <dd>当使用动态表格式,记录碎片用指针连接(每个4 ~ 7字节)。 <code>Linkdata</code>被这样的指针使用的内存量之和。 
  </dd>
</dl>

<p>如果一张表已经用<code>myisampack</code>压缩了,<code>myisamchk -d</code>打印每个表列的附加信息。对于它的一个例子及其含义的描述,见<a HREF="manual_Tools.html#myisampack">12.5 MySQL压缩只读表生成器</a>。 </p>

<h2><a NAME="Crash_recovery" HREF="manual_toc.html#Crash_recovery">13.4 使用<code>myisamchk</code>进行崩溃恢复</a></h2>

<p>由<strong>MySQL</strong>用来存储数据的文件格式以已经被广泛地测试过,但是总是有外部情况可以导致数据库表被破坏: 

<ul>
  <li><code>mysqld</code>进程在一个写入当中被杀死。</li>
  <li>计算机的意外关闭(例如,如果计算机掉电)。</li>
  <li>一个硬件错误</li>
</ul>

<p>这章描述如何检查和处理在<strong>MySQL</strong>数据库中的数据损坏。如果你的表损坏很多,你应该尝试找出其原因!见<a HREF="manual_Porting.html#Debugging_server">G.1 调试一个MySQL服务器</a>。 </p>

<p>在执行崩溃恢复时,理解在一个数据库中的每一个表<code>tbl_name</code>对应的在数据库目录中的3个文件是很重要的:</p>

<table BORDER="1" WIDTH="100%" NOSAVE="#101090" class="p4">
  <tr>
    <td><strong>文件</strong> </td>
    <td><strong>用途</strong> </td>
  </tr>
  <tr>
    <td><tt>“tbl_name.frm”</tt> </td>
    <td>表定义(表格)文件</td>
  </tr>
  <tr>
    <td><tt>“tbl_name.MYD”</tt> </td>
    <td>数据文件</td>
  </tr>
  <tr>
    <td><tt>“tbl_name.MYI”</tt> </td>
    <td>索引文件</td>
  </tr>
</table>

<p>这3个文件的每一个文件类型可能遭受不同形式的损坏,但是问题最常发生在数据文件和索引文件。 
</p>

<p><code>myisamchk</code>通过一行一行地创建一个<tt>“.MYD”</tt>(数据 )文件的副本来工作,它通过由删除老的<tt>“.MYD 
</tt>文件并且重命名新文件到原来的文件名结束修复阶段。如果你使用<code>--quick</code>,<code>myisamchk</code>不创建一个临时<tt>“.MYD”</tt>文件,只是假定<tt>“.MYD”</tt>文件是正确的并且仅创建一个新的索引文件,不接触<tt>“.MYD”</tt>文件,这是安全的,因为<code>myisamchk</code>自动检测<tt>“.MYD”</tt>文件是否损坏并且在这种情况下,放弃修复。你也可以给<code>myisamchk</code>两个<code>--quick</code>选项。在这种情况下,<code>myisamchk</code>不会在一些错误上(象重复键)放弃,相反试图通过修改<tt>“.MYD”</tt>文件解决它们。通常,只有在你在太少的空闲磁盘空间上实施一个正常修复,使用两个<code>--quick</code>选项才有用。在这种情况下,你应该至少在运行<code>myisamchk</code>前做一个备份。 
</p>

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

<h3><a NAME="Check" HREF="manual_toc.html#Check">13.4.1 怎样检查表的错误</a></h3>

<p>为了检查一张表,使用下列命令: 

<dl COMPACT="Check">
  <dt><code>myisamchk tbl_name</code> </dt>
  <dd>这能找出所有错误的99.99%。它不能找出的是<strong>仅仅</strong>涉及数据文件的损坏(这很不常见)。如果你想要检查一张表,你通常应该没有选项地运行<code>myisamchk</code>或用<code>-s</code>或<code>--silent</code>选项的任何一个。 
  </dd>
  <dt><code>myisamchk -e tbl_name</code> </dt>
  <dd>它做一个完全彻底的数据检查(<code>-e</code>意思是“扩展检查”)。它对每一行做每个键的读检查以证实他们确实指向正确的行。这在一个有很多键的大表上可能花很长时间。<code>myisamchk</code>通常将在它发现第一个错误以后停止。如果你想要获得更多的信息,你能增加<code>--verbose</code>(<code>-v</code>)选项。这使得<code>myisamchk</code>继续一直到最多20个错误。在一般使用中,一个简单的<code>myisamchk</code>(没有除表名以外的参数)就足够了。</dd>
  <dt><code>myisamchk -e -i tbl_name</code> </dt>
  <dd>象前面的命令一样,但是<code>-i</code>选项告诉<code>myisamchk</code>还打印出一些统计信息。</dd>
</dl>

<h3><a NAME="Repair" HREF="manual_toc.html#Repair">13.4.2 怎样修复表</a></h3>

<p>一张损坏的表的症状通常是查询意外中断并且你能看到例如这些错误: 

<ul>
  <li><tt>“tbl_name.frm”</tt>被锁定不能改变。</li>
  <li>不能找到文件<tt>“tbl_name.MYI”</tt>(Errcode :### )。</li>
  <li>从表处理器的得到错误###(此时,错误135是一个例外)。</li>
  <li>意外的文件结束。</li>
  <li>记录文件被毁坏。</li>
</ul>

<p>在这些情况下,你必须修复表。<code>myisamchk</code>通常能检测并且修复出错的大部分东西。</p>

<p>修复过程包含最多4个阶段,在下面描述。在你开始前,你应该<code>cd</code>到数据库目录和检查表文件的权限,确保他们可被运行<code>mysqld</code>的Unix用户读取(和你,因为你需要存取你正在检查的文件)。如果它拒绝你修改文件,他们也必须是可被你写入的。</p>

<p><strong>阶段1:检查你的表</strong> </p>

<p>运行<code>myisamchk *.MYI</code>或(<code>myisamchk -e *.MYI</code>,如果你有更多的时间)。使用<code>-s</code>(沉默)选项禁止不必要的信息。</p>

<p>你必须只修复那些<code>myisamchk</code>报告有一个错误的表。对这样的表,继续到阶段2。 
</p>

<p>如果在检查时,你得到奇怪的错误(例如<code>out of memory</code>错误),或如果<code>myisamchk</code>崩溃,到阶段3。</p>

<p><strong>舞台 2 :简单安全的修复</strong> </p>

<p>首先,试试<code>myisamchk -r -q tbl_name</code>(<code>-r -q</code>意味着“快速恢复模式”)。这将试图不接触数据文件来修复索引文件。如果数据文件包含它应有的一切和在数据文件指向正确地点的删除连接,这应该管用并且表可被修复。开始修理下一张表。否则,使用下列过程: 

<ol>
  <li>在继续前做数据文件的一个备份。 </li>
  <li>使用<code>myisamchk -r tbl_name</code>(<code>-r</code>意味着“恢复模式”)。这将从数据文件中删除不正确的记录和已被删除的记录并重建索引文件。</li>
  <li>如果前面的步骤失败,使用<code>myisamchk --safe-recover tbl_name</code>。安全恢复模式使用一个老的恢复方法,处理常规恢复模式不行的少数情况(但是更慢)。</li>
</ol>

<p>如果在修复时,你得到奇怪的错误(例如<code>out of memory</code>错误),或如果<code>myisamchk</code>崩溃,到阶段3。</p>

<p><strong>舞台 3 :困难的修理</strong> </p>

<p>如果在索引文件的第一个16K块被破坏,或包含不正确的信息,或如果索引文件丢失,你只应该到这个阶段 
。在这种情况下,创建一个新的索引文件是必要的。按如下这样做: 

<ol>
  <li>把数据文件移更安全的地方。 </li>
  <li>使用表描述文件创建新的(空)数据和索引文件:<pre>shell&gt; mysql db_name
mysql&gt; DELETE FROM tbl_name;
mysql&gt; quit
</pre>
  </li>
  <li>将老的数据文件拷贝到新创建的数据文件之中。(不要只是将老文件移回新文件之中;你要保留一个副本以防某些东西出错。)</li>
</ol>

<p>回到阶段2。现在<code>myisamchk -r -q</code>应该工作了。(这不应该是一个无限循环)。</p>

<p><strong>阶段4:非常困难的修复</strong> </p>

<p>只有描述文件也破坏了,你才应该到达这个阶段。这应该从未发生过,因为在表被创建以后,描述文件就不再改变了。 

<ol>
  <li>从一个备份恢复描述文件并且回到阶段3。你也可以恢复索引文件并且回到阶段2。对后者,你应该用<code>myisamchk 
    -r</code>启动。 </li>
  <li>如果你没有一个备份但是确切地知道表是怎样被创建的,在另一个数据库中创建表的一个拷贝。删除新的数据文件,然后从其他数据库将描述和索引文件移到破坏的数据库中。这给了你新的描述和索引文件,但是让数据文件独自留下来了。回到阶段2并且尝试重建索引文件。</li>
</ol>

<h3><a NAME="Optimization" HREF="manual_toc.html#Optimization">13.4.3 表优化</a></h3>

<p>为了组合成碎片的记录并且消除由于删除或更新记录而浪费的空间, 
以恢复模式运行<code>myisamchk</code>:</p>

<pre>shell&gt; myisamchk -r tbl_name
</pre>

<p>你可以用SQL的<code>OPTIMIZE TABLE</code>语句使用的相同方式来优化一张表,<code>OPTIMIZE 
TABLE</code>比较容易,但是<code>myisamchk</code>更快。也没有在一个实用程序和服务器之间不必要的交互可能性,因为当你使用<code>OPTIMIZE 
TABLE</code>时,服务器做所有的工作。</p>

<p><code>myisamchk</code>也有你可用来改进一个表的性能的很多其他选项: 

<dl COMPACT="Optimization">
  <dt><code>-S, --sort-index</code> </dt>
  <dd> </dd>
  <dt><code>-R index_num, --sort-records=index_num</code> </dt>
  <dd> </dd>
  <dt><code>-a, --analyze</code> </dt>
  <dd> </dd>
</dl>

<p>对于选项完整的描述见<a HREF="manual_Maintenance.html#myisamchk_syntax">13.1.1<code> 
myisamchk</code>调用语法</a>。 </p>

<h2><a NAME="Log_files" HREF="manual_toc.html#Log_files">13.5 日志文件维护</a></h2>

<p>当<strong>MySQL</strong>与日志文件一起使用时,你有时想要删除/备份旧的日志文件并且告诉<strong>MySQL</strong>在新文件中开始记录。见<a HREF="manual_Server.html#Update_log">9.2 更新日志</a>。 </p>

<p>在一个 Linux (<code>Redhat</code>)的安装上,你可为此使用<code>mysql-log-rotate</code>脚本。如果你从RPM分发安装<strong>MySQL</strong>,脚本应该自动被安装了。</p>

<p>在其他系统上,你必须自己安装一个短脚本,你可从<code>cron</code>启动来处理日志文件。</p>

<p>你可以通过使用<code>mysqladmin flush-logs</code>或SQL命令<code>FLUSH LOGS</code>来强制<strong>MySQL</strong>开始使用新的日志文件。如果你正在使用<strong>MySQL</strong> 
3.21,你必须使用<code>mysqladmin refresh</code>。</p>

<p>上面的命令做下列事情: 

<ul>
  <li>如果使用标准日志(<code>--log</code>),关闭并重新打开日志文件。(<tt>“ 
    mysql.log”</tt>为缺省)。 </li>
  <li>如果使用更新日志(<code>--log-update</code>),关闭更新日志并且重新打开有一个更高的顺序闭编号的新日志文件。</li>
</ul>

<p>如果你只使用一个更新日志,你只须清空日志文件,然后移走旧的更新日志文件到一个备份中。如果你使用一般的日志,你可以这样做:</p>

<pre>shell&gt; cd mysql-data-directory
shell&gt; mv mysql.log mysql.old
shell&gt; mysqladmin flush-tables
</pre>

<p>然后做一个备份并删除<tt>“mysql.old”</tt>。</p>

<hr>

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

⌨️ 快捷键说明

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