1 數(shù)據(jù)庫維護(hù)
數(shù)據(jù)庫維護(hù)是運(yùn)維工程師或者DBA主要工作,包括性能監(jiān)控、性能分析、性能調(diào)優(yōu)、數(shù)據(jù)庫備份和恢復(fù)等。
1.1 數(shù)據(jù)庫文件
MySQL的每個(gè)數(shù)據(jù)庫都對(duì)應(yīng)存放在一個(gè)與數(shù)據(jù)庫同名的文件夾中,MySQL數(shù)據(jù)庫文件包括MySQL所建數(shù)據(jù)庫文件和MySQL所用存儲(chǔ)引擎創(chuàng)建的數(shù)據(jù)庫文件。
1.1.1 MySQL創(chuàng)建并管理的數(shù)據(jù)庫文件
.frm文件:存儲(chǔ)數(shù)據(jù)表的框架結(jié)構(gòu),文件名與表名相同,每個(gè)表對(duì)應(yīng)一個(gè)同名frm文件,與操作系統(tǒng)和存儲(chǔ)引擎無關(guān),即不管MySQL運(yùn)行在何種操作系統(tǒng)上,使用何種存儲(chǔ)引擎,都有這個(gè)文件。
除了必有的.frm文件,根據(jù)MySQL所使用的存儲(chǔ)引擎的不同(MySQL常用的兩個(gè)存儲(chǔ)引擎是MyISAM和InnoDB),存儲(chǔ)引擎會(huì)創(chuàng)建各自不同的數(shù)據(jù)庫文件
MyISAM數(shù)據(jù)庫表文件:
-
.MYD文件:即MY Data,表數(shù)據(jù)文件 -
.MYI文件:即MY Index,索引文件 -
.log文件:日志文件
InnoDB采用表空間(tablespace)來管理數(shù)據(jù),存儲(chǔ)表數(shù)據(jù)和索引,InnoDB數(shù)據(jù)庫文件(即InnoDB文件集,ib-file set):
-
ibdata1、ibdata2等:系統(tǒng)表空間文件,存儲(chǔ)InnoDB系統(tǒng)信息和用戶數(shù)據(jù)庫表數(shù)據(jù)和索引,所有表共用 -
.ibd文件:?jiǎn)伪肀砜臻g文件,每個(gè)表使用一個(gè)表空間文件(file per table),存放用戶數(shù)據(jù)庫表數(shù)據(jù)和索引 - 日志文件: ib_logfile1、ib_logfile2
1.1.2 MySQL數(shù)據(jù)庫存放位置
MySQL如果使用MyISAM存儲(chǔ)引擎,數(shù)據(jù)庫文件類型就包括.frm、.MYD、.MYI,默認(rèn)存放位置是C:\Documentsand Settings\All Users\Application Data\MySQL\MySQL Server 5.1\data
MySQL如果使用InnoDB存儲(chǔ)引擎,數(shù)據(jù)庫文件類型就包括.frm、ibdata1、.ibd,.frm和.ibd文件默認(rèn)存放位置是MySQL安裝目錄下的data文件夾
1.2 性能狀態(tài)關(guān)鍵指標(biāo)QPS和TPS
QPS,Queries Per Second:每秒查詢數(shù),一臺(tái)數(shù)據(jù)庫每秒能夠處理的查詢次數(shù)
TPS,Transactions Per Second:每秒處理事務(wù)數(shù)
通過show status查看運(yùn)行狀態(tài),會(huì)有300多條狀態(tài)信息記錄,其中有幾個(gè)值幫可以我們計(jì)算出QPS和TPS,如下:
-
Uptime:服務(wù)器已經(jīng)運(yùn)行的實(shí)際,單位秒 -
Questions:已經(jīng)發(fā)送給數(shù)據(jù)庫查詢數(shù) -
Com_select:查詢次數(shù),實(shí)際操作數(shù)據(jù)庫的 -
Com_insert:插入次數(shù) -
Com_delete:刪除次數(shù) -
Com_update:更新次數(shù) -
Com_commit:事務(wù)次數(shù) -
Com_rollback:回滾次數(shù)
那么,計(jì)算方法來了,基于Questions計(jì)算出QPS:
mysql> show global status like 'Questions';
mysql> show global status like 'Uptime';
QPS = Questions / Uptime
基于Com_commit和Com_rollback計(jì)算出TPS:
mysql> show global status like 'Com_commit';
mysql> show global status like 'Com_rollback';
mysql> show global status like 'Uptime';
TPS = (Com_commit + Com_rollback) / Uptime
另一計(jì)算方式:基于Com_select、Com_insert、Com_delete、Com_update計(jì)算出QPS
mysql> show global status where Variable_name in('com_select','com_insert','com_delete','com_update');
等待1秒再執(zhí)行,獲取間隔差值,第二次每個(gè)變量值減去第一次對(duì)應(yīng)的變量值,就是QPS
TPS計(jì)算方法:
mysql> show global status where Variable_name in('com_insert','com_delete','com_update');
計(jì)算TPS,就不算查詢操作了,計(jì)算出插入、刪除、更新四個(gè)值即可。
經(jīng)網(wǎng)友對(duì)這兩個(gè)計(jì)算方式的測(cè)試得出,當(dāng)數(shù)據(jù)庫中myisam表比較多時(shí),使用Questions計(jì)算比較準(zhǔn)確。當(dāng)數(shù)據(jù)庫中innodb表比較多時(shí),則以Com_*計(jì)算比較準(zhǔn)確。
1.3 開啟慢查詢?nèi)罩?/h2>
MySQL開啟慢查詢?nèi)罩?,分析出哪條SQL語句比較慢,使用set設(shè)置變量,重啟服務(wù)失效,可以在my.cnf添加參數(shù)永久生效。
mysql> set global slow-query-log=on #開啟慢查詢功能
mysql> set global slow_query_log_file='/var/log/mysql/mysql-slow.log'; #指定慢查詢?nèi)罩疚募恢?mysql> set global log_queries_not_using_indexes=on; #記錄沒有使用索引的查詢
mysql> set global long_query_time=1; #只記錄處理時(shí)間1s以上的慢查詢
分析慢查詢?nèi)罩?,可以使用MySQL自帶的mysqldumpslow工具,分析的日志較為簡(jiǎn)單。
mysqldumpslow -t 3 /var/log/mysql/mysql-slow.log
#查看最慢的前三個(gè)查詢
也可以使用percona公司的pt-query-digest工具,日志分析功能全面,可分析slow log、binlog、general log。
分析慢查詢?nèi)罩荆簆t-query-digest /var/log/mysql/mysql-slow.log
分析binlog日志:mysqlbinlog mysql-bin.000001 >mysql-bin.000001.sql
pt-query-digest –type=binlog mysql-bin.000001.sql
分析普通日志:pt-query-digest –type=genlog localhost.log
1.4 數(shù)據(jù)庫備份
備份數(shù)據(jù)庫是最基本的工作,也是最重要的,否則后果很嚴(yán)重,但由于數(shù)據(jù)庫比較大,上百G,往往備份都很耗費(fèi)時(shí)間,所以就該選擇一個(gè)效率高的備份策略,對(duì)于數(shù)據(jù)量大的數(shù)據(jù)庫,一般都采用增量備份。常用的備份工具有mysqldump、mysqlhotcopy、xtrabackup等,mysqldump比較適用于小的數(shù)據(jù)庫,因?yàn)槭沁壿媯浞荩詡浞莺突謴?fù)耗時(shí)都比較長(zhǎng)。mysqlhotcopy和xtrabackup是物理備份,備份和恢復(fù)速度快,不影響數(shù)據(jù)庫服務(wù)情況下進(jìn)行熱拷貝,建議使用xtrabackup,支持增量備份。
1.4.1 myqldump示例
使用myqldump時(shí),注意myqldump不是sql語句,mysqldump是mysql用于轉(zhuǎn)存儲(chǔ)數(shù)據(jù)庫的實(shí)用程序
不能在MySQL可視化工具或者DOS里的mysql下直接執(zhí)行。
- 導(dǎo)出整個(gè)數(shù)據(jù)庫
導(dǎo)出文件默認(rèn)是存在mysql\bin目錄下
mysqldump -u 用戶名 -p 數(shù)據(jù)庫名 > 導(dǎo)出的文件名
mysqldump -u user_name -p123456 database_name > outfile_name.sql
- 導(dǎo)出一個(gè)表
mysqldump -u 用戶名 -p 數(shù)據(jù)庫名 表名> 導(dǎo)出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql
- 導(dǎo)出一個(gè)數(shù)據(jù)庫結(jié)構(gòu)
mysqldump -u user_name -p -d -add-drop-table database_name > outfile_name.sql
-d 沒有數(shù)據(jù) –add-drop-table 在每個(gè)create語句之前增加一個(gè)drop table
- 帶語言參數(shù)導(dǎo)出
mysqldump -uroot -p –default-character-set=latin1 –set-charset=gbk –skip-optdatabase_name > outfile_name.sql
1.5 數(shù)據(jù)庫修復(fù)
有時(shí)候MySQL服務(wù)器突然斷電、異常關(guān)閉,會(huì)導(dǎo)致表損壞,無法讀取表數(shù)據(jù)。這時(shí)就可以用到MySQL自帶的兩個(gè)工具進(jìn)行修復(fù),myisamchk和mysqlcheck
1.5.1 myisamchk修復(fù)
myisamchk: 只能修復(fù)myisam表,需要停止數(shù)據(jù)庫
常用參數(shù):
- -f –force 強(qiáng)制修復(fù),覆蓋老的臨時(shí)文件,一般不使用
- -r –recover 恢復(fù)模式
- -q –quik 快速恢復(fù)
- -a –analyze 分析表
- -o –safe-recover 老的恢復(fù)模式,如果-r無法修復(fù),可以使用此參數(shù)試試
- -F –fast 只檢查沒有正常關(guān)閉的表
快速修復(fù)weibo數(shù)據(jù)庫:
cd /var/lib/mysql/weibo
myisamchk -r -q *.MYI
1.5.2 mysqlcheck修復(fù)
mysqlcheck: myisam和innodb表都可以用,不需要停止數(shù)據(jù)庫,如修復(fù)單個(gè)表,可在數(shù)據(jù)庫后面添加表名,以空格分割
常用參數(shù):
- -a –all-databases 檢查所有的庫
- -r –repair 修復(fù)表
- -c –check 檢查表,默認(rèn)選項(xiàng)
- -a –analyze 分析表
- -o –optimize 優(yōu)化表
- -q –quik 最快檢查或修復(fù)表
- -F –fast 只檢查沒有正常關(guān)閉的表
快速修復(fù)weibo數(shù)據(jù)庫:
mysqlcheck -r -q -uroot -p123 weibo
1.5.3 .frm文件修復(fù)
在MYSQL中建立任何一張數(shù)據(jù)表,在其數(shù)據(jù)目錄對(duì)應(yīng)的數(shù)據(jù)庫目錄下都有對(duì)應(yīng)表的.frm文件,.frm文件是用來保存每個(gè)數(shù)據(jù)表的元數(shù)據(jù)(meta)信息,包括表結(jié)構(gòu)的定義等,.frm文件跟數(shù)據(jù)庫存儲(chǔ)引擎無關(guān),也就是任何存儲(chǔ)引擎的數(shù)據(jù)表都必須有.frm文件,命名方式為數(shù)據(jù)表名.frm,如user.frm。 .frm文件可以用來在數(shù)據(jù)庫崩潰時(shí)恢復(fù)表結(jié)構(gòu)。
1.5.3.1 InnoDB表結(jié)構(gòu)的恢復(fù)
假定:MYSQL數(shù)據(jù)庫已經(jīng)崩潰,目前只有對(duì)應(yīng)表的.frm文件,大家都知道,.frm文件無法通過文本編輯器查看,因?yàn)槿绻换謴?fù),基本上來說對(duì)我們沒什么用。這里我們?yōu)榱藴y(cè)試,假定該文件為test_innodb.frm
該表創(chuàng)建腳本如下(建表后就把該表所在數(shù)據(jù)庫服務(wù)器給強(qiáng)行關(guān)閉,模擬崩潰場(chǎng)景)
mysql> create table test_innodb
-> (A int(11) default NULL,
-> B varchar(30) default NULL,
-> C date default NULL) engine=innodb;
Query OK, 0 rows affected (0.05 sec)
恢復(fù)方法介紹(過程):
- 在新的正常工作的
MYSQL環(huán)境下建立一個(gè)數(shù)據(jù)庫,比如aa - 在aa數(shù)據(jù)庫下建立同名的數(shù)據(jù)表
test_innodb,表結(jié)構(gòu)隨意,這里只有一個(gè)id字段,操作過程片段如下:
mysql> create table test_innodb (id bigint not null)engine=InnoDB;
Query OK, 0 rows affected (0.09 sec)
mysql> show tables;
+--------------+
| Tables_in_aa |
+--------------+
| test_innodb |
+--------------+
2 rows in set (0.00 sec)
mysql> desc test_innodb;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | bigint(20) | NO | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
- 把系統(tǒng)崩潰后留下的
test_innodb.frm文件拷貝到此處正常數(shù)據(jù)庫的數(shù)據(jù)目錄aa下,覆蓋掉下邊同名的.frm文件 - 重新啟動(dòng)MYSQL服務(wù)。
- 測(cè)試下是否恢復(fù)成功,進(jìn)入aa數(shù)據(jù)庫,用desc命令測(cè)試下:
mysql> desc test_innodb;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| A | int(11) | YES | | NULL | |
| B | varchar(30) | YES | | NULL | |
| C | date | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
OK,發(fā)現(xiàn)表結(jié)構(gòu)已經(jīng)恢復(fù)過來了。
1.5.3.2 MyISAM表結(jié)構(gòu)的恢復(fù)
MyISAM類型的表恢復(fù)相對(duì)比較簡(jiǎn)單。
同樣先假定需要恢復(fù)的表的FRM文件為test_myisam.frm,表結(jié)構(gòu)為
mysql> create table test_myisam
-> (A int(11) default NULL,
-> B varchar(30) default NULL,
-> C date default NULL) engine=myisam;
Query OK, 0 rows affected (0.05 sec)
恢復(fù)過程如下:
- 直接將
test_myisam.frm拷貝到正常數(shù)據(jù)庫對(duì)應(yīng)的數(shù)據(jù)目錄下。這時(shí)測(cè)試
mysql> show tables;
+--------------+
| Tables_in_aa |
+--------------+
| test_innodb |
| test_myisam |
+--------------+
3 rows in set (0.00 sec)
mysql> desc test_myisam;
ERROR 1017 (HY000): Can't find file: 'test_myisam' (errno: 2)
發(fā)現(xiàn)只能通過show tables命令看見表名,但是表結(jié)構(gòu)還是沒有恢復(fù),desc命令報(bào)錯(cuò)。
- 在與
test_myisam.frm同一目錄建立以下2個(gè)文件,文件內(nèi)容可以為空:test_myisam.MYD表數(shù)據(jù)文件和test_myisam.MYI索引文件 - 在
MYSQL命令行使用MYSQL本身的數(shù)據(jù)表恢復(fù)命令repair命令恢復(fù)表,如下:
mysql> repair table test_myisam USE_FRM;
+-----------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------------+--------+----------+----------+
| aa.test_myisam | repair | status | OK |
+-----------------+--------+----------+----------+
1 row in set (0.00 sec)
根據(jù)結(jié)果可以知道,恢復(fù)命令執(zhí)行成功,下邊用desc命令測(cè)試下:
mysql> desc test_myisam;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| A | int(11) | YES | | NULL | |
| B | varchar(30) | YES | | NULL | |
| C | date | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.02 sec)
果然恢復(fù)成功了。
也可以用show create table命令測(cè)試下:
mysql> show create table test_myisam;
+--------------+-----------------------------------------------------------------
----------------------------------------------------------------------+
| Table | Create Table
|
+--------------+-----------------------------------------------------------------
----------------------------------------------------------------------+
| test_myisam | Create TABLE `test_myisam` (
`A` int(11) DEFAULT NULL,
`B` varchar(30) DEFAULT NULL,
`C` date DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
在恢復(fù)MyISAM表結(jié)構(gòu)時(shí),提到MYD文件和MYI文件,這兩個(gè)文件都專屬于MyISAM存儲(chǔ)引擎的,前者用來保存MyISAM表的數(shù)據(jù),后者用來存放MyISAM表的索引信息。
1.6 MySQL恢復(fù)誤刪表而丟失的數(shù)據(jù)
相信后端研發(fā)的同學(xué)在開發(fā)過程經(jīng)常會(huì)遇到產(chǎn)品臨時(shí)修改線上數(shù)據(jù)的需求,如果手法很穩(wěn)那么很慶幸可以很快完成任務(wù),很不幸某一天突然手一抖把表里的數(shù)據(jù)修改錯(cuò)誤或者誤刪了,這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)各種問題反饋接踵而來。
1.6.1 查看是否開啟binlog
保證 mysql 已經(jīng)開啟 binlog,查看命令:
查看binklog是否開啟
show variables like '%log_bin%';
查看binlog存放日志文件目錄
show variables like '%datadir%';

值為OFF,需開啟,值為ON,表示已開啟
如果沒有開啟 binlog ,也沒有預(yù)先生成回滾SQL,那可能真的無法快速回滾了。對(duì)存放重要業(yè)務(wù)數(shù)據(jù)的 MySQL,強(qiáng)烈建議開啟 binlog
1.6.2 查找日志文件
1.6.2.1 路徑下查找
進(jìn)入binlog文件目錄,找出日志文件

1.6.2.2 命令下查找
查看下當(dāng)前正在寫入的 binlog 文件:
show master status;

也可以查看下當(dāng)前有多少個(gè)
binlog 日志文件了:
show binary logs;

1.6.3 通過mysqlbinlog查看DML記錄
1.6.3.1 在mysql服務(wù)器內(nèi)
切換到mysqlbinlog目錄,當(dāng)線上數(shù)據(jù)出現(xiàn)錯(cuò)誤的時(shí)候首先可以詢問具體操作人記錄時(shí)間點(diǎn),這個(gè)時(shí)候可以借助mysql自帶的binlog解析工具mysqlbinlog,具體位置在mysql 安裝目錄 **/mysql/bin/下

通過 mysqlbinlog 工具命令查看數(shù)據(jù)庫增刪改查記錄(必須切換到 mysqlbinlog 目錄才有效)
例子1:查詢2022-11-12 09:00:00到2022-11-13 20:00:00 數(shù)據(jù)庫為 test 的操作日志,輸入如下命令將數(shù)據(jù)寫入到一個(gè)備用的txt文件中
mysqlbinlog --no-defaults --database=test --start-datetime="2022-11-12 09:00:00" --stop-datetime="2022-11-13 20:00:00" /data/mysql/mysql-bin.000015 > template_coupon_tb_product_category.txt
例子2:查詢2022-11-12 09:00:00到2022-11-13 20:00:00 數(shù)據(jù)庫為 test 的操作日志,并輸出到屏幕上
mysqlbinlog --no-defaults --database=test --start-datetime="2022-11-12 09:00:00" --stop-datetime="2022-11-13 20:00:00" /data/mysql/mysql-bin.000015 |more
例子3:查詢2022-11-12 09:00:00到2022-11-13 20:00:00 數(shù)據(jù)庫為 test 的操作日志,并且過濾出 只包括 template_coupon_tb_product_category 表數(shù)據(jù)的操作記錄 ,輸入如下命令將數(shù)據(jù)寫入到一個(gè)備用的txt文件中
mysqlbinlog --no-defaults --database=test--start-datetime="2022-11-12 09:00:00" --stop-datetime="2022-11-13 20:00:00" /data/mysql/mysql-bin.000015 | grep template_coupon_tb_product_category > template_coupon_tb_product_category.txt

1.6.3.2 用命令查看
在 SQL 控制臺(tái)查看下 binlog 信息:
show binlog events in 'binlog.000002';

這樣還不能看出剛才修改前的內(nèi)容,下面就要使用 mysqlbinlog 工具進(jìn)行分析了,首先進(jìn)入到 binlog 日志的位置,我們根據(jù)時(shí)間點(diǎn)過濾下:
mysqlbinlog --no-defaults --base64-output=decode-rows -v --start-datetime="2022-03-13 19:00:00" --stop-datetime="2022-03-13 19:10:00" ./binlog.000002
1.6.4 mysqlbinlog 命令
mysqlbinlog 命令的語法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u用戶名 -p密碼 數(shù)據(jù)庫名
參數(shù)選項(xiàng)解釋:
-
start-position=875:起始pos點(diǎn) -
stop-position=954:結(jié)束pos點(diǎn) -
start-datetime="2022-9-25 22:01:08":起始時(shí)間點(diǎn) -
stop-datetime="2022-9-25 22:09:46":結(jié)束時(shí)間點(diǎn) -
database=test:指定只恢復(fù)test數(shù)據(jù)庫(一臺(tái)主機(jī)上往往有多個(gè)數(shù)據(jù)庫,只限本地log日志) -
no-defaults:表示不使用配置文件中(my.cnf里配的[client])的參數(shù),可以避免有些mysqlbinlog沒有的參數(shù)導(dǎo)致的失敗 -
base64-output=decode-rows:解碼方式,不加的話看到的是base64之后的 -
v顯示sql語句,也可以vv顯示sql語句和類型 -
r:可以將結(jié)果輸出到文件中 -
-u 或--user=name:連接到遠(yuǎn)程主機(jī)的用戶名 -
-p 或--password[=name]:連接到遠(yuǎn)程主機(jī)的密碼 -
-h 或--host=name:從遠(yuǎn)程主機(jī)上獲取binlog日志 -
--read-from-remote-server:從某個(gè)MySQL服務(wù)器上讀取binlog日志
1.7 查詢表存儲(chǔ)空間
SELECT
table_schema AS "數(shù)據(jù)庫",
table_name AS "表名",
table_rows AS "記錄數(shù)",
TRUNCATE ( data_length / 1024 / 1024, 2 ) AS "數(shù)據(jù)容量(MB)",
TRUNCATE ( index_length / 1024 / 1024, 2 ) AS "索引容量(MB)"
FROM
information_schema.TABLES
WHERE
table_schema = '數(shù)據(jù)庫' and TABLE_NAME = '表名'
ORDER BY
data_length DESC,
index_length DESC;
附錄:Varchar(50) 和 varchar(500) 區(qū)別:
全表掃描無排序情況下,兩者性能無差異,在全表有排序的情況下,兩種性能差異巨大
當(dāng)使用varchar類型字段進(jìn)行排序操作的時(shí)候,Mysql會(huì)根據(jù)該字段的設(shè)計(jì)的長(zhǎng)度進(jìn)行內(nèi)存預(yù)估,如果設(shè)計(jì)過大的可變長(zhǎng)度,會(huì)導(dǎo)致內(nèi)存預(yù)估的值超出sort_buffer_size的大小,導(dǎo)致mysql采用磁盤臨時(shí)文件排序,最終影響查詢性能
1.8 mysqlslap
mysqlslap 是 MySQL 自帶的一個(gè) 基準(zhǔn)測(cè)試工具(benchmark tool),用于模擬多并發(fā)連接對(duì)數(shù)據(jù)庫進(jìn)行壓力測(cè)試,看看數(shù)據(jù)庫在高并發(fā)情況下的性能表現(xiàn)。
基本語法:mysqlslap [OPTIONS]
| 參數(shù) | 說明 |
|---|---|
--user/-u |
數(shù)據(jù)庫用戶名 |
--password/-p |
數(shù)據(jù)庫密碼(可以不寫,運(yùn)行后輸入) |
--host/-h |
數(shù)據(jù)庫主機(jī)(默認(rèn) localhost) |
--concurrency |
并發(fā)線程數(shù)(例如:50 表示同時(shí)開 50 個(gè)連接) |
--iterations |
測(cè)試的迭代次數(shù)(多次重復(fù)測(cè)試) |
--number-of-queries |
總執(zhí)行的 SQL 數(shù)量 |
--query |
要執(zhí)行的 SQL 語句(可選) |
--create-schema |
指定數(shù)據(jù)庫名稱 |
--create |
創(chuàng)建表的語句(用于測(cè)試時(shí)先建表) |
--engine |
使用的存儲(chǔ)引擎(如 InnoDB、MyISAM) |
--auto-generate-sql |
自動(dòng)生成測(cè)試 SQL(適合純測(cè)試) |
--auto-generate-sql-load-type |
加載類型:read、write、update、mixed
|
示例:
進(jìn)行基準(zhǔn)測(cè)試
mysqlslap --user=root --password --concurrency=50 --iterations=5 --auto-generate-sql
自定義 SQL 進(jìn)行壓力測(cè)試
mysqlslap --user=root --password --host=127.0.0.1 \
--concurrency=10 --iterations=2 \
--create-schema=test \
--query="SELECT * FROM my_table WHERE id = 1"
結(jié)果
Benchmark
Average number of seconds to run all queries: 0.245
Minimum number of seconds to run all queries: 0.240
Maximum number of seconds to run all queries: 0.251
Number of clients running queries: 50
Average number of queries per client: 1