程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 了解MySQl數據庫目錄

了解MySQl數據庫目錄

編輯:關於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:mysqlbin>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 文件基名的一個列表。某些數據庫系統維護一個列出了數據庫中的所有表的登記。但 MySQL 不這樣做,因為沒有必要,這個“登記”隱含在了數據目錄的結構中。

  MySQL的狀態文件

  除數據庫目錄外,MySQL 數據目錄還包含許多狀態文件。表10-3 概括介紹了這些文件。大多數狀態文件的缺省名稱從服務器主機名字中生成,在此表中表示為 HOSTNAME。

  服務器在啟動時將它的進程 ID(PID )寫入 PID 文件,並在關閉時刪除該文件。PID 文件是一種方法,用這種方法,其他的進程可以找到該服務器。例如,如果您在系統關閉時運行 mysql.server 腳本來關閉 MySQL 服務器,則該腳本將檢查 PID 文件以確定它需要哪個進程來發送一個終止信號。

  錯誤日志由 safe_mysqld 產生,作為服務器標准錯誤輸出結果的重定向,它包含服務器寫入 stderr 的所有消息。這意味著僅當通過調用 safe_mysqld 啟動服務器時,錯誤日志才存在(總之,這是啟動服務器的首選方法,因為,如果由於一個錯誤使錯誤日志存在,則 safe_MySQLd將重新啟動服務器)。

  常規日志和更新日志是可選的,可以用 --log 和 --log-update 服務器選項開啟需要的日志類型。

  常規進程提供有關服務器運作的常規信息:誰從哪裡進行了連接,以及他們發布了什麼查詢。更新日志也提供查詢信息,但僅僅是修改過的數據庫內容的查詢信息。更新日志的內容是一些 SQL 語句,這些語句可以通過將它們輸入到 MySQL 客戶機程序來運行。如果出現崩潰且必須轉到備份文件時,更新日志將是有用的,因為您能夠通過將更新日志輸入到服務器來重復這些自崩潰以來所完成的更新操作。這將使得數據庫恢復到崩潰發生時所處的狀態上。

  下面是一個實例,它是作為一個短客戶機會話的結果出現在常規日志中的信息中的,這個會話在 test 數據庫中從mytest.pet復制一個表,並插入一行到該表中,然後刪除該表:

  注意第二行是一個錯誤的語句,但是也被記錄下來。

  常規日志包含日期和時間、服務器線程 ID、事件類型以及特定事件信息的列。

  同一個會話出現在如下的更新日志中:

  use test;

  create table mytest select * from mytest.pet;

  insert into mytest set name='tom',owner='jerry',specIEs='cat',sex='f',birth='2000-01-01';

  drop table mytest;

  更新紀錄中沒有記錄錯誤的語句,因此對於恢復被破壞的數據庫內容非常有意義。

  對於更新日志,日志的擴展格式是可用的,即使是用 --log - long - format 選項。擴展的日志提供有關誰何時發布查詢的信息。當然,這將使用更多的磁盤空間,但是,如果您不將更新日志的內容與常規日志中的連接事件相聯系就想知道誰正在做什麼的話,擴展日志或許是可用的。

  確保日志文件的安全且不被用戶任意讀取是個好注意。常規日志和更新日志都包含有諸如口令這樣的敏感信息,這是因為它們包含了查詢的文本。下面是您不想讓任何人都能讀取的日志項,因為它顯示了 root 用戶的口令:

  010206 23:30:02    4 Query   update MySQL.user set password=passWord("peking77.") where User="root"

  有關檢查可設置數據目錄許可權的信息,數據目錄安全的簡短指令由下列命令組成:

  $ chmod 700 DATADIR

  以擁有該數據目錄的 UNIX 用戶身份來運行此命令。還要確保服務器以該用戶身份運行,否則此命令不僅將其他用戶排斥在該數據目錄之外(您想要的),還將阻止服務器訪問您的數據庫(您不要的)。


  狀態文件出現在數據目錄的最高級,就像數據庫目錄一樣,因此您可能會想到那些文件的名字是否會相互混淆或者被誤認為是數據庫名(例如,當服務器正在執行 SHOW DATABASE 語句時)。答案是:不會的。狀態和日志信息存儲在文件中,而數據庫是目錄,因此可執行程序可以將它們與一個簡單的 stat() 調用相區別(是服務器告訴它們怎樣區分的)。如果您正在監視數據目錄,則可以通過使用 ls -l 將狀態文件從數據庫目錄中區分開來,並且檢查該模式信息的第一個字符以查看它是‘-’還是‘d’:

  您還可以通過查看名字而簡單地告之:所有狀態文件名都包含一個句點,但是數據庫目錄名沒有句點(句點不是數據庫名的合法字符)。

  總結

  通過本節,讀者可以對MySQL的數據保存方式有了一定的認識。本節中較為重要的內容有:

  1、數據庫目錄的位置

  2、MySQL是如何表示數據表的

  3、MySQL的狀態文件的種類和作用

  了解MySQL如何保存數據,以及狀態文件的作用,對於備份數據庫是有重要意義的,根據MySQL數據庫目錄的特點,直接拷貝就是備份數據的重要方法之一。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved