天天看點

MySQL 架構組成--實體檔案組成

部落客QQ:819594300

部落格位址:http://zpf666.blog.51cto.com/

有什麼疑問的朋友可以聯系部落客,部落客會幫你們解答,謝謝支援!

一、MySQL Server 簡介

什麼是MySQL?

答:是目前IT行業最流行的開放源代碼的資料庫管理系統之一,它同時也是一個支援多線程高并發多使用者的關系型資料庫管理系統。

特點:

簡單:安裝簡單

高效:讀寫性能高,僅次于oracle

可靠:運作穩定

MySQL 與其他資料庫的簡單比較:

1)       功能比較

2)       易用性比較

3)       性能比較

4)       可靠性

MySQL 的主要适用場景:

1)       Web 網站系統

2)       日志記錄系統

3)       資料倉庫系統

二、MySQL 架構組成

Mysql實體檔案組成:

日志檔案,主要包含:錯誤日志、查詢日志、慢查詢日志、事務日志、二進制日志

日志檔案作用:記錄着mysql資料庫運作期間發生的變化;也就是說用來記錄mysql資料庫的用戶端連接配接狀況、SQL語句的執行情況和錯誤資訊等。當資料庫遭到意外的損壞時,可以通過日志檢視檔案出錯的原因,并且可以通過日志檔案進行資料恢複。

1、錯誤日志:Error Log

是否開啟:預設已開啟。

存儲路徑:預設在mysql資料庫所在的路徑。

名稱:預設為hostname.err。其中,hostname表示伺服器主機名。

配置:所記錄的資訊是可以通過log-error和log-warnings來定義。其中logwarnings是定義是否将警告資訊也定義至錯誤日志中。

記錄哪方面資訊:

①   伺服器啟動和關閉過程中的資訊(未必是錯誤資訊,如mysql如何啟動InnoDB(lnnoDB是插件式存儲引擎)的表空間檔案的、如何初始化自己的存儲引擎的等等)

②   伺服器運作過程中的錯誤資訊

③   事件排程器運作一個事件時産生的資訊、在從伺服器上啟動伺服器程序時産生的資訊。

注1:MySQL有很多系統變量可以設定,系統變量設定不同,會導緻系統運作狀态的不同。是以mysql提供兩組指令,分别檢視系統設定和運作狀态。

①  檢視系統設定

MySQL 架構組成--實體檔案組成

②運作狀态

MySQL 架構組成--實體檔案組成

如何修改系統配置

方法1:配置檔案設定my.cnf。例如:binlog_cache_size = 1M(永久設定)

方法2:例如:set  global binlog_cache_size = 1048576(臨時設定)

注2:檢視mysql的版本

MySQL 架構組成--實體檔案組成

或者

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

說明:一般而言,日志級别的定義沒有會話變量都隻是在全局級别下進行定義。

檢視錯誤日志的狀态:

MySQL 架構組成--實體檔案組成

更改錯誤日志位置可以使用log-error來設定形式如下:

MySQL 架構組成--實體檔案組成

檢視mysql錯誤日志:

MySQL 架構組成--實體檔案組成

說明:為了友善維護需要,有時候會希望将錯誤日志中的内容做備份并重新開始記錄,這時候

就可以利用MySQL 的FLUSH LOGS 指令來告訴MySQL 備份舊日志檔案并生成新的日志檔案。備份檔案名以“.old”結尾。

mysql5.5.7之前:資料庫管理者可以删除很長時間之前的錯誤日志,以保證mysql伺服器上的硬碟空間。

mysql5.5.7之後:伺服器将關閉此項功能。隻能使用重命名原來的錯誤日志檔案,手動沖洗日志建立一個新的錯誤日志檔案。

備份錯誤日志并生成新的錯誤日志檔案

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

更多資訊請查閱官方文檔:

http://dev.mysql.com/doc/refman/5.5/en/error-log.html

http://dev.mysql.com/doc/refman/5.6/en/error-log.html

http://dev.mysql.com/doc/refman/5.7/en/error-log.html

2、二進制日志:Binary Log & Binary Log Index

是否開啟:預設不開啟

記錄哪方面的資訊:記錄修改資料或有可能引起資料改變的mysql語句,并且記錄了語句發生時間、執行時長、操作的資料等等。

容量:一般大小體積上限為1G

開啟方法:在/etc/my.cnf檔案中,通過“log-bin=file路徑/file_name”

記錄過程:開啟了記錄二進制檔案之後,MySQL 會将所有修改資料庫資料的query (即sql語句)以二進制形式記錄到日志檔案中。

名稱:如果未手動指定file_name名稱,則會在資料目錄下記錄為mysql-bin.******(*代表0~9 之間的某一個數字,來表示該日志的序号)。

檢視二進制開啟狀态:

MySQL 架構組成--實體檔案組成

my.cnf配置檔案中,關于binlog的參數及其含義

MySQL 架構組成--實體檔案組成

binlog-format={ROW|STATEMENT|MIXED}#指定二進制日志的類型,預設為MIXED。

MySQL 架構組成--實體檔案組成

說明:每次重新開機mysql服務或運作mysql> flush logs;都會生成一個新的二進制日志檔案,這些日志檔案的number會不斷地遞增。除了生成filename.number檔案外還會自動生成filename.index的檔案。

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

檢視二進制日志:

說明:二進制日志的定義方式為二進制格式;使用此格式可以存儲更多的資訊,并且可以使寫入二進制日志的效率更高。但是不能直接使用檢視指令打開并檢視二進制日志。

MySQL 架構組成--實體檔案組成

目前使用的二進制檔案及所處位置

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

檢視目前二進制檔案的資訊:

MySQL 架構組成--實體檔案組成

檢視二進制日志資訊的指令:

MySQL 架構組成--實體檔案組成

檢視所有的二進制資訊:

MySQL 架構組成--實體檔案組成

檢視指定日志的二進制資訊:

MySQL 架構組成--實體檔案組成

從指定的事件位置開始

MySQL 架構組成--實體檔案組成

注意:二進制日志的記錄位置:通常為上一個事件執行結束時間的位置

指定偏移量(不是語句,是事件)

MySQL 架構組成--實體檔案組成

指令行下檢視二進制日志:

說明:由于無法使用cat等方式直接打開并檢視二進制日志;是以必須使用mysqlbinlog指令。但是當正在執行mysql讀寫操作時建議不要使用此打開正在使用的二進制日志檔案;若非要打開可flush logs。

mysqlbinlog指令的使用方式:

MySQL 架構組成--實體檔案組成

删除二進制日志資訊:

說明:若要删除二進制日志首先将其和資料庫備份一份,其中也隻能删除備份前的二進制日志,新産生的日志資訊不可删。也不可在關閉mysql伺服器之後直接删除因為這樣可能會給資料庫帶來錯誤的。若非要删除二進制日志需要做如下操作:導出備份資料庫和二進制日志檔案進行壓縮歸檔存儲。删除二進制檔案的方法如下:

方法1:根據檔案或時間點來删除二進制日志:

文法形式:

MySQL 架構組成--實體檔案組成

說明:其中TO 'log_name'表示把這個檔案之前的其他檔案都删除掉,也可使用BEFORE datetime_expr指定把哪個時間之前的二進制檔案删除了。

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

或者删除時間點之前的二進制日志檔案

MySQL 架構組成--實體檔案組成

方法2:删除所有的二進制日志(慎用):

使用RESET MASTER語句可以删除所有的二進制日志。該語句的形式如下:

MySQL 架構組成--實體檔案組成

3、事務日志(或稱redo日志)

說明:(InnoDB特有的日志)可以幫助提高事務的效率。

為什麼會減少磁盤I/O資源:事務日志采用追加方式寫入,是以此寫日志的操作是磁盤上一小塊區域内的順序I/O,而不像随機I/O需要在磁盤的多個地方移動磁頭,是以采用事務日志的方式相對來說要快得多。

名稱:,在mysql中預設以ib_logfile0,ib_logfile1名稱存在。

MySQL 架構組成--實體檔案組成

作用:修改資料時,資料存放在資料緩沖區,當送出事務時,事務緩沖區的資料将寫入事務日志中,而資料緩沖區的資料将在某個時間後才寫入資料檔案,這樣減少的磁盤I/O資源。

檢視你的mysql現在已提供什麼存儲引擎:

MySQL 架構組成--實體檔案組成

看你的mysql目前預設的存儲引擎:

MySQL 架構組成--實體檔案組成

你要看某個表用了什麼引擎(在顯示結果裡參數engine後面的就表示該表目前用的存儲引擎):

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

檢視事務日志的定義:

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

總結:先有刷,後才有寫。012三者的比較,最終性能最優的是0,但是預設是1

每個事物日志檔案預設大小事50M(不同版本的mysql有差異)

MySQL 架構組成--實體檔案組成

4、   慢查詢日志:slow query log

含義:顧名思義,慢查詢日志中記錄的是執行時間較長的query,也就是我們常說的slow query。

格式:采用的是簡單的文本格式,可以通過各種文本編輯器檢視其中的内容。

記錄了什麼内容:記錄了語句執行的時刻,執行所消耗的時間,執行使用者,連接配接主機等相關資訊。

作用:通過慢查詢日志,可以查找出哪些查詢語句的執行效率很低,以便進行優化

是否開啟:預設沒開啟

工具:MySQL 還提供了專門用來分析滿查詢日志的工具程式mysqldumpslow

檢視慢查詢日志的定義:

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

啟動和設定慢查詢日志:

方法1:通過配置檔案my.cnf開啟慢查詢日志:

注:在不同的mysql版本中,開啟慢查詢日志參數不太一樣,不過都可以通過 show variables like "%slow%" 和showvariables like "%long%"檢視出來。

MySQL 架構組成--實體檔案組成

注意:如果不指定存儲路徑,慢查詢日志預設存儲到mysql資料庫的資料檔案下,如果不指定檔案名,預設檔案名為hostname-slow.log

修改my.cnf檔案:

MySQL 架構組成--實體檔案組成

重新開機mysqld服務

MySQL 架構組成--實體檔案組成

再次查詢慢查詢日志定義:

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

方法2:通過登入mysql伺服器直接定義,方式如下:

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

或用系統檢視檔案内容指令如cat直接檢視慢日志檔案

MySQL 架構組成--實體檔案組成

第一行表示記錄日志時的時間。其格式是 YYYY-MM-DDHH:MM:SS。我們可以看出上面的查詢記錄于 2016 年8 月 29 日下午 15:47:24 - 注意:這個是伺服器時間.

MySql 使用者、伺服器以及主機名第三行表示總的查詢時間、鎖定時間、"發送"或者傳回的行數

Query_time: 0.000304  表示用了0.000304秒

Lock_time: 0.000128  表示鎖了0.000128秒

Rows_sent: 4 表示傳回4行

Rows_examined: 4  表示一共查了4行

SET timestamp=UNIXTIME; 這是查詢實際發生的時間

何将其變成一個有用的時間,将 Unix 時間轉成一個可讀的時間,可以使用 date –d@日志中的時間戳

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

慢查詢分析mysqldumpslow

們可以通過打開log檔案檢視得知哪些SQL執行效率低下。從日志中,可以發現查詢時間超過long_query_time時間的query為慢查詢,而小于long_query_time時間的沒有出現在此日志中。

如果慢查詢日志中記錄内容很多,可以使用mysqldumpslow工具(MySQL用戶端安裝自帶)來對慢查詢日志進行分類彙總。mysqldumpslow對日志檔案進行了分類彙總,顯示彙總後摘要結果

進入log的存放目錄,運作

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

資料文據

作用:用來存放改資料庫中各種表資料檔案。

資料庫引擎:

MyISAM:擴充名是“.MYD”

Innodb:擴充名是“.idb”

Archive:擴充名是“.arc”

CSV   : 擴充名是“.csv”

如何檢視你的mysql現在已提供什麼存儲引擎:

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

查要看某個表用了什麼引擎(在顯示結果裡參數engine後面的就表示該表目前用的存儲引擎):

MySQL 架構組成--實體檔案組成

注:create table 庫名.表名 engine = 引擎名;  這樣就可以将要建的表的引擎變更為其他引擎了(預設是innodb)

剛才在上面建了一個資料庫bdqn,還在bdqn庫裡建了一個表it。

這時去檢視資料庫所在目錄會發現資料目錄下存在一個以資料庫名字命名的檔案夾

MySQL 架構組成--實體檔案組成

檢視bdqn目錄的檔案清單

MySQL 架構組成--實體檔案組成

以myisam存儲引擎建立一個測試表it2。

MySQL 架構組成--實體檔案組成

再次檢視資料庫bdqn目錄

MySQL 架構組成--實體檔案組成

修改mysql的預設存儲引擎的方法

1、      先用mysql> show engines;指令檢視字段 Support為:Default的引擎是哪種

2、      在配置檔案my.cnf中的 [mysqld] 下面加入“default-storage-engine=引擎名稱”這一句話

3、      重新開機mysql伺服器:①mysqladmin -u root -p shutdown

②systemctl  restart  mysqld

“.frm”檔案

作用:與表相關的中繼資料(meta)(中繼資料含義:描述資料的資訊或屬性的資料)資訊都存放在“.frm”檔案中,包括表結構的定義資訊等。

所屬哪個引擎:不論是什麼存儲引擎(MySQL常用的兩個存儲引擎是MyISAM和InnoDB),每一個表都會有一個以表名命名的“.frm”檔案。

存放位置:所有的“.frm”檔案都存放在所屬資料庫的目錄下。

說明:MyISAM資料庫表檔案:.MYD檔案:表資料檔案;.MYI檔案:索引檔案

“.MYD”檔案

所屬哪個引擎:MyISAM 存儲引擎專用

作用:存放MyISAM 表的資料,一個表一個”.MYD”檔案

存放位置:和“.frm”檔案在一起,,同樣存放于所屬資料庫的檔案夾下

“.MYI”檔案

所屬哪個引擎:也是專屬于MyISAM 存儲引擎

作用:主要存放MyISAM 表的索引相關資訊,一個表一個”.MYI”檔案

特别之處:于MyISAM 存儲來說,可以被緩存的内容主要就是來源于“.MYI”檔案中

存放位置:存放于位置和“.frm”以及“.MYD”一樣

InnoDB采用表空間(tablespace)來管理資料,存儲表資料和索引。

.ibd檔案

說明以及作用:單表表空間檔案,每個表使用一個表空間檔案(file per table),存放使用者資料庫表資料和索引。

ibdata1、ibdata2等(即ibdata檔案)

說明以及作用:InnoDB共享表空間(即InnoDB檔案集,ib-file set),存儲InnoDB系統資訊和使用者資料庫表資料和索引,所有表共用。

“.ibd”檔案和ibdata 檔案

相同點:這兩種檔案都是存放Innodb 資料的檔案

既然作用一樣,為啥要分兩種檔案:因為Innodb 的資料存儲方式能夠通過配置來決定是使用共享表空間存放存儲資料,還是獨享表空間存放存儲資料。

不同點:

①獨享表空間存儲方式使用“.ibd”檔案來存放資料,且每個表一個“.ibd”檔案,檔案存放在和MyISAM 資料相同的位置。

②如果選用共享存儲表空間來存放資料,則會使用ibdata 檔案來存放,所有表共同使用一個(或者多個,可自行配置)ibdata 檔案。

ibdata檔案:innodb_data_home_dir(配置資料存放的總目錄,即存放的路徑)

             和

             innodb_data_file_path(配置每一個檔案的名稱,即檔案名)

            兩個參數共同配置組成。

innodb_data_file_path:一次可以配幾個:可以一次配置多個ibdata 檔案。

                       大小固定與否:檔案可以是指定大小,也可以是自動擴充的。

                      特殊之處:Innodb限制了僅僅隻有最後一個ibdata 檔案能夠配置成自動擴充類型。

                      新增新的ibdata檔案怎麼添加:隻能添加在innodb_data_file_path配置的最後,而且必須重新開機MySQL才能完成ibdata 的添加工作。

                      額外說明:如果我們使用獨享表空間存儲方式的話,就不會有這樣的問題。

總結:

1、共享表空間以及獨占表空間都是針對資料的存儲方式而言的。

2、共享表空間:某一個資料庫的所有的表資料、索引檔案全部放在一個檔案中。

3、獨立表空間:每一個表都将會生成以獨立的檔案方式來進行存儲,每一個表都有一個“.frm”(myisam引擎所有)表描述檔案,描述表的表結構定義資訊;還有一個“.ibd”(innodb引擎所有)檔案,其中這個檔案包含了獨立一個表的資料内容以及索引内容。

即:使用innodb引擎的獨立表空間占用大小=“.idb”檔案的大小

使用myisam引擎的獨立表空間占用大小=“.MYD”檔案大小+“.MYI”檔案大小

使用共享表空間的表不管什麼引擎,其中的單獨的一個表的表空間所占大小=Data_length+Index_legth

兩者之間的優缺點:

共享表空間:

優點:

可以把表空間分成多個檔案存放在各個磁盤上,資料和檔案放在一起友善管理。

缺點:

所有的資料和索引存放到一個檔案中,多個表以及索引在表空間中混合存儲,這樣對于一個表做了大量删除操作後表空間中将會有大量的空隙(即資料碎片),特别是對于統計分析、日值系統這類應用最不合适用共享表空間。

獨立表空間:

1、每個表都有自己獨立的表空間。

2、每個表的資料和索引都會存在自己的表空間中。

3、可以實作單表在不同的資料庫中移動。

4、空間可以回收。

a)drop table 操作自動回收表空間,如果對于統計分析或者日值表,删除大量資料後

可以通過”alter  table  表名 engine=innodb”回縮不用的空間。

b)對于使用獨立表空間的表,不管怎麼删除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。

單表增加過大,例如超過100個G,相比較之下,使用獨立表空間的效率以及性能會更高一點。

總結一句話:對于獨立表空間,其中的資料删除後,空出來的空間可以回收。

            對于共享表空間,其中的資料删除後,會産生空隙(即碎片),無法回收。

檢視目前資料庫的表空間管理類型

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

Innodb共享表空間配置:

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

mysqld啟動失敗,檢視錯誤日志

MySQL 架構組成--實體檔案組成

修改配置為12M

MySQL 架構組成--實體檔案組成

再次嘗試重新開機mysqld服務

MySQL 架構組成--實體檔案組成

如果不清楚預設檔案page大小,可以先 du -h ibdata1 檢視下,再去設定;

MySQL 架構組成--實體檔案組成

登入mysql執行mysql> show variables like'%innodb_file_per_table%';

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

這時建立的表就會使用共享表空間了。

建立一個資料庫testdb并建立一個表,并定義一個存儲過程向表中插入1萬個資料

MySQL 架構組成--實體檔案組成

調用存儲過程

MySQL 架構組成--實體檔案組成

如何檢視表在表空間占用情況:

方法1:對INNODB,你可以直接用指令showtable status檢視某個表的表空間占用情況。

MySQL 架構組成--實體檔案組成

方法2:

如果想知道MySQL資料庫中每個表占用的空間、表記錄的行數的話,可以打開MySQL的 information_schema 資料庫。在該庫中有一個 TABLES 表,這個表主要字段分别是:

MySQL 架構組成--實體檔案組成
MySQL 架構組成--實體檔案組成

Replication相關檔案:

說明:與主從複制有關系

1)master.info 檔案:

存放位置:存在于slave端的/usr/local/mysql/data目錄下

存放了什麼:存放了該Slave 的Master 端的相關資訊,包括Master 的主機位址,連接配接使用者,連接配接密碼,連接配接端口,目前日志位置,已經讀取到的日志位置等資訊。

即包含的就是slave要連接配接master時。所輸入的資訊,如下例子所為;

MySQL 架構組成--實體檔案組成

2)relay log 和relay log index:

mysql-relay-bin.xxxxxn檔案用于存放Slave 端的I/O 線程從Master 端所讀取到的Binary Log 資訊,然後由Slave 端的SQL 線程從該relaylog 中讀取并解析相應的日志資訊,轉化成Master 所執行的SQL 語句,然後在Slave 端應用。

mysql-relay-bin.index檔案的功能類似于mysql-bin.index ,同樣是記錄日志的存放位置的絕對路徑,隻不過他所記錄的不是Binary Log,而是Relay Log。

3)relay-log.info 檔案:

類似于master.info,它存放通過Slave 的I/O 線程寫入到本地的relaylog 的相關信

息。供Slave 端的SQL 線程以及某些管理操作随時能夠擷取目前複制的相關資訊。

其他檔案:

1)system config file

MySQL 的系統配置檔案一般都是my.cnf,預設存放在"/etc"目錄下,my.cnf檔案中包含多種參數選項組(group),每一種參數組都通過中括号給定了固定的組名,如“[mysqld]”組中包括了mysqld服務啟動時候的初始化參數,“[client]”組中包含着用戶端工具程式可以讀取的參數。

2)pid file

pid file 是mysqld 應用程式在Unix/Linux 環境下的一個程序檔案,和許多其他

Unix/Linux 服務端程式一樣,存放着自己的程序id。

3)socket file

socket 檔案也是在Unix/Linux 環境下才有的,使用者在Unix/Linux 環境下用戶端連接配接可以不通過TCP/IP 網絡而直接使用Unix Socket 來連接配接MySQL。

mysql有兩種連接配接方式,常用的一般是tcp

mysql –h  mysql主機ip  -uroot  -p密碼

mysql -S  /path /mysql.sock

MySQL 架構組成--實體檔案組成

“lsof   -c   程序名稱”     //檢視某個程序所關聯額檔案

MySQL 架構組成--實體檔案組成

如果Linux伺服器中了病毒或者木馬了該證明解決:

繼續閱讀