mysql架構組成_第 2 章 MySQL 架構組成

麻雀雖小,五臟俱全。MySQL 雖然以簡單著稱,但其內部結構并不簡單。本章從MySQL物理組成、邏輯組成,以及相關工具幾個角度來介紹 MySQL 的整體架構組成,希望能夠讓讀者對 MySQL 有一個更全面深入的了解。

2.1 MySQL物理文件組成

2.1.1 日志文件

1、錯誤日志:Error Log

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

為了方便維護需要,有時候會希望將錯誤日志中的內容做備份并重新開始記錄,這時候就可以利用MySQL的FLUSH LOGS命令來告訴MySQL備份舊日志文件并生成新的日志文件。備份文件名以“.old”結尾。

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

二進制日志,也就是我們常說的binlog,也是MySQL Server中最為重要的日志之一。當我們通過“--log-bin[=file_name]”打開了記錄的功能之后,MySQL會將所有修改數據庫數據的query以二進制形式記錄到日志文件中。當然,日志中并不僅限于query語句這么簡單,還包括每一條query所執行的時間,所消耗的資源,以及相關的事務信息,所以binlog是事務安全的。

和錯誤日志一樣,binlog記錄功能同樣需要“--log-bin[=file_name]”參數的顯式指定才能開啟,如果未指定file_name,則會在數據目錄下記錄為mysql-bin.******(*代表0~9之間的某一個數字,來表示該日志的序號)。

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

“--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文件。

3、更新日志:update log

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

4、查詢日志:query log

查詢日志記錄MySQL中所有的query,通過“--log[=fina_name]”來打開該功能。由于記錄了所有的query,包括所有的select,體積比較大,開啟后對性能也有較大的影響,所以請大家慎用該功能。一般只用于跟蹤某些特殊的sql性能問題才會短暫打開該功能。默認的查詢日志文件名為hostname.log。

5、慢查詢日志:slow query log

顧名思義,慢查詢日志中記錄的是執行時間較長的query,也就是我們常說的slow query,通過設--log-slow-queries[=file_name]來打開該功能并設置記錄位置和文件名,默認文件名為hostname-slow.log,默認目錄也是數據目錄。

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

6、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”文件都存放在所屬數據庫的文件夾下面。

2、“.MYD”文件

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

3、“.MYI”文件

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

4、“.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的主機地址,連接用戶,連接密碼,連接端口,當前日志位置,已經讀取到的日志位置等信息。

2、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。

3、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讀取相關參數。

2、pid file

pid file是mysqld應用程序在Unix/Linux環境下的一個進程文件,和許多其他Unix/Linux服務端程序一樣,存放著自己的進程id。

3、socket file

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

2.2 MySQL Server 系統架構

2.2.1 邏輯模塊組成

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

e45c821554603bb6498862001dadd9dd.png

圖 2-1

雖然從上圖看起來MySQL架構非常的簡單,就是簡單的兩部分而已,但實際上每一層中都含有各自的很多小模塊,尤其是第一層 SQL Layer,結構相當復雜的。下面我們就分別針對SQL Layer和Storage Engine Layer做一個簡單的分析。

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

1、初始化模塊

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

2、核心API

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

3、網絡交互模塊

底層網絡交互模塊抽象出底層網絡交互所使用的接口api,實現底層網絡數據的接收與發送,以方便其他各個模塊調用,以及對這一部分的維護。所有源碼都在vio文件夾下面。

4、Client & Server 交互協議模塊

任何C/S結構的軟件系統,都肯定會有自己獨有的信息交互協議,MySQL也不例外。MySQL的Client & Server 交互協議模塊部分,實現了客戶端與MySQL交互過程中的所有協議。當然這些協議都是建立在現有的OS和網絡協議之上的,如TCP/IP以及Unix Socket。

5、用戶模塊

用戶模塊所實現的功能,主要包括用戶的登錄連接權限控制和用戶的授權管理。他就像MySQL的大門守衛一樣,決定是否給來訪者“開門”。

6、訪問控制模塊

造訪客人進門了就可以想干嘛就干嘛么?為了安全考慮,肯定不能如此隨意。這時候就需要訪問控制模塊實時監控客人的每一個動作,給不同的客人以不同的權限。訪問控制模塊實現的功能就是根據用戶模塊中各用戶的授權信息,以及數據庫自身特有的各種約束,來控制用戶對數據的訪問。用戶模塊和訪問控制模塊兩者結合起來,組成了MySQL整個數據庫系統的權限安全管理的功能。

7、連接管理、連接線程和線程管理

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

8、Query解析和轉發模塊

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

9、Query Cache模塊

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

10、Query優化器模塊

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

11、表變更管理模塊

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

12、表維護模塊

表的狀態檢查,錯誤修復,以及優化和分析等工作都是表維護模塊需要做的事情。

13、系統狀態管理模塊

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

14、表管理器

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

15、日志記錄模塊

日志記錄模塊主要負責整個系統級別的邏輯層的日志的記錄,包括error log,binary log,slow query log等。

16、復制模塊

復制模塊又可分為Master模塊和Slave模塊兩部分,Master模塊主要負責在Replication環境中讀取Master端的binary日志,以及與Slave端的I/O線程交互等工作。Slave模塊比Master模塊所要做的事情稍多一些,在系統中主要體現在兩個線程上面。一個是負責從Master請求和接受binary日志,并寫入本地relay log中的I/O線程。另外一個是負責從relay log中讀取相關日志事件,然后解析成可以在Slave端正確執行并得到和Master端完全相同的結果的命令并再交給Slave執行的SQL線程。

17、存儲引擎接口模塊

存儲引擎接口模塊可以說是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打開了bin-log功能,則對應的處理模塊還會調用日志處理模塊將相應的變更語句以更新事件的形式記錄到相關參數指定的二進制日志文件中。

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

了解到整個處理過程之后,我們可以將以上各個模塊畫成如圖2-2的關系圖:

f7ba4301af5dbce664c5a5ac3e978694.png

圖 2-2

2.3 MySQL 自帶工具使用介紹

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

1、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, --safe-updates”參數,功能是限制查詢記錄的條數,“--max_join_size=#”也需要與“-U, --safe-updates”一起使用,限制參與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程序的源代碼來發現其更多有趣的內容。

2、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的線程等等。

3、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程序的時候都通過盡量做到“--default-character-set=name”顯式指定字符集內容,以防止以錯誤的字符集生成不可用的內容。mysqldump所生成的SQL文件可以通過mysql工具執行。

4、mysqlimport

Usage: mysqlimport [OPTIONS] database textfile ...

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

5、mysqlbinlog

Usage: mysqlbinlog [OPTIONS] log-files

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

6、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之后來執行相應命令完成完全相同的任務。

7、myisamchk

Usage: myisamchk [OPTIONS] tables[.MYI]

功能有點類似“mysqlcheck -c/-r”,對檢查和修復MyISAM存儲引擎的表,但只能對MyISAM存儲引擎的索引文件有效,而且不用登錄連接上MySQL Server即可完成操作。

8、myisampack

Usage: myisampack [OPTIONS] filename ...

對MyISAM表進行壓縮處理,以縮減占用存儲空間,一般主要用在歸檔備份的場景下,而且壓縮后的MyISAM表會變成只讀,不能進行任何修改操作。當我們希望歸檔備份某些歷史數據表,而又希望該表能夠提供較為高效的查詢服務的時候,就可以通過myisampack工具程序來對該MyISAM表進行壓縮,因為即使雖然更換成archive存儲引擎也能夠將表變成只讀的壓縮表,但是archive表是沒有索引支持的,而通過壓縮后的MyISAM表仍然可以使用其索引。

9、mysqlhotcopy

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

mysqlhotcopy和其他的客戶端工具程序不太一樣的是他不是c(或者c++)程序編寫的,而是一個perl腳本程序,僅能在Unix/Linux環境下使用。他的主要功能就是對MySQL 中的MyISAM存儲引擎的表進行在線備份操作,其備份操作實際上就是通過對數據庫中的表進行加鎖,然后復制其結構,數據和索引文件來完成備份操作,當然,也可以通過指定“--noindices”告訴mysqlhotcopy不需要備份索引文件。

10、其他工具

除了上面介紹的這些工具程序之外,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。

2.4 小結

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534935.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534935.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534935.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python列表生成器語法_python列表生產式和生成器

1.列表生成式:通過簡潔的語法可以對一組元素進行過濾 格式:[exp for val in collection if condition] 例子1: a [x*xforxinxrange(1,10)ifx%20] print(a) 1)append(): 該方法用于在列表末尾添加新的對象,…

win2008 mysql端口_使用自定義端口連接SQL Server 2008的方法

使用過SQL Server的人大多都知道,SQL Server服務器默認監聽的端口號是1433,但是我今天遇到的問題是我的機器上有三個數據庫實例,這樣使用TCP/IP遠程連接時就產生了問題。如何在Microsoft SQL Server Management Studio里加入端口號連接呢&…

python基本命令range_Python的Range()函數(指南)

當需要執行特定次數的操作時,Python內置的range函數十分方便。 讀罷本文,你將: 理解Python的range函數是如何工作的 了解Python 2和Python 3中的實現方式有何不同 看過了不少range()函數操作實例 有能力解決它的一些局限性 讓我們開始吧&…

天涯python_python 網絡爬蟲(一)爬取天涯論壇評論

我是一個大二的學生,也是剛接觸python,接觸了爬蟲感覺爬蟲很有趣就爬了爬天涯論壇,中途碰到了很多問題,就想把這些問題分享出來,都是些簡單的問題,希望大佬們以寬容的眼光來看一個小菜鳥😄&…

python快遞費用計算_[Python]簡單用Python寫個查詢快遞的程序最后附源代碼

[Python] 純文本查看 復制代碼from requests_html import HTMLSession session HTMLSession() def sb(dh): 用來識別快遞 返回快遞種類! url http://www.kuaidi100.com/autonumber/autoComNum?resultv21&text dh header { Referer: http://www.kuaidi100.com/, User-A…

qos的_QoS 概述

QoS 是一個很大的領域,涉及到網絡中的多個層次和環節。本文僅簡要的談談 Endpoint 側的 QoS 概念,將這些紛繁的概念名詞串起來,便于理解。QoS 技術背景下圖說明了 QoS workflow 中,各項技術的位置和關系摘自 < 端到端Q…

為什么python 為什么沒有接口_python做接口測試的必要性

什么是接口測試 接口測試主要用于檢測外部系統與內部系統之間,以及系統內部各 個子系統之間的交互點。其測試的重點是,檢查數據的交換、傳遞和控 制管理過程,以及系統間的邏輯依賴關系等。 為什么要做接口測試 1.傳統的測試方法成本急劇增加&…

路由器mysql密碼重置密碼_【驗證】mysql root密碼恢復

1.首先確認服務器出于安全的狀態,也就是沒有人能夠任意地連接MySQL數據庫。因為在重新設置MySQL的root密碼的期間,MySQL數據庫完全出于沒有密碼保護的狀態下,其他的用戶也可以任意地登錄和修改MySQL的信息。可以采用將MySQL對外的…

centos daemonize_手把手教你在centos上配置Django項目(超詳細步驟)

前言關于Django的部署,本人也踩了很多坑,這篇文章一步一步教你怎么進行部署,只需要你按照我的步驟來就OK了!這里我們使用的服務器是一個全新的服務器,沒有安裝任何東西。基礎環境搭建步驟★ 注意:下面的步驟…

mysql8.0.17壓縮包安裝教程_mysql 8.0.16 壓縮包安裝配置方法圖文教程

本文為大家分享了mysql 8.0.16 壓縮包安裝配置方法,供大家參考,具體內容如下運行環境:windows 10 x641、下載zip安裝包:mysql8.0 for windows zip包:,進入頁面后可以不用登錄。后點擊底部“no thanks, just…

python收集數據程序_基于Python語言的互聯網數據收集軟件的設計

軟件建立所需的工具及其版本 編寫環境與 IDE Python3.5.2 Windows10 PyCharm 2016.3 Sublime Text3 第三方庫與版本號 Requests 2.12.1 BeautifulSoup 4.5.1 PYQT5 5.8.1 Pyinstaller 庫的作用 用于爬蟲編寫 用于爬蟲編寫 用于軟件 GUI 設計 用于封裝 python 程序 1.1 百度地圖…

Mysql保存是事件驅動嗎_【CHRIS RICHARDSON 微服務系列】事件驅動的數據管理-5

編者的話 |本文來自 Nginx 官方博客,是「Chris Richardson 微服務」系列的第五篇文章。第一篇文章介紹了微服務架構模式,并且討論了使用微服務的優缺點;第二和第三篇描述了微服務架構模塊間通訊的不同方面;第四篇研究了服務發現中…

chrome postman插件_收集了一些Chrome插件神器,助你快速成為老司機

剛開始開發項目的時候,我一直都在用火狐,因為它有一個fireBug插件,特別好用(目前已不支持),也不知道什么時候,就一直用起來Chrome瀏覽器了,可能是因為它有強大的插件作為后盾吧。開發了這么多年&#xff0c…