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