http://hongge.blog.51cto.com/html
1、MySQL Server 系統架構mysql
在前一節中咱們學習了mysql的物理文件組成,接下來咱們來學習mysql的邏輯模塊組成。算法
邏輯模塊組成:sql
MySQL邏輯結構能夠當作是二層架構,第一層咱們一般叫作SQL Layer,在MySQL 數據庫系統處理底層數據以前的全部工做都是在這一層完成的,包括權限判斷,sql 解析,執行計劃優化,query cache 的處理等等;第二層就是存儲引擎層,咱們一般叫作StorageEngine Layer,也就是底層數據存取操做實現部分,由多種存儲引擎共同組成。因此,能夠用以下一張最簡單的架構示意圖來表示MySQL 的基本架構,如圖所示:數據庫
從上圖看起來MySQL邏輯架構很是的簡單,但實際上每一層中都含有各自的不少小模塊,尤爲是第一層SQL Layer,結構至關複雜的。下面就分別針對SQL Layer 和Storage Engine Layer 作一個簡單的分析。api
SQL Layer 中包含了多個子模塊,下面我將逐個作一下簡單的介紹:緩存
一、初始化模塊安全
初始化模塊就是在MySQL Server 啓動的時候,對整個系統作各類各樣的初始化操做,好比各類buffer,cache 結構的初始化和內存空間的申請,各類系統變量的初始化設定,各類存儲引擎的初始化設置,等等。性能優化
二、核心API服務器
核心API 模塊主要是爲了提供一些須要高效的底層操做功能的優化實現,包括各類底層數據結構的實現,以及最重要的內存管理,文件I/O,數字和字符串處理等等。
。
三、網絡交互模塊
底層網絡交互模塊抽象出底層網絡交互所使用的接口api,實現底層網絡數據的接收與發送,以方便其餘各個模塊調用,以及對這一部分的維護。
四、Client & Server 交互協議模塊
任何C/S 結構的軟件系統,都確定會有本身獨有的信息交互協議,MySQL 也不例外。MySQL的Client & Server 交互協議模塊部分,實現了客戶端與MySQL 交互過程當中的全部協議。固然這些協議都是創建在現有的OS 和網絡協議之上的,如TCP/IP 以及Unix Socket。
五、用戶模塊
用戶模塊所實現的功能,主要包括用戶的登陸鏈接權限控制和用戶的受權管理。他就像MySQL 的大門守衛同樣,決定是否給來訪者「開門」。
六、訪問控制模塊
造訪客人進門了就能夠想幹嗎就幹嗎麼?爲了安全考慮,確定不能如此隨意。這時候就須要訪問控制模塊實時監控客人的每個動做,給不一樣的客人以不一樣的權限。訪問控制模塊實現的功能就是根據用戶模塊中各用戶的受權信息,以及數據庫自身特有的各類約束,來控制用戶對數據的訪問。用戶模塊和訪問控制模塊二者結合起來,組成了MySQL 整個數據庫系統的權限安全管理的功能。
七、鏈接管理、鏈接線程和線程管理
鏈接管理模塊負責監聽對MySQL Server 的各類請求,接收鏈接請求,轉發全部鏈接請求到線程管理模塊。每個鏈接上MySQL Server 的客戶端請求都會被分配(或建立)一個鏈接線程爲其單獨服務。而鏈接線程的主要工做就是負責MySQL Server 與客戶端的通訊,接受客戶端的命令請求,傳遞Server 端的結果信息等。線程管理模塊則負責管理維護這些鏈接線程。包括線程的建立,線程的cache 等。
八、Query 解析和轉發模塊
在MySQL 中咱們習慣將全部Client 端發送給Server 端的命令都稱爲query,在MySQLServer 裏面,鏈接線程接收到客戶端的一個Query 後,會直接將該query 傳遞給專門負責將各類Query 進行分類而後轉發給各個對應的處理模塊,這個模塊就是query 解析和轉發模塊。其主要工做就是將query 語句進行語義和語法的分析,而後按照不一樣的操做類型進行分類,而後作出針對性的轉發。
九、Query Cache 模塊
Query Cache 模塊在MySQL 中是一個很是重要的模塊,他的主要功能是將客戶端提交給MySQL 的Select 類query 請求的返回結果集cache 到內存中,與該query 的一個hash 值作一個對應。該Query 所取數據的基表發生任何數據的變化以後,MySQL 會自動使該query 的Cache 失效。在讀寫比例很是高的應用系統中,Query Cache 對性能的提升是很是顯著的。固然它對內存的消耗也是很是大的。
十、Query 優化器模塊
Query 優化器,顧名思義,就是優化客戶端請求的query,根據客戶端請求的query 語句,和數據庫中的一些統計信息,在一系列算法的基礎上進行分析,得出一個最優的策略,告訴後面的程序如何取得這個query 語句的結果。
十一、表變動管理模塊
表變動管理模塊主要是負責完成一些DML 和DDL 的query,如:update,delte,insert,create table,alter table 等語句的處理。
十二、表維護模塊
表的狀態檢查,錯誤修復,以及優化和分析等工做都是表維護模塊須要作的事情。
1三、系統狀態管理模塊
系統狀態管理模塊負責在客戶端請求系統狀態的時候,將各類狀態數據返回給用戶,像DBA 經常使用的各類show status 命令,show variables 命令等,所獲得的結果都是由這個模塊返回的。
1四、表管理器
這個模塊從名字上看來很容易和上面的表變動和表維護模塊相混淆,可是其功能與變動及維護模塊卻徹底不一樣。你們知道,每個MySQL 的表都有一個表的定義文件,也就是*.frm文件。表管理器的工做主要就是維護這些文件,以及一個cache,該cache 中的主要內容是各個表的結構信息。此外它還維護table 級別的鎖管理。
1五、日誌記錄模塊
日誌記錄模塊主要負責整個系統級別的邏輯層的日誌的記錄,包括error log,binarylog,slow query log 等。
1六、複製模塊
複製模塊又可分爲Master 模塊和Slave 模塊兩部分, Master 模塊主要負責在Replication 環境中讀取Master 端的binary 日誌,以及與Slave 端的I/O 線程交互等工做。
Slave 模塊比Master 模塊所要作的事情稍多一些,在系統中主要體如今兩個線程上面。一個是負責從Master 請求和接受binary 日誌,並寫入本地relay log 中的I/O 線程。另一個是負責從relay log 中讀取相關日誌事件,而後解析成能夠在Slave 端正確執行並獲得和Master 端徹底相同的結果的命令並再交給Slave 執行的SQL 線程。
1七、存儲引擎接口模塊
存儲引擎接口模塊能夠說是MySQL 數據庫中最有特點的一點了。目前各類數據庫產品中,基本上只有MySQL 能夠實現其底層數據存儲引擎的插件式管理。這個模塊實際上只是一個抽象類,但正是由於它成功地將各類數據處理高度抽象化,才成就了今天MySQL 可插拔存儲引擎的特點。
各模塊工做配合
咱們能夠將以上各個模塊畫成一個簡單的關係圖來描述各模塊的工做關係:
MySQL 各個模塊間是如何相互協同工做的?
接下來,咱們經過啓動MySQL,客戶端鏈接,請求query,獲得返回結果,最後退出,這樣一整個過程來進行分析。
首先當咱們執行啓動MySQL 命令以後,MySQL 的初始化模塊就從系統配置文件中讀取系統參數和命令行參數,並按照參數來初始化整個系統,如申請並分配buffer,初始化全局變量,以及各類結構等。同時各個存儲引擎也被啓動,並進行各自的初始化工做。當整個系統初始化結束後,由鏈接管理模塊接手。鏈接管理模塊會啓動處理客戶端鏈接請求的監聽程序,包括tcp/ip 的網絡監聽,還有unix 的socket。這時候,MySQL Server 就基本啓動完成,準備好接受客戶端請求了。
當鏈接管理模塊監聽到客戶端的鏈接請求,鏈接管理模塊就會將鏈接請求轉發給線程管理模塊,去請求一個鏈接線程。
線程管理模塊立刻又會將控制交給鏈接線程模塊,告訴鏈接線程模塊:如今我這邊有鏈接請求過來了,須要創建鏈接,你趕快處理一下。鏈接線程模塊在接到鏈接請求後,首先會檢查當前鏈接線程池中是否有空閒鏈接線程,若是有,就取出一個和客戶端請求鏈接上,若是沒有空閒的鏈接線程,則創建一個新的鏈接線程與客戶端請求鏈接。
注意:鏈接線程模塊並非在收到鏈接請求後立刻就會取出一個鏈接線程連和客戶端鏈接,而是首先經過調用用戶模塊進行受權檢查,只有客戶端請求經過了受權檢查後,他纔會將客戶端請求和負責請求的鏈接線程連上。
知識補充:在MySQL 中,將客戶端請求分爲了兩種類型:一種是query,須要調用Parser ,也就是Query 解析和轉發模塊的解析纔可以執行的請求;一種是command,不須要調用Parser 就能夠直接執行的請求。
當客戶端請求和鏈接線程「互換暗號(互通協議)」接上頭以後,鏈接線程就開始處理客戶端發送過來的各類命令(或者query),並將收到的query 語句轉給Query 解析和轉發模塊,Query 解析器先對Query 進行基本的語義和語法解析,而後根據命令類型的不一樣,有些會直接處理,有些會分發給其餘模塊來處理。
例如對於SELECT語句,在解析查詢以前,服務器會先檢查緩存(Query cache),若是可以在其中找到對應的查詢,服務器就沒必要在執行查詢解析、優化和執行的整個過程,而是直接返回查詢緩存中的結果集。若是不是一個能夠被cache 的query類型,或者cache 中沒有該query 的數據,那麼query 將被繼續傳回query 解析器,讓query解析器進行相應處理,再經過query 分發器分發給相關處理模塊。例如若是解析器解析結果是一條未被cache 的select 語句,則將控制權交給查詢Optimizer,也就是Query 優化器模塊,若是是DML 或者是DDL 語句,則會交給表變動管理模塊,若是是一些更新統計信息、檢測、修復和整理類的query 則會交給表維護模塊去處理,複製相關的query 則轉交給複製模塊去進行相應的處理,請求狀態的query 則轉交給了狀態收集報告模塊。
注:實際上表變動管理模塊根據所對應的處理請求的不一樣,是分別由insert 處理器、delete處理器、update 處理器、create 處理器,以及alter 處理器這些小模塊來負責不一樣的DML和DDL 的。
在各個模塊收到Query 解析與分發模塊分發過來的請求後,首先會經過訪問控制模塊檢查鏈接用戶是否有訪問目標表以及目標字段的權限,若是有,就會調用表管理模塊請求相應的表,並獲取對應的鎖。
當表變動管理模塊「獲取」打開的表以後,就會根據該表的相關meta 信息,判斷表的存儲引擎類型和其餘相關信息。根據表的存儲引擎類型,提交請求給存儲引擎接口模塊,調用對應的存儲引擎實現模塊,進行相應處理。
當一條query 或者一個command 處理完成(成功或者失敗)以後,控制權都會交還給鏈接線程模塊。若是處理成功,則將處理結果(多是一個Result set,也多是成功或者失敗的標識)經過鏈接線程反饋給客戶端。若是處理過程當中發生錯誤,也會將相應的錯誤信息發送給客戶端,而後鏈接線程模塊會進行相應的清理工做,並繼續等待後面的請求,重複上面提到的過程,或者完成客戶端斷開鏈接的請求。
若是在上面的過程當中,相關模塊使數據庫中的數據發生了變化,並且MySQL 打開了binlog功能,則對應的處理模塊還會調用日誌處理模塊將相應的變動語句以更新事件的形式記錄到相關參數指定的二進制日誌文件中。
在上面各個模塊的處理過程當中,各自的核心運算處理功能部分都會依賴整個MySQL的核心API 模塊,好比內存管理,文件I/O,數字和字符串處理等等。
2、MySQL 自帶工具使用介紹
MySQL 數據庫不只提供了數據庫的服務器端應用程序,同時還提供了大量的客戶端工具程序,如mysql,mysqladmin,mysqldump 等等
一、mysql命令
Mysql命令是用的最多的一個命令工具了,爲用戶提供一個命令行接口來操做管理MySQL 服務器。
語法格式:
Usage: mysql [OPTIONS] [database]
例如:# mysql -e "select user,host from user" mysql
你們只要運行一下「mysql --help」就會獲得以下相應的基本使用幫助信息:
這裏主要介紹一些在運維過程當中會用到的相關選項:
首先看看「-e, --execute=name」參數,這個參數是告訴mysql,我要執行「-e」後面的某個命令,而不是要經過mysql 鏈接登陸到MySQL Server 上面。此參數在咱們寫一些基本的MySQL 檢查和監控的腳本中很是有用,運維mysql時常常在腳本中使用到它。
#mysql -h hostname -Pport -uusername -ppassword -e 相關mysql的sql語句
例1:
經過binlog_cache_use 以及 binlog_cache_disk_use來分析設置的binlog_cache_size是否足夠
例2:經過腳本建立數據庫、表及對錶進行增、改、刪、查操做。
腳本內容以下:
建立授予test用戶能夠在指定的源登陸
測試test用戶鏈接mysql服務器
授予腳本執行權限
#chmod +x /root/mysql1.sh
執行腳本:
若是在鏈接時候使用了「-E, --vertical」參數,登入以後的全部查詢結果都將以縱列顯示,效果和咱們在一條query 以後以「\G」結尾同樣。
#mysql -E -u root -p
「-H, --html」與「-X, --xml」,在啓用這兩個參數以後,select出來的全部結果都會按照「Html」與「Xml」格式來輸出,在有些場合之下,好比但願Xml或者Html 文件格式導出某些報表文件的時候,是很是方便的。
#mysql -X -u root -p
「--prompt=name」參數對於作運維的人來講是一個很是重要的參數選項,其主要功能是定製本身的mysql 提示符的顯示內容。在默認狀況下,咱們經過mysql 登入到數據庫以後,mysql 的提示符只是一個很簡單的內容」mysql>「,沒有其餘任何附加信息。很是幸運的是mysql 經過「--prompt=name」參數給咱們提供了自定義提示信息的辦法,能夠經過配置顯示登入的主機地址,登陸用戶名,當前時間,當前數據庫schema,MySQL Server 的一些信
息等等。我我的強烈建議將登陸主機名,登陸用戶名和所在的schema 這三項加入提示內容,
由於當你們手邊管理的MySQL 愈來愈多,操做愈來愈頻繁的時候,很是容易由於操做的時候沒有太在乎本身當前所處的環境而形成在錯誤的環境執行了錯誤的命令並形成嚴重後果的狀況。若是咱們在提示內容中加入了這幾項以後,至少能夠更方便的提醒本身當前所處環境,以儘可能減小犯錯誤的機率。
我的強烈建議提示符定義: "\\u@\\h : \\d \\r:\\m:\\s> ",顯示效果:
切換數據庫:
提示符解釋:
\u 表示用戶名, \h 表示主機名, \d 表示當前數據庫,\r小時(12小時制),\m分種,\s秒,\R The current time, in 24-hour military time (0–23)
「--tee=name」參數也是對運維人員很是有用的參數選項,用來告訴mysql,將全部輸入和輸出內容都記錄進文件。在咱們一些較大維護變動的時候,爲了方便被查,最好是將整個操做過程的全部輸入和輸出內容都保存下來。
假如mysql命令行狀態下,要進行大量的交互操做,其實能夠把這些操做記錄在log中進行審計,很簡單 mysql -u root -p --tee=/path/xxxx.log
也能夠在服務器上的/etc/my.cnf中的[client]加入
tee = /tmp/client_mysql.log便可.
注:若沒有[client]就添加便可
或者在mysql>提示符下執行下面的命令
mysql 其餘參數選項能夠經過MySQL 官方參考手冊查閱,也能夠經過執行「mysql --help」或man mysql獲得幫助信息以後經過自行實驗來作進一步的深入認識。
二、mysqladmin
Usage: mysqladmin [OPTIONS] command command ...
mysqadmin,顧名思義,提供的功能都是與MySQL 管理相關的各類功能。如MySQL Server狀態檢查,各類統計信息的flush,建立/刪除數據庫,關閉MySQL Server 等等。mysqladmin所能作的事情,雖然大部分均可以經過mysql 鏈接登陸上MySQL Server 以後來完成,可是大部分經過mysqladmin 來完成操做會更簡單更方便。這裏將介紹一下常用到的幾個經常使用功能:
ping 命令能夠很容易檢測MySQL Server 是否還能正常提供服務
mysql本機上測試:
在其餘主機上測試mysql server是否正常提供服務
注1:地址192.168.56.11是mysql server的ip
注2:mysql server的防火牆要容許3306/tcp通訊
注3:在mysql server上建立受權用戶
status 命令能夠獲取當前MySQL Server 的幾個基本的狀態值:
mysqladmin status命令結果有下述列
Uptime:是mysql服務器運行的秒數。
Threads: 活躍線程的數量即開啓的會話數。
Questions: 服務器啓動以來客戶的問題(查詢)數目 (只要跟mysql做交互,無論查詢表,仍是查詢服務器狀態都記一次)。
Slow queries:是慢查詢的數量。
Opens:mysql已經打開的數據庫表的數量
Flush tables: mysql已經執行的flush tables,refresh和reload命令的數量。
注:flush tables //刷新表(清除緩存)
reload 重載受權表
refresh 洗掉全部表並關閉和打開日誌文件
open:打開數據庫的表的數量,以服務器啓動開始。
Queries per second avg:select語句平均查詢時間
Memory in use分配的內存(只有在MySQL用--with-debug編譯時可用)
Max memory used分配的最大內存(只有在MySQL用--with-debug編譯時可用)
processlist 獲取當前數據庫的鏈接線程信息:
監控mysql進程運行狀態:
上面的這三個功能在一些簡單監控腳本中常用到的。
mysqladmin 其餘參數選項能夠經過執行「mysqladmin --help」或man mysqladmin獲得幫助信息。
編寫一個簡單的mysql監控腳本,內容以下:
附加知識點1:
Mysql的系統數據庫:
1) INFORMATION_SCHEMA數據字典:此數據庫存貯了其餘全部數據庫的信息(元數據)。元數據是關於數據的數據,如database name或table name,列的數據類型,或訪問權限等。
INFORMATION_SCHEMA庫的主要系統表
TABLES表:提供了關於數據庫中的表和視圖的信息。(Table_schema字段表明 數據表所屬的數據庫名)
SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA='數據庫名';
COLUMNS表:提供了表中的列信息。詳細表述了某張表的全部列以及每一個列的信息。
SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='數據庫名‘' AND TABLE_NAME='表名'
TABLE_CONSTRAINTS表:存儲主鍵約束、外鍵約束、惟一約束、check約束。各字段的說明信息
ELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA='數據庫名' AND TABLE_NAME='表名'
STATISTICS表:提供了關於表索引的信息。
SELECT * FROM information_schema.STATISTICS WHERE TABLE_SCHEMA='數據庫名' AND TABLE_NAME='表名'
2)performance_schema 性能字典,此數據庫爲數據庫性能優化提供重要的參考信息
3)MYSQL數據庫: 該數據庫也是個核心數據庫,存儲用戶的權限信息與幫助信息。
4)MySQL5.7 提供了 sys系統數據庫。 sys數據庫裏面包含了一系列的存儲過程、自定義函數以及視圖來幫助咱們快速的瞭解系統的元數據信息。sys系統數據庫結合了information_schema和performance_schema的相關數據,讓咱們更加容易的檢索元數據。
附加知識點2:
mysql有關show的用法
SHOW DATABASES列出 MySQL Server上的數據庫。
SHOW TABLES [FROM db_name]列出數據庫中的表。
SHOW TABLE STATUS [FROM db_name]列出數據庫的表信息,比較詳細。
SHOW COLUMNS FROM tbl_name [FROM db_name]列出表的列信息,同 SHOW FIELDS FROM tbl_name [FROM db_name],
DESCRIBE tbl_name [col_name]。
SHOW FULL COLUMNS FROM tbl_name [FROM db_name]列出表的列信息,比較詳細,同 SHOW FULL FIELDS FROM tbl_name [FROM db_name]。
SHOW INDEX FROM tbl_name [FROM db_name]列出表的索引信息。
SHOW STATUS列出 Server 的狀態信息。
SHOW VARIABLES列出 MySQL 系參數值
SHOW PROCESSLIST查看當前mysql查詢進程
SHOW GRANTS FOR user列出用戶的受權命令
三、mysqldump:
這個工具其功能就是將MySQL Server中的數據以SQL 語句的形式從數據庫中dump 成文本文件。mysqldump 是作爲MySQL 的一種邏輯備份工具
四、mysqlbinlog
mysqlbinlog 程序的主要功能就是分析MySQL Server 所產生的二進制日誌(也就是binlog)。
經過mysqlbinlog,咱們能夠解析出binlog 中指定時間段或者指定日誌起始和結束位置的內容解析成SQL 語句。