溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql數(shù)據(jù)目錄結(jié)構(gòu)是怎么樣的

發(fā)布時(shí)間:2021-11-16 16:56:12 來(lái)源:億速云 閱讀:118 作者:柒染 欄目:MySQL數(shù)據(jù)庫(kù)

mysql數(shù)據(jù)目錄結(jié)構(gòu)是怎么樣的,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

mysql數(shù)據(jù)目錄結(jié)構(gòu)(轉(zhuǎn))[@more@]  從概念上講,大多數(shù)關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)是相似的:它們有一系列數(shù)據(jù)庫(kù)組成,每個(gè)數(shù)據(jù)庫(kù)
  包含一系列數(shù)據(jù)庫(kù)表,但每個(gè)系統(tǒng)有各自組織其管理的數(shù)據(jù)方式,mysql也不例外。
  缺省地,所有由mysql服務(wù)器mysqld管理的數(shù)據(jù)存儲(chǔ)在一個(gè)稱為mysql數(shù)據(jù)目錄的地方,
  所有數(shù)據(jù)庫(kù)都存放在哪兒,也包括提供服務(wù)器操作信息的狀態(tài)文件。 如果你對(duì)一個(gè)mysql安
  裝執(zhí)行管理任務(wù),你應(yīng)該熟知數(shù)據(jù)目錄的布局及用途。
  本文介紹下列專題:
  如何確定數(shù)據(jù)目錄的位置。
從概念上講,大多數(shù)關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)是相似的:它們有一系列數(shù)據(jù)庫(kù)組成,每個(gè)數(shù)據(jù)庫(kù)
  包含一系列數(shù)據(jù)庫(kù)表,但每個(gè)系統(tǒng)有各自組織其管理的數(shù)據(jù)方式,mysql也不例外。
  缺省地,所有由mysql服務(wù)器mysqld管理的數(shù)據(jù)存儲(chǔ)在一個(gè)稱為mysql數(shù)據(jù)目錄的地方,
  所有數(shù)據(jù)庫(kù)都存放在哪兒,也包括提供服務(wù)器操作信息的狀態(tài)文件。 如果你對(duì)一個(gè)mysql安
  裝執(zhí)行管理任務(wù),你應(yīng)該熟知數(shù)據(jù)目錄的布局及用途。
  本文介紹下列專題:
  如何確定數(shù)據(jù)目錄的位置。
  服務(wù)器如何組織并提供對(duì)數(shù)據(jù)庫(kù)和它管理的表的訪問(wèn)。
  在哪里找到由服務(wù)器生成的狀態(tài)文件記憶它們包含什么內(nèi)容。
  如何改變?nèi)笔〉攸c(diǎn)或數(shù)據(jù)目錄或單獨(dú)數(shù)據(jù)庫(kù)的組織結(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ù)器,通過(guò)使用一個(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:mysqldata |....
  
  如果你有多個(gè)服務(wù)器在運(yùn)行,它們將在不同的TCP/IP端口或套接字上監(jiān)聽(tīng),通過(guò)提供連
  接服務(wù)器正在監(jiān)聽(tīng)的端口或套接字的--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上, 你可以通過(guò)使用--pipe強(qiáng)制一個(gè)命令管道連接和--socket=pipe_name指
  定管道名來(lái)連接監(jiān)聽(tīng)一個(gè)命令管道的NT服務(wù)器:
  c:mysqladmin --pipe --socket=pipe_name variables
  你可以使用ps命令查看任何正在運(yùn)行mysqld 進(jìn)程的命令行。
  試一下下列命令之一并尋找--datadir:
  %ps axww | grep mysql BSD風(fēng)格
  %ps -ef | grep mysqld System V風(fēng)格
  如果你的系統(tǒng)運(yùn)行多個(gè)服務(wù)器,ps命令可能特別有用,因?yàn)槟隳荞R上發(fā)現(xiàn)多個(gè)數(shù)據(jù)目錄
  位置,缺點(diǎn)是必須在服務(wù)器上運(yùn)行,而且可能沒(méi)有有用的信息產(chǎn)生,除非在mysqld命令行上
  明確指定了--datadir選項(xiàng)。
  如果mysql是從一個(gè)源代碼分發(fā)安裝的,你可以檢查其配置信息確定數(shù)據(jù)目錄位置。 例
  如,位置可從頂級(jí)Makefile中獲得,但是注意,位置是Makefile中的localstatedir值, 不
  是datadir,而且,如果分發(fā)位于一個(gè)NFS掛載的文件系統(tǒng)并用來(lái)為多個(gè)主機(jī)構(gòu)建mysql, 配
  置信息反映了分發(fā)被最新構(gòu)建的主機(jī),這可能不能提供你感興趣的主機(jī)的數(shù)據(jù)目錄信息。
  如果上述方式失敗,你可以用find尋找數(shù)據(jù)庫(kù)文件,下列命令尋找“.frm”文件,它是任
  何mysql安裝的一部分:
  % find / -name ".frm" -print
  在下文各例中,用DATADIR表示mysql數(shù)據(jù)目錄位置。
  2、數(shù)據(jù)目錄結(jié)構(gòu)
  mysql數(shù)據(jù)目錄包含了服務(wù)器管理的所有數(shù)據(jù)目錄,這些文件被組織成一個(gè)樹(shù)狀結(jié)構(gòu),
  通過(guò)利用Unix或Windows文件系統(tǒng)的層次結(jié)構(gòu)直接實(shí)現(xiàn)。
  每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)于數(shù)據(jù)目錄下的一個(gè)目錄。
  在一個(gè)數(shù)據(jù)庫(kù)中的表對(duì)應(yīng)于數(shù)據(jù)目錄下的文件。
  數(shù)據(jù)目錄也包含由服務(wù)器產(chǎn)生的幾個(gè)狀態(tài)文件,如日志文件。這些文件提供了關(guān)于服務(wù)
  器操作的重要信息。對(duì)管理特別在出了問(wèn)題而試圖確定問(wèn)題原因時(shí)很有價(jià)值。例如,如果某
  個(gè)特定查詢殺死服務(wù)器,你可以通過(guò)檢查日志文件判別搗亂的查詢。
  2.1 mysql服務(wù)器怎樣提供對(duì)數(shù)據(jù)的訪問(wèn)
  在數(shù)據(jù)目錄下的一切由一個(gè)單獨(dú)的實(shí)體-mysql服務(wù)器mysqld管理,客戶程序絕不直接操
  作數(shù)據(jù)。相反,服務(wù)器提供數(shù)據(jù)可訪問(wèn)的切入點(diǎn),它是客戶程序與它們想使用的數(shù)據(jù)之間的
  中介。
  當(dāng)服務(wù)器啟動(dòng)時(shí),如果有需要,它打開(kāi)日志文件,然后通過(guò)監(jiān)聽(tīng)網(wǎng)絡(luò)連接位數(shù)據(jù)目錄呈
  現(xiàn)一個(gè)網(wǎng)絡(luò)接口。要訪問(wèn)數(shù)據(jù),客戶程序建立對(duì)服務(wù)器的一個(gè)連接, 然后以mysql查詢傳輸
  請(qǐng)求來(lái)執(zhí)行希望的操作。服務(wù)器執(zhí)行每一個(gè)操作并將結(jié)果發(fā)回用戶。服務(wù)器是多線程的并能
  服務(wù)多個(gè)同時(shí)的客戶連接。然而,因?yàn)樾薷牟僮饕粋€(gè)執(zhí)行一個(gè),實(shí)際效果是順序化請(qǐng)求,以
  使兩個(gè)客戶決不能在同一時(shí)刻改變同一記錄。
  在正常的情況下,讓服務(wù)器作為數(shù)據(jù)庫(kù)訪問(wèn)的唯一仲裁者提供了避免可從同時(shí)訪問(wèn)數(shù)據(jù)
  庫(kù)表的多個(gè)進(jìn)程的破壞的保證。管理員應(yīng)該知道有時(shí)服務(wù)器沒(méi)有對(duì)數(shù)據(jù)目錄的獨(dú)裁控制。
  當(dāng)你在一個(gè)單個(gè)數(shù)據(jù)目錄上運(yùn)行多個(gè)服務(wù)器。一般倪云新一個(gè)服務(wù)器管理主機(jī)上的所有
  數(shù)據(jù)庫(kù),但是有可能運(yùn)行多個(gè)服務(wù)器。如果這完成提供對(duì)多個(gè)獨(dú)立數(shù)據(jù)目錄的訪問(wèn),沒(méi)有相
  互影響的問(wèn)題,但喲也能啟動(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í)
  對(duì)表操作,這樣能導(dǎo)致表?yè)p壞。理解如何限制這種相互影響是很重要的,這樣你不會(huì)損壞你
  的表。
  2.2 數(shù)據(jù)目表示
  每個(gè)mysql服務(wù)器管理的數(shù)據(jù)庫(kù)有自己的數(shù)據(jù)庫(kù)表,它是數(shù)據(jù)目錄下的一個(gè)子目錄, 其
  名字與它表示的數(shù)據(jù)庫(kù)相同。例如數(shù)據(jù)庫(kù)my_db對(duì)應(yīng)于數(shù)據(jù)庫(kù)目錄DATADIR/my_db。
  這種表示允許多個(gè)數(shù)據(jù)庫(kù)級(jí)的語(yǔ)句在其實(shí)現(xiàn)中十分簡(jiǎ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ù)庫(kù):
  %mkdir DATADIR/db_name%chmod 700 DADADIR/db_name
  用一個(gè)空目錄表示一個(gè)新數(shù)據(jù)庫(kù)的最簡(jiǎn)單方法與其它數(shù)據(jù)庫(kù)甚至為一個(gè)空數(shù)據(jù)庫(kù)創(chuàng)建大
  量的控制文件或系統(tǒng)文件正好相反。
  DROP DATABASE語(yǔ)句實(shí)現(xiàn)同樣簡(jiǎn)單。 DROP DATABASE db_name刪除數(shù)據(jù)庫(kù)中的db_name目
  錄和所有表文件,這幾乎與下列命令一樣:
  %rm -rf DATADIR/db_name
  (差別是服務(wù)器只刪除具有已知用于表的后綴名的文件。 如果你在數(shù)據(jù)庫(kù)目錄創(chuàng)建了其
  它文件。則服務(wù)器保留它們,而且目錄本身不被刪除。
  SHOW DATABASE基本上不做什么,只是列出位于數(shù)據(jù)目錄中的目錄名。 有些數(shù)據(jù)庫(kù)系統(tǒng)
  保持一個(gè)主表,用于維護(hù)所有數(shù)據(jù)庫(kù),但在mysql無(wú)此構(gòu)件。由于賦予數(shù)據(jù)目錄結(jié)構(gòu)的簡(jiǎn)潔性,數(shù)據(jù)庫(kù)列表隱含在數(shù)據(jù)目錄的內(nèi)容中,而且這樣的表不必有額外的開(kāi)銷。
  2.3 數(shù)據(jù)庫(kù)表的表示
  每個(gè)數(shù)據(jù)庫(kù)在數(shù)據(jù)庫(kù)目錄中有3個(gè)文件:一個(gè)樣式(描述文件)、 一個(gè)數(shù)據(jù)文件和一個(gè)
  索引文件。每個(gè)文件的基本名是表名,文件名擴(kuò)展名代表文件類型。擴(kuò)展名如下表。數(shù)據(jù)和
  索引文件的擴(kuò)展名指出表使用老式IASM索引或新式MyISAM索引。表 mysql文件類型
  文件類型 文件名擴(kuò)展名 文件內(nèi)容
  樣式文件 .frm 描述表的結(jié)構(gòu)(它的列、列類型、索引等)。
  數(shù)據(jù)文件 .ISD(ISAM)
  或.MYD(MyISAM) 包含數(shù)據(jù)文件上的所有索引的索引樹(shù)。
  索引文件 .ISM(ISAM)
  或.MYI(MyISAM) 該索引文件依賴表是否有索引而存在。
  當(dāng)你發(fā)出一條CREATE TABLE tbl_name時(shí)語(yǔ)句定義表的結(jié)構(gòu)時(shí),服務(wù)器創(chuàng)建一個(gè)名為
  tbl_name.frm的文件,它包括該結(jié)構(gòu)的內(nèi)部編碼,同時(shí)也創(chuàng)建一個(gè)空數(shù)據(jù)和索引文件,初始
  化為包含指出無(wú)記錄和無(wú)索引的信息(如果CREATE TABLE語(yǔ)句包括索引指定,索引文件反映
  出這些索引)。對(duì)應(yīng)于表的文件的屬主和模式被設(shè)置為只允許mysql服務(wù)器用戶訪問(wèn)。
  當(dāng)你發(fā)出一條ALTER TABLE tbl_name語(yǔ)句時(shí),服務(wù)器重新編碼tbl_name.frm,并修改數(shù)
  據(jù)和索引文件的內(nèi)容以反映語(yǔ)句指定的結(jié)構(gòu)改變。對(duì)于CREATE INDEX和DROP INDEX也是一樣,
  因?yàn)樗鼈儽环?wù)器視為與ALTER TABLE等價(jià)。 DROP TABLE通過(guò)刪除對(duì)應(yīng)于表的三個(gè)文件來(lái)實(shí)
  現(xiàn)。
  雖然你可以通過(guò)刪除數(shù)據(jù)庫(kù)目錄中對(duì)應(yīng)于表的三個(gè)文件,但不能手工創(chuàng)建或修改一個(gè)表,
  如,如果my_db是當(dāng)前數(shù)據(jù)庫(kù),DROP TABLE my_tbl大概等價(jià)于下列命令。
  % rm -rf DATADIR/my_db/my_tbl.*
  SHOW TABLE my_db的輸出只是列出my_db數(shù)據(jù)庫(kù)目錄中的.frm文件的基文件名。 有些數(shù)
  據(jù)庫(kù)系統(tǒng)一個(gè)注冊(cè)表,列舉所有包含在一個(gè)數(shù)據(jù)庫(kù)中的表,mysql不是,因?yàn)椴槐匾?quot;注冊(cè)
  表"隱含在數(shù)據(jù)目錄的結(jié)構(gòu)中。
  
  2.4 操作系統(tǒng)對(duì)數(shù)據(jù)庫(kù)和表命名的限制
  mysql對(duì)命名數(shù)據(jù)庫(kù)和表有一個(gè)原則:名字可以由當(dāng)前字符集中的任何字母數(shù)字字符組成,
  下劃線和美元符$也可以。名字最長(zhǎng)為64個(gè)字符。
  然而,因?yàn)閿?shù)據(jù)庫(kù)和表的名字對(duì)應(yīng)于目錄和文件名,服務(wù)器運(yùn)行的操作系統(tǒng)可能強(qiáng)加額
  外的限制。
  首先,數(shù)據(jù)庫(kù)和表名僅限于對(duì)文件名合法的字符,如$在mysql的原則中是允許的,但是
  如果你的操作系統(tǒng)不允許,則你不能在目錄或表名中使用它。實(shí)際上,這對(duì)Unix或Windows
  不是所擔(dān)心的,最大的難度是在執(zhí)行數(shù)據(jù)庫(kù)管理時(shí)直接在shell中引用名字,例如,如果你
  命名一個(gè)數(shù)據(jù)庫(kù)如$my_db,包含一個(gè)美元符,任何從shell中對(duì)該名字的引用可能被shell
  解釋為對(duì)一個(gè)變量的引用:
  %ls $my_db
  my_db:undefined variable
  對(duì)此,你必須轉(zhuǎn)義$字符或用引號(hào)禁止其特殊含義:
  %ls $my_db
  %ls '$my_db'
  如果你用引號(hào),一定要用單引號(hào),而雙引號(hào)并不禁止變量解釋。
  其次,雖然mysql允許數(shù)據(jù)庫(kù)和表名最長(zhǎng)到64個(gè)字符, 但名字的長(zhǎng)度受限于你的操作系
  統(tǒng)限定的長(zhǎng)度,一般這不是一個(gè)問(wèn)題(雖然老的System V強(qiáng)制14個(gè)字符)。在這種情況下,
  你數(shù)據(jù)庫(kù)名的上限為14個(gè)字符,而表名上限為10個(gè)字符,因?yàn)楸硎颈淼奈募幸粋€(gè)點(diǎn)(.)
  和三個(gè)字符的擴(kuò)展名。
  第三,文件系統(tǒng)的大小寫敏感性影響到你如何命名和引用數(shù)據(jù)庫(kù)和表名。如果文件系統(tǒng)
  是大小寫敏感的(如Unix),兩個(gè)名字my_tbl和MY_TBL是不同的表。如果文件系統(tǒng)不是大小
  寫敏感的(如Windows),這兩個(gè)名字指的是相同的表。 如果你用一個(gè)Unix服務(wù)器開(kāi)發(fā)數(shù)據(jù)
  庫(kù),并且如果你有可能轉(zhuǎn)移到Windows,你應(yīng)該記住這一點(diǎn)。
  
  2.5 mysql狀態(tài)文件
  除了數(shù)據(jù)庫(kù)目錄,mysql數(shù)據(jù)目錄還包含很多狀態(tài)文件,這些文件總結(jié)在下表中。 大多
  數(shù)文件的缺省名從服務(wù)器主機(jī)名生成,在下表中表示為HOSTNAME。表 mysql狀態(tài)文件
  文件類型 缺省名 文件內(nèi)容
  進(jìn)程ID HOSTNAME.pid 服務(wù)器進(jìn)程的ID
  出錯(cuò)日志 HOSTNAME.err 啟動(dòng)和關(guān)閉事件和出錯(cuò)情況
  一般日志 HOSTNAME.log 連接/斷開(kāi)事件和查詢信息
  更新日志 HOSTNAME.nnn 修改表結(jié)構(gòu)級(jí)內(nèi)容的所有查詢文本
  
  當(dāng)服務(wù)器啟動(dòng)時(shí),它將其進(jìn)程ID寫入進(jìn)程ID(PID)文件中,而在它關(guān)閉時(shí),刪除該文件。
  PID文件是允許服務(wù)器本身被其他進(jìn)程找到的工具。例如,如果你運(yùn)行mysql.server,在系統(tǒng)
  關(guān)閉時(shí),關(guān)閉mysql服務(wù)器的腳本檢查PID文件以決定它需要向哪個(gè)進(jìn)程發(fā)出一個(gè)終止信號(hào)。
  出錯(cuò)日志由safe_mysqld創(chuàng)建,作為服務(wù)器標(biāo)準(zhǔn)出錯(cuò)輸出的重定向,它包含任何發(fā)到stderr
  的消息。這意味著只有你通過(guò)調(diào)用safe_mysqld啟動(dòng)服務(wù)器,出錯(cuò)文件才存在(無(wú)論如何,
  它是一個(gè)啟動(dòng)服務(wù)器的最好方法,因?yàn)槿绻捎诔鲥e(cuò)而退出,safe_mysqld將重啟服務(wù)器。)。
  一般日志和更新日志是可選的。你可以只開(kāi)啟你需要的日志類型,用--log和
  --log-update服務(wù)器選項(xiàng)。
  一般日志提供服務(wù)器操作的一般信息:誰(shuí)從哪里連接服務(wù)器和他們發(fā)出什么查詢。更新
  日志提供查詢信息,但只有修改數(shù)據(jù)庫(kù)內(nèi)容的查詢。更新日志內(nèi)容被寫成SQL語(yǔ)句, 可以將
  它們提供給mysql客戶程序來(lái)執(zhí)行。如果你遇上崩潰,并且必須倒回備份文件, 更新日志就
  很有用,因?yàn)槟隳苤貜?fù)執(zhí)行自崩潰時(shí)的更新,通過(guò)將更新日志反饋給服務(wù)器,這允許你將數(shù)
  據(jù)庫(kù)恢復(fù)到崩潰發(fā)生時(shí)的狀態(tài)。
  下面是一個(gè)簡(jiǎn)單的例子,信息出現(xiàn)在一般日志中,它是一個(gè)創(chuàng)建一個(gè)在數(shù)據(jù)庫(kù)test中表,
  插入一行,然后刪除表的會(huì)話:
  990509 7:37:09 492 Connect Paul@localhost on test 492 Query show databases
  492 Query show tables 492 Field List tbl_1 492 Field List tbl_2 ...990509
  7:34:22 492 Query CREATE TABLE my_tbl (val INT)990509 7:34:34 492 Query
  INSERT INTO my_tbl values (1)990509 7:34:38 492 Query DROP TABLE my_tbl
  990509 7:34:40 492 Quit
  
  一般日志包含日期和時(shí)間、服務(wù)器進(jìn)程ID、事件類型和事件信息欄目。
  同一個(gè)會(huì)話出現(xiàn)在更新日志中看上去像這樣:
  use test;CREATE TABLE my_tbl (val int);INSERT INTO my_tbl VALUES(1);
  DROP TABLE my_tbl;
  
  對(duì)更新日志,用--log-long-format選項(xiàng)獲得一個(gè)擴(kuò)展形式的日志, 擴(kuò)展日志提供有關(guān)
  誰(shuí)何時(shí)發(fā)出每一條查詢,這使用更多的磁盤空間,但如果你想知道誰(shuí)在做什么,而不用將更
  新日志對(duì)照一般日志的內(nèi)容找到連接事件。
  對(duì)上面的會(huì)話,擴(kuò)展更新日志產(chǎn)生這樣的信息:
  # Time: 990507 7:32:42# User@Host: paul [paul] @ localhost []use test;
  CREATE TABLE my_tbl (val int);# User@Host: paul [paul] @ localhost
  []INSERT INTO my_tbl VALUES(1);# Time: 990507 7:32:43#
  User@Host: paul [paul] @ localhost []DROP TABLE my_tbl; 
  
  保證你的日志文件安全并且不讓任意用戶讀取是個(gè)好主意。一般日志和更新日志都能包
  含諸如口令等的敏感信息,因?yàn)樗鼈儼樵兾谋?。如?br/>  990509 7:23:31 4 Query UPDATE user SET Password=PASSWORD("secret") WHERE user="root"
  
  對(duì)于檢查和設(shè)置數(shù)據(jù)目錄的權(quán)限,請(qǐng)見(jiàn)《mysql安全性指南》。 使數(shù)據(jù)目錄安性的指令
  包含下列命令:
  % chmod 700 DATADIR
  以擁有數(shù)據(jù)目錄的Unix用戶運(yùn)行此命令。確保服務(wù)器也以此用戶運(yùn)行,否則該命令不僅
  將其它人拒之門外,它也阻止服務(wù)器訪問(wèn)你的數(shù)據(jù)庫(kù)。
  狀態(tài)文件出現(xiàn)在數(shù)據(jù)目錄的頂級(jí)目錄,就象數(shù)據(jù)庫(kù)目錄,所以你可能擔(dān)心這些文件名是
  否與數(shù)據(jù)庫(kù)名沖突或出錯(cuò)(如在服務(wù)器執(zhí)行SHOW DATABASES語(yǔ)句時(shí))。答案是不。狀態(tài)和日
  志文件信息存儲(chǔ)在文件中,而數(shù)據(jù)庫(kù)是目錄,所以可執(zhí)行程序能用一個(gè)簡(jiǎn)單的stat()調(diào)用區(qū)
  分它們。如果你看一下數(shù)據(jù)目錄,你可以區(qū)分狀態(tài)文件和數(shù)據(jù)庫(kù)目錄, 用ls -l并檢查模式
  的第一個(gè)字符是一個(gè)"_"還是一個(gè)"d"。
  你也可以簡(jiǎn)單地看一下名字,所有狀態(tài)文件名包含一個(gè)點(diǎn)("."),而數(shù)據(jù)庫(kù)目錄沒(méi)有
 ?。?在數(shù)據(jù)庫(kù)名中是無(wú)效字符)。
  
  MySQL數(shù)據(jù)目錄結(jié)構(gòu)(2)
  
  3 重定位數(shù)據(jù)庫(kù)目錄
  前面討論的數(shù)據(jù)目錄結(jié)構(gòu)是缺省配置,所有數(shù)據(jù)庫(kù)和狀態(tài)文件均包含其中,然而,你有
  某些自由決定數(shù)據(jù)目錄內(nèi)容的位置,本節(jié)討論為什么你可能移走部分?jǐn)?shù)據(jù)目錄(或甚至目錄
  本身)、你能移走什么以及你如何做這些改變。
  MySQL允許你重定位數(shù)據(jù)目錄或其中的成員,由幾個(gè)原因你為什么要這樣做:
  你能將數(shù)據(jù)目錄放在你缺省所在的文件系統(tǒng)更大容量的文件系統(tǒng)上。
  如果你的數(shù)據(jù)目錄在一個(gè)繁忙的硬盤上,你可能把它放在不太忙的磁盤上以均衡磁盤活
  動(dòng)。你可以把數(shù)據(jù)庫(kù)和日志文件放在分開(kāi)的磁盤上或跨磁盤分布。
  你可能想運(yùn)行多個(gè)服務(wù)器,各自有自己的數(shù)據(jù)目錄,這是解決每個(gè)進(jìn)程文件描述符限制
  問(wèn)題的一種方法,特別是你不能重新配置內(nèi)核以允許更高的限制。
  有些系統(tǒng)在例如/var/run中保存服務(wù)器的部分文件,你可能想把MySQL的PID文件也放在
  那兒,為了系統(tǒng)操作的一致性。
  
  3.1 重定位方法
  有兩種方法重定位數(shù)據(jù)目錄的內(nèi)容:
  你可以在服務(wù)器啟動(dòng)時(shí)指定選項(xiàng),在命令行或在一個(gè)選項(xiàng)文件的[mysqld]中。
  你可以移走要重定位的東西,然后在原位置做一個(gè)指向新位置的符號(hào)連接。
  
  兩種方法都不能解決你能重定位的一切,下表總結(jié)了什么能重定位和用哪種方法重定位。
  如果你使用選項(xiàng)文件,有可能在全局選項(xiàng)文件/etc/my.cnf(Windows上的c:my.cnf) 指定
  選項(xiàng)。當(dāng)前的Windows版本也尋找系統(tǒng)目錄(c:Windows或c:NT)。表 重定位方法
  重定位方法 適用的重定位方法
  整個(gè)數(shù)據(jù)目錄 啟動(dòng)選項(xiàng)或符號(hào)連接
  單個(gè)數(shù)據(jù)庫(kù)目錄 符號(hào)連接
  單個(gè)數(shù)據(jù)庫(kù)表 符號(hào)連接
  PID文件 啟動(dòng)選項(xiàng)
  一般日志 啟動(dòng)選項(xiàng)
  更新日志 啟動(dòng)選項(xiàng)
  
  你也可以使用缺省數(shù)據(jù)目錄中的選項(xiàng)文件my.cnf,但不推薦使用該文件。如果你想重定
  位數(shù)據(jù)目錄本身,你不得不讓缺省數(shù)據(jù)目錄可讀以便使你能在這里放置選項(xiàng)文件指定服務(wù)器
  應(yīng)該在哪里找到“真正”的數(shù)據(jù)目錄!這很混亂。如果你想使用一個(gè)選項(xiàng)文件指定服務(wù)器選項(xiàng),
  最好使用/etc/my.cnf。
  
  3.1 檢驗(yàn)重定位的效果
  在試圖重定位任何東西之前,檢驗(yàn)操作達(dá)到預(yù)期效果是個(gè)好主意。借助于du、df和
  ls -l命令獲得磁盤空間的信息,但這些依賴于你正確了解你的文件系統(tǒng)的布局。
  下面演示一個(gè)在你檢驗(yàn)一個(gè)屬目錄重定位時(shí)的設(shè)計(jì)陷阱。假定你的數(shù)據(jù)目錄是
  /usr/local/var,而你想把它移到/var/mysql,因?yàn)閐f顯示/var文件系統(tǒng)有很多的空閑空間:
  %df /usr /varFilesystem
  1k-blocks Used Avail Capacity Mounted on/dev/wd0s3e
  396895 292126 73018 80% /usr/dev/wd0s3f
  1189359 1111924 162287 15% /var  
  
  重定位的數(shù)據(jù)目錄在/usr文件系統(tǒng)上有多少空閑空間呢?要知道它,使用du -s找出該目錄使用多少空間。
  %cd /usr/local/var%du -s .133426
  
  這大約是130MB,真實(shí)這樣嗎?在數(shù)據(jù)目錄下試一下df:
  %df /usr/local/varFilesystem
  1k-blocks Used Avail Capacity Mounted on/dev/wd0s3f
  1189359 1111924 162287 15% /var 
  
  這就奇怪了。如果我們?yōu)榘?usr/local/var的文件系統(tǒng)申請(qǐng)空閑空間,為什么卻報(bào)告
  var上的空間呢?這里ls -l提供了答案:
  %ls -l /usr/local....lrwxrwxrwx 1 root wheel 10 Dec 11 23:33 var -> /var/mysql.... 
  
  輸出顯示/usr/local/var是對(duì)/var/mysql的符號(hào)連接,換句話說(shuō),數(shù)據(jù)目錄已經(jīng)被重定
  位于/var文件系統(tǒng),并用一個(gè)指向那里的符號(hào)連接代替。通過(guò)將數(shù)據(jù)目錄移到/var竟然釋放
  了/usr上那么多空間!
  
  3.2 重定位數(shù)據(jù)目錄
  
  要重定位數(shù)據(jù)目錄,關(guān)閉服務(wù)器并把數(shù)據(jù)目錄移到新位置上,然后你應(yīng)該刪除員數(shù)據(jù)目
  錄并用指向新位置的符號(hào)連接代替它,或用明確指出新位置的選項(xiàng)重啟服務(wù)器。下表列出指
  定位置的命令行和選項(xiàng)。表 數(shù)據(jù)目錄重定位語(yǔ)法
  選項(xiàng)源 語(yǔ)法
  命令行 --data-dir=/path/to/dir
  選項(xiàng)文件 [mysqld]
  datadir=/path/to/dir
  
  3.3 重定位數(shù)據(jù)庫(kù)
  
  數(shù)據(jù)庫(kù)能通過(guò)符號(hào)連接的方法移走。要重定位一個(gè)數(shù)據(jù)庫(kù),關(guān)閉服務(wù)器并移走數(shù)據(jù)庫(kù)目
  錄并刪除原來(lái)的數(shù)據(jù)庫(kù)目錄,用指向新位置的符號(hào)連接代替它,然后重啟服務(wù)器。
  下例顯示你如何將一個(gè)數(shù)據(jù)庫(kù)bigdb移到一個(gè)不同的地方:
  %mysqladmin -u root -p shutdownEnter password: ******
  %cd DATADIR%tar cf - bigdb | (cd /var/db; tar xf -)
  %mv bigdb bigdb.origln -s /var/db/bigdb .
  %safe_mysqld 
  你應(yīng)該以該數(shù)據(jù)目錄的擁有者執(zhí)行這些命令。為了安全起見(jiàn),原數(shù)據(jù)庫(kù)目錄改名為
  bigdb.orig。在你驗(yàn)證了服務(wù)器工作正常后,你可以刪除原數(shù)據(jù)目錄。
  %rm -rf bigdb.orig
  
  3.4 重定位數(shù)據(jù)庫(kù)表
  
  重定位一個(gè)單獨(dú)的表不是個(gè)好主意。你可以通過(guò)把表文件移到一個(gè)不同地方,并在數(shù)據(jù)
  目錄中創(chuàng)建指向這些文件的符號(hào)連接進(jìn)行。然而,如果你發(fā)出一條
  ALTER TABLE或OPTIMIZE TABLE語(yǔ)句,將不進(jìn)行你的修改。
  每個(gè)語(yǔ)句通過(guò)在數(shù)據(jù)庫(kù)目錄中創(chuàng)建一個(gè)實(shí)現(xiàn)你修改或優(yōu)化的臨時(shí)表,然后刪除原來(lái)的表
  并將臨時(shí)表更名為原來(lái)的表來(lái)完成,結(jié)果是你的符號(hào)連接被刪除,而且新表又回到數(shù)據(jù)庫(kù)目
  錄,這是你移走前的原表文件位置。更糟糕的是,你還沒(méi)有意識(shí)到它們?cè)谀莾海^續(xù)占據(jù)著
  空間,而且符號(hào)連接已經(jīng)被破壞,這樣以后當(dāng)你意識(shí)到發(fā)生的事情時(shí),如果你忘記你把它們
  移到什么地方,你可能沒(méi)有好辦法追蹤文件了。
  因?yàn)楹茈y保證具有表訪問(wèn)權(quán)的人不修改或優(yōu)化表,所以最好把表留在數(shù)據(jù)庫(kù)目錄中。
  
  3.5 重定位狀態(tài)文件
  
  你可以重中定位PID文件、一般日志和更新日志。出錯(cuò)日志由safe_mysqld用啟動(dòng)選項(xiàng)創(chuàng)
  建,而不能被重定位(除非你編輯safe_mysqld)。
  要在一個(gè)不同位置寫入狀態(tài)文件,關(guān)閉服務(wù)器,然后由指定新?tīng)顟B(tài)文件位置的適當(dāng)選項(xiàng)
  啟動(dòng)它。下表列出每一個(gè)文件的命令行和選項(xiàng)文件的語(yǔ)法。表 狀態(tài)文件重定位語(yǔ)法
  選項(xiàng)源 語(yǔ)法
  命令行 --pid-file=pidfile
  --log=lodfile
  --log-update=updatefile
  選項(xiàng)文件 [mysqld]
  pid-file=pidfile
  log=lodfile
  log-update=updatefile
  
  如果你用絕對(duì)路徑名指定狀態(tài)文件,用該路徑創(chuàng)建文件,否則文件在數(shù)據(jù)目錄下創(chuàng)建。
  如,如果你指定--pid-file=/var/run/mysqld.pid,PID文件是/var/run/mysqld.pid。如果
  你指定-pid-file=mysqld.pid,PID文件是DATADIR/mysqld.pid。
  如果你指定無(wú)擴(kuò)展名的更新日志文件,MySQL在它每次打開(kāi)更新日志時(shí)產(chǎn)生順序名。這些
  名字用一個(gè)擴(kuò)展名.nnn,這里.nnn是還沒(méi)被現(xiàn)有更新日志使用的第一個(gè)數(shù)字(如update.000,
  update.001等)。你可以通過(guò)明確指定擴(kuò)展名來(lái)覆蓋順序名,這時(shí)服務(wù)器將只使用指定的名字。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI