ch2 MySQL 架構組成

2 MySQL 架構組成

前言 html

麻雀雖小,五臟俱全。MySQL    雖然以簡單著稱,但其內部結構並不簡單。本章從 MySQL 物理組成、邏輯組成,以及相關工具幾個角度來介紹    MySQL    的總體架構組成,但願可以讓讀者對    MySQL    有一個更全面深刻的瞭解。 mysql

21 MySQL 物理文件組成

2.1.1 日誌文件

  1. 錯誤日誌:Error    Log

錯誤日誌記錄了 MyQL    Server 運行過程當中全部較爲嚴重的警告和錯誤信息,以及 MySQL Server 每次啓動和關閉的詳細信息。在默認狀況下,系統記錄錯誤日誌的功能是關閉的,錯誤信息被輸出到標準錯誤輸出(stderr),若是要開啓系統記錄錯誤日誌的功能,須要在啓動時開啓-log-error 選項。錯誤日誌的默認存放位置在數據目錄下,以 hostname.err 命名。可是可使用命令:--log-error[=file_name],修改其存放目錄和文件名。 linux

爲了方便維護須要,有時候會但願將錯誤日誌中的內容作備份並從新開始記錄,這時候就能夠利用 MySQL 的 FLUSH    LOGS 命令來告訴 MySQL 備份舊日誌文件並生成新的日誌文件。 c++

備份文件名以".old"結尾。 redis

  1. 二進制日誌:Binary    Log    &    Binary    Log    Index

    二進制日誌,也就是咱們常說的 binlog,也是 MySQL    Server 中最爲重要的日誌之一。 算法

當咱們經過"--log-bin[=file_name]"打開了記錄的功能以後,MySQL 會將全部修改數據庫數據的 query 以二進制形式記錄到日誌文件中。固然,日誌中並不只限於 query 語句這麼簡單,還包括每一條 query 所執行的時間,所消耗的資源,以及相關的事務信息,因此 binlog 是事務安全的。 sql

和錯誤日誌同樣,binlog 記錄功能一樣須要"--log-bin[=file_name]"參數的顯式指定才能開啓,若是未指定 file_name,則會在數據目錄下記錄爲 mysql-bin.******(*表明0~ 數據庫

9 之間的某一個數字,來表示該日誌的序號)。 windows

binlog 還有其餘一些附加選項參數: api

"--max_binlog_size"設置 binlog 的最大存儲上限,當日志達到該上限時,MySQL 會從新建立一個日誌開始繼續記錄。不過偶爾也有超出該設置的 binlog 產生,通常都是由於在即將達到上限時,產生了一個較大的事務,爲了保證事務安全,MySQL 不會將同一個事務分開記錄到兩個 binlog 中。

"--binlog-do-db=db_name"參數明確告訴 MySQL,須要對某個(db_name)數據庫記錄 binlog,若是有了"--binlog-do-db=db_name"參數的顯式指定,MySQL 會忽略針對其餘數據庫執行的 query,而僅僅記錄針對指定數據庫執行的 query。

"--binlog-ignore-db=db_name"與"--binlog-do-db=db_name"徹底相反,它顯式指定忽略某個(db_name)數據庫的 binlog 記錄,當指定了這個參數以後,MySQL 會記錄指定數據庫之外全部的數據庫的 binlog。

"--binlog-ignore-db=db_name"與"--binlog-do-db=db_name"兩個參數有一個共同的概念須要你們理解清楚,參數中的 db_name 不是指 query 語句更新的數據所在的數據庫,而是執行 query 的時候當前所處的數據庫。不論更新哪一個數據庫的數據,MySQL 僅僅比較當前鏈接所處的數據庫(經過 use    db_name 切換後所在的數據庫)與參數設置的數據庫名,而不會分析 query 語句所更新數據所在的數據庫。

mysql-bin.index 文件(binary    log    index)的功能是記錄全部 Binary    Log 的絕對路徑,保證    MySQL    各類線程可以順利的根據它找到全部須要的 Binary    Log 文件。 三、更新日誌:update    log

更新日誌是 MySQL 在較老的版本上使用的,其功能和 binlog 基本相似,只不過不是以二進制格式來記錄而是以簡單的文本格式記錄內容。自從 MySQL 增長了 binlog 功能以後,就不多使用更新日誌了。從版本 5.0 開始,MySQL 已經再也不支持更新日誌了。

  1. 查詢日誌:query    log

查詢日誌記錄 MySQL 中全部的 query,經過"--log[=fina_name]"來打開該功能。因爲記錄了全部的 query,包括全部的 select,體積比較大,開啓後對性能也有較大的影響,因此請你們慎用該功能。通常只用於跟蹤某些特殊的 sql 性能問題纔會短暫打開該功能。默認的查詢日誌文件名爲 hostname.log。

  1. 慢查詢日誌:slow    query    log

顧名思義,慢查詢日誌中記錄的是執行時間較長的 query,也就是咱們常說的 slow

query,經過設--log-slow-queries[=file_name]來打開該功能並設置記錄位置和文件名,默認文件名爲 hostname-slow.log,默認目錄也是數據目錄。

慢查詢日誌採用的是簡單的文本格式,能夠經過各類文本編輯器查看其中的內容。其中記錄了語句執行的時刻,執行所消耗的時間,執行用戶,鏈接主機等相關信息。MySQL 還提供了專門用來分析滿查詢日誌的工具程序 mysqlslowdump,用來幫助數據庫管理人員解決可能存在的性能問題。

  1. Innodb 的在線 redo 日誌:innodb    redo    log

Innodb 是一個事務安全的存儲引擎,其事務安全性主要就是經過在線 redo 日誌和記錄在表空間中的 undo 信息來保證的。redo 日誌中記錄了 Innodb 所作的全部物理變動和事務信息,經過 redo 日誌和 undo 信 息 ,Innodb 保證了在任何狀況下的事務安全性。Innodb 的redo 日誌一樣默認存放在數據目錄下,能夠經過 innodb_log_group_home_dir 來更改設置日誌的存放位置,經過 innodb_log_files_in_group 設置日誌的數量。

2.1.2 數據文件

在 MySQL 中每個數據庫都會在定義好(或者默認)的數據目錄下存在一個以數據庫名字命名的文件夾,用來存放該數據庫中各類表數據文件。不一樣的 MySQL 存儲引擎有各自不一樣的數據文件,存放位置也有區別。多數存儲引擎的數據文件都存放在和 MyISAM 數據文件位置相同的目錄下,可是每一個數據文件的擴展名卻各不同。如 MyISAM 用".MYD"做爲擴展名,Innodb 用".ibd",Archive 用".arc",CSV 用".csv",等等。

  1. ".frm"文件

與表相關的元數據(meta)信息都存放在".frm"文件中,包括表結構的定義信息等。不管是什麼存儲引擎,每個表都會有一個以表名命名的".frm"文件。全部的".frm"文件都存放在所屬數據庫的文件夾下面。

  1. ".MYD"文件

".MYD"文件是 MyISAM 存儲引擎專用,存放 MyISAM 表的數據。每個 MyISAM 表都會有一個".MYD"文件與之對應,一樣存放於所屬數據庫的文件夾下,和".frm"文件在一塊兒 。

  1. ".MYI"文件

".MYI"文件也是專屬於 MyISAM 存儲引擎的,主要存放 MyISAM 表的索引相關信息。對於 MyISAM 存儲來講,能夠被 cache 的內容主要就是來源於".MYI"文件中。每個 MyISAM 表對應一個".MYI"文件,存放於位置和".frm"以及".MYD"同樣。

  1. ".ibd"文件和 ibdata 文件

這兩種文件都是存放 Innodb 數據的文件,之因此有兩種文件來存放 Innodb 的數據(包括索引),是由於 Innodb 的數據存儲方式可以經過配置來決定是使用共享表空間存放存儲數據,仍是獨享表空間存放存儲數據。獨享表空間存儲方式使用".ibd"文件來存放數據,且每一個表一個".ibd"文件,文件存放在和 MyISAM 數據相同的位置。若是選用共享存儲表空間來存放數據,則會使用 ibdata 文件來存放,全部表共同使用一個(或者多個,可自行配置)ibdata 文件。ibdata 文件能夠經過 innodb_data_home_dir 和 innodb_data_file_path 兩 個 參 數 共 同 配 置 組 成 , innodb_data_home_dir 配 置 數 據 存 放 的 總 目 錄 , 而 innodb_data_file_path 配 置 每 一 個 文 件 的 名 稱 。 當 然 , 也 可 以 不 配 置 innodb_data_home_dir 而直接在 innodb_data_file_path 參數配置的時候使用絕對路徑來完成配置。innodb_data_file_path 中能夠一次配置多個 ibdata 文件。文件能夠是指定大小,也能夠是自動擴展的,可是 Innodb 限制了僅僅只有最後一個 ibdata 文件可以配置成自動擴展類型。當咱們須要添加新的 ibdata 文件的時候,只能添加在 innodb_data_file_path 配置的最後,並且必須重啓 MySQL 才能完成 ibdata 的添加工做。不過若是咱們使用獨享表空間存儲方式的話,就不會有這樣的問題,可是若是要使用裸設備的話,每一個表一個裸設備 ,可能形成裸設備數量很是大,並且不太容易控制大小,實現比較困難,而共享表空間卻不會有這個問題,容易控制裸設備數量。我我的仍是更傾向於使用獨享表空間存儲方式。固然,兩種方式各有利弊,看你們各自應用環境的側重點在那裏了。

上面僅僅介紹了兩種最經常使用存儲引擎的數據文件,此外其餘各類存儲引擎都有各自的數據文件,讀者朋友能夠自行建立某個存儲引擎的表作一個簡單的測試,作更多的瞭解。

2.1.3 Replication 相關文件:

  1. master.info 文件:

master.info 文件存在於 Slave 端的數據目錄下,裏面存放了該 Slave 的 Master 端的相關信息,包括 Master 的主機地址,鏈接用戶,鏈接密碼,鏈接端口,當前日誌位置,已經讀取到的日誌位置等信息。

  1. relay    log    和 relay    log    index

mysql-relay-bin.xxxxxn 文件用於存放    Slave    端的 I/O 線程從    Master    端所讀取到的    Binary    Log    信息,而後由    Slave    端的    SQL    線程從該    relay    log    中讀取並解析相應的日誌信息,轉化成    Master    所執行的    SQL    語句,而後在    Slave    端應用。

mysql-relay-bin.index 文件的功能相似於    mysql-bin.index ,一樣是記錄日誌的存放位置的絕對路徑,只不過他所記錄的不是    Binary    Log,而是    Relay    Log。

  1. relay-log.info 文件:

相似於 master.info,它存放經過 Slave 的 I/O 線程寫入到本地的 relay log 的相關信息。供 Slave 端的 SQL 線程以及某些管理操做隨時可以獲取當前複製的相關信息。

2.1.4    其餘文件:

  1. system    config    file

MySQL 的系統配置文件通常都是"my.cnf",Unix/Linux 下默認存放在"/etc"目錄下, Windows 環境通常存放在"c:/windows"目錄下面。"my.cnf"文件中包含多種參數選項組(group),每一種參數組都經過中括號給定了固定的組名,如"[mysqld]"組中包括了 mysqld 服務啓動時候的初始化參數,"[client]"組中包含着客戶端工具程序能夠讀取的參數,此外還有其餘針對於各個客戶端軟件的特定參數組,如 mysql 程序使用的"[mysql]",mysqlchk 使用的"[mysqlchk]",等等。若是讀者朋友本身編寫了某個客戶端程序,也能夠本身設定一個參數組名,將相關參數配置在裏面,而後調用 mysql 客戶端 api 程序中的參數讀取 api 讀取相關參數。

  1. pid    file

    pid    file 是 mysqld 應用程序 在 Unix/Linux 環境下的一個進程文件,和許多其餘

Unix/Linux 服務端程序同樣,存放着本身的進程 id。

  1. socket    file

socket 文件也是在 Unix/Linux 環境下才有的,用戶在 Unix/Linux 環境下客戶端鏈接

能夠不經過 TCP/IP 網絡而直接使用 Unix    Socket 來鏈接 MySQL。

22 MySQL Server 系統架構

2.2.1 邏輯模塊組成

總的來講,MySQL 能夠當作是二層架構,第一層咱們一般叫作 SQL Layer,在 MySQL 數據庫系統處理底層數據以前的全部工做都是在這一層完成的,包括權限判斷,sql 解析,執行計劃優化,query cache 的處理等等;第二層就是存儲引擎層,咱們一般叫作 Storage Engine Layer,也就是底層數據存取操做實現部分,由多種存儲引擎共同組成。因此,能夠用以下一張最簡單的架構示意圖來表示 MySQL 的基本架構,如圖 2-1 所示:

    圖    2-1

雖然從上圖看起來 MySQL 架構很是的簡單,就是簡單的兩部分而已,但實際上每一層中都含有各自的不少小模塊,尤爲是第一層 SQL Layer,結構至關複雜的。下面咱們就分別針對 SQL Layer 和 Storage Engine Layer 作一個簡單的分析。

    SQL    Layer 中包含了多個子模塊,下面我將逐個作一下簡單的介紹:

  1. 初始化模塊

顧名思議,初始化模塊就是在 MySQL    Server 啓動的時候,對整個系統作各類各樣的初始化操做,好比各類 buffer,cache 結構的初始化和內存空間的申請,各類系統變量的初始化設定,各類存儲引擎的初始化設置,等等。

  1. 核心 API

核心 API 模塊主要是爲了提供一些須要很是高效的底層操做功能的優化實現,包括各類底層數據結構的實現,特殊算法的實現,字符串處理,數字處理等,小文件 I/O,格式化輸出,以及最重要的內存管理部分。核心 API 模塊的全部源代碼都集中在 mysys 和 strings 文件夾下面,有興趣的讀者能夠研究研究。

  1. 網絡交互模塊

底層網絡交互模塊抽象出底層網絡交互所使用的接口 api,實現底層網絡數據的接收與

發送,以方便其餘各個模塊調用,以及對這一部分的維護。全部源碼都在 vio 文件夾下面。

  1. Client    &    Server    交互協議模塊

任何 C/S 結構的軟件系統,都確定會有本身獨有的信息交互協議,MySQL 也 不例 外。MySQL 的 Client & Server 交互協議模塊部分,實現了客戶端與 MySQL 交互過程當中的全部協議。

固然這些協議都是創建在現有的 OS 和網絡協議之上的,如 TCP/IP 以及 Unix    Socket。

  1. 用戶模塊

用戶模塊所實現的功能,主要包括用戶的登陸鏈接權限控制和用戶的受權管理。他就像

MySQL 的大門守衛同樣,決定是否給來訪者"開門"。

  1. 訪問控制模塊

造訪客人進門了就能夠想幹嗎就幹嗎麼?爲了安全考慮,確定不能如此隨意。這時候就須要訪問控制模塊實時監控客人的每個動做,給不一樣的客人以不一樣的權限。訪問控制模塊實現的功能就是根據用戶模塊中各用戶的受權信息,以及數據庫自身特有的各類約束,來控制用戶對數據的訪問。用戶模塊和訪問控制模塊二者結合起來,組成了 MySQL 整個數據庫系統的權限安全管理的功能。

  1. 鏈接管理、鏈接線程和線程管理

鏈接管理模塊負責監聽對 MySQL Server 的各類請求,接收鏈接請求,轉發全部鏈接請求到線程管理模塊。每個鏈接上 MySQL Server 的客戶端請求都會被分配(或建立)一個鏈接線程爲其單獨服務。而鏈接線程的主要工做就是負責 MySQL Server 與客戶端的通訊,接受客戶端的命令請求,傳遞 Server 端的結果信息等。線程管理模塊則負責管理維護這些鏈接線程。包括線程的建立,線程的 cache 等。

  1. Query 解析和轉發模塊

在 MySQL 中咱們習慣將全部 Client 端發送給 Server 端的命令都稱爲 query,在 MySQL Server 裏面,鏈接線程接收到客戶端的一個 Query 後,會直接將該 query 傳遞給專門負責將各類 Query 進行分類而後轉發給各個對應的處理模塊,這個模塊就是 query 解析和轉發模塊。其主要工做就是將 query 語句進行語義和語法的分析,而後按照不一樣的操做類型進行分類,而後作出針對性的轉發。

  1. Query    Cache 模塊

Query    Cache 模塊在 MySQL 中是一個很是重要的模塊,他的主要功能是將客戶端提交給 MySQL 的 Select 類 query 請求的返回結果集 cache 到內存中,與該 query 的一個 hash 值作一個對應。該 Query 所取數據的基表發生任何數據的變化以後,MySQL 會自動使該 query 的 Cache 失效。在讀寫比例很是高的應用系統中,Query    Cache 對性能的提升是很是顯著的。

固然它對內存的消耗也是很是大的。

  1. Query 優化器模塊

Query 優化器,顧名思義,就是優化客戶端請求的 query,根據客戶端請求的 query 語句,和數據庫中的一些統計信息,在一系列算法的基礎上進行分析,得出一個最優的策略,告訴後面的程序如何取得這個 query 語句的結果。

  1. 表變動管理模塊

表變動管理模塊主要是負責完成一些 DML 和 DDL 的 query,如 :update,delte,insert, create table,alter table 等語句的處理。

  1. 表維護模塊表的狀態檢查,錯誤修復,以及優化和分析等工做都是表維護模塊須要作的事情。
  2. 系統狀態管理模塊

系統狀態管理模塊負責在客戶端請求系統狀態的時候,將各類狀態數據返回給用戶,像 DBA 經常使用的各類 show status 命令,show variables 命令等,所獲得的結果都是由這個模塊返回的。

  1. 表管理器

這個模塊從名字上看來很容易和上面的表變動和表維護模塊相混淆,可是其功能與變動及維護模塊卻徹底不一樣。你們知道,每個 MySQL 的表都有一個表的定義文件,也就是*.frm 文件。表管理器的工做主要就是維護這些文件,以及一個 cache,該 cache 中的主要內容是各個表的結構信息。此外它還維護 table 級別的鎖管理。

  1. 日誌記錄模塊

日誌記錄模塊主要負責整個系統級別的邏輯層的日誌的記錄,包括 error    log,binary log,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 可插拔存儲引擎的特點。

2.2.2 各模塊工做配合

在瞭解了 MySQL 的各個模塊以後,咱們再看看 MySQL 各個模塊間是如何相互協同工做的 。接下來,咱們經過啓動 MySQL,客戶端鏈接,請求 query,獲得返回結果,最後退出,這樣一整個過程來進行分析。

當咱們執行啓動 MySQL 命令以後,MySQL 的初始化模塊就從系統配置文件中讀取系統參數和命令行參數,並按照參數來初始化整個系統,如申請並分配 buffer,初始化全局變量,以及各類結構等。同時各個存儲引擎也被啓動,並進行各自的初始化工做。當整個系統初始化結束後,由鏈接管理模塊接手。鏈接管理模塊會啓動處理客戶端鏈接請求的監聽程序,包括 tcp/ip 的網絡監聽,還有 unix 的 socket。這時候,MySQL    Server 就基本啓動完成,準備好接受客戶端請求了。

當鏈接管理模塊監聽到客戶端的鏈接請求(藉助網絡交互模塊的相關功能),雙方經過 Client    &    Server    交互協議模塊所定義的協議"寒暄"幾句以後,鏈接管理模塊就會將鏈接請求轉發給線程管理模塊,去請求一個鏈接線程。

線程管理模塊立刻又會將控制交給鏈接線程模塊,告訴鏈接線程模塊:如今我這邊有鏈接請求過來了,須要創建鏈接,你趕快處理一下。鏈接線程模塊在接到鏈接請求後,首先會檢查當前鏈接線程池中是否有被 cache 的空閒鏈接線程,若是有,就取出一個和客戶端請求鏈接上,若是沒有空閒的鏈接線程,則創建一個新的鏈接線程與客戶端請求鏈接。固然,鏈接線程模塊並非在收到鏈接請求後立刻就會取出一個鏈接線程連和客戶端鏈接,而是首先經過調用用戶模塊進行受權檢查,只有客戶端請求經過了受權檢查後,他纔會將客戶端請求和負責請求的鏈接線程連上。

在 MySQL 中,將客戶端請求分爲了兩種類型:一種是 query,須要調用 Parser 也就是 Query 解析和轉發模塊的解析纔可以執行的請求;一種是 command,不須要調用 Parser 就能夠直接執行的請求。若是咱們的初始化配置中打開了 Full Query Logging 的功能,那麼 Query 解析與轉發模塊會調用日誌記錄模塊將請求計入日誌,無論是一個 Query 類型的請求仍是一個 command 類型的請求,都會被記錄進入日誌,因此出於性能考慮,通常不多打開 Full

Query    Logging 的功能。

當客戶端請求和鏈接線程"互換暗號(互通協議)"接上頭以後,鏈接線程就開始處理客戶端請求發送過來的各類命令(或者 query),接受相關請求。它將收到的 query 語句轉給 Query 解析和轉發模塊,Query 解析器先對 Query 進行基本的語義和語法解析,而後根據命令類型的不一樣,有些會直接處理,有些會分發給其餘模塊來處理。

若是是一個 Query 類型的請求,會將控制權交給 Query 解析器。Query 解析器首先分析看是否是一個 select 類型的 query,若是是,則調用查詢緩存模塊,讓它檢查該 query 在 query    cache 中是否已經存在。若是有,則直接將 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 解析與分發模塊分發過來的請求後,首先會經過訪問控制模塊檢查鏈接用戶是否有訪問目標表以及目標字段的權限,若是有,就會調用表管理模塊請求相應的表,並獲取對應的鎖。表管理模塊首先會查看該表是否已經存在於 table    cache 中,若是已經打開則直接進行鎖相關的處理,若是沒有在 cache 中,則須要再打開表文件獲取鎖,而後將打開的表交給表變動管理模塊。

當表變動管理模塊"獲取"打開的表以後,就會根據該表的相關 meta 信息,判斷表的存儲引擎類型和其餘相關信息。根據表的存儲引擎類型,提交請求給存儲引擎接口模塊,調用對應的存儲引擎實現模塊,進行相應處理。不過,對於表變動管理模塊來講,可見的僅是存儲引擎接口模塊所提供的一系列"標準" 接口,底層存儲引擎實現模塊的具體實現,對於表變動管理模塊來講是透明的。他只須要調用對應的接口,並指明表類型,接口模塊會根據表類型調用正確的存儲引擎來進行相應的處理。

當一條 query 或者一個 command 處理完成(成功或者失敗)以後,控制權都會交還給鏈接線程模塊。若是處理成功,則將處理結果(多是一個 Result set,也多是成功或者失敗的標識)經過鏈接線程反饋給客戶端。若是處理過程當中發生錯誤,也會將相應的錯誤信息發送給客戶端,而後鏈接線程模塊會進行相應的清理工做,並繼續等待後面的請求,重複上面提到的過程,或者完成客戶端斷開鏈接的請求。

若是在上面的過程當中,相關模塊使數據庫中的數據發生了變化,並且 MySQL 打開了 binlog 功能,則對應的處理模塊還會調用日誌處理模塊將相應的變動語句以更新事件的形式記錄到相關參數指定的二進制日誌文件中。

在上面各個模塊的處理過程當中,各自的核心運算處理功能部分都會高度依賴整個 MySQL 的核心 API 模塊,好比內存管理,文件 I/O,數字和字符串處理等等。

瞭解到整個處理過程以後,咱們能夠將以上各個模塊畫成如圖 2-2 的關係圖:

    圖    2-2

23 MySQL 自帶工具使用介紹

MySQL 數據庫不只提供了數據庫的服務器端應用程序,同時還提供了大量的客戶端工具程序,如 mysql,mysqladmin,mysqldump 等等,都是你們所熟悉的。雖然有些人對這些工具的功能都已經比較瞭解了,可是真正能將這些工具程序物盡其用的人可能並非太多,或者知道的不全,也可能並不徹底瞭解其中的某種特性。因此在這裏我也簡單地作一個介紹。

一、mysql

相信在全部 MySQL 客戶端工具中,讀者瞭解最多的就是 mysql 了,用的最多的應該也非

他莫屬。mysql 的功能和 Oracle 的 sqlplus 同樣,爲用戶提供一個命令行接口來操做管理 MySQL 服務器。其基本的使用語法這裏就不介紹了,你們只要運行一下"mysql --help"就會獲得以下相應的基本使用幫助信息:

sky@sky:~$    mysql    --help

mysql Ver 14.14 Distrib 5.1.26-rc, for pc-linux-gnu (i686) using EditLine wrapper

Copyright    (C)    2000-2008    MySQL    AB

This    software    comes    with    ABSOLUTELY    NO    WARRANTY.    This    is    free    software, and    you    are    welcome    to    modify    and    redistribute it    under    the    GPL    license

Usage:    mysql    [OPTIONS]    [database]

-?,    --help ...    ...

Display    this    help    and    exit.

-e,    --execute=name

Execute    command    and    quit.    (Disables    --force    and    history file)

-E,    --vertical ...    ...

Print    the    output    of    a    query    (rows)    vertically.

-H,    --html

Produce    HTML    output.

-X,    --xml ...    ...

Produce    XML    output

--prompt=name ...    ...

Set    the    mysql    prompt    to    this    value.

--tee=name

Append    everything    into    outfile.    See    interactive    help    (\h)

    also.    Does    not    work    in    batch    mode.    Disable    with

    --disable-tee. This    option    is    disabled    by    default.

...    ...

-U,    --safe-updates    Only    allow    UPDATE    and    DELETE    that    uses    keys.

--select_limit=#

Automatic    limit    for    SELECT    when    using    --safe-updates

--max_join_size=# ...    ...

Automatic    limit    for    rows    in    a    join    when    using

--safe-updates

--show-warnings

Show    warnings    after    every    statement.

...    ...

上面的內容僅僅只是輸出的一部分,省略去掉了你們最經常使用的一些參數(由於你們應該已經很熟悉了),留下了部分我的認爲可能不是太常常用到,可是在有些狀況下卻能給咱們帶來意料以外的驚喜的一些參數選項。

首先看看"-e, --execute=name"參數,這個參數是告訴 mysql,我只要執行"-e"後面的某個命令,而不是要經過 mysql 鏈接登陸到 MySQL Server 上面。此參數在咱們寫一些基本的 MySQL 檢查和監控的腳本中很是有用,我我的就常常在腳本中使用到他。

若是在鏈接時候使用了"-E, --vertical"參數,登入以後的全部查詢結果都將以縱列顯示,效果和咱們在一條 query 以後以"\G"結尾同樣,這個參數的使用場景可能不是特別多。

"-H, --html"與"-X, --xml"這兩個參數頗有意思的,在啓用這兩個參數以後,select 出來的全部結果都會按照"Html"與"Xml"格式來輸出,在有些場合之下,好比但願 Xml 或者 Html 文件格式導出某些報表文件的時候,是很是方便的。

"--prompt=name"參數對於作運維的人來講是一個很是重要的參數選項,其主要功能是定製本身的 mysql 提示符的顯示內容。在默認狀況下,咱們經過 mysql 登入到數據庫以後 , mysql 的提示符只是一個很簡單的內容"mysql>",沒有其餘任何附加信息。很是幸運的是 mysql 經過"--prompt=name"參數給咱們提供了自定義提示信息的辦法,能夠經過配置顯示登入的主機地址,登陸用戶名,當前時間,當前數據庫 schema,MySQL    Server 的一些信息等等。我我的強烈建議將登陸主機名,登陸用戶名和所在的 schema 這三項加入提示內容,由於當你們手邊管理的 MySQL 愈來愈多,操做愈來愈頻繁的時候,很是容易由於操做的時候沒有太在乎本身當前所處的環境而形成在錯誤的環境執行了錯誤的命令並形成嚴重後果的狀況。若是咱們在提示內容中加入了這幾項以後,至少能夠更方便的提醒本身當前所處環境 ,以儘可能減小犯錯誤的機率。

    我我的的提示符定義:    "\\u@\\h    :    \\d    \\r:\\m:\\s>    ",顯示效果:

    "sky@localhost :    test    04:25:45>"

"--tee=name"參數也是對運維人員很是有用的參數選項,用來告訴 mysql,將全部輸入和輸出內容都記錄進文件。在咱們一些較大維護變動的時候,爲了方便被查,最好是將整個操做過程的全部輸入和輸出內容都保存下來。有了"--tee=name"參數,就不再用經過 copy 屏幕來保存操做過程了。

"-U, --safe-updates","--select_limit=#"和"--max_join_size=#"三個參數都是出於性能相關考慮的參數。使用"-U, --safe-updates"參數以後,將禁止全部不能使用索引的 update 和 delete 操做的請求,"--select_limit=#"的使用前提是有"-U, --safeupdates"參數,功能是限制查詢記錄的條數,"--max_join_size=#"也須要與"-U, --safeupdates"一塊兒使用,限制參與 join 的最大記錄數。

"--show-warnings"參數做用是在執行完每一條 query 以後都會自動執行一次"show warnings",顯示出最後一次 warning 的內容。

上面僅僅介紹了部分不是太常使用可是頗有特色的少數幾個參數選項,實際上 mysql

程序支持很是多的參數選項,有其自身的參數,也有提交給 MySQL Server 的。mysql 的全部參數選項均可以寫在 MySQL Server 啓動參數文件(my.cnf)的[mysql]參數 group 中,還有部分鏈接選項參數會從[client]參數 group 中讀取,這樣不少參數就能夠不用在每次執行 mysql 的時候都手工輸入,而由 mysql 程序本身自動從 my.cnf 文件 load 這些參數。

若是讀者朋友但願對 mysql 其餘參數選項或者 mysql 的其餘更國有圖有更深刻的瞭解,

能夠經過 MySQL 官方參考手冊查閱,也能夠經過執行"mysql    --help"獲得幫助信息以後經過自行實驗來作進一步的深入認識。固然若是您是一位基本能看懂 c 語言的朋友,那麼您徹底能夠經過 mysql 程序的源代碼來發現其更多有趣的內容。

二、mysqladmin

    Usage:    mysqladmin    [OPTIONS]    command    command    ...

mysqadmin,顧名思義,提供的功能都是與 MySQL 管理相關的各類功能。如 MySQL    Server 狀態檢查,各類統計信息的 flush,建立/刪除數據庫,關閉 MySQL    Server 等等。mysqladmin 所能作的事情,雖然大部分均可以經過 mysql 鏈接登陸上 MySQL    Server 以後來完成,可是大部分經過 mysqladmin 來完成操做會更簡單更方便。這裏我將介紹一下本身常用到的幾個經常使用功能:

    ping 命令能夠很容易檢測 MySQL    Server 是否還能正常提供服務

sky@sky:~# mysqladmin -u sky -ppwd -h localhost ping mysqld is alive

    status 命令能夠獲取當前 MySQL    Server 的幾個基本的狀態值:

    sky@sky:~#    mysqladmin    -u    sky    -ppwd    -h    localhost    status

Uptime:    20960    Threads:    1    Questions:    75    Slow    queries:    0    Opens:    15    Flush tables:    1    Open    tables:    9    Queries    per    second    avg:    0.3

processlist 獲取當前數據庫的鏈接線程信息:

    sky@sky:~#    mysqladmin    -u    sky    -ppwd    -h    localhost    processlist

+----+------+-----------+----+---------+------+-------+------------------+

|    Id    |    User    |    Host    |    db    |    Command    |    Time    |    State    |    Info    | +----+------+-----------+----+---------+------+-------+------------------+

    |    48    |    sky    |    localhost    |    |    Query    |    0    |    |    show    processlist    |

+----+------+-----------+----+---------+------+-------+------------------+

上面的這三個功能是我在本身的一些簡單監控腳本中常用到的,雖然獲得的信息仍是比較有限,可是對於完成一些比較基本的監控來講,已經足夠勝任了。此外,還能夠經過 mysqladmin 來 start    slave 和 stop    slave,kill 某個鏈接到 MySQL    Server 的線程等等。

  1. mysqldump

    Usage:    mysqldump    [OPTIONS]    database    [tables]

OR    mysqldump    [OPTIONS]    --databases    [OPTIONS]    DB1    [DB2    DB3...] OR    mysqldump    [OPTIONS]    --all-databases [OPTIONS]

mysqldump 這個工具我想大部分讀者可能都比較熟悉了,其功能就是將 MySQL Server 中的數據以 SQL 語句的形式從數據庫中 dump 成文本文件。雖然 mysqldump 是作爲 MySQL 的一種邏輯備份工具爲你們所認識,但我我的以爲稱他爲 SQL 生成導出工具更合適一點,由於經過 mysqldump 所生成的文件,所有是 SQL 語句,包括數據庫和表的建立語句。固然,經過給 mysqldump 程序加"-T"選項參數以後,能夠生成非 SQL 形式的指定給是的文本文件。這個功能其實是調用了 MySQL 中的"select * into OUTFILE from ..."語句而實現。也能夠經過"-d,--no-data"僅僅生成結構建立的語句。在聲稱 SQL 語句的時候,字符集設置這一項也是比較關鍵的,建議每次執行 mysqldump 程序的時候都經過儘可能作到"--defaultcharacter-set=name"顯式指定字符集內容,以防止以錯誤的字符集生成不可用的內容。 mysqldump 所生成的 SQL 文件能夠經過 mysql 工具執行。

  1. mysqlimport

    Usage:    mysqlimport    [OPTIONS]    database    textfile    ...

mysqlimport 程序是一個將以特定格式存放的文本數據(如經過"select * into OUTFILE from ..."所生成的數據文件)導入到指定的 MySQL Server 中的工具程序,好比將一個標準的 csv 文件導入到某指定數據庫的指定表中。mysqlimport 工具實際上也只是 "load data infile"命令的一個包裝實現。

  1. mysqlbinlog

    Usage:    mysqlbinlog    [OPTIONS]    log-files

mysqlbinlog 程序的主要功能就是分析 MySQL Server 所產生的二進制日誌(也就是你們所熟知的 binlog)。當咱們但願經過以前備份的 binlog 作一些指定時間之類的恢復的時候,mysqlbinlog 就能夠幫助咱們找到恢復操做須要作哪些事情。經過 mysqlbinlog,咱們能夠解析出 binlog 中指定時間段或者指定日誌起始和結束位置的內容解析成 SQL 語句,並導出到指定的文件中,在解析過程當中,還能夠經過指定數據庫名稱來過濾輸出內容。

  1. mysqlcheck

    Usage:    mysqlcheck    [OPTIONS]    database    [tables]

OR    mysqlcheck    [OPTIONS]    --databases    DB1    [DB2    DB3...] OR    mysqlcheck    [OPTIONS]    --all-databases

mysqlcheck 工具程序能夠檢查(check),修復( repair),分析( analyze)和優化(optimize)MySQL Server 中的表,但並非全部的存儲引擎都支持這裏全部的四個功能,像 Innodb 就不支持修復功能。實際上,mysqlcheck 程序的這四個功能均可以經過 mysql 鏈接登陸到 MySQL Server 以後來執行相應命令完成徹底相同的任務。

  1. myisamchk

    Usage:    myisamchk    [OPTIONS]    tables[.MYI]

功能有點相似"mysqlcheck -c/-r",對檢查和修復 MyISAM 存儲引擎的表,但只能對 MyISAM 存儲引擎的索引文件有效,並且不用登陸鏈接上 MySQL Server 便可完成操做。

  1. myisampack

    Usage:    myisampack    [OPTIONS]    filename    ...

對 MyISAM 表進行壓縮處理,以縮減佔用存儲空間,通常主要用在歸檔備份的場景下,

並且壓縮後的 MyISAM 表會變成只讀,不能進行任何修改操做。當咱們但願歸檔備份某些歷史數據表,而又但願該表可以提供較爲高效的查詢服務的時候,就能夠經過 myisampack 工具程序來對該 MyISAM 表進行壓縮,由於即便雖然更換成 archive 存儲引擎也可以將表變成只讀的壓縮表,可是 archive 表是沒有索引支持的,而經過壓縮後的 MyISAM 表仍然可使用其索引。

  1. mysqlhotcopy

    Usage:    mysqlhotcopy    db_name[./table_regex/] [new_db_name    |    directory]

mysqlhotcopy 和其餘的客戶端工具程序不太同樣的是他不是 c(或者 c++)程序編寫的 ,

而是一個 perl 腳本程序,僅能在 Unix/Linux 環境下使用。他的主要功能就是對 MySQL 中的 MyISAM 存儲引擎的表進行在線備份操做,其備份操做實際上就是經過對數據庫中的表進行加鎖,而後複製其結構,數據和索引文件來完成備份操做,固然,也能夠經過指定 "-noindices"告訴 mysqlhotcopy 不須要備份索引文件。

  1. 其餘工具除了上面介紹的這些工具程序以外,MySQL 還有自帶了其餘大量的工具程序,如針對離

線 Innodb 文 件 作 checksum 的 innochecksum, 轉 換 mSQL C API 函 數 的 msql2mysql , dumpMyISAM 全文索引的 myisam_ftdump,分析處理 slowlog 的 mysqldumpslow,查詢 mysql 相關開發包位置和 include 文件位置的 mysql_config, 向 MySQL AB 報告 bug 的 mysqlbug,測 試 套 件 mysqltest 和 mysql_client_test , 批 量 修 改 表 存 儲 引 擎 類 型 的 mysql_convert_table_format, 能 從 更 新 日 志 中 提 取 給 定 匹 配 規 則 的 query 語 句 的 mysql_find_rows,更改 MyIsam 存儲引擎表後綴名的 mysql_fix_extensions,修復系統表的 mysql_fix_privilege_tables,查看數據庫相關對象結構的 mysqlshow,MySQL 升級工具 mysql_upgrade,經過給定匹配模式來 kill 客戶端鏈接線程的 mysql_zap,查看錯誤號信息的 perror,文本替換工具 replace,等 等一系列工具程序可供咱們使用。若是您但願在 MySQL 源代碼的基礎上作一些本身的修改,如修改 MyISAM 存儲引擎的時候,能夠利用 myisamlog 來進行跟蹤分析 MyISAM 的 log。

相關文章
相關標籤/搜索