MySQL數據目錄結構(1)轉
發表時間:2024-06-18 來源:明輝站整理相關軟件相關文章人氣:25
[摘要]MySQL數據目錄結構(1)[晏子]從概念上講,大多數關系數據庫系統是相似的:它們有一系列數據庫組成,每個數據庫包含一系列數據庫表,但每個系統有各自組織其管理的數據方式,MySQL也不例外。缺省地,所有由MySQL服務器mysqld管理的數據存儲在一個稱為MySQL數據目錄的地方,所有數據庫都存放...
MySQL數據目錄結構(1)
[晏子]
從概念上講,大多數關系數據庫系統是相似的:它們有一系列數據庫組成,每個數據庫包含一系列數據庫表,但每個系統有各自組織其管理的數據方式,MySQL也不例外。
缺省地,所有由MySQL服務器mysqld管理的數據存儲在一個稱為MySQL數據目錄的地方,所有數據庫都存放在哪兒,也包括提供服務器操作信息的狀態文件。如果你對一個MySQl安裝執行管理任務,你應該熟知數據目錄的布局及用途。
本文介紹下列專題:
- 如何確定數據目錄的位置。
- 服務器如何組織并提供對數據庫和它管理的表的訪問。
- 在哪里找到由服務器生成的狀態文件記憶它們包含什么內容。
- 如何改變缺省地點或數據目錄或單獨數據庫的組織結構。
1、數據目錄的位置
一個缺省數據目錄被編譯進了服務器,如果你從一個源代碼分發安裝MySQL,典型的缺省目錄為/usr/local/var,如果從RPM文件安裝則為/var/lib/mysql,如果從一個二進制分發安裝則是/usr/local/mysql/data。
在你啟動服務器,通過使用一個--datadir=/path/to/dir選項可以明確指定數據目錄位置。如果你想把數據目錄置于其它缺省位置外的某處,這很有用。
作為一名MySQL管理員,你應該知道你的數據目錄在哪里。如果你運行多個服務器,你應該是到所有數據目錄在哪里,但是如果你不知道確切的位置,由多種方法找到它:
- 使用mysqladmin variables從你的服務器直接獲得數據目錄路徑名。查找datadir變量的值,在Unix上,其輸出類似于:
%mysqladmin variables
+----------------------+----------------------+ variable_name Value +----------------------+----------------------+ back_log 5 connect_timeout 5 basedir /var/local/ datadir /usr/local/var/ ....
在Windows上,輸出可能看上去像這樣:
c:\mysqladmin variables +----------------------+----------------------+ variable_name Value +----------------------+----------------------+ back_log 5 connect_timeout 5 basedir c:\mysql\ datadir c:\mysql\data\ ....
如果你有多個服務器在運行,它們將在不同的TCP/IP端口或套接字上監聽,通過提供連接服務器正在監聽的端口或套接字的--port或--socket選項,你可以輪流獲得它們每一個的數據目錄信息:
%msqladmin --port=port_name variables
%mysqladmin --socket=/path/to/socket variables
mysqladmin命令可運行在任何你能從其連接服務器的主機上,如果你想在一個遠程主機連接服務器,使用一個--host=host_name選項:
%mysqladmin --host=host_name variables
在Windows上,你可以通過使用--pipe強制一個命令管道連接和--socket=pipe_name指定管道名來連接監聽一個命令管道的NT服務器:
c:\mysqladmin --pipe --socket=pipe_name variables - 你可以使用ps命令查看任何正在運行mysqld 進程的命令行。
試一下下列命令之一并尋找--datadir:
%ps axww grep mysqlBSD風格
%ps -ef grep mysqldSystem V風格
如果你的系統運行多個服務器,ps命令可能特別有用,因為你能馬上發現多個數據目錄位置,缺點是必須在服務器上運行,而且可能沒有有用的信息產生,除非在mysqld命令行上明確指定了--datadir選項。 - 如果MySQL是從一個源代碼分發安裝的,你可以檢查其配置信息確定數據目錄位置。例如,位置可從頂級Makefile中獲得,但是注意,位置是Makefile中的localstatedir值,不是datadir,而且,如果分發位于一個NFS掛載的文件系統并用來為多個主機構建MySQL,配置信息反映了分發被最新構建的主機,這可能不能提供你感興趣的主機的數據目錄信息。
- 如果上述方式失敗,你可以用find尋找數據庫文件,下列命令尋找“.frm”文件,它是任何MySQL安裝的一部分:
% find / -name ".frm" -print
在下文各例中,用DATADIR表示MySQL數據目錄位置。
2、數據目錄結構
MySQL數據目錄包含了服務器管理的所有數據目錄,這些文件被組織成一個樹狀結構,通過利用Unix或Windows文件系統的層次結構直接實現。
- 每個數據庫對應于數據目錄下的一個目錄。
- 在一個數據庫中的表對應于數據目錄下的文件。
數據目錄也包含由服務器產生的幾個狀態文件,如日志文件。這些文件提供了關于服務器操作的重要信息。對管理特別在出了問題而試圖確定問題原因時很有價值。例如,如果某個特定查詢殺死服務器,你可以通過檢查日志文件判別搗亂的查詢。
2.1 MySQL服務器怎樣提供對數據的訪問
在數據目錄下的一切由一個單獨的實體-MySQL服務器mysqld管理,客戶程序絕不直接操作數據。相反,服務器提供數據可訪問的切入點,它是客戶程序與它們想使用的數據之間的中介。
當服務器啟動時,如果有需要,它打開日志文件,然后通過監聽網絡連接位數據目錄呈現一個網絡接口。要訪問數據,客戶程序建立對服務器的一個連接,然后以MySQL查詢傳輸請求來執行希望的操作。服務器執行每一個操作并將結果發回用戶。服務器是多線程的并能服務多個同時的客戶連接。然而,因為修改操作一個執行一個,實際效果是順序化請求,以使兩個客戶決不能在同一時刻改變同一記錄。
在正常的情況下,讓服務器作為數據庫訪問的唯一仲裁者提供了避免可從同時訪問數據庫表的多個進程的破壞的保證。管理員應該知道有時服務器沒有對數據目錄的獨裁控制。
- 當你在一個單個數據目錄上運行多個服務器。一般倪云新一個服務器管理主機上的所有數據庫,但是有可能運行多個服務器。如果這完成提供對多個獨立數據目錄的訪問,沒有相互影響的問題,但喲也能啟動多個服務器并指向同一個目錄。一般地,這不是一個好主意。如果你試圖這樣,最好是你的系統提供良好的文件鎖定功能,否則服務器將不能正確協作。如果你將多個服務器同時寫入日志文件,你也冒著你的日志文件稱為混亂的根源的風險。
- 在你運行isamchk和myisamchk時。isamchk和myisamchk實用程序用于表的維護、診錯和修復,就想你想的那樣,因為這些程序可以修改表內容,允許它們與服務器正在操作的同時對表操作,這樣能導致表損壞。理解如何限制這種相互影響是很重要的,這樣你不會損壞你的表。
2.2 數據目表示
每個MySQL服務器管理的數據庫有自己的數據庫表,它是數據目錄下的一個子目錄,其名字與它表示的數據庫相同。例如數據庫my_db對應于數據庫目錄DATADIR/my_db。
這種表示允許多個數據庫級的語句在其實現中十分簡單。CREATE DATABASE db_name在數據目錄中創建一個db_name空目錄,具有只允許MySQL服務器用戶(運行服務器的Unix用戶)的屬主和模式,這等價于下列手工在服務器主機上創建數據庫:
%mkdir DATADIR/db_name%chmod 700 DADADIR/db_name
用一個空目錄表示一個新數據庫的最簡單方法與其它數據庫甚至為一個空數據庫創建大量的控制文件或系統文件正好相反。
DROP DATABASE語句實現同樣簡單。DROP DATABASE db_name刪除數據庫中的db_name目錄和所有表文件,這幾乎與下列命令一樣:
%rm -rf DATADIR/db_name
(差別是服務器只刪除具有已知用于表的后綴名的文件。如果你在數據庫目錄創建了其它文件。則服務器保留它們,而且目錄本身不被刪除。
SHOW DATABASE基本上不做什么,只是列出位于數據目錄中的目錄名。有些數據庫系統保持一個主表,用于維護所有數據庫,但在MySQL無此構件。由于賦予數據目錄結構的簡潔性,數據庫列表隱含在數據目錄的內容中,而且這樣的表不必有額外的開銷。
2.3 數據庫表的表示
每個數據庫在數據庫目錄中有3個文件:一個樣式(描述文件)、一個數據文件和一個索引文件。每個文件的基本名是表名,文件名擴展名代表文件類型。擴展名如下表。數據和索引文件的擴展名指出表使用老式IASM索引或新式MyISAM索引。