瞭解MySQl數據庫目錄

數據庫目錄是MySQL數據庫服務器存放數據文件的地方,不僅包括有關表的文件,還包括數據文件和MySQL的服務器選項文件。不同的分發,數據庫目錄的缺省位置是不同的。


數據目錄的位置


缺省的數據庫位置


缺省數據庫的位置編譯在服務器中。


◆如果您是在一個源程序分發包中安裝 MySQL,典型的缺省位置可能是 /usr/local/var;


◆如果在二進制分發包中安裝 MySQL,則為 /usr/local/mysql/ data;


◆在 RPM 文件中安裝,為 /var/lib/mysql。


◆對於windwos平臺上的分發,其位置時BASEDIRdata


數據目錄的位置可以在啟動服務器時通過–datadir = / path / to / dir 明確地指定。如果您想將數據目錄放置在其他地方而非缺省的位置,則這個選項是有用的。


瞭解數據庫目錄的位置


作為一名 MySQL 管理員,您應該知道數據目錄在哪裡。如果運行多個服務器,那麼您應該掌握所有數據目錄的位置。但是,如果不知道目錄的位置(或許您正在代替前一位管理員,而他留下的記錄很糟糕),有幾種方法可以用來查找它:


1、可使用 mysqladmin 變量直接從服務器中得到數據目錄路徑名。在 UNIX 中,輸出結果類似於如下所示:


$mysqladmin variables
+————————-+—————————
| Variable_name           | Value                   
+————————-+—————————
| ansi_mode               | OFF                     
| back_log                | 50                      
| basedir                 | /var/local        
| connect_timeout         | 5                       
| concurrent_insert       | ON                      
| datadir                 | /usr/local/var



該輸出結果指明瞭服務器主機中數據目錄的位置 /usr/local/var。
在 Windows 中,輸出結果類似於如下所示:


c:mysqlin>mysqladmin variables
+————————-+—————————
| Variable_name           | Value                   
+————————-+—————————
| ansi_mode               | OFF                     
| back_log                | 50                      
| basedir                 | c:mysql        
| connect_timeout         | 5                       
| concurrent_insert       | ON         


如果正在運行多個服務器,它們將監聽不同的 TCP/IP 端口號和套接字。可以通過提供合適的–port 或 –socket 選項連接到每個服務器監聽的端口和套接字上:


$mysqladmin –port=port=port_num variables
$mysqladmin –socket=/path/to/socket variables


mysqladmin 命令可在您連接服務器的任何一臺主機上運行。如果需要連接到遠程主機上的服務器,則使用 –host = host_name 選項:


$mysqladmin –host=host_name varibles


2、在Unix平臺上,可使用 ps 來查看任何當前執行 mysql 進程的命令行。試一試下列的命令(根據您的系統所支持的 ps 版本)並查找顯示在輸出結果中的這些命令的 –datadir:


$ps au | grep mysqld


如果系統運行多個服務器(因為一次發現瞭多個數據目錄位置),則 ps 命令將會特別有用。它的缺點是:ps 必須運行在服務器的主機上,並且除非 –datadir 選項在 mysqld 命令行中明確指定,否則將產生無用的信息。


3、如果 MySQL 從源程序分發包中安裝,可以檢查其配置信息以確定數據目錄的位置。例如,在最高級的 Makefile 中該位置是可用的。但是,要小心:位置是 Makefile 中的變量localstatedir 的值,而不是 datadir 的值。同樣,如果分發包定位在 NFS 裝配文件系統中,並且是用於為幾個主機建立 MySQL的,則配置信息反映最近建立分發包的主機。它可能不顯示您感興趣的主機的數據目錄。


4、如果前面的任何方法都不成功,可使用 find 搜索數據庫文件。下列命令將搜索 .frm(描述)文件,它是 MySQL 安裝程序的組成部分:


$find / -name  “*.frm” –print


在windows平臺上的搜索非常簡單,本節就不給出例子瞭。


在本章的這些例子中,筆者將 MySQL 數據目錄的位置表示為 DATADIR。您可以將其解釋成為您自己的機器中的數據目錄的位置。


 


 


數據庫的表示法


由 MySQL 管理的每個數據庫都有自己的數據庫目錄,它們是數據目錄的子目錄,與所表示的數據庫有相同的名稱。例如,數據庫 my_db 對應於數據庫目錄 DATADIR/my_db。


這個表示法使得幾個數據庫級的語句的實現是非常容易的。CREATE DATABASE db_name 使用隻允許對 MySQL 服務器用戶(服務器運行的UNIX 用戶)進行訪問的所有權和方式,並在數據目錄中創建一個空目錄 db_name。這等價於以服務器主機中的服務器用戶的身份通過執行下列命令手工創建數據庫:


$ mkdir DATADIR/db_name 創建數據庫目錄
$ chmod 700 DATADIR/db_name  使它僅對 MySQL 服務器用戶可訪問


通過空目錄表示新數據庫的方法與其他數據庫系統完全不同,那些數據庫系統甚至要為“空”數據庫創建許多控制文件或系統文件。


DROP DATABASE 語句也很容易實現。DROP DATABASE db_name 刪除數據目錄中的 db_name 目錄以及其中的所有表文件。這個語句類似於下列命令:


$rm -rf DATADIR/db_name


其區別是,服務器隻刪除帶有表的擴展名的文件。如果已經在該數據庫目錄中創建瞭其他的文件,服務器將使它們保持完整,並且不刪除該目錄本身。


SHOW DATABASE 隻不過是對應位於數據目錄中的子目錄名稱的一個列表。有些數據庫系統需要保留一個列出所有需要維護的數據庫的主表,但是,在 MySQL 中沒有這樣的結構。由於數據目錄結構的簡單性,數據庫的列表是隱含在該數據目錄的內容中的,像主表這樣的表可能會引起不必要的開銷。


數據庫表的表示法


數據庫中的每個表在數據庫目錄中都作為三個文件存在:一個格式(描述)文件、一個數據文件和一個索引文件。每個文件的基名是該表名,擴展名指明該文件的類型。擴展名如表5-1所示。數據和索引文件的擴展名指明該表是否使用較老的 ISAM 索引或較新的 MyISAM 索引。


 


當發佈定義一個表結構的 CREATE TABLE tbl_name 語句時,服務器創建 tbl_name.frm 文件,它包含該結構的內部編碼。該語句還創建空的數據文件和索引文件,這些文件的初始信息表明沒有記錄和索引(如果 CREATE TABLE 語句包含索引說明,則該索引文件將反映這些索引)。描述表的文件的所有權和方式被設置為隻允許對 MySQL 服務器用戶的訪問。


當發佈 ALTER TABLE 語句時,服務器對 tbl_name.frm 重新編碼並修改數據文件和索引文件的內容以反映由該語句表明的結構變化。對於 CREATE 和 DROP INDEX 也是如此,因為服務器認為它們等價於 ALTER TABLE 語句。DROP TABLE 刪除代表該表的三個文件。


盡管可以通過刪除數據庫目錄中的對應某個表的三個文件來刪除該表,但不能手工創建或更改表。例如,如果 my_db 是當前的數據庫,DROP TABLE my_tbl 大致等價於下列命令:


來自於 SHOW TABLES my_db 的輸出結果正是 my_db 數據庫目錄中 .frm 文件基名的一個列表。某些數據庫系

發佈留言