目錄
一. mysqlcheck——表維護程序
?1.1.作用
1.2 注意事項
1.3 使用方法
1.4 常用選項
1.5?mysqlcheck的特殊使用
二. mysqldump——數據庫備份程序
2.1.作用
2.2 注意事項
2.3 使用方法
2.4 常用選項
三.?mysqladmin——MySQL 服務器管理程序
3.1.作用
3.2 使用方法
3.3 支持的命令
3.4 常用選項
四.mysqlshow——顯?數據庫、表和列信息
4.1.作用
4.2.注意事項
4.3.使用方法
4.4.常用選項
五.mysqldumpslow - 總結慢查詢日志文件
5.1 作用
5.2 注意事項
5.3 使用方法
5.4.常用選項
六.?mysqlbinlog——處理二進制日志文件
6.1 作用
6.2 注意事項
6.3 使用方法
6.4常用選項
七.mysqlslap - 負載仿真客戶端
7.1 作用
7.2 使用方法
7.3 注意事項
7.4.常用選項
7.5.示例
話接上篇,我們只講了mysqld和mysql,但是還是有很多其他的應用我們還沒有講解。
程序名 | 作用 | 特別說明 |
---|---|---|
mysqld | MySQL 服務器守護進程 | 客戶端程序需依賴其運行,負責處理數據庫請求 |
mysql | MySQL 命令行客戶端 | 日常最常用工具,支持交互式 SQL 輸入或批量執行 SQL 腳本 |
mysqlcheck | 表維護客戶端 | 用于檢查、修復、分析和優化數據庫表 |
mysqldump | 數據庫邏輯備份客戶端 | 導出數據庫/表結構及數據到 SQL、文本或 XML 文件 |
mysqlimport | 數據導入客戶端 | 將文本文件(如 CSV)數據導入表,封裝?LOAD DATA INFILE |
mysqladmin | 管理操作客戶端 | 執行創建/刪除數據庫、重載權限表等任務,可檢索服務器版本、進程和狀態信息 |
mysqlshow | 信息顯示客戶端 | 展示數據庫、表、列和索引的結構信息 |
mysqldumpslow | 慢查詢日志分析工具 | 解析慢查詢日志,匯總性能問題 |
mysqlbinlog | 二進制日志處理工具 | 讀取二進制日志文件并輸出 SQL 語句,用于數據恢復和主從復制 |
mysqlslap | 負載模擬與基準測試工具 | 模擬多客戶端并發訪問,測試性能并報告響應時間 |
現在我們就來簡單的講解一下這些程序
在命令行中使用MySQL發行版中的其他工具時,一些選項是公共的,比如用戶名和密碼,使用方法和 mysql相同,在這里統一列出,后面我們在介紹不同的工具時,只討論個性的選項及作用,公共選項 如下所示:
選項-長格式 | 短格式 | 說明 |
---|---|---|
--host=host_name | -h host_name | 連接到指定主機上的MySQL服務 |
--port=port_num | -P port_num | TCP/IP連接使用的端口號 |
--user=user_name | -u user_name | 用于連接到MySQL服務器的用戶名 |
--password[=password] | -p[password] | 用于連接到MySQL服務器的密碼。可選,如果沒有給出,會提示用戶輸入 |
--defaults-file=file_name | 使用指定的選項文件。如果該文件不存在,則會發生錯誤。 | |
--compress | -C | 如果可能,壓縮客戶端和服務器之間傳輸的所有信息 |
--protocol={TCP|SOCKET|PIPE|MEMORY} | 用于連接到服務器的傳輸協議, 默認為TCP | |
--version | -V | 顯示版本信息并退出。 |
--help | -? |
一. mysqlcheck——表維護程序
mysqlcheck
?是 MySQL 官方提供的在線表維護工具,用于檢查、修復、優化或分析數據庫表(無需停服)。
?1.1.作用
mysqlcheck客戶端用于執行表維護,可以對表進行:分析、檢查、優化或修復操作。
- 分析的作用是查看表的關鍵字分布,能夠讓sql生成正確的執行計劃(支持InnoDB,MyISAM, NDB)
- 檢查的作用是檢查表的完整性以及數據庫表和索引是否損壞(支持InnoDB,MyISAM, ARCHIVE,CSV)
- 優化的作用是回收空間、減少碎片、提高I/O(支持InnoDB,MyISAM,ARCHIVE)
- 修復的作用是修復可能已經損壞的表(支持MyISAM,ARCHIVE,CSV)
1.2 注意事項
- 當使用mysqlcheck工具時,MySQL服務器必須在運行狀態
- 執行過程中相應的表將會被鎖定,所以其他的操作將會被掛起
- 并不是所有的存儲引擎都支持以上四種操作,如果遇到不支持的引擎會報出相應的錯誤
- 執行表修復操作之前對表進行備份,在某些情況下可能會導致數據丟失。
1.3 使用方法
一般通過以下三種方法使用mysqlcheck
mysqlcheck [選項] db_name [tbl_name ...]
mysqlcheck [options] --databases db_name ...
mysqlcheck [options] --all-databases
如果在db_name后沒有指定任何表名,那么整個數據庫所有的表都會被檢查
如果使用?--databases
?或--all-databases
?選項,那么整個數據庫所有的表都會被檢查
1.4 常用選項
mysqlcheck有如下常用選項,可以在命令行中指定,也可以在選項文件中通過 [mysqlcheck] 和[client]組進行指定
選項(注意前面是長選項,后面是短選項) | 說明 |
---|---|
--analyze,-a | 分析表 |
--auto-repair | 如果檢查的表有損壞,則自動修復它。所有表都檢查過之后才進行必要的修復 |
--check,-c | 檢查表中的錯誤。mysqlcheck的默認操作 |
--check-only-changed,-C | 僅檢查自上次檢查以來更改過的表 |
--databases,-B | --databases db_name多數據用空格隔開。處理指定數據庫中的所有表 |
--force,-f | 即使發生SQL錯誤也要繼續 |
--optimize,-o | 優化表 |
--repair,-r | 執行可能進行的任務修復操作,除了唯一鍵 |
--skip-database | --skip-database=db_name不需要執行檢查的數據庫名(區分大小寫) |
--tables | --tables=table_name多個表用格隔開。 在選項之后的所有名稱參數都被視為表名。 |
--use-frm | 對于MyISAM表的修復操作 |
最常用的就是?
- -a
- -c
- -o
- -r
這四個選項。而這四個也剛好是我們開頭說的
mysqlcheck客戶端用于執行表維護,可以對表進行:分析、檢查、優化或修復操作。
- 分析的作用是查看表的關鍵字分布,能夠讓sql生成正確的執行計劃(支持InnoDB,MyISAM, NDB)——對應-a選項
- 檢查的作用是檢查表的完整性以及數據庫表和索引是否損壞(支持InnoDB,MyISAM, ARCHIVE,CSV)——對應-c選項
- 優化的作用是回收空間、減少碎片、提高I/O(支持InnoDB,MyISAM,ARCHIVE)——對應-o選項
- 修復的作用是修復可能已經損壞的表(支持MyISAM,ARCHIVE,CSV)——對應-r選項
我們來使用一下這些東西
首先看看我們的數據庫是啥樣子的?
?
接著我們就來分析一下這個表(-a選項)
都是沒有問題的,接著我們檢查表中的錯誤。(-c選項)
接著我們進行修復操作(-r選項)
你有沒有發現報錯了。這是因為我們的mysql默認存儲引擎就是InnoDB存儲引擎,而InnoDB存儲引擎不支持這個修復操作。如果要修復InnoDB存儲引擎的數據,則要把InnoDB存儲引擎的表轉換成Mylsam存儲引擎。
接下來我們來優化一下。
InnoDB存儲引擎在優化的過程中,其實是執行了一個重建的操作,官網建議我們不要經常去優化操作。
1.5?mysqlcheck的特殊使用
mysqlcheck程序的默認功能是對數據表進行檢查操作(相當于指定選項--check),如果想要對表進行修復操作,可以通過復制原來的mysqlcheck程序,并重命名為mysqlrepair,并運行mysqlrepair即可,還可以創建mysqlcheck的快捷方式,并把快捷方式命名為mysqlrepair,然后直接運行,這時就執行的是修復操作,通過下表所示的命名方式可以改變mysqlcheck的默認行為:
程序名 | 說明 |
---|---|
mysqlrepair | 默認行為是修復,相當于選項 --repair |
mysqlanalyze | 默認行為是分析,相當于分析 --analyze |
mysqloptimize | 默認行為是優化,相當于優化 --optimize |
?這個功能可以這樣理解,就像給你的工具箱里的同一個多功能工具貼上不同的標簽:
-
核心工具是?
mysqlcheck
:?想象?mysqlcheck
?本身是一個瑞士軍刀。-
它默認的功能是“檢查”表(
--check
),就像你拿出瑞士軍刀默認可能想用小刀割東西。 -
但它還有很多其他功能(修復?
--repair
, 分析?--analyze
, 優化?--optimize
),就像瑞士軍刀還有剪刀、螺絲刀、開瓶器一樣。
-
-
改名就是貼標簽換默認功能:?系統做了一個很聰明的設計:
-
當你把這個程序?復制一份并改名?(比如改成?
mysqlrepair
) 或者?創建一個快捷方式并改名?(比如快捷方式叫?mysqlrepair
)。 -
然后,當你運行?
mysqlrepair
?這個新名字時,程序內部會“看”一下自己現在叫什么名字。 -
如果它發現自己叫?
mysqlrepair
,它就自動認為你想做的是“修復”操作 (--repair
),而不是默認的檢查。這就相當于你給瑞士軍刀的“螺絲刀”功能單獨貼了個“螺絲刀”標簽,你拿起這個貼著“螺絲刀”標簽的工具,默認就知道要用螺絲刀功能了。
-
-
總結改名后的默認行為:
-
運行?
mysqlrepair
:?程序看到自己叫?repair
,就自動執行?--repair
?(修復表)。 -
運行?
mysqlanalyze
:?程序看到自己叫?analyze
,就自動執行?--analyze
?(分析表,更新統計信息)。 -
運行?
mysqloptimize
:?程序看到自己叫?optimize
,就自動執行?--optimize
?(優化表,整理碎片)。
-
二. mysqldump——數據庫備份程序
2.1.作用
mysqldump
?是 MySQL 官方提供的邏輯備份工具。它的核心工作原理可以概括為:連接到 MySQL 服務器,讀取數據庫的結構和數據,并將其轉換成一系列標準的 SQL 語句,然后輸出到一個文本文件(即備份文件)中,從而實現對數據庫的簡單備份。
mysqldump命令可以生成CSV、或XML格式的文件。
2.2 注意事項
- 轉儲表時必須要有 SELECT 權限
- 轉儲視圖時必須要有 SHOW VIEW 權限
- 轉儲觸發器時必須要有 TRIGGER 權限
- 如果沒有使用 --single-transaction 選項時必須要有 LOCK TABLES 權限
- 如果沒有使用 --no-tablespaces 選項時必須要有 PROCESS 權限
- 重新導入轉儲文件時,也需要有相應的權限
- 由于mysqldump是逐行轉儲數據,所以不適用于大數據量的轉儲與導入
2.3 使用方法
mysqldump的方法通常有以下使用,可以轉儲一個或多個表或數據庫,如下所示:
mysqldump [options] db_name [tbl_name ...]
mysqldump [options] --databases db_name ...
mysqldump [options] --all-databases
如果在db_name后沒有指定任何表名,那么整個數據庫所有的表都會被轉儲
如果使用?--databases
?或--all-databases
?選項,那么整個數據庫所有的表都會被轉儲
2.4 常用選項
mysqldump有如下常用選項,可以在命令行中指定,也可以在選項文件中通過 [mysqldump] 和 [client] 組進行指定
選項 | 說明 |
---|---|
--add-drop-database | 在每個 CREATE DATABASE 語句之前添加 DROP DATABASE 語句 |
--add-drop-table | 在每個 CREATE TABLE 語句之前添加 DROP TABLE 語句 |
--add-drop-trigger | 在每個 CREATE TRIGGER 語句之前添加 DROP TRIGGER 語句 |
--add-locks | 用 LOCK TABLES 和 UNLOCK TABLES 語句包裹每個表轉儲 |
--all-databases, -A | 轉儲所有數據庫中的所有表 |
--databases, -B | --databases=db_name 多個數據庫名用空格隔開,將參數解釋為數據庫名稱并轉儲所有的表 |
--comments, -i | 添加注釋到轉儲文件 |
--compact | 緊湊格式輸出 |
--compatible=ansi | 生成與其他數據庫或舊MySQL服務器更兼容的輸出 |
--complete-insert, -c | 使用包含列名的完整INSERT語句 |
--events, -E | 從轉儲數據庫中轉儲事件 |
--extended-insert, -e | 使用多行INSERT語法 |
--flush-logs, -F | 在開始轉儲前刷新日志 |
--flush-privileges | 在轉儲后刷新權限 |
--force, -f | 轉儲期間發生了SQL錯誤,也要繼續 |
--hex-blob | 使用十六進制表示法轉儲二進制列 |
--ignore-table | --ignore-table=db_name.table_name 多個表用空格隔開 不轉儲給定的表 |
--lock-all-tables, -x | 鎖定所有數據庫中的所有表 |
--lock-tables, -l | 在轉儲之前鎖定指定要轉儲的表 |
--no-autocommit | 將每個轉儲表的 INSERT 語句包含在 SET autocommit = 0 和 COMMIT 語句中 |
--no-create-db, -n | 不要生成 CREATE DATABASE 語句 |
--no-create-info, -t | 不要為每個轉儲的表生成 CREATE TABLE 語句 |
--no-data, -d | 不轉儲表內容 |
--skip-add-drop-table | 在每個 CREATE TABLE 語句之前不添加 DROP TABLE 語句 |
--skip-add-locks | 不要添加鎖 |
--skip-comments | 轉儲文件中不添加注釋 |
--skip-compact | 不使用緊湊格式 |
--skip-triggers | 不轉儲觸發器 |
--tables --tables=table_name 多個表名用空格隔開 | 在選項之后的所有名稱參數都被視為表名。 |
--triggers | 轉儲每個表中的觸發器 |
--xml, -X | 以XML格式輸出 |
接下來我們來實操一下
- 實例一
先來實現一下最簡單的東西。
接下來我們在命令行里面執行下面這個就行
mysqldump db2 > /home/zs_108/dump.sql -u root -p
這個命令的意思是:使用`root`用戶(需要輸入密碼)來備份名為`db2`的數據庫,并將備份的內容保存到`/home/zs_108/dump.sql`文件中。
我們打開這個文件看看
?
有沒有發現核心的東西就是 創建表tb1,然后往里面插入信息。
- 實例二
我們還是先看這個原有數據庫是啥樣
接著我們在命令行里面執行下面這個命令
mysqldump --add-drop-database -d scott > /home/zs_108/dump1.sql -u root -p
這個命令用 root 賬戶備份?scott
?數據庫的純結構(不含數據),并在備份文件中自動添加刪除數據庫的命令,保存到?/home/zs_108/dump1.sql
?文件,執行時會提示輸入密碼。?
我們打開看看
?
三.?mysqladmin——MySQL 服務器管理程序
3.1.作用
mysqladmin是一個執行管理操作的客戶端。可以用來檢查服務器的配置和當前狀態,以及創建和刪除數據庫等。
核心功能涵蓋以下關鍵領域:
-
服務器啟停控制:
-
shutdown
:安全關閉正在運行的 MySQL 服務器。 -
start slave
?/?stop slave
?(舊版本):控制主從復制(較新版本推薦在 SQL 會話中使用?START REPLICA
/STOP REPLICA
)。 -
kill
:終止指定的客戶端連接線程。
-
-
服務器狀態監控與診斷:
-
ping
:快速檢查?MySQL 服務器是否處于運行狀態。 -
status
:顯示服務器關鍵狀態摘要(運行時長、線程、查詢、流量等)。 -
extended-status
:顯示所有服務器狀態變量 (SHOW GLOBAL STATUS
)。 -
variables
:顯示服務器系統變量?(SHOW GLOBAL VARIABLES
)。 -
processlist
:顯示當前活動連接和查詢列表 (SHOW PROCESSLIST
)。 -
version
:顯示服務器版本信息。
-
-
配置與維護操作:
-
reload
?/?refresh
:刷新權限表(使?GRANT
/REVOKE
?立即生效)并重新打開日志文件。 -
flush-*
:刷新特定組件,如?flush-hosts
(清除主機緩存)、flush-logs
(輪換日志文件)、flush-privileges
(同?reload
)、flush-status
(重置狀態計數器)、flush-tables
(關閉所有打開的表)、flush-threads
(清空線程緩存)。 -
password
:更改指定用戶的密碼(需謹慎使用,密碼可能暴露在命令行歷史或進程列表中)。
-
-
數據庫操作:
-
create
:創建一個新數據庫。 -
drop
:刪除一個數據庫(及其所有表!需極度謹慎!)。
-
既然這是一個管理的應用,那說明配合mysqladmin的用戶必須具備管理員權限。
3.2 使用方法
mysqladmin 可以使用以下語法:
mysqladmin [選項] 命令 [命令參數] [command [command-arg]]...
3.3 支持的命令
?語法中的command表示命令,有些命令后面需要跟上一個參數,如下列出了mysqladmin的常用命令:
- version:顯示來自服務器的版本信息。
我們執行下面這個命令
??mysqladmin version -u root -p
?這些都是啥意思呢?
- Uptime:MySQL 服務器已運行的秒數。
- Threads:活動線程(客戶端)的數量。
- Questions:自服務器啟動以來客戶端的問題(查詢)數。
- Slow queries:慢SQL的查詢數。
- Opens:服務器已打開的表數。
- Flush tables:服務器已執行flush-*、refresh和reload命令的數量。
- Open tables:當前打開的表數。
- status:顯示簡短的服務器狀態消息。
我們執行下面這個命令
mysqladmin status -u root -p
?這個內容比那個version少很多了。
- create db_name:創建一個數據庫名為 db_name 。
創建數據庫時使用的是編碼集是選項文件中配置的編碼集,如果沒有指定,那么使用和當前MYSQL版本默認的編碼集
我們可以看看,我們現在是沒有這個test數據庫的
mysqladmin create test -u root -p
我們發現,這就多了一個test!!
- drop db_name:刪除名為 db_name 的數據庫及其所有表。
我們現在就把上面創建的那個數據庫test刪除掉
我們執行下面這個命令
mysqladmin drop test -u root -p
這個時候我們輸入y即可
這個時候我們回去看
發現那個test數據庫沒了。
- password new_password:設置新密碼。
如果密碼中有空格必須用雙引號把密碼包裹起來。
password 后可以省略新密碼,mysqladmin會在之后提示輸入新密碼。
password 做為最后一個command時才可以省略密碼值,否則下一個參數將作為密碼被設置。
Warning:有可能存在安全問題。
Setting a password using mysqladmin should be considered insecure. On some systems, your password becomes visible to system status programs such as ps that may be invoked by other users to display command lines. MySQL clients typically overwrite the command-line password argument with zeros during their initialization sequence. However, there is still a brief interval during which the value is visible. Also, on some systems this overwriting strategy is ineffective and the password remains visible to ps. (SystemV Unix systems and perhaps others are subject to this problem.)
- processlist:顯示活動服務器線程的列表。
我們輸入下面這個命令看看
mysqladmin processlist -u root -p
?嗯?這里怎么有兩個root用戶啊?因為我開了一個mysql客戶端
這兩個root其實一個是mysql一個,mysqladmin一個
1518是mysql的,1546是mysqladmin的
不信的話,我們可以試試看,我們在mysql客戶端隨便輸入一個SQL語句
有沒有發現這個1518的Time從333變成了8啊!!!
- kill id , id ,...:終止服務器線程。如果給出了多個線程ID值,則列表中不能有空格。
?默認的mysql服務器可以維護150個活動連接。如果連接被用完了,可以使用kill指定去手動釋放休眠時間最長的那個連接線程
我們看上面那個圖
我們要殺掉這個id是1518的線程——這個其實就是我們的mysql客戶端。
我們執行下面這個命令
mysqladmin kill 1518 -u root -p
這個時候我們回到我們的mysql客戶端。
我們發現還是沒有斷開連接的提示,我們看看能不能執行命令。
我們看它說它和服務端斷開連接了,開始自動重連了。
?還有下面這些,我不在演示了?
- reload:重新加載授權表。
- refresh:刷新所有表。
- shutdown:停止服務器。
- start-replica:在副本服務器上開始復制。MySQL 8.0.26及以后的版本使用此命令。
- start-slave:在副本服務器上開始復制。MySQL 8.0.26之前使用此命令。
- stop-replica:停止副本服務器上的復制。MySQL 8.0.26及以后的版本使用此命令。
- stop-slave:停止副本服務器上的復制。MySQL 8.0.26之前使用此命令。
- variables:顯示服務器系統變量及其值。
- extended-status:顯示服務器狀態變量的值。
- flush-hosts:刷新主機緩存中的所有信息。
- flush-logs [log_type ...]:刷新所有日志。 log_type 中可以提供以下一種或多種日志類型:binary, engine, error, general, relay, slow,多個類型之間用空格分隔。
- flush-privileges:重新加載授權表。
- flush-status:清除狀態變量。
- flush-tables:刷新所有表。
- flush-threads:刷新線程緩存。
- ping:檢查服務器是否可用。
3.4 常用選項
mysqladmin的常用選項參考公共選項部分,可以在命令行中指定,也可以在選項文件中通過 [mysqladmin] 和 [client] 組進行指定。
選項-長格式 | 短格式 | 說明 |
---|---|---|
--host=host_name | -h host_name | 連接到指定主機上的MySQL服務 |
--port=port_num | -P port_num | TCP/IP連接使用的端口號 |
--user=user_name | -u user_name | 用于連接到MySQL服務器的用戶名 |
--password[=password] | -p[password] | 用于連接到MySQL服務器的密碼。可選,如果沒有給出,會提示用戶輸入 |
--defaults-file=file_name | 使用指定的選項文件。如果該文件不存在,則會發生錯誤。 | |
--compress | -C | 如果可能,壓縮客戶端和服務器之間傳輸的所有信息 |
--protocol={TCP|SOCKET|PIPE|MEMORY} | 用于連接到服務器的傳輸協議, 默認為TCP | |
--version | -V | 顯示版本信息并退出。 |
--help | -? |
四.mysqlshow——顯?數據庫、表和列信息
4.1.作用
mysqlshow
?是 MySQL 官方提供的一個命令行工具,主要用于快速查看 MySQL 服務器中的數據庫、表、列(字段)的結構信息。
它提供了一種比登錄到?mysql
?命令行客戶端并執行?SHOW
?語句更快捷、更直觀的方式來瀏覽數據庫的元數據(metadata)。
4.2.注意事項
mysqlshow為一些show語句提供了一個命令行接口。我們可以去官網看看:MySQL :: MySQL 8.0 Reference Manual :: 6.5.7 mysqlshow — Display Database, Table, and Column Information
4.3.使用方法
mysqlshow可以使?以下語法:
?mysqlshow [options] [db_name [tbl_name [col_name]]]
- db_name tbl_name col_name 可以使?通配符 * 、 ? 、 % 或 _
- 如果沒有指定數據庫,則顯?所有數據庫名稱列表。
- 如果沒有指定表,則顯?數據庫中所有匹配的表。
- 如果沒有指定列,則顯?表中所有匹配的列和列類型。
- 輸出僅顯?當前權限可以訪問的數據庫、表或列的名稱。
它的主要功能和用途如下:
查看數據庫列表:
mysqlshow -u 用戶名 -p
輸入密碼后,會列出 MySQL 服務器上用戶有權訪問的所有數據庫(相當于?SHOW DATABASES;
)。
查看某個數據庫中的所有表:
mysqlshow -u 用戶名 -p 數據庫名
這會列出指定數據庫中的所有表(相當于?USE 數據庫名; SHOW TABLES;
)。
查看某個表的列(字段)信息:
mysqlshow -u 用戶名 -p 數據庫名 表名
這會顯示指定表的列名、數據類型、是否允許 NULL、鍵信息(主鍵等)、默認值等(相當于?DESCRIBE 表名;
?或?SHOW COLUMNS FROM 表名;
)。
我們還可以指定列
?
查看更詳細的表狀態信息:
mysqlshow -u 用戶名 -p --status 數據庫名 表名
使用?--status
?(或?-i
) 選項會顯示類似?SHOW TABLE STATUS LIKE '表名';
?的結果,包含更多信息,如存儲引擎、行數、平均行長度、數據大小、索引大小、創建時間等。
查看表索引信息:
mysqlshow -u 用戶名 -p --keys 數據庫名 表名
使用?--keys
?(或?-k
) 選項會顯示表的索引信息(相當于?SHOW INDEX FROM 表名;
)。
查看表的主鍵信息:
mysqlshow -u 用戶名 -p --primary-keys 數據庫名 表名
4.4.常用選項
mysqlshow的常?選項參考公共選項部分,可以在命令?中指定,也可以在選項?件中通過 [mysqlshow] 和 [client] 組進?指定,具體選項參考公共選項列表。
選項-長格式 | 短格式 | 說明 |
---|---|---|
--host=host_name | -h host_name | 連接到指定主機上的MySQL服務 |
--port=port_num | -P port_num | TCP/IP連接使用的端口號 |
--user=user_name | -u user_name | 用于連接到MySQL服務器的用戶名 |
--password[=password] | -p[password] | 用于連接到MySQL服務器的密碼。可選,如果沒有給出,會提示用戶輸入 |
--defaults-file=file_name | 使用指定的選項文件。如果該文件不存在,則會發生錯誤。 | |
--compress | -C | 如果可能,壓縮客戶端和服務器之間傳輸的所有信息 |
--protocol={TCP|SOCKET|PIPE|MEMORY} | 用于連接到服務器的傳輸協議, 默認為TCP | |
--version | -V | 顯示版本信息并退出。 |
--help | -? |
五.mysqldumpslow - 總結慢查詢日志文件
5.1 作用
mysqldumpslow
?是 MySQL 官方提供的一個命令行工具,專門用于解析、匯總和分析 MySQL 的慢查詢日志文件。它的核心功能是幫助數據庫管理員(DBA)和開發者快速識別數據庫中執行緩慢的 SQL 語句,以便進行性能優化。
????????在平時使用MySQL數據庫時,經常進行查詢操作,有些查詢語句執行的時間非常長,當執行時間超過設定的閾值時,我們稱這個查詢為慢查詢,慢查詢的相關信息通常需要用日志記錄下來稱為慢查詢日志,mysqldumpslow可以解析慢查詢日志文件并匯總其內容,有關慢查詢日志的內容我們在MySQL服務器配置與管理專題進行講解。
? ? ? ? 這個是進行慢查詢對應的SQL優化的依據。
我們回憶一下
mysqladmin status -u root -p
Slow queries:慢SQL的查詢數。
這個Slow queries就是我們慢查詢的字段。目前是0,因為我們當前數據庫沒有涉及大查詢的字段。
我們來看看這個慢查詢的閾值
show variables like '%query%';
?這個long_query_time就是我們說的慢查詢的閾值。如果一個查詢的時間大于10s,那么就會被系統標記為慢查詢,存放到慢查詢日志里面,然后我們就能查詢到這個慢查詢。
然后我們說的慢查詢日志文件在哪里?
其實就在下面
/var/lib/mysql/lavm-kpx2y2i6go-slow.log就是我們說的慢查詢日志文件。
其實系統如果出現慢查詢,系統會自動存儲到慢查詢日志文件里面,這是有前提的——就是我們下面這個字段必須是開的(也就是on)
5.2 注意事項
通常情況下,mysqldumpslow會將相似的查詢分組并顯示摘要輸出,一般會把數字和字符串用"N"和"S"代替,要想顯示真實的值可以使用-a和-n選項。
怎么理解呢?
慢查詢日志中會有大量結構相同但參數不同的查詢:
SELECT * FROM users WHERE id = 100;
SELECT * FROM users WHERE id = 200;
抽象化將這些查詢視為同一類查詢,便于統計執行次數、總耗時等關鍵指標。
抽象化后就變成了
SELECT * FROM users WHERE id = N;
轉換規則就是?
-
數字 →?
N
?(例如?100
,?200
?都變成?N
) -
字符串 →?
'S'
?(例如?'Phone'
,?'Laptop'
?都變成?'S'
)
就像下面這樣子
-- 原始查詢 --
SELECT * FROM orders WHERE amount > 100 AND status = 'pending';-- 抽象化后 --
SELECT * FROM orders WHERE amount > N AND status = 'S';
?事實上,如果我們想顯示真實的值,我們就可以借助-a或者-n選項
- 1.?
-a
?選項 (不抽象化)
mysqldumpslow -a slow.log
效果:禁用所有抽象化,顯示原始SQL
輸出示例:
Count: 5? Time=2.1s (10.5s) ...SELECT * FROM users WHERE id = 100 AND email = 'alice@example.com'Count: 3? Time=1.8s (5.4s) ...SELECT * FROM users WHERE id = 200 AND email = 'bob@example.com'
缺點:相同結構的查詢會被分成不同組,失去統計意義
- 2.?
-n
?選項 (控制數字抽象化)
mysqldumpslow -n 20 slow.log
-
功能:設置數字抽象化的敏感度
-
參數:數字位數閾值(默認為
-n 128
)
-n
?選項不顯示真實數字,而是控制數字的抽象化粒度
當您使用?-n N
?選項時(如?-n 2
):
-
不是顯示真實數字
-
而是根據數字位數決定抽象化方式:
-
數字位數?≤?
N
?→ 用單個?#
?符號表示 -
數字位數?>?
N
?→ 用?N
?表示
-
示例解析
-- 原始查詢 --
SELECT * FROM logs WHERE error_code = 5; -- 1位數
SELECT * FROM logs WHERE error_code = 42; -- 2位數
SELECT * FROM logs WHERE user_id = 10025; -- 5位數-- 使用 mysqldumpslow -n 2 的輸出 --
SELECT * FROM logs WHERE error_code = #; -- 1位變#
SELECT * FROM logs WHERE error_code = #; -- 2位變#
SELECT * FROM logs WHERE user_id = N; -- 5位>2,變N
5.3 使用方法
由于我們這沒有慢查詢SQL,所以我們借助一下官網的信息:MySQL :: MySQL 8.0 參考手冊 :: 6.6.10 mysqldumpslow — 總結慢查詢日志文件
mysqldumpslow可以使用以下語法
mysqldumpslow [options] [log_file ...]
在沒有給出任何選項的輸出如下:
Reading mysql slow query log from /usr/local/mysql/data/mysqld80-slow.log
Count: 1 Time=4.32s (4s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhostinsert into t2 select * from t1Count: 3 Time=2.53s (7s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhostinsert into t2 select * from t1 limit NCount: 3 Time=2.13s (6s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhostinsert into t1 select * from t1
那這些字段都啥意思呢?我們看看?
1. Count
-
含義:該查詢在日志中出現的次數。
-
示例:
Count: 1
?表示這條查詢只出現了一次;Count: 3
?表示這條查詢重復出現了 3 次。 -
作用:幫助您快速定位高頻慢查詢。
2. Time
-
格式:
Time=平均執行時間 (總執行時間)
-
示例:
-
Time=4.32s (4s)
:平均每次執行耗時 4.32 秒,總耗時 4 秒(因為?Count=1
)。 -
Time=2.53s (7s)
:平均每次執行耗時 2.53 秒,總耗時 7 秒(因為?Count=3
,3×2.53≈7.59,但日志可能四舍五入)。
-
-
作用:衡量查詢性能的核心指標,值越大表示查詢越慢。
3. Lock
-
格式:
Lock=平均鎖等待時間 (總鎖等待時間)
-
示例:
Lock=0.00s (0s)
?表示查詢沒有等待鎖的開銷。 -
作用:反映查詢是否因等待表鎖或行鎖而延遲。如果值較高,可能表示存在鎖競爭。
4. Rows
-
格式:
Rows=平均影響的行數 (總影響的行數)
-
示例:
Rows=0.0 (0)
?表示查詢沒有返回或修改任何行。 -
作用:
-
對于?
SELECT
?查詢:表示返回的行數。 -
對于?
INSERT/UPDATE/DELETE
:表示修改的行數。 -
值為 0 可能表示:
-
查詢是?
INSERT ... SELECT
?且目標表為空。 -
查詢是?
INSERT INTO t1 SELECT * FROM t1
(自插入,但未實際新增數據)。 -
查詢條件未匹配到任何行。
-
-
5. 用戶信息
-
格式:
用戶[認證用戶]@主機
-
示例:
root[root]@localhost
?表示:-
執行查詢的數據庫用戶:
root
。 -
認證用戶:
root
(可能通過代理或權限鏈)。 -
連接來源:
localhost
(本地連接)。
-
-
作用:幫助定位問題查詢的來源(用戶和主機)。
6. 查詢語句
-
示例:
-
insert into t2 select * from t1
-
insert into t2 select * from t1 limit N
-
insert into t1 select * from t1
-
-
作用:實際執行的 SQL 語句,是分析性能問題的核心依據。
5.4.常用選項
選項 | 說明 |
---|---|
-a | 不將數字(Numbers)和字符串(Strings)替換為?N ?和?S |
-n N | 在查詢名稱中,若包含超過?N ?個數字,則用?N ?代替 |
-g pattern | 僅分析匹配指定模式(Pattern)的慢查詢 |
--help | 顯示幫助信息并退出 |
-h host_name | 指定 MySQL 服務器主機名(支持通配符),默認匹配所有主機(* ) |
-i name | 指定服務器實例名稱 |
-l | 不從總時間中減去鎖占用時間 |
-r | 按倒序排列結果 |
-s sort_type | 指定排序方式(sort_type ?可選值見下文) |
-t N | 僅顯示前?N ?個查詢結果 |
--verbose ,?-v | 輸出更詳細的程序運行信息 |
-s sort_type里的
sort_type
的可選值說明:
排序類型 | 描述 | 示例 | 典型使用場景 |
---|---|---|---|
t | 按查詢總時間(Total Time)排序 | -s t | 定位總耗時最長的查詢,適合分析整體性能瓶頸 |
at | 按平均查詢時間(Average Time)排序 | -s at | 識別單次執行較慢的查詢,適合優化高頻但單次耗時高的操作 |
l | 按鎖占用總時間(Total Lock Time)排序 | -s l | 分析鎖競爭嚴重的查詢,適合排查并發性能問題 |
al | 按平均鎖占用時間(Average Lock Time)排序 | -s al | 識別單次鎖持有時間較長的查詢,適合優化鎖粒度或減少鎖競爭 |
r | 按發送的總行數(Total Rows Sent)排序 | -s r | 定位返回數據量最大的查詢,適合優化大數據量返回的場景(如未分頁的列表查詢) |
ar | 按平均發送的行數(Average Rows Sent)排序 | -s ar | 識別單次返回數據量較大的查詢,適合優化高頻但單次數據量大的操作 |
c | 按查詢計數(Count)排序 | -s c | 統計執行次數最多的查詢,適合定位高頻次執行的輕量級操作(如頻繁的緩存查詢) |
六.?mysqlbinlog——處理二進制日志文件
- 什么是二進制日志文件
我們平時對數據庫的修改,包括對數據的增刪改,都會被描述成一個"事件",每個"事件"都會以二進制的形式記錄在一個文件里,這個文件就是服務器的二進制日志文件,稱為Binary Log或binlog。
關于二進制日志文件的具體格式與使用場景我們在MySQL主從復制專題講解
我們可以簡單的講講MySQL主從復制啊
- 一、主從復制是什么?
主從復制是MySQL的一種數據同步技術,就像一個“主倉庫”負責記錄所有數據變動,然后自動同步到多個“備份倉庫”,確保數據一致性和系統穩定性。
- 二、工作原理:三步走
主庫記錄變更
主庫將所有寫操作(如增刪改)記錄到二進制日志(binlog)中,就像“記賬本”一樣。
例如:用戶下單、修改訂單等操作都會被記錄。
從庫拉取日志
從庫會定時通過I/O線程連接主庫,拉取binlog并保存到本地的中繼日志(relay log)。
就像分店經理每天來取總賬本的副本。
從庫執行變更
從庫的SQL線程讀取relay log,解析其中的SQL語句并執行,使數據與主庫保持一致。
就像分店會計根據副本重新錄入訂單。
- 三、生活化例子
假設你是一家連鎖餐廳的老板(主庫),每天記錄所有訂單(數據變更)。分店(從庫)需要同步這些訂單信息:
主庫:在總賬本(binlog)上記錄每一筆訂單。
從庫:分店經理(I/O線程)每天結束時來取總賬本的副本(拉取binlog)。
執行同步:分店會計(SQL線程)根據副本重新錄入訂單(執行SQL),確保分店賬本與總店一致。
6.1 作用
mysqlbinlog能夠以文本格式顯示二進制日志文件中的內容。
6.2 注意事項
- 數據目錄在哪里?
我們可以去
cd /etc/mysql/mysql.conf.d
ls -l
我們可以看看這個mysqld.cnf里面的東西
這個datadir就是我們口中的數據目錄。
binlog的默認保存路徑是數據目錄:
- Linux下默認目錄:/var/lib/mysql
- Windows下默認目錄:C:\ProgramData\MySQL\MySQL Server 8.0\Data
?binlog是以.00000n結尾命名的文件,n不斷遞增
6.3 使用方法
mysqlbinlog可以使用以下語法
mysqlbinlog [options] log_file ...
例如要顯示名為binlog.000001二進制日志文件的內容,可以使用以下命令:
mysqlbinlog binlog.000001
這說明出問題了,我們得去
vim /etc/mysql/my.cnf
?
然后我們接著運行,我們發現還是很奇怪的東西
?這些看起來亂七八糟的。?
我們就不看了,我們還是舉一個片段來吧
root@guangchen-vm:/var/lib/mysql# mysqlbinlog binlog.000010# ...
略
# at 37380#230906 15:30:33 server id 1 end_log_pos 37442 CRC32 0x6d3de7e6
Write_rows: table id 119 flags: STMT_END_FBINLOG 'mSr4ZBMBAAAAQgAAAASSAAAAAHcAAAAAAAEAB3Rlc3RfZGIAB3N0dWRlbnQABAMDDw8EUABQAA8BAQACAS1oGW+UmSr4ZB4BAAAAPgAAAEKSAAAAAHcAAAAAAAMAAgAE/wAFAAAAVcMAAAbpkrHkuIMKcXFAYml0LmNvbebnPW0='/*!*/;# ...
略
1.# at 37380:
事件在 binlog 文件中的起始位置(字節偏移量)。
2.?時間戳?(#230906 15:30:33
)
-
通俗解釋:這條日志記錄的“時間”,就像日記本上的日期。這里表示操作發生在?2023 年 9 月 6 日 15 點 30 分 33 秒,幫助您定位問題發生的時間點。
3.?服務器ID?(server id 1
)
-
通俗解釋:這是 MySQL 服務器的“身份證號”。如果有多臺數據庫服務器,每臺都有一個唯一 ID(這里是 1),用于區分日志來源。
4.?結束位置?(end_log_pos 37442
)
-
通俗解釋:這是日志條目在二進制日志文件中的“頁碼”。表示這條日志內容結束在文件的?第 37442 字節位置,方便快速定位和查找。
5.?CRC32校驗值?(CRC32 0x6d3de7e6
)
-
通俗解釋:這是一個“數據指紋”,用于驗證日志是否被篡改或損壞。如果計算出的指紋和?
0x6d3de7e6
?不一致,說明日志可能有問題。
6.?操作類型?(Write_rows
)
-
通俗解釋:這是日志記錄的“動作類型”。
Write_rows
?表示這條日志記錄了一次?寫入數據?的操作(比如插入或更新數據)。
7.?表ID?(table id 119
)
-
通俗解釋:這是被操作數據庫表的“身份證號”。每個表在 MySQL 中都有一個唯一 ID(這里是 119),用于快速定位到具體的數據表。
8.?標志?(flags: STMT_END_F
)
-
通俗解釋:這是操作的“附加標簽”。
STMT_END_F
?表示這是一個?語句結束的標志,類似于一句話的句號,幫助解析日志的結構。
9.?BINLOG內容
-
通俗解釋:這是日志的“核心數據”,包含了實際的操作細節(比如插入的字段和值)。但內容通常是加密或編碼的字符串(如?
mSr4ZBMBAAAAQgAAAASSAAAAAHcAAAAAAA...
),需要專業工具才能解讀。
總結:這條日志說了什么?
這條日志記錄了?2023 年 9 月 6 日 15:30:33,服務器(ID=1)在二進制日志的?37442 字節位置?寫入了一條操作:對表(ID=119)執行了寫入數據的動作,并通過 CRC32 校驗確保數據完整性。
binlog.000010的輸出內容中包含各種事件,事件信息包括SQL語句、執行語句的服務器ID、語句執行時的時間戳、花費的時間等等。
日志的具體格式我們這里先不做討論。
6.4常用選項
mysqlbinlog有如下常用選項,可以在命令行中指定,也可以在選項文件中通過 [mysqlbinlog] 和[client]組進行指定?
選項 | 說明 |
---|---|
--base64-output | --base64-output=value把BINLOG中的事件用base-64進行編碼,value的取值在之后有特殊說明 |
--binlog-row-event-max-size | --binlog-row-event-max-size=N指定基于行的二進制日志事件的最大值(以字節為單位),取值應為256的倍數,默認4GB |
--force-if-open, -F | 讀取二進制日志文件,即使它們已打開或未正確關閉 |
--force-read, -f | 如果使用這個選項,當mysqlbinlog讀取一個不能識別的binlog,會打印一個警告并忽略該事件,然后繼續。如果沒有這個選項,mysqlbinlog在讀取這樣的事件時會停止 |
--hexdump, -H | 顯示日志的十六進制轉儲 |
--offset, -o | --offset=N, -o N:跳過日志中的前N條記錄 |
--raw | mysqlbinlog以原始二進制格式寫入事件,默認是文本格式 |
--read-from-remote-server, -R | --read-from-remote-server=file_name, -R讀取遠程MySQL服務器的二進制日志,而不是讀取本地,要求遠程服務器正在運行 |
--require-row-format | 基于行格式的二進制日志記錄格式。 |
--result-file, -r | --result-file=name, -r name:輸出的目標文件 |
--server-id | 僅顯示指定服務器ID創建的事件。 |
--server-id-bits | --server-id-bits=N:使用server_id的前N位來標識服務器 |
--start-datetime | --start-datetime=datetime:從等于或晚于datetime的第一個事件開始讀取日志,支持DATETIME和TIMESTAMP類型 |
--start-position,-j? | - --start-position=N,-j N 開始讀取日志的位置,position等于或大于N之后的任何事件。 |
--stop-datetime | --stop-datetime=datetime 在等于或晚于datetime的第一個事件結束,支持 DATETIME 和TIMESTAMP類型 |
--stop-never | 保持與服務器的連接 |
--stop-position | --stop-position=N:在日志位置N處停止解碼 |
--verbose, -v | 重新構建行事件并將其顯示為已注釋的SQL語句,并在適用的情況下顯示表分區信息。 |
--base64-output=value:
控制BINLOG語句的顯示方式,value
可選值如下:
參數選項 | 說明 |
---|---|
AUTO | (默認值)在必要時自動顯示BINLOG語句,是重新執行二進制日志文件內容時的唯一安全行為。 |
UNSPEC | 行為與AUTO 相同,即未明確指定時的默認行為。 |
NEVER | 不顯示BINLOG語句。 |
DECODE-ROWS | 不顯示加密內容,可配合-verbose 選項以注釋形式顯示事件的SQL語句(僅用于調試或測試)。 |
我說實話,作為開發人員,這個mysqlbinlog很少用到,一般是運維什么的用的比較多。
七.mysqlslap - 負載仿真客戶端
7.1 作用
mysqlslap是一個診斷程序,用于模擬MySQL服務器的客戶端負載,并報告每個階段的時間,就好比多個客戶端正在訪問服務器一樣。
核心功能
-
模擬并發負載
-
通過多線程模擬大量用戶同時執行 SQL 操作。
-
測試數據庫在高并發下的響應速度和穩定性。
-
-
自動生成測試數據
-
可自動創建測試表并填充隨機數據。
-
支持自定義表結構和數據量。
-
-
性能指標統計
-
輸出平均查詢耗時、最小/最大耗時、并發吞吐量等指標。
-
生成詳細的壓力測試報告。
-
7.2 使用方法
mysqlslap可以使用以下語法
?mysqlslap [options]
7.3 注意事項
1. 可以通過 --create 或 --query 選項,指定包含SQL語句的字符串或包含SQL語句的文件
2. 如果指定一個包含SQL語句的文件,默認情況下每行必須包含一條語句(也就是說,隱式語句分隔符是換行符)
3. 如果要把一條語句分為多行書寫,可以使用 --delimiter 選項指定不同的分隔符
4. 不能在文件中包含注釋,因為mysqlslap不能解析注釋。
5. mysqlslap運行分為三個階段:
- a. 創建測試數據階段:創建用于測試的庫、表或數據,這個階段使用單個客戶端連接
- b. 運行負載測試階段,這個階段可以使用許多客戶端連接
- c. 清理階段:執行刪除表,斷開連接等操作,這個階段使用單個客戶端連接
7.4.常用選項
我們可以去官網看看:MySQL :: MySQL 8.0 Reference Manual :: 6.5.8 mysqlslap — A Load Emulation Client
選項名稱 | 說明 |
---|---|
--auto-generate-sql ,?-a | 當命令選項或文件中沒有提供 SQL 語句時,自動生成 SQL 語句 |
--auto-generate-sql-add-autoincrement | 在自動生成的表中添加?AUTO_INCREMENT ?列 |
--auto-generate-sql-execute-number | --auto-generate-sql-execute-number=N,指 定要?動?成多少查詢 |
--auto-generate-sql-guid-primary | 向自動生成的表添加基于 GUID 的主鍵 |
--auto-generate-sql-load-type | --auto-generate-sql-load-type=type 指定測試負載類型。允許的值是? read ?(掃描表)、write ?(插入表)、key ?(讀取主鍵)、update ?(更新主鍵) 或?mixed ?(一半插入,一半掃描選擇)。默認為?mixed |
--auto-generate-sql-secondary-indexes | --auto-generate-sql-secondary-indexes=N 指定要向自動生成的表添加多少索引。默認為 0 |
--auto-generate-sql-unique-query-number | --auto-generate-sql-unique-query-number=N 為自動測試生成多少個不同查詢 (where 條件不同)。默認值是 10 |
--auto-generate-sql-write-number | --auto-generate-sql-write-number=N 要執行多少行插入。默認值是 100 |
--auto-generate-sql-unique-write-number | --auto-generate-sql-unique-write-number=N 為? --auto-generate-sql-write-number ?生成多少個不同的查詢。默認值是 10 |
--commit | --commit=N 在提交之前要執行多少語句。默認值是 0 |
--concurrency ,?-c | --concurrency=N ,?-c N 要模擬并行客戶端的數量 |
--create | --create=value 用于創建表的 SQL 語句或文件 |
--create-schema | --create-schema=value 用于測試的庫,測試完成后會自動刪除 |
--csv | --csv[=file_name] 以逗號分隔的格式輸出到指定的文件,如果沒有給出文件,則輸出到控制臺 |
--delimiter ,?-F | --delimiter=str ,?-F str SQL 語句的分隔符 |
--engine ,?-e | --engine=engine_name ,?-e engine_name 創建表的存儲引擎 |
--iterations ,?-i | --iterations=N ,?-i N 每個客戶端運行測試的次數 |
--no-drop | 運行完測試后不刪除創建的數據庫 |
--number-char-cols ,?-x | --number-char-cols=N ,?-x N 使用? --auto-generate-sql ?選項時 VARCHAR 列的數量 |
--number-int-cols ,?-y | --number-int-cols=M ,?-y M 使用? --auto-generate-sql ?選項時 INT 列的數量 |
--number-of-queries | --number-of-queries=M 限制每個客戶端最大的查詢數 |
--pre-query | --pre-query=value 測試開始前要執行 SQL 語句或 SQL 文件,不計入查詢次數 |
--pre-system | --pre-system=str 測試開始前使用? system() ?執行的命令,不計入查詢次數 |
--post-query | --post-query=value 測試完成后要執行 SQL 語句或 SQL 文件,不計入查詢次數 |
--post-system | --post-system=str 測試完成后使用? system() ?執行的命令,不計入查詢次數 |
--query ,?-q | --query=value ,?-q value 包含用于測試的 SELECT 語句的文件或 SQL 語句 |
7.5.示例
- 示例一——自定義語句 + 高并發測試
下面這個命令使用?mysqlslap
?工具模擬 50 個并發用戶重復執行 200 次 "SELECT * FROM a" 查詢,測試 MySQL 數據庫的并發處理性能和查詢響應能力。
mysqlslap --delimiter=";" --create="CREATE TABLE a (b int); INSERT INTO a VALUES (23);" --query="SELECT * FROM a" --concurrency=50 --iterations=200 -uroot -p
參數 | 說明 |
---|---|
--delimiter=";" | 指定 SQL 語句分隔符為分號?; |
--create="CREATE TABLE a (b int); INSERT INTO a VALUES (23);" | 測試前執行的操作: 1. 創建測試表? a ?(包含整數列?b )2. 插入測試數據? 23 |
--query="SELECT * FROM a" | 壓力測試的核心操作: 重復執行? SELECT * FROM a ?查詢 |
--concurrency=50 | 模擬?50個并發用戶?同時操作 |
--iterations=200 | 整個測試過程?重復執行200次 |
-uroot | 使用?root 用戶?連接數據庫 |
-p | 連接時需要?輸入密碼 |
測試流程
-
初始化階段:
CREATE TABLE a (b int); -- 創建測試表 INSERT INTO a VALUES (23); -- 插入測試數據
-
壓力測試階段(重復200次):
-- 每次模擬50個用戶同時執行: SELECT * FROM a; -- 執行簡單查詢
-
結果統計:
-
輸出平均查詢耗時
-
統計最小/最大響應時間
-
計算服務器吞吐量
-
我們去運行一下看看
mysqlslap --delimiter=";" --create="CREATE TABLE a (b int); INSERT INTO a VALUES (23);" --query="SELECT * FROM a" --concurrency=50 --iterations=200 -uroot -p
執行后就下面這樣子了。?
過了一會,它就是會變成下面這樣子
?我們看看這些字段啥意思
字段 | 含義 | 說明 |
---|---|---|
Average number of seconds to run all queries: 0.018 seconds | 平均總耗時 | 所有客戶端完成全部查詢的平均時間為?0.018 秒。反映數據庫處理請求的典型速度。 |
Minimum number of seconds to run all queries: 0.009 seconds | 最短總耗時 | 某個客戶端完成全部查詢的最短時間為?0.009 秒。體現數據庫在最佳狀態下的極限性能。 |
Maximum number of seconds to run all queries: 0.083 seconds | 最長總耗時 | 某個客戶端完成全部查詢的最長時間為?0.083 秒。反映數據庫在高負載或資源競爭時的性能波動。 |
Number of clients running queries: 50 | 并發客戶端數 | 模擬了?50 個客戶端同時發起查詢。用于測試數據庫的并發處理能力。 |
Average number of queries per client: 1 | 每客戶端查詢次數 | 每個客戶端平均執行了?1 次查詢。結合并發數可推算總查詢量(50 × 1 = 50 次)。 |
- 示例二——自動生成復雜表結構測試
下面命令通過自動創建包含 2 個整型列和 3 個字符列的表,模擬 5 個并發用戶執行 20 輪混合讀寫操作(插入/查詢),測試 MySQL 的并發處理能力。
mysqlslap --concurrency=5--iterations=20--number-int-cols=2--number-char-cols=3--auto-generate-sql -uroot -p
參數 | 作用 |
---|---|
--concurrency=5 | 模擬 5 個并發用戶?同時操作數據庫 |
--iterations=20 | 整個測試過程?重復執行 20 輪 |
--number-int-cols=2 | 在自動生成的測試表中?創建 2 個整型列?(如?INT ) |
--number-char-cols=3 | 在自動生成的測試表中?創建 3 個字符列?(如?VARCHAR ) |
--auto-generate-sql | 自動生成測試 SQL: - 建表 - 插入數據 - 混合查詢(默認 read/write 各半) |
-uroot -p | 使用?root 用戶登錄(執行時會提示輸入密碼) |
我們去運行一下看看
mysqlslap --concurrency=5 --iterations=20 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql -uroot -p
?還是需要一點時間
?
- 示例三——從文件加載 SQL 測試
mysqlslap --concurrency=5--iterations=5 --query=query.sql --create=create.sql --delimiter=";" -uroot -p
?該命令使用?create.sql
?文件中的 SQL 創建表結構,通過?query.sql
?文件中的 SQL 執行測試,模擬 5 個并發用戶重復執行 5 輪操作,評估 MySQL 數據庫性能。
參數 | 作用 |
---|---|
--concurrency=5 | 模擬?5 個并發用戶?同時操作 |
--iterations=5 | 整個測試過程?重復執行 5 輪 |
--query=query.sql | 核心測試 SQL: 從? query.sql ?文件讀取測試語句(如 SELECT/UPDATE) |
--create=create.sql | 初始化 SQL: 從? create.sql ?文件讀取建表語句 |
--delimiter=";" | SQL 語句分隔符為?分號?; (支持單文件多語句) |
-uroot -p | 使用?root 用戶登錄(執行時需輸入密碼) |
測試流程:
-
初始化階段:
執行?create.sql
?中的 SQL(如建表):-- create.sql 示例 CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50)); INSERT INTO users VALUES (1, 'Alice'), (2, 'Bob');
-
壓力測試階段:
每輪并發執行?query.sql
?中的 SQL:-- query.sql 示例 SELECT * FROM users WHERE id=1; -- 查詢1 UPDATE users SET name='Charlie' WHERE id=2; -- 更新1
-
執行規模:
5 并發用戶 × 5 輪測試 = 共 25 個測試單元 每個單元執行 query.sql 中所有 SQL