MySQL之?dāng)?shù)據(jù)庫維護(hù)

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_commitCom_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ù)庫,一般都采用增量備份。常用的備份工具有mysqldumpmysqlhotcopy、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語句,mysqldumpmysql用于轉(zhuǎn)存儲(chǔ)數(shù)據(jù)庫的實(shí)用程序

不能在MySQL可視化工具或者DOS里的mysql下直接執(zhí)行。

  1. 導(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
  1. 導(dǎo)出一個(gè)表
mysqldump -u 用戶名 -p 數(shù)據(jù)庫名 表名> 導(dǎo)出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql
  1. 導(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
  1. 帶語言參數(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ù),myisamchkmysqlcheck

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ù)

mysqlcheckmyisam和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ù)方法介紹(過程):

  1. 在新的正常工作的MYSQL環(huán)境下建立一個(gè)數(shù)據(jù)庫,比如aa
  2. 在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)
  1. 把系統(tǒng)崩潰后留下的test_innodb.frm文件拷貝到此處正常數(shù)據(jù)庫的數(shù)據(jù)目錄aa下,覆蓋掉下邊同名的.frm文件
  2. 重新啟動(dòng)MYSQL服務(wù)。
  3. 測(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ù)過程如下:

  1. 直接將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ò)。

  1. 在與test_myisam.frm同一目錄建立以下2個(gè)文件,文件內(nèi)容可以為空:test_myisam.MYD 表數(shù)據(jù)文件和test_myisam.MYI索引文件
  2. 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%';
image.png

值為OFF,需開啟,值為ON,表示已開啟
如果沒有開啟 binlog ,也沒有預(yù)先生成回滾SQL,那可能真的無法快速回滾了。對(duì)存放重要業(yè)務(wù)數(shù)據(jù)的 MySQL,強(qiáng)烈建議開啟 binlog

1.6.2 查找日志文件

1.6.2.1 路徑下查找

進(jìn)入binlog文件目錄,找出日志文件

image.png

1.6.2.2 命令下查找

查看下當(dāng)前正在寫入的 binlog 文件:

show master status;

image.png

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

show binary logs;
image.png

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/

image.png

通過 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
image.png

1.6.3.2 用命令查看

在 SQL 控制臺(tái)查看下 binlog 信息:

show binlog events in 'binlog.000002';
image.png

這樣還不能看出剛才修改前的內(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

mysqlslapMySQL 自帶的一個(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容