MySQL 常用程序介绍

以下是一些常用的MySQL程序:

|---------------|----------------------------------------------------------------------------------|
| 程序名 | 作⽤ |
| mysqld | MySQL的守护进程即 MySQL 服务器,要使⽤MySQL 服务器 mysqld必须正在运⾏状态 |
| mysql | MySQL客⼾端程序,⽤于交互式输⼊ SQL 语句或以批处理模式从⽂件执⾏SQL的命令⾏⼯具 |
| mysqlcheck | ⽤于检查、修复、分析和优化表的表维护客⼾端 |
| mysqldump | 将 MySQL 数据库转储到 SQL、⽂本或 XML ⽂件中的客⼾端 |
| mysqlimport | 将⽂本⽂件导⼊到表的客⼾端⼯具 |
| mysqladmin | 执⾏管理操作的客⼾端,例如创建或删除数据库、重新加载授权表、将表刷新到磁盘以及重新打开⽇志⽂件。mysqladmin还可以⽤于从服务器检索版本、进程和状态信息。 |
| mysqlshow | 显⽰数据库、表、列和索引信息的客⼾端 |
| mysqldumpslow | ⽤于读取和汇总慢速查询⽇志内容的实⽤程序 |
| mysqlbinlog | 从⼆进制⽇志中读取SQL语句的实⽤程序。mysqlbinlog ⽂件中包含的已执⾏SQL语句的⽇志,可⽤于从崩溃中恢复数据。 |
| mysqlslap | 客⼾端负载⼯具,模拟多个客⼾端同时访问MySQL服务器,并报告每个阶段的使⽤时间。 |

mysqld - MySQL 服务器

mysqld也被称为MySQL服务器,是⼀个多线程程序,对数据⽬录进⾏访问管理(包含数据库和
表)。数据⽬录也是其他信息(如⽇志⽂件和状态⽂件)的默认存储位置。当 MySQL 服务器启动时,会侦听指定的端⼝、处理来⾃客⼾端程序的⽹络连接,并管理不同客⼾端对数据库的访问.

mysql - MySQL 命令行客户端

mysql是⼀个简单的 SQL shell, 可以输⼊命令和执⾏SQL语句,当执⾏SQL语句时,查询结果以
ASCII 表格式显⽰.在终端连接MySQL服务器可以使用如下指令:

bash 复制代码
# ⻓选项格式
mysql --user=user_name --password [db_name]
# 短选项格式
mysql -uuser_name -p [db_name]
# 终端回显,输⼊密码
Enter password: your_password

mysql 客户端选项

|-------------------------|-----|----------------------------------------------------------------------------------------|
| 选项--⻓格式 | 短格式 | 说明 |
| --host | -h | --host= host_name , -h host_name 连接到指定主机上的 MySQL 服务 |
| --port | -P | --port=port_num, -Pport_num TCP/IP 连接使⽤的端⼝号 |
| --user | -u | --user= user_name , -u user_name ⽤于连接到MySQL 服务器的⽤户名 |
| --password | -p | --password[= password ] , -p[ password ] ⽤于连接到MySQL 服务器的密码。可选,如果没有给出, 会提⽰⽤户输⼊ |
| --defaults-file | | --defaults-file= file_name 使⽤指定的选项⽂件。如果该⽂件不存在,则会发⽣错误。 |
| --default-character-set | | --default-character-set= charset_name charset_name 将作为 客⼾端和当前连接的默认字符集,例: utf8mb4 |
| --database | -D | --database= db_name , -D db_name 要使⽤的数据库 |
| --compress | -C | --compress , -C 如果可能,压缩客⼾端和服务器之间传输的所有信息 |
| --reconnect | | --reconnect 如果客⼾端与服务器的连接丢失,⾃动尝试重新连接 |
| --quick | -q | --quick , -q 不缓存查询结果,收到⼀⾏打印⼀⾏,如果输出被挂起,可能会降低服务器速度 |
| --protocol | | --protocol={TCP|SOCKET|PIPE|MEMORY} ⽤于连接到服务器的传输协议, 默认为TCP |
| --delimiter | | --delimiter= 要设置的 SQL语句分隔符 设置SQL语句分隔符。默认值为分号 ( ; ) |
| --execute | -e | --execute= statement , -e statement 执⾏指定的SQL语句并退出。 |
| --version | -V | --version , -V 显⽰版本信息并退出。 |
| --help | -? | --help , -? 显⽰帮助信息并退出。 |

在命令行中使用选项

命令⾏中指定选项遵循以下规则:

  • 选项应在程序名之后给出

  • 选项以单破折号" - "或双破折号" -- "号开头, - 表⽰短格式, -- 表⽰⻓格式,例如:-?和 --help 都表⽰MySQL 程序显⽰他的帮助消息

  • 选项名称区分⼤⼩写。 -v 和 -V 都是合法的,但含义不同,它们分别是 --verbose 和 --version 选项的相应缩写形式

  • 对于带值的⻓格式选项,通常⽤ = 符号分隔选项名称和值。对于带值的短选项,选项值可以紧跟在选项之后,也可以⽤空格隔开,例如: --host=127.0.0.1 、 -h127.0.0.1 和 -h 127.0.0.1 是等价的。 但是对于密码选项的短格式,如果要指定密码,选项与值之间不能有空格,如下所⽰:

bash 复制代码
mysql -ptest # test表⽰密码,但没有指定要访问的数据库
mysql -p test # test 表⽰指定了访问的数据库,但没有指定密码
  • 对于采⽤数值的选项,该值可以带有后缀 K , M 或 G 以指⽰乘数 1024、1024^2或 1024^3,例如,以下命令告诉 mysqladmin对服务器执⾏ 1024 次 ping,每次 ping 之间休眠 3 秒
bash 复制代码
mysqladmin --count=1K --sleep=3 ping -uroot -p
  • 在命令⾏中包含空格的选项值必须⽤引号引起来。例如, --execute (or -e ) 选项与mysql⼀起使⽤时,表⽰将⼀个或多个 SQL 语句发送给服务器执⾏并显⽰结果
bash 复制代码
mysql -u root -p -e "SELECT VERSION();SELECT NOW();"

选项(配置)文件

⼤多数 MySQL 程序都可以从选项⽂件(配置⽂件)中读取启动选项。可以在选项⽂件中指定常⽤选项,这样就不⽤在每次运⾏程序时都在命令⾏中输⼊它们。⼤部分选项⽂件都是纯⽂本格式,可以使⽤任何⽂本编辑器创建。

使用⽅法

选项 --defaults-file 可以指定要使⽤的选项⽂件,客⼾端程序会读取并应⽤选项⽂件中的相关配置

bash 复制代码
# Linux
mysql --defaults-file=/etc/mysql/my.cnf -uroot -p
# windows下
mysql "--defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" -uroot -p
选项⽂件位置及加载顺序

MySQL 按以下表格中的顺序查找并读取选项⽂件,如果⽂件不存在则需要⼿动创建。读取顺序从上到下,后读取的⽂件中配置的选项优先级越⾼。

  • 在 Windows 系统读取选项⽂件

|-----------------------------------------|---------------------------------------------------------------------------|
| ⽂件名 | 说明 |
| %WINDIR%\my.ini , %WINDIR%\my.cnf | 全局,%WINDIR%是一个环境变量,它代表Windows操作系统的安装目录,通常等于C:\Windows |
| C:\my.ini , C:\my.cnf | 全局 |
| BASEDIR \my.ini , BASEDIR \my.cnf | 全局,其中 BASEDIR指mysql的安装路径,这是最常用的配置文件 |
| defaults-extra-file | 如果存在其他选项⽂件可以通过 --defaults-extra-file 选项指定 |
| %APPDATA%\MySQL\.mylogin.cnf | 登录路径选项(仅限客⼾端),%APPDATA% 表⽰应⽤程序数据的⽬录,如C:\Users\[用户名]\AppData\Roaming |
| DATADIR \mysqld-auto.cnf | 系统变量 (仅限服务器) |

  • 在 Unix 和 Linux 系统上读取的选项⽂件

|--------------------------|-------------------------------------------|
| ⽂件名 | 说明 |
| /etc/my.cnf | 全局 |
| /etc/mysql/my.cnf | 全局 |
| $MYSQL_HOME/my.cnf | 服务器特定选项(仅限服务器),MYSQL_HOME 是设置的环境变量路径 |
| defaults-extra-file | 如果存在其他选项⽂件可以通过 --defaults-extra-file 选项指定 |
| ~/.my.cnf | ⽤⼾特定选项,MYSQL_HOME 是设置的环境变量路径 |
| ~/.mylogin.cnf | ⽤⼾特定的登录路径选项(仅限客⼾端) |
| DATADIR /mysqld-auto.cnf | 系统变量 (仅限服务器),D ATADIR 代表MySQL数据⽬录 |

选项⽂件中指定选项时,省略两个前导破折号,并且每⼀⾏表⽰⼀个选项,例如: --quick 和 --host=127.0.0.1 在选项⽂件中应表⽰成 quick 和 host=127.0.0.1
选项⽂件中的空⾏会被忽略。⾮空⾏可以采⽤以下任何形式:
◦ # comment , ; comment
注释⾏以 # 或 ; 开,注释可以从⼀⾏的中间开始
◦ [ group ]
设置选项的程序或组的名称,不区分⼤⼩写。如果选项组名称与程序名称相同,则组中的选项专⻔应⽤于该程序,例如, [mysqld] 和 [mysql] 组分别适⽤于mysqld服务端程序和 mysql客⼾端程序
◦ [client] MySQL发⾏版中所有客⼾端程序都会读取并应⽤这个组下的选项(除了mysqld),在这个组下可以指定适⽤于所有客⼾端程序的通⽤选项,例如配置⽤⼾名和密码(但要确保只有⾃⼰才可以访问这个⽂件以防⽌密码泄漏)。
opt_name
相当于命令⾏上的选项名
opt_name = value
选项名对应的值,可以使⽤转义序列 \b , \t , \n , \r , \\ 和 \s 来表⽰退格符、制表符、换⾏符、回⻋符、反斜杠和空格字符
◦ 在选项⽂件中使⽤ !include 指令来包含其他选项⽂件,例如: !include /home/mydir/myopt.cnf
案例:设置客⼾端全局编码格式

  • 在Linux下编辑全局配置⽂件默认位置 /etc/mysql/my.cnf ,初始内容如下:
bash 复制代码
root@hcss-ecs-9734:/# vim etc/mysql/my.cnf

# Copyright (c) 2015, 2024, Oracle and/or its affiliates.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
# ... 省略
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
# 以下区域可以根据需要进⾏配置
  • 在已有内容下⽅输⼊相应的配置,我们要为客⼾端设置全局的编码格式为utf8mb4, 那么在[client] 节点下指定相应的选项即可
bash 复制代码
[client] # 所有客⼾端程序者会读取这个节点下的配置信息
default-character-set=utf8mb4 # 指定编码格式为utf8mb4

从.sql⽂件执⾏ SQL 语句

使⽤source命令导⼊

有时候我们需要从.sql ⽂件执⾏⼀些SQL语句,⽐如要把⼀个数据库从⼀台服务器A复制到另⼀台服务器B上,那么可以先从服务器A导出数据到.sql⽂件,然后在服务器B执⾏这个.sql⽂件,我们可以⽤help命令查看命令列表,可以看到有⼀个source 命令如下所⽰:

bash 复制代码
mysql> help

# ... 省略
source    (\.) Execute an SQL script file. Takes a file name as an argument.
# ... 省略

下⾯我们演⽰⼀下source命令的使⽤⽅法

  • 准备要执⾏的.sql⽂件,名为test_db.sql,内容如下:
sql 复制代码
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP DATABASE IF EXISTS `test_db`;
CREATE DATABASE `test_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `test_db`;
-- ----------------------------
-- Table structure for classes
-- ----------------------------
DROP TABLE IF EXISTS `classes`;
CREATE TABLE `classes` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL
DEFAULT NULL,
 `desc` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL
DEFAULT NULL,
 PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = 
utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of classes
-- ----------------------------
INSERT INTO `classes` VALUES (1, '计算机系2019级1班', '学习了计算机原理、C和Java语
⾔、数据结构和算法');
INSERT INTO `classes` VALUES (2, '中⽂系2019级3班', '学习了中国传统⽂学');
INSERT INTO `classes` VALUES (3, '⾃动化2019级5班', '学习了机械⾃动化');
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL
DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = 
utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (1, 'Java');
INSERT INTO `course` VALUES (2, '中国传统⽂化');
INSERT INTO `course` VALUES (3, '计算机原理');
INSERT INTO `course` VALUES (4, '语⽂');
INSERT INTO `course` VALUES (5, '⾼阶数学');
INSERT INTO `course` VALUES (6, '英⽂');
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
 `score` decimal(3, 1) NULL DEFAULT NULL,
 `student_id` int(11) NULL DEFAULT NULL,
 `course_id` int(11) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci 
ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES (70.5, 1, 1);
INSERT INTO `score` VALUES (98.5, 1, 3);
INSERT INTO `score` VALUES (33.0, 1, 5);
INSERT INTO `score` VALUES (98.0, 1, 6);
INSERT INTO `score` VALUES (60.0, 2, 1);
INSERT INTO `score` VALUES (59.5, 2, 5);
INSERT INTO `score` VALUES (33.0, 3, 1);
INSERT INTO `score` VALUES (68.0, 3, 3);
INSERT INTO `score` VALUES (99.0, 3, 5);
INSERT INTO `score` VALUES (67.0, 4, 1);
INSERT INTO `score` VALUES (23.0, 4, 3);
INSERT INTO `score` VALUES (56.0, 4, 5);
INSERT INTO `score` VALUES (72.0, 4, 6);
INSERT INTO `score` VALUES (81.0, 5, 1);
INSERT INTO `score` VALUES (37.0, 5, 5);
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
 `id` int(11) PRIMARY KEY AUTO_INCREMENT,
 `sn` int(11) NOT NULL COMMENT '学号',
 `name` varchar(20) NOT NULL COMMENT '姓名',
 `mail` varchar(20) COMMENT 'QQ邮箱'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci 
ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, 50001, '张三', 'zs@bit.com');
INSERT INTO `student` VALUES (2, 50002, '李四', 'ls@bit.com');
INSERT INTO `student` VALUES (3, 50003, '王五', 'ww@bit.com');
INSERT INTO `student` VALUES (4, 50004, '赵六', 'zl@bit.com');
INSERT INTO `student` VALUES (5, 50005, '钱七', 'qq@bit.com');
SET FOREIGN_KEY_CHECKS = 1;
  • 确定.sql⽂件的绝对路径:/home/lbk/test_db/database.sql
  • 连接数据库查看已有数据库
  • 使⽤source命令执⾏.sql⽂件的SQL语句
sql 复制代码
source /home/lbk/test_db/database.sql
  • 查看数据库并查询数据,验证导⼊是否成功
使⽤mysql客⼾端导⼊

直接使⽤mysql客⼾端程序导⼊.sql⽂件并执⾏相应的SQL语句,可以使⽤以下命令

sql 复制代码
mysql db_name < text_file # 在指定的数据库下执⾏SQL,前提是数据库必须提前建⽴好
mysql < text_file # 不指定数据库.sql中必须有USE [database_name],来指定要操作的数据库

mysqlcheck - 表维护程序

mysqlcheck客⼾端⽤于执⾏表维护,可以对表进⾏:分析、检查、优化或修复操作。

  • 分析的作⽤是查看表的关键字分布,能够让 sql ⽣成正确的执⾏计划(⽀持 InnoDB,MyISAM,NDB)
  • 检查的作⽤是检查表的完整性以及数据库表和索引是否损坏(⽀持 InnoDB,MyISAM, ARCHIVE,CSV)
  • 优化的作⽤是回收空间、减少碎⽚、提⾼I/O(⽀持 InnoDB,MyISAM,ARCHIVE)
  • 修复的作⽤是修复可能已经损坏的表(⽀持 MyISAM,ARCHIVE,CSV)

⼀般通过以下三种⽅法使⽤mysqlcheck

bash 复制代码
mysqlcheck [options] db_name [tbl_name ...]
mysqlcheck [options] --databases db_name ...
mysqlcheck [options] --all-databases

如果在 db_name 后没有指定任何表名,或者使⽤ --databases 或 --all-databases 选项,那么整个数据库都会被检查。

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表的修复操作 |

使用如下:

  • 分析test_db数据库
bash 复制代码
mysqlcheck -a test_db
  • 检查test_db数据库
bash 复制代码
mysqlcheck -a test_db
  • 修复test_db数据库
bash 复制代码
mysqlcheck -r test_db


我们可以知道,修复不支持InnoDB存储引擎,如果要修复InnoDB存储引擎的数据,我们需要把存储引擎更换为MyIsam。

mysqldump - 数据库备份程序

mysqldump客⼾端程序可以执⾏逻辑备份并⽣成⼀组SQL语句,其中包含原始数据库和表的定义
以及表中的数据,以便实现对数据库的简单备份或复制。mysqldump命令可以⽣成CSV、或XML格式的⽂件。
mysqldump的⽅法通常有以下使⽤,可以转储⼀个或多个表或数据库,如下所⽰:

bash 复制代码
mysqldump [options] db_name [tbl_name ...] > 备份文件的路径
mysqldump [options] --databases db_name ... > 备份文件的路径
mysqldump [options] --all-databases > 备份文件的路径

如果在 db_name 后没有指定任何表名,或者使⽤ --databases 或 --all-databases 选项,那么整个数据库都会被转储。
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 | 添加注释到转储⽂件 |
| --ignore-table | --ignore-table =db_name.table_name 多个表⽤空格隔开 不转储给定的表 |
| --no-data,-d | 不转储表内容 |
| --triggers | 转储每个表中的触发器 |
| --xml,-X | 以XML格式输出 |

使用案例

bash 复制代码
mysqldump test_db > /root/dump.sql

然后我们就会有/root/dump.sql文件,其中包含了test_dp数据库中所有的表及其数据,之后我们就可以在mysql中通过 source 命令执行/root/dump.sql文件,从而实现复制了test_dp数据库。

mysqladmin - MySQL 服务器管理程序

mysqladmin 是⼀个执⾏管理操作的客⼾端。可以⽤来检查服务器的配置和当前状态,以及创建和删除数据库等。
mysqladmin 可以使⽤以下语法:

bash 复制代码
mysqladmin [options] command [command-arg] [command [command-arg]] ...

语法中的command 表⽰命令,有些命令后⾯需要跟上⼀个参数,如下列出了mysqladmin 的常⽤命令:

|-------------------------|-----------------------------------------------|
| 选项 | 说明 |
| version | 显⽰来⾃服务器的版本信息 |
| create db_name | 创建⼀个数据库名为 db_name |
| drop db_name | 删除名为 db_name的数据库及其所有表 |
| extended-status | 显⽰服务器状态变量的值 |
| password new_password | 设置新密码,password 后可以省略新密码,mysqladmin会在之后提⽰输⼊新密码 |
| processlist | 显⽰活动服务器线程的列表 |
| kill id , id ,... | 终⽌服务器线程。如果给出了多个线程ID值,则列表中不能有空格。 |
| shutdown | 停⽌服务器 |

mysqlshow - 显⽰数据库、表和列信息

mysqlshow 客⼾端可⽤于快速查看存在哪些数据库、数据库中的表以及表中的列或索引。mysqlshow 可以使⽤以下语法:

bash 复制代码
mysqlshow [options] [db_name [tbl_name [col_name]]]
  • db_name tbl_name col_name 可以使⽤通配符 * 或 _
  • 如果没有指定数据库,则显⽰所有数据库名称列表;如果没有指定表,则显⽰数据库中所有匹配的表;如果没有指定列,则显⽰表中所有匹配的列和列类型。
  • 输出仅显⽰当前权限可以访问的数据库、表或列的名称。

使用如下:

bash 复制代码
mysqlshow test_db;

mysqldumpslow - 总结慢查询⽇志⽂件

在平时使⽤MySQL数据库时,经常进⾏查询操作,有些查询语句执⾏的时间⾮常⻓,当执⾏时间超过设定的阈值时,我们称这个查询为慢查询,慢查询的相关信息通常需要⽤⽇志记录下来称为慢查询⽇志,mysqldumpslow可以解析慢查询⽇志⽂件并汇总其内容。

例如,我们可以使用mysqladmin查看当前有多少条慢查询

bash 复制代码
mysqladmin status

我们可以看到当前一共有三条慢查询,我们在mysql中可以用如下命令查看有关慢查询的各种信息,例如设定的执行时间阈值,慢查询日志文件是否开启,及慢查询日志文件的位置。

sql 复制代码
show variables like '%query%';


通常情况下,mysqldumpslow 会将相似的查询分组并显⽰摘要输出,⼀般会把数字和字符串⽤ N
和 "S" 代替,要想显⽰真实的值可以使⽤ -a 和 -n 选项。
mysqldumpslow 可以使⽤以下语法

bash 复制代码
mysqldumpslow [options] [log_file ...]

由于通过 show variables like '%query%'; 命令我们已经知道慢查询日志文件在 /var/lib/mysql/hcss-ecs-9734-slow.log ,但是我们可以看到 slow_query_log 是关闭的,所以我们需要在配置文件 /etc/mysql/my.cnf 中添加如下配置,使用如下命令

sql 复制代码
[mysqld]
slow_query_log = 1

之后我们就可以使用如下命令查看慢查询日志文件里的内容

sql 复制代码
mysqldumpslow /var/lib/mysql/hcss-ecs-9734-slow.log

mysqldumpslow 的常⽤选项

|----------------|-----------------------------------------------------|
| 选项 | 说明 |
| -a | 不⽤ N 和 'S' 代替numbers和String |
| -n N | 在名称中包含N个以上的数字⽤ N 代替 |
| -g pattern | 仅考虑与指定模式匹配的慢查询 |
| -h host_name | 与*-slow.log⽂件名对应的MySQL服务器主机名,可以包含通配符。默认值是*(匹配所有)。 |
| -i name | 服务器实例的名称 |
| -l | 不要从总时间中减去锁占⽤的时间 |
| -r | 倒序顺列 |
| -s sort_type | 如何对输出进⾏排序 |
| -t N | 显⽰输出中的前N个查询 |

-s sort_type sort_type可选的值如下所⽰:

  • t , at : 按查询时间或平均查询时间排序,默认排序
  • l , al : 按锁占⽤时间或平均锁占⽤时间排序
  • r , ar : 按发送的⾏数或平均发送的⾏数排序
  • c : 按计数排序

mysqlbinlog - 处理⼆进制⽇志⽂件

我们平时对数据库的修改,包括对数据的增删改,都会被描述成⼀个"事件",每个"事件"都会以⼆进制形式记录在⼀个⽂件⾥,这个⽂件就是服务器的⼆进制⽇志⽂件,称为Binary Log或binlog。
mysqlbinlog 能够以⽂本格式显⽰⼆进制⽇志⽂件中的内容。
binlog的默认保存路径是数据⽬录:

  • Linux下默认⽬录:/var/lib/mysql
  • Windows下默认⽬录:MySQL程序的安装路径\Data

binlog是以 .00000n 结尾命名的⽂件,n不断递增

mysqlbinlog 可以使⽤以下语法

bash 复制代码
mysqlbinlog [options] log_file ...

例如要显⽰名为 binlog.000011 ⼆进制⽇志⽂件的内容,可以使⽤以下命令:

bash 复制代码
mysqlbinlog binlog.000011

mysqlbinlog 有如下常⽤选项,可以在命令⾏中指定,也可以在选项⽂件中通过 [mysqlbinlog] 和 [client] 组进⾏指定

|-------------------|-------------------------------------------|
| 选项 | 说明 |
| --offset, -o | --offset= N -o N 跳过⽇志中的前N条记录 |
| --result-file, -r | --result-file= name , -r name 输出的⽬标⽂件 |
| --server-id | 仅显⽰指定服务器ID创建的事件 |

mysqlslap - 负载仿真客⼾端

mysqlslap是⼀个诊断程序,⽤于模拟MySQL服务器的客⼾端负载,并报告每个阶段的时间,就好⽐多个客⼾端正在访问服务器⼀样。
mysqlslap可以使⽤以下语法

bash 复制代码
mysqlslap [options]
  • 可以通过 --create 或 --query 选项,指定包含SQL语句的字符串或包含SQL语句的⽂件
  • 如果指定⼀个包含SQL语句的⽂件,默认情况下每⾏必须包含⼀条语句(也就是说,隐式语句分隔符是换⾏符)
  • 如果要把⼀条语句分为多⾏书写,可以使⽤ --delimiter 选项指定不同的分隔符
  • 不能在⽂件中包含注释,因为mysqlslap不能解析注释。

mysqlslap运⾏分为三个阶段:
a. 创建测试数据阶段:创建⽤于测试的库、表或数据,这个阶段使⽤单个客⼾端连接
b. 运⾏负载测试阶段,这个阶段可以使⽤许多客⼾端连接
c. 清理阶段:执⾏删除表,断开连接等操作,这个阶段使⽤单个客⼾端连接
mysqlslap 有如下常⽤选项,可以在命令⾏中指定,也可以在选项⽂件中通过 [mysqlslap] 和
[client] 组进⾏指定

|---------------------------------------|--------------------------------------------------------|
| 选项 | 说明 |
| --create | --create=value 其中value等于创建的SQL语句或.sql文件 |
| --query , -q | --query=value 其中value等于创建的SQL语句或.sql文件 |
| --concurrency, -c | --concurrency= N , -c N 要模拟并⾏客⼾端的数量 |
| --no-drop | 运⾏完测试后不删除创建的数据库 |
| --iterations , -i | --iterations= N , -i N 每个客⼾端运⾏测试的次数 |
| --auto-generate-sql-add- autoincremen | 在⾃动⽣成的表中添加 AUTO_INCREMENT 列 |
| --auto-generate-sql- write-number | --auto-generate-sql-write-number= N 要执⾏多少⾏插⼊,默认值是100 |

案例

  • 提供⾃定义的创建和查询语句,创建50个客⼾端连接,每个客⼾端进⾏200次 select 查询(在⼀⾏内输⼊命令)。
bash 复制代码
mysqlslap --create="CREATE TABLE a (b int);INSERT INTO a VALUES (23);" --query="SELECT * FROM a" --concurrency=50 --iterations=200
  • 从指定的⽂件中加载创建、插⼊和查询SQL语句。SQL⽂件中的语句以 ";" 分隔。使⽤5个客⼾端,每个客⼾端查询5次。
bash 复制代码
mysqlslap --concurrency=5 --iterations=5 --query=query.sql --create=create.sql --delimiter=";
相关推荐
ROCKY_8173 小时前
Mysql复习(二)
数据库·mysql·oracle
问道飞鱼6 小时前
【知识科普】认识正则表达式
数据库·mysql·正则表达式
HaiFan.6 小时前
SpringBoot 事务
java·数据库·spring boot·sql·mysql
水根LP496 小时前
linux系统上SQLPLUS的重“大”发现
数据库·oracle
途途途途6 小时前
精选9个自动化任务的Python脚本精选
数据库·python·自动化
04Koi.7 小时前
Redis--常用数据结构和编码方式
数据库·redis·缓存
silver98867 小时前
mongodb和Cassandra
数据库
PersistJiao7 小时前
3.基于 Temporal 的 Couchbase 动态 SQL 执行场景
数据库·sql
上山的月8 小时前
MySQL -函数和约束
数据库·mysql
zhcf8 小时前
【MySQL】十三,关于MySQL的全文索引
数据库·mysql