有兩種對數據目錄重定位的方法: 可以在命令行或在一個選項文件的[mysqld] 組上,在服務器啟動時間指定一個選項。 可以移動要重定位的內容,然后在原始的位置中做一個指向新位置的s y m l i n k (symbolic link,符號鏈接)。 兩種方法的任何一種都不能為您進行全部的重定位工作。表10-4 綜合了可重定位的內容以及可用于重定位的方法。如果您使用一個選項文件,可以指定在全局選項文件/ e t c / my.cnf(windows中的c:/my.cnf)中的選項。當前的windows 版本還訪問系統目錄(c:/windows 或c:/n t)。 您還可以使用缺省數據目錄的選項文件my.cnf(該目錄編譯在服務器中)。筆者不建議使用此文件。如果要重定位數據目錄本身,必須保持缺省數據目錄的完整性,以便在數據目錄中放置一個選項文件,該文件將說明服務器應該在哪里找到“真正”的數據目錄!真亂。如果想要用一個選項文件來指定服務器的選項,則最好使用/ e t c / my.cnf。
估計重定位的效果
在試圖對任何東西進行重定位之前,檢驗該操作是否將具有所期望的效果是一個好主意。筆者傾向于用d u、df 和ls -l 命令來獲得磁盤空間信息,但是所有的命令都依賴于對文件系統布局的正確理解。 以下例子將顯示出一個神秘的中斷以密切注意何時估計數據目錄的重定位。假定數據目錄是/ us r / l o c a l / v a r,并且想將其移動到/ v a r / mysql,因為df 指出該/var 文件系統有較多的可用空間(如下例所示): 重定位的數據目錄能釋放/usr 文件系統中多少空間?為了查找空間數量,可使用du-s 來查看該目錄使用了多少空間: 這大約為13 0 mb,應該對/usr 產生相當大的變化。但這是真的嗎?可在該數據目錄/ us r 中試一下df 命令: 真奇怪。我們請求的是包含/usr/local/var 系統文件的可用空間,可為什么df 報告了v a r 的空間呢?下面的ls -l 做出了回答: 該輸出結果表明/usr/local/var 是對/var/mysql的一個s y m l i n k。換句話說,數據目錄已經被重定位到/var 文件系統中,并且用指向/var 文件系統的symlink 所取代。有關通過移動數據目錄到/var 中來釋放大量的/usr 空間的工作就到此為止了! 教訓:花幾分鐘的時間估計重定位的效果是一個有價值的投資。不用花很長的時間就會發現您可能不能達到自己的預期目標,這樣可以使您避免浪費大量的移動數據目錄的時間。
數據庫只能通過symlink 方法來移動。為了重定位數據庫,應關閉服務器,移動數據庫目錄。刪除原來的數據庫目錄,用指向新位置的symlink 來代替它,然后啟動服務器。 下面的例子說明怎樣將數據庫bigdb 移動到另一個位置: 重定位的預防措施 在執行任何重定位操作之前應該關閉服務器,然后再重新啟動它。對有些類型的重定位(如移動數據庫目錄),保持服務器的運行狀態是可能的(盡管不建議這樣做)。如果要這樣做,您必須確保服務器沒有訪問將要移動的數據庫。還應該確保在移動數據庫之前發布了flush table 語句,以便確保服務器關閉所有打開的表文件。不履行這些預防措施可能導致表的毀壞。 應該以數據目錄所有者的身份來執行這些命令。為了安全起見,將原來的數據庫目錄重新命名為b i g db . o r i g。在驗證了服務器與重定位服務器正常工作之后,可以刪除原來的目錄: % rm -rf bigdb.orig
可以用啟動選項重定位pid 文件、常規日志和更新日志。錯誤日志由safe_mysqld 創建且不能夠重定位(除非編輯s a f e _ mysqld) 為了在另一個位置寫狀態文件,應關閉服務器,然后用指定新狀態文件位置的恰當選項重新啟動它。表10 - 6列出了每個文件的命令行和選項的語法。 刪除一個重定位的數據庫 您可以用drop database 語句刪除一個數據庫,但是舊版本的mysql在刪除已經重定位的數據庫時是有難度的。該數據庫中的表被正確地刪除了,但在服務器試圖刪除該數據庫目錄時會出現錯誤,這是由于該目錄是一個symlink 而不是真正的目錄。mysql管理員必須手工刪除該數據庫目錄和指向它的s y m l i n k。自mysql3.23 以來,這個問題已經得到解決。 如果以絕對路徑名指定一個狀態文件的名稱,則用該路徑名創建該文件。否則,該文件在該數據目錄下創建。例如,如果您指定- - pid - file = /var/run/mysqld.pid,則該pid 文件為/ v a r / r un / mysqld . p i d。如果您指定-- pid - file = mysqld.pid ,則該pid 文件為data d i r/ mysqld . p i d。 如果指定一個沒有帶擴展名的更新日志,則mysql在打開該更新日志時將生成順序的名字。這些名字用. n n n 擴展名創建,這里的.n n n是未被已有的更新日志文件使用過的第一個號碼(如, up date . 0 0 1、up date . 0 0 2等等)。可以通過指定包含明確的擴展名來忽略順序名字的生成,然后服務器將僅使用您指定的這個名字。,歡迎訪問網頁設計愛好者web開發。