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