直播中
[晏子]
3 重定位數(shù)據(jù)庫目錄
前面討論的數(shù)據(jù)目錄結構是缺省配置,所有數(shù)據(jù)庫和狀態(tài)文件均包含其中,然而,你有某些自由決定數(shù)據(jù)目錄內(nèi)容的位置,本節(jié)討論為什么你可能移走部分數(shù)據(jù)目錄(或甚至目錄本身)、你能移走什么以及你如何做這些改變。
MySQL允許你重定位數(shù)據(jù)目錄或其中的成員,由幾個原因你為什么要這樣做:
你能將數(shù)據(jù)目錄放在你缺省所在的文件系統(tǒng)更大容量的文件系統(tǒng)上。
如果你的數(shù)據(jù)目錄在一個繁忙的硬盤上,你可能把它放在不太忙的磁盤上以均衡磁盤活動。你可以把數(shù)據(jù)庫和日志文件放在分開的磁盤上或跨磁盤分布。
你可能想運行多個服務器,各自有自己的數(shù)據(jù)目錄,這是解決每個進程文件描述符限制問題的一種方法,特別是你不能重新配置內(nèi)核以允許更高的限制。
有些系統(tǒng)在例如/var/run中保存服務器的部分文件,你可能想把MySQL的PID文件也放在那兒,為了系統(tǒng)操作的一致性。
3.1 重定位方法
有兩種方法重定位數(shù)據(jù)目錄的內(nèi)容:
你可以在服務器啟動時指定選項,在命令行或在一個選項文件的[mysqld]中。
你可以移走要重定位的東西,然后在原位置做一個指向新位置的符號連接。
兩種方法都不能解決你能重定位的一切,下表總結了什么能重定位和用哪種方法重定位。如果你使用選項文件,有可能在全局選項文件/etc/my.cnf(Windows上的c:\my.cnf)指定選項。當前的Windows版本也尋找系統(tǒng)目錄(c:\Windows或c:\NT)。表 重定位方法
重定位方法 適用的重定位方法
整個數(shù)據(jù)目錄 啟動選項或符號連接
單個數(shù)據(jù)庫目錄 符號連接
單個數(shù)據(jù)庫表 符號連接
PID文件 啟動選項
一般日志 啟動選項
更新日志 啟動選項
你也可以使用缺省數(shù)據(jù)目錄中的選項文件my.cnf,但不推薦使用該文件。如果你想重定位數(shù)據(jù)目錄本身,你不得不讓缺省數(shù)據(jù)目錄可讀以便使你能在這里放置選項文件指定服務器應該在哪里找到“真正”的數(shù)據(jù)目錄!這很混亂。如果你想使用一個選項文件指定服務器選項,最好使用/etc/my.cnf。
3.1 檢驗重定位的效果
在試圖重定位任何東西之前,檢驗操作達到預期效果是個好主意。借助于du、df和ls -l命令獲得磁盤空間的信息,但這些依賴于你正確了解你的文件系統(tǒng)的布局。
下面演示一個在你檢驗一個屬目錄重定位時的設計陷阱。假定你的數(shù)據(jù)目錄是/usr/local/var,而你想把它移到/var/mysql,因為df顯示/var文件系統(tǒng)有很多的空閑空間:
%df /usr /varFilesystem 1k-blocks Used Avail Capacity Mounted on/dev/wd0s3e 396895 292126 73018 80% /usr/dev/wd0s3f 1189359 1111924 162287 15% /var
重定位的數(shù)據(jù)目錄在/usr文件系統(tǒng)上有多少空閑空間呢?要知道它,使用du -s找出該目錄使用多少空間。
%cd /usr/local/var%du -s .133426
這大約是130MB,真實這樣嗎?在數(shù)據(jù)目錄下試一下df:
%df /usr/local/varFilesystem 1k-blocks Used Avail Capacity Mounted on/dev/wd0s3f 1189359 1111924 162287 15% /var
這就奇怪了。如果我們?yōu)榘?usr/local/var的文件系統(tǒng)申請空閑空間,為什么卻報告var上的空間呢?這里ls -l提供了答案:
%ls -l /usr/local....lrwxrwxrwx 1 root wheel 10 Dec 11 23:33 var -> /var/mysql....
輸出顯示/usr/local/var是對/var/mysql的符號連接,換句話說,數(shù)據(jù)目錄已經(jīng)被重定位于/var文件系統(tǒng),并用一個指向那里的符號連接代替。通過將數(shù)據(jù)目錄移到/var竟然釋放了/usr上那么多空間!
3.2 重定位數(shù)據(jù)目錄
要重定位數(shù)據(jù)目錄,關閉服務器并把數(shù)據(jù)目錄移到新位置上,然后你應該刪除員數(shù)據(jù)目錄并用指向新位置的符號連接代替它,或用明確指出新位置的選項重啟服務器。下表列出指定位置的命令行和選項。表 數(shù)據(jù)目錄重定位語法
選項源 語法
命令行 --data-dir=/path/to/dir
選項文件 [mysqld]
datadir=/path/to/dir
3.3 重定位數(shù)據(jù)庫
數(shù)據(jù)庫能通過符號連接的方法移走。要重定位一個數(shù)據(jù)庫,關閉服務器并移走數(shù)據(jù)庫目錄并刪除原來的數(shù)據(jù)庫目錄,用指向新位置的符號連接代替它,然后重啟服務器。
下例顯示你如何將一個數(shù)據(jù)庫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
你應該以該數(shù)據(jù)目錄的擁有者執(zhí)行這些命令。為了安全起見,原數(shù)據(jù)庫目錄改名為bigdb.orig。在你驗證了服務器工作正常后,你可以刪除原數(shù)據(jù)目錄。
%rm -rf bigdb.orig
3.4 重定位數(shù)據(jù)庫表
重定位一個單獨的表不是個好主意。你可以通過把表文件移到一個不同地方,并在數(shù)據(jù)目錄中創(chuàng)建指向這些文件的符號連接進行。然而,如果你發(fā)出一條ALTER TABLE或OPTIMIZE TABLE語句,將不進行你的修改。
每個語句通過在數(shù)據(jù)庫目錄中創(chuàng)建一個實現(xiàn)你修改或優(yōu)化的臨時表,然后刪除原來的表并將臨時表更名為原來的表來完成,結果是你的符號連接被刪除,而且新表又回到數(shù)據(jù)庫目錄,這是你移走前的原表文件位置。更糟糕的是,你還沒有意識到它們在那兒,繼續(xù)占據(jù)著空間,而且符號連接已經(jīng)被破壞,這樣以后當你意識到發(fā)生的事情時,如果你忘記你把它們移到什么地方,你可能沒有好辦法追蹤文件了。
因為很難保證具有表訪問權的人不修改或優(yōu)化表,所以最好把表留在數(shù)據(jù)庫目錄中。
3.5 重定位狀態(tài)文件
你可以重中定位PID文件、一般日志和更新日志。出錯日志由safe_mysqld用啟動選項創(chuàng)建,而不能被重定位(除非你編輯safe_mysqld)。
要在一個不同位置寫入狀態(tài)文件,關閉服務器,然后由指定新狀態(tài)文件位置的適當選項啟動它。下表列出每一個文件的命令行和選項文件的語法。表 狀態(tài)文件重定位語法
選項源 語法
命令行 --pid-file=pidfile
--log=lodfile
--log-update=updatefile
選項文件 [mysqld]
pid-file=pidfile
log=lodfile
log-update=updatefile
如果你用絕對路徑名指定狀態(tài)文件,用該路徑創(chuàng)建文件,否則文件在數(shù)據(jù)目錄下創(chuàng)建。如,如果你指定--pid-file=/var/run/mysqld.pid,PID文件是/var/run/mysqld.pid。如果你指定-pid-file=mysqld.pid,PID文件是DATADIR/mysqld.pid。
如果你指定無擴展名的更新日志文件,MySQL在它每次打開更新日志時產(chǎn)生順序名。這些名字用一個擴展名.nnn,這里.nnn是還沒被現(xiàn)有更新日志使用的第一個數(shù)字(如update.000,update.001等)。你可以通過明確指定擴展名來覆蓋順序名,這時服務器將只使用指定的名字。