?? manual_maintenance.html
字號:
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<title>MySQL中文參考手冊-13 維護 MySQL 安裝</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)
主頁:<a href="http://linuxdn.yeah.net">http://linuxdb.yeah.net</a></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>
<hr>
<h1><a NAME="Maintenance" HREF="manual_toc.html#Maintenance">13 維護MySQL安裝</a></h1>
<h2><a NAME="Table_maintenance" HREF="manual_toc.html#Table_maintenance">13.1 使用<code>myisamchk</code>進行表的維護和崩潰恢復</a></h2>
<p>為了檢查/修復MyISAM表(<code>.MYI</code>和<code>.MYD</code>),你應該使用<code>myisamchk</code>實用程序。為了檢查/修復ISAM表(<code>.ISM</code>和<code>.ISD</code>),你應該使用<code>isamchk</code>實用程序。見<a HREF="manual_Server.html#Table_types">9.4 MySQL 桌子類型</a>。</p>
<p>在下文中,我們將討論<code>myisamchk</code>,但是也適用于老的<code>isamchk</code>。</p>
<p>你可以使用<code>myisamchk</code>實用程序來獲得有關你的數據庫桌表的信息、檢查和修復他們或優化他們。下列小節描述如何調用<code>myisamchk</code>(包括它的選項的描述),如何建立一個表維護的時間表,并且如何使用<code>myisamchk</code>執行其各種功能。</p>
<p>如果你用<code>--skip-locking</code>運行<code>mysqld</code>(它在一些系統上是缺省的,如Linux),當<code>mysqld</code>正在使用同一個表時,你不能可靠地使用<code>myisamchk</code>檢查一張表。如果你能肯定在你運行<code>myisamchk</code>時沒有人通過<code>mysqld</code>正在存取表,在你開始檢查表之前,你僅需做<code>mysqladmin
flush-tables</code>。如果你不能保證, 那么當你檢查表時,你必須停掉<code>mysqld</code>。如果你在<code>mysqld</code>正在更新表時運行<code>myisamchk</code>,你可能得到一個表已破壞的警告,即使它沒有。</p>
<p>如果你沒使用<code>--skip-locking</code>,你能在任何時間使用<code>myisamchk</code>檢查表。當你這樣時,所有試圖更新表的客戶在繼續前將等到<code>myisamchk</code>就緒。
</p>
<p>如果你使用<code>myisamchk</code>修復或優化表,你<strong>必須</strong>總是保證<code>mysqld</code>服務器不在使用表(如果你正在使用<code>--skip-locking</code>,這也適用)。如果你不停掉<code>mysqld</code>,在你運行<code>myisamchk</code>前,你至少應該做一個<code>mysqladmin
flush-tables</code>。</p>
<p>在大多數情況下,你也可使用命令<code>OPTIMIZE TABLES</code>優化并修復表,但是這不如<code>myisamchk</code>快或可靠(在真正的致命錯誤的情況下)。在另一方面,<code>OPTIMIZE
TABLE</code>較易使用并且你不必須關心清空表。見<a HREF="manual_Reference.html#OPTIMIZE_TABLE">7.9<code>OPTIMIZE TABLE</code>句法</a>。</p>
<h3><a NAME="myisamchk_syntax" HREF="manual_toc.html#myisamchk_syntax">13.1.1<code>
myisamchk</code>調用語法</a></h3>
<p><code>myisamchk</code>這樣調用:</p>
<pre>shell> myisamchk [options] tbl_name
</pre>
<p><code>options</code>指定你想要<code>myisamchk</code>做什么。他們在下面描述。(你也可以通過調用<code>myisamchk
--help</code>得到一張選項表。) 沒有選項,<code>myisamchk</code>簡單地檢查你的表。為了得到更多的信息或告訴<code>myisamchk</code>執行校正操作,指定在下面和下小節描述的選項擇。</p>
<p><code>tbl_name</code>是你想要檢查的數據庫表。如果你不在數據庫目錄的某處運行<code>myisamchk</code>,你必須指定到文件的路徑,因為<code>myisamchk</code>不知道你的數據庫位于哪兒。實際上,<code>myisamchk</code>別在乎你正在操作的文件是否位于一個數據庫目錄;你可以拷貝對應于一張數據庫表的文件到別處并且在那里執行恢復操作。
</p>
<p>如果你愿意,你可以<code>myisamchk</code>命令行命名幾個表。你也能指定一個名字作為一個索引文件(用<tt>“
.MYI”</tt>后綴),它允許你通過使用模式<tt>“*.MYI”指定</tt>在一個目錄所有的表。例如,如果你在一個數據庫目錄,你可以這樣在目錄下檢查所有的表:</p>
<pre>shell> myisamchk *.MYI
</pre>
<p>如果你不在數據庫目錄下,你可通過指定到目錄的路徑檢查所有在那里的表:
</p>
<pre>shell> myisamchk /path/to/database_dir/*.MYI
</pre>
<p>你甚至可以通過為<strong>MySQL</strong>數據目錄的路徑指定一個通配符來檢查所有的數據庫中的所有表:</p>
<pre>shell> myisamchk /path/to/datadir/*/*.MYI
</pre>
<p><code>myisamchk</code>支持下列選項:
<dl COMPACT="myisamchk_syntax">
<dt><code>-a, --analyze</code> </dt>
<dd>分析鍵值的分布。這通過讓聯結優化器更好地選擇表應該以什么次序聯結和應該使用哪個鍵來改進聯結性能。
</dd>
<dt><code>-#, --debug=debug_options</code> </dt>
<dd>輸出調試記錄文件。<code>debug_options</code>字符串經常是<code>'d:t:o,filename'</code>。</dd>
<dt><code>-d, --description</code> </dt>
<dd>打印出關于表的一些信息。 </dd>
<dt><code>-e, --extend-check</code> </dt>
<dd>非常徹底地檢查表。這僅在極端情況下是必要的。通常,<code>myisamchk</code>應該找出所有錯誤,即使沒有改選項。</dd>
<dt><code>-f, --force</code> </dt>
<dd>覆蓋老的臨時文件。如果你在檢查表時使用<code>-f</code> (運行<code>myisamchk</code>沒有<code>-r</code>),<code>myisamchk</code>在檢查期間將自動為出現一個錯誤的表用<code>-r</code>重啟。</dd>
<dt><code>--help</code> </dt>
<dd>顯示一條幫助消息并且退出。 </dd>
<dt><code>-i, --information</code> </dt>
<dd>打印有關被檢查的表的信息統計。</dd>
<dt><code>-k #, --keys-used=#</code> </dt>
<dd>與<code>-r</code>一起使用。告訴ISAM表處理器僅更新頭<code>#</code>個索引。較高編號的索引被撤銷。這能用來使插入變得更快!撤銷的索引能通過使用<code>myisamchk
-r</code>被重新激活。</dd>
<dt><code>-l, --no-symlinks</code> </dt>
<dd>在修復時,不跟隨符號連接。通常<code>myisamchk</code>修復一個符號連接所指的表。</dd>
<dt><code>-q, --quick</code> </dt>
<dd>與<code>-r</code>一起使用使得一個修復更快。通常,原來的數據文件沒被接觸;你能指定第二個<code>-q</code>強制使用原來的數據文件。
</dd>
<dt><code>-r, --recover</code> </dt>
<dd>恢復模式。可以修復幾乎所有一切,除非唯一的鍵不是唯一。</dd>
<dt><code>-o, --safe-recover</code> </dt>
<dd>恢復模式。使用一個老的恢復方法;這比<code>-r</code>慢些,但是能處理一<code>-r</code>不能處理的情況。</dd>
<dt><code>-O var=option, --set-variable var=option</code> </dt>
<dd>設置一個變量的值。可能的變量列在下面。 </dd>
<dt><code>-s, --silent</code> </dt>
<dd>沉默模式。當錯誤發生時,僅寫輸出。你能使用<code>-s</code>兩次(<code>-ss</code>)非常沉默地做<code>myisamchk</code>。</dd>
<dt><code>-S, --sort-index</code> </dt>
<dd>以從高到低的順序排序索引樹塊。這將優化搜尋并且將使按鍵值的表掃描更快。</dd>
<dt><code>-R index_num, --sort-records=index_num</code> </dt>
<dd>根據一個索引排序記錄。這使你的數據更局部化并且可以加快在該鍵上的<code>SELECT</code>和<code>ORDER
BY</code>的范圍搜索。(第一次做排序可能很慢!)
為了找出一張表的索引編號,使用<code>SHOW INDEX</code>,它以<code>myisamchk</code>看見他們的相同順序顯示一張表的索引。索引從1開始編號。</dd>
<dt><code>-u, --unpack</code> </dt>
<dd>解開一個用<code>myisampack</code>壓縮的表。</dd>
<dt><code>-v, --verbose</code> </dt>
<dd>冗長模式。打印更多的信息。這能與<code>-d</code>和<code>-e</code>一起使用。為了更冗長,使用<code>-v</code>多次(<code>-vv</code>,
<code>-vvv</code>)!</dd>
<dt><code>-V, --version</code> </dt>
<dd>打印<code>myisamchk</code>版本并退出。</dd>
<dt><code>-w, --wait</code> </dt>
<dd>如果表被鎖定,等待。</dd>
</dl>
<p>對<code>--set-variable</code>(<code>-O</code>)選項,可能的變量是:</p>
<pre>key_buffer_size 當前值: 16776192
read_buffer_size 當前值: 262136
write_buffer_size 當前值: 262136
sort_buffer_size 當前值: 2097144
sort_key_blocks 當前值: 16
decode_bits 當前值: 9
</pre>
<h3><a NAME="myisamchk_memory" HREF="manual_toc.html#myisamchk_memory">13.1.2<code>
myisamchk</code>內存使用</a></h3>
<p>當你運行<code>myisamchk</code>時,內存分配很重要。<code>myisamchk</code>使用不超過你用<code>-O</code>選項指定的內存量。如果你想在很大的文件上使用<code>myisamchk</code>,你首先應該確定你想要它使用多少內存。缺省僅使用大約
3M 來修復。通過使用更大的值,你能使<code>myisamchk</code>更快地操作。例如,如果你有多于32M內存,你能使用例如這些選項(除了任何你可能指定的選項):</p>
<pre>shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...
</pre>
<p>使用<code>-O sort=16M</code>應該可能對大多數情形就足夠了。</p>
<p>必須明白,<code>myisamchk</code>使用在<code>TMPDIR</code>里面的臨時文件。如果<code>TMPDIR</code>指向一個內存文件系統,你可能很容易得到內存溢出的錯誤。如果它發生,設定<code>TMPDIR</code>指向有更多空間的某個目錄并且重啟<code>myisamchk</code>。</p>
<h2><a NAME="Maintenance_regimen" HREF="manual_toc.html#Maintenance_regimen">13.2
建立一個數據庫表維護規范</a></h2>
<p>在一個定期基礎而非等到問題出現才實施數據庫表的檢查是一個好主意。為維護目的,你能使用<code>myisamchk
-s</code>檢查桌子。<code>-s</code>選項使<code>myisamchk</code>以沉默模式運行,當錯誤出現時,僅僅打印消息。</p>
<p><a NAME="IDX672"></a>在服務器啟動時檢查表是一個好主意。例如,無論何時機器在更新當中重新啟動了,你通常需要檢查所有可能被影響了的表。(這是一個“期望破壞了的表”)
如果重啟后有一個舊的<tt>“.pid”</tt>(進程ID),你能為<code>safe_mysqld</code>加入一個測試,運行<code>myisamchk</code>檢查所有在過去24小時修改過的表)。(<tt>“.pid”</tt>文件在<code>mysqld</code>啟動時由它創建,并它正常終止時刪除。在系統啟動時存在一個<tt>“.pid”</tt>文件表明<code>mysqld</code>異常地終止了。)</p>
<p>一個更好的測試將是檢查任何表,它的最后修改時間是比<tt>“.pid”</tt>文件更新。</p>
<p>你也應該定期在正常系統操作期間檢查表。在TcX,我們運行一個<code>cron</code>任務,每周一次檢查我們所有重要的表,在一個<tt>“crontab”</tt>文件中使用這樣的行:</p>
<pre>35 0 * * 0 /path/to/myisamchk -s /path/to/datadir/*/*.MYI
</pre>
<p>這打印出損壞的表的信息,因此我們能檢驗并且在需要時修復他們。</p>
<p>當我們現在幾年(這確實是真的)都沒有任何意外損壞的表時(由于除硬件故障外的其他原因造成損壞的表),每周一次對我們是足夠了。</p>
<p>我們建議現在開始,你對所有最后24小時內被更新了表每晚都執行<code>myisamchk
-s</code>,直到你變得象我們那樣信任<strong>MySQL</strong>。</p>
<h2><a NAME="Table-info" HREF="manual_toc.html#Table-info">13.3
獲得關于一個表的信息</a></h2>
<p>為了獲得關于一個表的描述或統計,使用顯示在下面的命令。我們以后更詳細地解釋某些信息。
<dl COMPACT="Table-info">
<dt><code>myisamchk -d tbl_name</code> </dt>
<dd>以“描述模式”運行<code>myisamchk</code>,生成你的表的描述。如果你用<code>--skip-locking</code>選項啟動<strong>MySQL</strong>服務器,<code>myisamchk</code>可以當它運行時報告被一個更新的表的錯誤。然而,既然在描述模式中<code>myisamchk</code>不改變表,沒有破壞數據的任何風險。
</dd>
<dt><code>myisamchk -d -v tbl_name</code> </dt>
<dd>為了生成更多關于<code>myisamchk</code>正在做什么的信息,加上<code>-v</code>告訴它以冗長模式運行。
</dd>
<dt><code>myisamchk -eis tbl_name</code> </dt>
<dd>僅顯示一個表最重要的信息。因為必須讀取整個表,它很慢。 </dd>
<dt><code>myisamchk -eiv tbl_name</code> </dt>
<dd>這類似<code>-eis</code>,只是告訴你正在做什么。 </dd>
</dl>
<p><code>myisamchk -d</code>輸出的例子: </p>
<pre>MyISAM file: company.MYI
Record format: Fixed length
Data records: 1403698 Deleted blocks: 0
Recordlength: 226
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -