MySQL 数据目录
MySQL 的數據目錄
1. MySQL 的主要目錄結構
- 方式1:通過命令搜索
find / -name mysql
- 方式2(推薦):通過查看配置文件獲取目錄結構
vim /etc/my.cnf
- (重要)- my.cnf 配置信息說明
[mysqld]
bind-address=0.0.0.0
port=3306 # 端口號
user=mysql # 用戶
basedir=/usr/local/mysql #指定的是mysql 安裝目錄
datadir=/data/mysql #指定的是mysql數據目錄
socket=/tmp/mysql.sock #mysql端口存放文件
log-error=/data/mysql/mysql_err.log # mysql 錯誤日志文件
pid-file=/data/mysql/mysql.pid # mysql 進程文件
#skip_ssl #關閉SSL加密連接
character_set_server=utf8mb4 # 指定數據服務字符集
symbolic-links=0
explicit_defaults_for_timestamp=true
lower_case_table_names=1 # mysql在windows下,默認是對表名大小寫不敏感的,但是在[linux下,一些系統需要手動設置
#skip-grant-tables #免密碼登陸
- basedir:指定的是 mysql 安裝目錄
- datadir:指定的是 mysql 數據目錄
- socket:mysql端口存放文件
- log-error=/data/mysql/mysql_err.log:mysql 錯誤日志文件
- character_set_server=utf8mb4 :指定數據服務字符集
- skip_ssl : 關閉SSL加密連接
- lower_case_table_names=1 : mysql在windows下,默認是對表名大小寫不敏感的,但是在[linux下,一些系統需要手動設置。
- skip-grant-tables :免密碼登陸 (用戶修改賬號密碼,上面文件沒該配置)
1.1 數據庫文件的存放路徑 -(數據目錄)
MySQL 服務器程序在啟動是會到文件系統的某個目錄下加載一些文件,之后在運行過程中產生的數據也都會存儲到這個目錄下的某些文件中,這個目錄就稱為為數據目錄(對應 數據庫的庫,表等文件)。
MySQL 數據庫文件的存放路徑:(默認為:/var/lib/mysql)
其實數據目錄對應著一個系統變量 datadir(該變量是全局系統變量),我們可以通過該系統變量查詢 數據目錄 的地址:
SELECT @@global.datadir;
# 或
SHOW GLOBAL VARIABLES LIKE '%datadir%';
1.2 相關命令目錄 - (安裝目錄)
- 方式1:通過命令搜索
find / -name "mysqladmin"
find / -name "mysqldump"
- 方式2(推薦):查詢數據庫系統變量
basedir(該變量是全局系統變量)
SELECT @@global.basedir;
# 或
SHOW GLOBAL VARIABLES LIKE '%basedir%';
安裝目錄 下非常主要的 bin 目錄,它里邊放著許多關于控制客戶端和服務器程序的命令。許多可執行文件,比如:
- mysql:客戶端(登錄)命令
- mysqld:啟動數據庫實例命令
- mysqladmin:修改數據庫用戶密碼命令
- mysqldump:備份/導出 數據庫命令
等...
1.2.1 mysqld服務和mysql服務啟動程序
- mysqld
1. mysqld就是mysql server,負責管理對mysql數據的訪問。且 mysql server 有一套系統變量。
2. 當mysql server啟動后,它會監聽來自客戶端的網絡連接,并代表客戶端管理數據庫連接。
3. 可以影響mysql運行時的操作,系統變量可以在mysql server啟動時設置,很多系統變量可以在mysql server運行時改變,用于動態影響服務器配置。
4. 用于顯示mysql運行信息,包括運行性能特征。
5. mysql server 有一套命令參數。shell> `mysqld --verbose --help ``#``可以獲取所有的命令參數
-
mysqld_safe
mysql server 啟動腳本。
-
mysql.server
mysql server 啟動腳本。
-
mysqld_multi
mysql server啟動腳本
1.2.2 mysql客戶端命令
- mysql:mysql客戶端登錄或數據導入命令
- mysqldump:mysql數據導出命令
- mysqlcheck:檢查、修復、分析以及優化表的表維護
- mysqladmin:用來檢索版本、進程、以及服務器的狀態信息
一、MySQL服務器端工具
1.mysqld:SQL后臺保護程序(MySQL服務器進程)。該程序必須運行之后??蛻舳瞬拍芡ㄟ^連接服務器端程序訪問和操作數據庫
2.mysqld_safe:MySQL服務腳本。mysql_safe增加了一些安全特性,如當出現錯誤時重啟服務器,向錯誤日志文件寫入運行時間信息
3.mysql.server:MySQL服務啟動服本。調用mysqld_safe來啟動MySQL服務
4.mysql_multi:服務器啟動腳本,可以啟動或停止系統上安裝的多個服務
5.myiasmchk:用來描述、檢查、優化和維護MyISAM表的實用工具
6.mysqlbug:MySQL缺陷報告腳本。它可以用來向MySQL郵件系統發送缺陷報告
7.mysql_install_db:用于默認權限創建MySQ授權表。通常只是在系統上首次安裝MySQL時執行一次
clear
一、MySQL客戶端工具
1.myisampack:壓縮MyISAP表,產生更小的只讀表
2.mysql:交互式輸入SQL語句或從文件以批處理模式執行SQL語句來操作數據庫管理系統
3.mysaqlaccess:檢查訪問主機名、用戶名和數據庫組合的權限
4.mysqladmin:用來檢索版本、進程、以及服務器的狀態信息
5.mysqlbinlog:用于從二進制日志讀取語句。在二進制日志文件中包含執行的語句,可用來幫助系統從崩潰中恢復
6.mysqlcheck:檢查、修復、分析以及優化表的表維護
7.mysqldump:將MySQL數據庫轉儲到一個文件
8.mysqlhotcopy:當服務器在運行時,快速備份MyISAM或ISAM表的工具
9.mysql import:使用load data infile將文本文件導入相關表的客戶程序
10.perror:顯示系統或MySQL錯誤代碼含義的工具
1.3 配置文件目錄 -(配置目錄)
-
/etc/my.cnf
-
還有一個配置文件一般在 share 目錄下:可通過 find 搜索命令查找
find / -name mysql
2. 數據庫和文件系統的關系
像 InnoDB,MyISAM 這樣的存儲引擎都是把表存儲在磁盤上的,操作系統用來管理磁盤的結構被稱為文件系統,換句話來說就是:InnoDB,MyISAM這樣的存儲引擎都是把表存儲在文件系統上的。
- 讀數據:當我們想讀數據的時候,存儲引擎會從
文件系統中把數據讀出來返回給我們。 - 寫數據:當我們想寫數據的時候,存儲引擎會把這些數據寫入到
文件系統中。
個人理解:文件系統就是存放數據的系統。而數據是通過存儲引擎讀寫到文件系統中的。所以存儲引擎就是 "筆",文件系統就是 "紙"
2.1 查看默認數據庫
查看當前數據庫實例中都有哪些數據庫:
SHOW DATABASES;
# 結果集
information_schema
mysql
performance_schema
sys
可以看到有4個數據庫是屬于MySQL自帶的系統數據。
mysql
? MySQL 系統自帶的核心數據庫,它存儲了 MySQL 的用戶賬戶和權限信息,一些存儲過程,事件的定義信息,一些運行過程中的產生的日志信息,一些幫助信息以及時區信息等。
information_schema
? MySQL 系統自帶的數據庫,這個數據保庫存著 MySQL 服務器 維護的所有其他數據庫的信息,比如有哪些表,哪些視圖,哪些觸發器,哪些列,哪些索引。這些信息并不是真實的用戶數據,而是一些描述性信息,又稱為元數據。該庫中該提供了一些以innodb_sys開頭的表,用于表示內部系統表。
performance_schema
? MySQL 系統自帶的數據庫,這個數據庫里主要保存 MySQL 服務器運行過程中的一些狀態信息,可以用來 監控MySQL服務的各類性能指標。包括統計最近執行了哪些語句,在執行過程的每個階段都花費了多長時間,內存的使用情況信息。
sys
? MySQL 系統自帶的數據庫,這個數據庫主要是通過 "視圖(view)" 的形式把 information_schema 和 performance_schema 結合起來,幫助系統管理員和開發人員監控 MySQL 的技術性能。
2.2 數據庫在文件系統中的表示
當我們使用 "create database 數據庫名" 語句創建一個數據庫的時候,在 "文件系統" 上實際發生了什么呢?(兩件事)
- 會在數據庫服務對應的 "數據目錄" 下創建一個和數據庫名同名的子目錄。
- 在與該數據庫名同名的子目錄下創建一個名為 "db.opt" 的文件(僅限 5.7 及之前的版本),這文件中包含了數據庫的各種屬性。
2.3 表在文件系統中的表示
數據其實都是以 "記錄的形似" 插入到表中的,每個表的信息其實可以分為兩種:
- 表結構的定義(".frm")
- 表中的數據(".ibd")
表結構就是:(ddl)定義語句。包含了,表名,列,列數據類型,約束等...
2.3.1 InnoDB 存儲引擎模式
2.3.1.1 文件系統中的數據庫文件中文件的表示:
5.7.xx
- db.opt:用來存儲該數據庫的信息,例如:字符集,比較規則,存儲引擎等其他信息。
- xx.frm:用來存儲 xx表結構信息的,例如,表名,哪些列,列的數據類型,約束,存儲引擎等其他信息。
- xx.ibd:用來存儲 xx表的數據的(.ibd 又稱為:獨立表空間)。但表中的數據也有可能會存儲在(系統表空間中:ibdatal)
8.0.xx
- xx.ibd:用來存儲 xx表的數據以及表結果信息的,相比 5.7.xx 來說,8.0 將 ".frm" 和 ".ibd" 合并在了一起(.ibd 又稱為:獨立表空間)。但表中的數據也有可能會存儲在(系統表空間中:ibdatal)
2.3.1.2 表中數據和索引
....哈哈哈現在還不懂...
2.3.1.3 系統表空間
- 默認情況下,"InnoDB" 會在 "數據目錄" 下創建一個名為 ""ibdata1"",大小為 ""12M"" 的文件,該文件就對應著 "系統表空間"(該文件是自擴展文件)。
- 修改系統表空間配置(my.cnf / ny.ini):
[server]
innodb_data_file_path=data1:512M;data2:512M:autoextend
配置說明:會創建這兩個512M大小的文件作為 "系統表空間",其中 "autoextend" 表示空間不足后自動擴展那個文件。
注意:在一個 MySQL服務器中,"系統表空間"只有一份。從 5.5.7 ~ 5.6.6 之間的版本,默認將表中的數據存儲到 "系統表空間" 中。
2.3.1.4 系統表空間
- 獨立表空間:就是 為每一個表建立一個獨立存儲空間。有多少張表,就有多少個獨立表空間。
- 使用 "獨立表空間" 來存儲表數據的話,會在該表所屬數據庫對應的數據目錄中創建一個表示 "獨立表空間" 的文件,文件名和表名相同,擴展名為 ".ibd"
表名.ibd
"表名.ibd" 文件主要是用來存儲 "表名"中的數據和索引。
8.0 之后是用來存儲 "表"中的表結構信息和數據以及索引。
2.3.1.5 (系統 / 獨立)表空間查看及設置
**我們可以通過設置 innodb_file_per_table 來指定使用的是 系統表空間 還是獨立表空間。 **
- 查看表空間設置 - (該系統變量是全局系統變量)
SELECT @@global.innodb_file_per_table;
# 或
SHOW VARIABLES LIKE '%innodb_file_per_table%';
# 0:表示使用系統表空間,1:表示使用獨立表空間
- 表空間設置
- 方式1:通過配置文件設置(my.cnf / my.ini)。該方式需要重啟服務才生效
[server]
innodb_file_per_table = 0; # 0:表示使用系統表空間,1:表示使用獨立表空間
- 方式2:通過修改系統變量的方式。該方式重啟服務后會失效
SET innodb_file_per_table = 0; # 0:表示使用系統表空間,1:表示使用獨立表空間
# 或
SET @@global.innodb_file_per_table = 0;
# 或
SET GLOBAL innodb_file_per_table = 0;
注意:innodb_file_per_table 參數的修改 只對新建的表起作用,對于已經分配了表空間的表并不起作用。
- 如果我們想把已經存在 "系統表空間"-(表轉移到)-> "獨立表空間"中,可以使用以下語法:
ALTER TABLE 表名 TABLESPACE [=] innodb_file_per_table;
- 或者把已經存在 "獨立表空間"-(表轉移到)-> "系統表空間"中,可以使用以下語法:
ALTER TABLE 表名 TABLESPACE [=] innpdb_system;
2.3.2 MyISAM 存儲引擎模式
2.3.2.1 表結構
存儲表結構和 InnoDB 和 MyISAM 方式一樣
表名.frm
2.3.2.2 表中數據和索引
在 MyISAM 中的引擎全部都是 "二級索引",該引擎的 "數據和索引是分開" 的。所以在 "文件系統" 中也是使用不同的文件來存儲數據文件和索引文件的。
- MySQL 5.7.x
表名.frm #存儲表結構
表名.MYD #存儲表數據 (MYData)
表名.MYI #存儲表索引 (MYIdex)
- MySQL 8.0
表名_myisam_x.sdi #存儲元數據
表名_myisam.MYD #存儲表數據 (MYData)
表名_myisam.MYI #存儲表索引 (MYIdex)
- 對于 "InnoDB "表,SDI 與 "InnoDB" 用戶表空間中的數據一起存儲。
- 對于 "MyISAM" 和其他存儲引擎,它被寫入數據目錄中的 ".sdi" 文件中。
- 在 8.0 之后 MyISAM 引擎和 InnoDB 引擎一樣去掉了 ".frm" 文件,將數據放入了 ".sdi" 文件中。
注意:在MySQL 8.0中,MyISAM 存儲引擎不提供分區支持。以前的版本在 8.0 中不能使用。
2.x 擴展
".frm"在MySQL中不存在了,那去了那里
放入了 ".ibd" 文件中,寫入了 "ibd" 文件內部??梢酝ㄟ^ MySQL 安裝時自帶的(ibd2sdi)命令工具解析查看。
- 到存儲 "ibd" 文件目錄下,執行下面的命令:
ibd2sdi --dump-file=xxx.txt xxx.ibd
# 命令解析說明:
xxx.txt:表示解析后的新文件
xxx.ibd:表示你要解析的文件
2.4 小結
2.4.1 InnoDB
如果"某表"采用 "InnoDB" ,就會在 "文件系統" 中的 "數據庫目錄"?下產生1個或者2個文件,如下:
- "表名.frm":描述表結構文件,字段長度等...
- 如果采用 "系統表空間" 模式,數據信息和索引信息都會存儲在 "ibdata1" 中(默認的,也可以自定義)
- 如果采用 "獨立表空間" 模式, "文件系統" 中的 "數據庫目錄" 中產生 "表名.ibd" 文件用來存儲數據信息和索引信息。
此外:
- 5.7 中 "數據庫目錄" 中還會產生 "db.opt"文件用于保存數據庫的相關配置。字符集,比較規則等...。而 8.0 不再提供 db.opt 文件
- 8.0 中 不再單獨提供 "表名.frm",而是合并在 "表名.ibd" 文件中了。
2.4.2 MyISAM
- 如果"某表"采用 "MyISAM" ,就會在 "文件系統" 中的 "數據庫目錄" 下產生3個文件,如下:
- 5.7 中:"表名.frm":用來描述表結構文件,字段長度等等..
- 8.0 中:"表名_myisam_x.sdi":用來描述表結構文件,字段長度等等..
- 表名.MYD (MYData):數據信息文件,存儲數據信息的文件(如果采用 獨立表空間的存儲模式)
- 表名.MYI (MYIndex):存儲索引信息文件
2.5 視圖在文件喜宴中的表示
MySQL 中的 "視圖" 其實是 "虛擬的表"。所以在存儲 "視圖" 的時候不需要存儲真實的數據,只需要把它的結果存儲起來就就行了。和表一樣,描述 "視圖" 結構的文件也會被存儲到所屬數據庫對應的子目錄中,但只會存儲一個 "視圖名.frm" 的文件。
視圖名.frm
2.6 其他文件
-
服務器進程文件
每運行一個MySQL服務器程序,都意味著啟動一個進程。MySQL 服務器會把自己的進程ID寫入到一個文件中。
-
服務器日志文件
在服務器運行過程中,會產生各種各樣的日志,比如常規的查詢日志,錯誤日志,二進制日志,redo日志等。
-
默認/自動生成的 SSL 和 RSA 證書和密鑰文件
主要是為了客戶端和服務器安全通信而創建的一些文件。
總結
以上是生活随笔為你收集整理的MySQL 数据目录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贵州师范学院怎么样(贵州师范学院属于什么
- 下一篇: MySQL 事务的基础知识