[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 數據庫 > MySQL > 正文
MySQL數據目錄結構(2)
本文出自: 作者: 晏子 (2001-07-05 12:10:00)


3 重定位數據庫目錄

前面討論的數據目錄結構是缺省配置,所有數據庫和狀態文件均包含其中,然而,你有某些自由決定數據目錄內容的位置,本節討論為什你可能移走部分數據目錄(或甚至目錄本身)、你能移走什以及你如何做這些改變。
MySQL允許你重定位數據目錄或其中的成員,由幾個原因你為什要這樣做:
你能將數據目錄放在你缺省所在的文件系統更大容量的文件系統上。
如果你的數據目錄在一個繁忙的硬盤上,你可能把它放在不太忙的磁盤上以均衡磁盤活動。你可以把數據庫和日志文件放在分開的磁盤上或跨磁盤分布。
你可能想運行多個服務器,各自有自己的數據目錄,這是解決每個進程文件描述符限制問題的一種方法,特別是你不能重新配置內核以允許更高的限制。
有些系統在例如/var/run中保存服務器的部分文件,你可能想把MySQL的PID文件也放在那兒,為了系統操作的一致性。

3.1 重定位方法

有兩種方法重定位數據目錄的內容:
你可以在服務器啟動時指定選項,在命令行或在一個選項文件的[mysqld]中。
你可以移走要重定位的東西,然在原位置做一個指向新位置的符號連接。

兩種方法都不能解決你能重定位的一切,下表總結了什能重定位和用哪種方法重定位。如果你使用選項文件,有可能在全局選項文件/etc/my.cnf(Windows上的c:\my.cnf)指定選項。當前的Windows版本也尋找系統目錄(c:\Windows或c:\NT)。表 重定位方法
重定位方法 適用的重定位方法
整個數據目錄 啟動選項或符號連接
單個數據庫目錄 符號連接
單個數據庫表 符號連接
PID文件 啟動選項
一般日志 啟動選項
更新日志 啟動選項

你也可以使用缺省數據目錄中的選項文件my.cnf,但不推薦使用該文件。如果你想重定位數據目錄本身,你不得不讓缺省數據目錄可讀以便使你能在這裡放置選項文件指定服務器應該在哪裡找到“真正”的數據目錄!這很混亂。如果你想使用一個選項文件指定服務器選項,最好使用/etc/my.cnf。
3.1 檢驗重定位的效果

在試圖重定位任何東西之前,檢驗操作達到預期效果是個好主意。借助du、df和ls -l命令獲得磁盤空間的信息,但這些依賴你正確了解你的文件系統的布局。
下面演示一個在你檢驗一個屬目錄重定位時的設計陷阱。假定你的數據目錄是/usr/local/var,而你想把它移到/var/mysql,因為df顯示/var文件系統有很多的空閑空間:

%df /usr /varFilesystem 1k-blocks Used Avail Capacity Mounted on/dev/wd0s3e 396895 292126 73018 80% /usr/dev/wd0s3f 1189359 1111924 162287 15% /var  

重定位的數據目錄在/usr文件系統上有多少空閑空間呢?要知道它,使用du -s找出該目錄使用多少空間。
%cd /usr/local/var%du -s .133426

這大約是130MB,真實這樣嗎?在數據目錄下試一下df:
%df /usr/local/varFilesystem 1k-blocks Used Avail Capacity Mounted on/dev/wd0s3f 1189359 1111924 162287 15% /var 

這就奇怪了。如果我們為包含/usr/local/var的文件系統申請空閑空間,為什卻報告var上的空間呢?這裡ls -l提供了答案:
%ls -l /usr/local....lrwxrwxrwx 1 root wheel 10 Dec 11 23:33 var -> /var/mysql.... 

輸出顯示/usr/local/var是對/var/mysql的符號連接,換句話說,數據目錄已經被重定位/var文件系統,並用一個指向那裡的符號連接代替。通過將數據目錄移到/var竟然釋放了/usr上那多空間!

3.2 重定位數據目錄

要重定位數據目錄,關閉服務器並把數據目錄移到新位置上,然你應該刪除員數據目錄並用指向新位置的符號連接代替它,或用明確指出新位置的選項重啟服務器。下表列出指定位置的命令行和選項。表 數據目錄重定位語法
選項源 語法
命令行 --data-dir=/path/to/dir
選項文件 [mysqld]
datadir=/path/to/dir

3.3 重定位數據庫

數據庫能通過符號連接的方法移走。要重定位一個數據庫,關閉服務器並移走數據庫目錄並刪除原來的數據庫目錄,用指向新位置的符號連接代替它,然重啟服務器。
下例顯示你如何將一個數據庫bigdb移到一個不同的地方:
%mysqladmin -u root -p shutdownEnter password: ******%cd DATADIR%tar cf - bigdb | (cd /var/db; tar xf -)%mv bigdb bigdb.origln -s /var/db/bigdb .%safe_mysqld 

你應該以該數據目錄的擁有者執行這些命令。為了安全起見,原數據庫目錄改名為bigdb.orig。在你驗証了服務器工作正常,你可以刪除原數據目錄。
%rm -rf bigdb.orig

3.4 重定位數據庫表

重定位一個單獨的表不是個好主意。你可以通過把表文件移到一個不同地方,並在數據目錄中創建指向這些文件的符號連接進行。然而,如果你發出一條ALTER TABLE或OPTIMIZE TABLE語句,將不進行你的修改。
每個語句通過在數據庫目錄中創建一個實現你修改或優化的臨時表,然刪除原來的表並將臨時表更名為原來的表來完成,結果是你的符號連接被刪除,而且新表又回到數據庫目錄,這是你移走前的原表文件位置。更糟糕的是,你還沒有意識到它們在那兒,繼續佔據著空間,而且符號連接已經被破壞,這樣以當你意識到發生的事情時,如果你忘記你把它們移到什地方,你可能沒有好辦法追蹤文件了。
因為很難保証具有表訪問權的人不修改或優化表,所以最好把表留在數據庫目錄中。

3.5 重定位狀態文件

你可以重中定位PID文件、一般日志和更新日志。出錯日志由safe_mysqld用啟動選項創建,而不能被重定位(除非你編輯safe_mysqld)。
要在一個不同位置寫入狀態文件,關閉服務器,然由指定新狀態文件位置的適當選項啟動它。下表列出每一個文件的命令行和選項文件的語法。表 狀態文件重定位語法
選項源 語法
命令行 --pid-file=pidfile
--log=lodfile
--log-update=updatefile
選項文件 [mysqld]
pid-file=pidfile
log=lodfile
log-update=updatefile

如果你用絕對路徑名指定狀態文件,用該路徑創建文件,否則文件在數據目錄下創建。如,如果你指定--pid-file=/var/run/mysqld.pid,PID文件是/var/run/mysqld.pid。如果你指定-pid-file=mysqld.pid,PID文件是DATADIR/mysqld.pid。
如果你指定無擴展名的更新日志文件,MySQL在它每次打開更新日志時產生順序名。這些名字用一個擴展名.nnn,這裡.nnn是還沒被現有更新日志使用的第一個數字(如update.000,update.001等)。你可以通過明確指定擴展名來覆蓋順序名,這時服務器將只使用指定的名字。


(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
MySQL數據目錄結構(2) (2001-07-05 12:10:00)
MySQL數據目錄結構(1) (2001-07-05 11:00:00)
MySQL數據目錄結構 (2001-05-14 03:28:00)
 

★  樊強制作 歡迎分享  ★