熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

MySQL數據目錄結構

2013-11-23 20:56:59  來源: MySQL 

  從概念上講大多數關系數據庫系統是相似的它們有一系列數據庫組成每個數據庫包含一系列數據庫表但每個系統有各自組織其管理的數據方式MySQL也不例外
  
  缺省地所有由MySQL服務器mysqld管理的數據存儲在一個稱為MySQL數據目錄的地方所有數據庫都存放在哪兒也包括提供服務器操作信息的狀態文件如果你對一個MySQl安裝執行管理任務你應該熟知數據目錄的布局及用途
  
  本文介紹下列專題
  
  如何確定數據目錄的位置
  服務器如何組織並提供對數據庫和它管理的表的訪問
  在哪裡找到由服務器生成的狀態文件記憶它們包含什麼內容
  如何改變缺省地點或數據目錄或單獨數據庫的組織結構
  
  數據目錄的位置
  一個缺省數據目錄被編譯進了服務器如果你從一個源代碼分發安裝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 | |
  | connect_timeout | |
  | basedir | /var/local/ |
  | datadir | /usr/local/var/ |
  
  在Windows上輸出可能看上去像這樣
  c:mysqladmin variables
  
  +++
  | variable_name | Value |
  +++
  | back_log | |
  | connect_timeout | |
  | basedir | c:mysql |
  | datadir | c:mysqldata |
  
  如果你有多個服務器在運行它們將在不同的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 mysql BSD風格
  
  %ps ef | grep mysqld System V風格
  
  如果你的系統運行多個服務器ps命令可能特別有用因為你能馬上發現多個數據目錄位置缺點是必須在服務器上運行而且可能沒有有用的信息產生除非在mysqld命令行上明確指定了datadir選項
  
  如果MySQL是從一個源代碼分發安裝的你可以檢查其配置信息確定數據目錄位置例如位置可從頂級Makefile中獲得但是注意位置是Makefile中的localstatedir值不是datadir而且如果分發位於一個NFS掛載的文件系統並用來為多個主機構建MySQL配置信息反映了分發被最新構建的主機這可能不能提供你感興趣的主機的數據目錄信息
  如果上述方式失敗你可以用find尋找數據庫文件下列命令尋找frm文件它是任何MySQL安裝的一部分
  
  % find / name frm print
  
  在下文各例中用DATADIR表示MySQL數據目錄位置
  
  數據目錄結構
  
  MySQL數據目錄包含了服務器管理的所有數據目錄這些文件被組織成一個樹狀結構通過利用Unix或Windows文件系統的層次結構直接實現
  
  每個數據庫對應於數據目錄下的一個目錄
  在一個數據庫中的表對應於數據目錄下的文件
  數據目錄也包含由服務器產生的幾個狀態文件如日志文件這些文件提供了關於服務器操作的重要信息對管理特別在出了問題而試圖確定問題原因時很有價值例如如果某個特定查詢殺死服務器你可以通過檢查日志文件判別搗亂的查詢
  
   MySQL服務器怎樣提供對數據的訪問
  
  在數據目錄下的一切由一個單獨的實體MySQL服務器mysqld管理客戶程序絕不直接操作數據相反服務器提供數據可訪問的切入點它是客戶程序與它們想使用的數據之間的中介
  
  當服務器啟動時如果有需要它打開日志文件然後通過監聽網絡連接位數據目錄呈現一個網絡接口要訪問數據客戶程序建立對服務器的一個連接然後以MySQL查詢傳輸請求來執行希望的操作服務器執行每一個操作並將結果發回用戶服務器是多線程的並能服務多個同時的客戶連接然而因為修改操作一個執行一個實際效果是順序化請求以使兩個客戶決不能在同一時刻改變同一記錄
  
  在正常的情況下讓服務器作為數據庫訪問的唯一仲裁者提供了避免可從同時訪問數據庫表的多個進程的破壞的保證管理員應該知道有時服務器沒有對數據目錄的獨裁控制
  
  當你在一個單個數據目錄上運行多個服務器一般倪雲新一個服務器管理主機上的所有數據庫但是有可能運行多個服務器如果這完成提供對多個獨立數據目錄的訪問沒有相互影響的問題但喲也能啟動多個服務器並指向同一個目錄一般地這不是一個好主意如果你試圖這樣最好是你的系統提供良好的文件鎖定功能否則服務器將不能正確協作如果你將多個服務器同時寫入日志文件你也冒著你的日志文件稱為混亂的根源的風險
  在你運行isamchk和myisamchk時isamchk和myisamchk實用程序用於表的維護診錯和修復就想你想的那樣因為這些程序可以修改表內容允許它們與服務器正在操作的同時對表操作這樣能導致表損壞理解如何限制這種相互影響是很重要的這樣你不會損壞你的表
  
   數據目表示
  
  每個MySQL服務器管理的數據庫有自己的數據庫表它是數據目錄下的一個子目錄其名字與它表示的數據庫相同例如數據庫my_db對應於數據庫目錄DATADIR/my_db
  
  這種表示允許多個數據庫級的語句在其實現中十分簡單CREATE DATABASE db_name在數據目錄中創建一個db_name空目錄具有只允許MySQL服務器用戶(運行服務器的Unix用戶)的屬主和模式這等價於下列手工在服務器主機上創建數據庫
  
  %mkdir DATADIR/db_name
  %chmod DADADIR/db_name
  用一個空目錄表示一個新數據庫的最簡單方法與其它數據庫甚至為一個空數據庫創建大量的控制文件或系統文件正好相反
  
  DROP DATABASE語句實現同樣簡單DROP DATABASE db_name刪除數據庫中的db_name目錄和所有表文件這幾乎與下列命令一樣
  
  %rm rf DATADIR/db_name
  (差別是服務器只刪除具有已知用於表的後綴名的文件如果你在數據庫目錄創建了其它文件則服務器保留它們而且目錄本身不被刪除
  
  SHOW DATABASE基本上不做什麼只是列出位於數據目錄中的目錄名有些數據庫系統保持一個主表用於維護所有數據庫但在MySQL無此構件由於賦予數據目錄結構的簡潔性數據庫列表隱含在數據目錄的內容中而且這樣的表不必有額外的開銷
  
   數據庫表的表示
  
  每個數據庫在數據庫目錄中有個文件一個樣式(描述文件)一個數據文件和一個索引文件每個文件的基本名是表名文件名擴展名代表文件類型擴展名如下表數據和索引文件的擴展名指出表使用老式IASM索引或新式MyISAM索引
  
  表 MySQL文件類型
  文件類型 文件名擴展名 文件內容
  樣式文件 frm 描述表的結構(它的列列類型索引等)
  數據文件 ISD(ISAM)
  或MYD(MyISAM) 包含數據文件上的所有索引的索引樹
  索引文件 ISM(ISAM)
  或MYI(MyISAM) 該索引文件依賴表是否有索引而存在
  
  當你發出一條CREATE TABLE tbl_name時語句定義表的結構時服務器創建一個名為tbl_namefrm的文件它包括該結構的內部編碼同時也創建一個空數據和索引文件初始化為包含指出無記錄和無索引的信息(如果CREATE TABLE語句包括索引指定索引文件反映出這些索引)對應於表的文件的屬主和模式被設置為只允許MySQL服務器用戶訪問
  
  當你發出一條ALTER TABLE tbl_name語句時服務器重新編碼tbl_namefrm並修改數據和索引文件的內容以反映語句指定的結構改變對於CREATE INDEX和DROP INDEX也是一樣因為它們被服務器視為與ALTER TABLE等價DROP TABLE通過刪除對應於表的三個文件來實現
  
  雖然你可以通過刪除數據庫目錄中對應於表的三個文件但不能手工創建或修改一個表如果my_db是當前數據庫DROP TABLE my_tbl大概等價於下列命令 From:http://tw.wingwit.com/Article/program/MySQL/201311/29333.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.