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。