MySQL程序特别酷

这一篇和上一篇有重合的内容,,我决定从头开始再学一下MySQL,和上一篇的区别是写的更细了,以及写这篇的时候Linux已经学完了

下面就是关于MySQL很多程序的介绍:

MySQL安装完成通常会包含如下程序:

Linux系统程序一般在/usr/bin目录下,可以通过命令查看:

Windows系统目录也可以查看(如果安装过MySQL的话):

bash 复制代码
PS D:\Program Files\MySQL\MySQL Server 8.0\bin> dir *.exe

每一个MySQL程序都有许多不同的选项,大多数程序都提供一个--help选项,可以使用这个选项来获取程序不同选项的描述

mysql是客户端程序

mysqld是服务端程序

这乱七八糟的东西(常用的 MySQL程序)可以用,,,一张表来描述一下:

mysqld是服务端程序,mysql是客户端程序,上面那个表除了mysqld都是客户端程序

搞怪裤太裤了

mysqld也被称为MySQL服务器,是⼀个多线程程序,对数据目录(可以理解为mysql的主要工作目录)进行访问管理(包含数据库和表)。数据目录也是其他信息(如日志文件和状态文件)的默认存储位置。

当MySQL服务器启动时,会侦听指定的端⼝、处理来⾃客⼾端程序的网络连接,并管理不同客户端对数据库的访问

mysqld程序有许多选项可以在启动时指定。运行以下命令查看完整的选项列表:

cpp 复制代码
root@guangchen-vm:~# mysqld --verbose --help

mysql客户端怎么学呢?

mysql是⼀个简单的SQLshell,可以输入命令和执行SQL语句,当执行SQL语句时,查询结果以ASCII表格式显示

mysql的基本使用还是比较简单的,,:

cpp 复制代码
# 连接MySQL服务器,⻓选项格式
mysql --user=user_name --password [db_name]
# 短选项格式
mysql -uuser_name -p [db_name]
# 输⼊密码
Enter password: your_password

mysql有指定选项的方式:

1.在mysql后⾯的命令行中列出选项

2.在mysql后⾯指定配置⽂件的路径以便在程序启动时读取配置⽂件中的选项

(读取并解析对应程序选项的值,并应用在启动参数中)

3.使⽤环境变量中的选项

特别裤

MySQL客户端命令

这是对应的选项

在命令行中指定选项遵循原则:

1.选项在程序名之后给出

2.选项以单破折号"-"或双破折号"--"开头。-表示短格式,--表示长格式就比如这两句是一样的:

bash 复制代码
mysql -?
mysql --help

3.选项名区分大小写(-v和-V都是合法的,但是意义不同,分别是--verbose和--version选项的相应缩写形式)

4.有些选项需要在后面指定一个值,例如指定主机:

bash 复制代码
mysql -h 127.0.0.1
msyql --host=127.0.0.1

5.对于带值的长格式选项,通常用=符号分割选项名和值,对于带值的短选项,选项值可以紧跟在选项只有也可以用空格隔开,这三个是等价的:

bash 复制代码
--host=127.0.0.1
-h127.0.0.1
-h 127.0.0.1

但如果要指定密码,选项和值之间就不能有空格:

bash 复制代码
mysql -ptest # test表⽰密码,但没有指定要访问的数据库
mysql -p test # test 表⽰指定了访问的数据库,但没有指定密码

tips:在命令⾏中,第⼀个不带破折号 - 的值被解析为要访问的数据库名,所以 --database 选项⼀ 般可以省略

在选项的名称中,-和_大多数情况下可以互换使用,但前导破折号不能转为_,例如:--skip-grant-tables和--skip_grant_tables是等价的

对于采⽤数值的选项,该值可以带有后缀 K ,M 或 G 以指⽰乘数1024、1024^2或1024^3,例如,以下命令告诉mysqladmin对服务器执⾏1024次ping,每次ping之间休眠3秒:

bash 复制代码
mysqladmin --count=1K --sleep=3 ping -uroot -p

在命令行中包含空格的选项值必须用""引起,例如,--execute(-e)选项与mysql一起使用时,表示将一个或多个SQL语句发送给服务器并显示结果:

bash 复制代码
mysql -u root -p -e "SELECT VERSION();SELECT NOW();"

这是一些格式上的区别

tips:如果选项的值中包含空格,那么值需要包含在双引号中

在命令行中使用选项时,选项应该在程序名之后给出,以单破折号或双破折号开头,-表示短格式,--表示长格式

这是一些MySQL命令:

\r是重新链接服务器,会有链接的次数

\s是查看当前服务器的状态

delimiter(\d)是一个重新指定SQL语句结束标识符的命令

quit(\q)都是退出MySQL客户端(没什么好说的)

tee(\T)也是一条命令,可以把所有结果保存到一个指定的文件中

/root目录下回生成一个指定的文件

如果要禁用(执行结果不再写入文件),那就采用notee(\t)呃呃呃

其他的命令可以用help查询:

用help contents命令可以查看关于MySQL数据库的使用帮助,包括用户管理,SQL语法,数据类型,组件等相关内容列表

可以通过help contents中的具体条目查看介绍:

继续输入help具体的条目可以查看关于此条目的详细说明:

source(\.)是加载并执行指定的.sql脚本

system(\!)就像是:

执行系统命令(比较危险容易被做手脚)

这个W和w是设置警告显示的:

如图所示

.sql文件执行SQL语句

为什么有的时候需要从.sql文件中执行一些SQL语句呢?

在这样的情况下适用:有时候我们需要从.sql文件执行一些SQL语句,比如要把一个数据库从一台服务器A复制到另一台服务器B上,那么可以先从服务器A导出数据到.sql文件,然后在服务器B上执行这个.sql文件(需要对应的权限)

也可以使用MySQL客户端直接导入

下面来演示一下source命令的使用方法!

1.准备要执行的.sql文件,我的test_db.sql长这样:

cpp 复制代码
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, '计算机系2023级1班', '学习了计算机原理、C和Java语⾔、数据结构和算法');
INSERT INTO `classes` VALUES (2, '中⽂系2023级3班', '学习了中国传统⽂学');
INSERT INTO `classes` VALUES (3, '光电2023级2班', '学习了概率论与数理统计');
-- ----------------------------
-- 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, '张三', '[email protected]');
INSERT INTO `student` VALUES (2, 50002, '李四', '[email protected]');
INSERT INTO `student` VALUES (3, 50003, '王五', '[email protected]');
INSERT INTO `student` VALUES (4, 50004, '赵六', '[email protected]');
INSERT INTO `student` VALUES (5, 50005, '钱七', '[email protected]');
SET FOREIGN_KEY_CHECKS = 1;

2.用source命令执行.sql文件的SQL语句(要是绝对路径)

3.查看数据库并查询数据验证导入是否成功

成功哩:

除了上面这种方式,也可以使用mysql客户端导入

cpp 复制代码
mysql < /root/test_db.sql -uroot -p
//路径是.sql文件的绝对路径

可以根据实际的需要选择导入.sql的方式

使用环境:开发-->测试-->生产

MySQL配置文件

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

如果在使用MySQL的程序时没有指定配置文件的路径,那就会自动读取默认路径下的配置文件

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% 表示Windows目录的位置,可以通过命令查看

BASEDIR 表⽰MySQL的安装⽬录

cpp 复制代码
D:\Program Files\MySQL\MySQL Server 8.0

%APPDATA% 表⽰应⽤程序数据的⽬录

bash 复制代码
C:\Users\Lenovo>echo %APPDATA%
# 以下是结果
C:\Users\Lenovo\AppData\Roaming

DATADIR 代表MySQL数据⽬录

cpp 复制代码
C:\ProgramData\MySQL\MySQL Server 8.0

在Unix和Linux系统上读取的选项文件:

~表示当前用户的主目录

MYSQL_HOME是设置的环境变量路径

DATADIR代表MySQL的数据目录

mysqld-auto.cnf的优先级最⾼For the server,one exception applies: The mysqld-auto.cnf option file in the data directory is processed last, so it takes precedence even over command -line options

运行MySQL程序时在命令行上指定的任何长选项都可以在选项文件中指定,要获取选项列表可以用如下命令:

bash 复制代码
mysql --help
bash 复制代码
mysqld --verbose --help

一堆,,,刷屏都截不完

选项文件中指定选项时,省略两个前导破折号,并且每一行表示一个选项

选项文件中的空行会被忽略,非空行可以采用以下形式:

#comment ;comment

注释⾏以 # 或 ; 开,注释可以从⼀⾏的中间开始

group \]设置选项的程序或组的名称,不区分⼤⼩写。如果选项组名称与程序名称相同,则组中的选项专⻔应⽤于该程序,例如, \[mysqld\] 和 \[mysql\] 组分别适⽤于mysqld服务端程序和mysql客⼾端程序 opt_name 相当于命令⾏上的选项名 opt_name = value 选项名对应的值,可以使⽤转义序列 \\b ,\\t ,\\n ,\\r , \\\\ 和\\s 来表⽰退格符、制表 符、换⾏符、回⻋符、反斜杠和空格字符 > tips: > > 1.选项名称和值的前导和尾随空格会自动删除 > > 2.在Windows系统中设置路径应该使用转义字符 ```cpp basedir="C:\\Program Files\\MySQL\\MySQL Server 8.0" # 或 basedir="C:/Program Files/MySQL/MySQL Server 8.0" ``` \[client\]MySQL发行版中所有的客户端程序都会读取并应用这个组下的选项(除了mysqld),在这个组下可以指定适用于所有客户端程序的通用选项(配置用户名和密码,但要确保只有自己才可以访问这个文件以防密码泄漏) 可以这样配置mysql的免密登录: 在当前用户的home目录下创建.my.cnf,并在\[client\]写入公共配置: ```cpp [client] host=127.0.0.1 port=3306 user=root password=123456 ``` 然后直接运行mysql,不用用户名密码就能直接登录 ![](https://i-blog.csdnimg.cn/direct/b49039cc34a2484597e97fa5a7cb8af6.png) 可以通过\[客户端程序名\]的形式为不同的客户端程序指定选项,例如\[mysql\],当运行mysql程序时会读取并应用该组下的配置 ```cpp [client] host=127.0.0.1 port=3306 user=root password=123456 # 设置为必须输⼊密码 [mysql] password root@guangchen-vm:~# mysql Enter password: # 强制要求登录时输⼊密码 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 8.0.34 MySQL Community Server - GPL Copyright (c) 2000, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. ``` 为特定的MySQL版本设置选项可以使用\[mysqld-5.7\]、\[mysqld-8.0\]的组名 在选项文件中使用!include指令来包含其他选项文件,例如:!include /home/mydir/myopt.cnf 在选项文件中使用!includedir指令来搜索指定目录中的其他选项文件(但不保证目录中选项文件的读取顺序) tips: 1.!includedir在Unix和Linux操作系统中会搜索指定目录下任何以.cnf为后缀的文件(在Windows中会搜索指定目录下任何以.ini或.cnf为后缀的文件) 2. 只会读取包含文件中当前客户端的组配置(例如当前运行的是mysql程序,那么只会读取\[mysql\]组中的选项配置) 在Windows中请确保在配置⽂件的最后⼀⾏加⼀个换⾏符,否则该⾏将被忽略 #### 工具包中的其他程序 在命令行中使用MySQL发行版中的其他工具,一些选项是公共的,使用方法和mysql相同 这是一些公共选项: ![](https://i-blog.csdnimg.cn/direct/646388cc912145a5a5952c67113bd816.png) ![](https://i-blog.csdnimg.cn/direct/d4a1f1a88c4343dd97a926d395abccab.png) ##### mysqlcheck mysqlcheck客户端用于执行表维护,可对表进行分析检查优化或者修复操作 > 分析:查看表的关键字分布,能让sql生成正确的执行计划(InnoDB,MyISAM,NDB) > > 检查:检查表的完整性以及数据库表和索引是否损坏(InnoDB,MyISAM,ARCHIVE,CSV) > > 优化:回收空间、减少碎片、提高IO(InnoDB,MyISAM,ARCHIVE) > > 修复:修复可能已经损坏的表(MyISAM,ARCHIVE,CSV) 当使用mysqlcheck工具时,MySQL服务器必须在运行状态 执行过程中相应的表会被锁定,其他的操作将会被挂起 如果遇到不支持的引擎会报错 在执行表修复的操作之前对表进行备份(有些情况下数据会丢失) 来试试查一下这个数据库: ```bash mysqlcheck -a test_db -uroot -p ``` ![](https://i-blog.csdnimg.cn/direct/6cbf6cabbb614894b99dba6d91ee8cba.png) 这是一些选项: ![](https://i-blog.csdnimg.cn/direct/ac656aed3e5b49dd9218d091257c6757.png) **tips:修复不支持InnoDB存储引擎,如果要修复InnoDB存储引擎的数据,就要InnoDB存储引擎的表转换成MyISAM存储引擎** InnoDB在优化的过程中,执行了重建的操作,不建议经常(一小时,一天,大多数一个月优化一次就可以了)执行优化操作 mysqlcheck程序的默认功能是对数据表进行检查操作(相当于指定选项--check),如果想要对表进行修复操作,可以通过复制原来的mysqlcheck程序,重命名为mysqlrepair,并运行它: ![](https://i-blog.csdnimg.cn/direct/357016d7957244dba0bc6698cba4fb0d.png) ##### mysqldump 作用:mysqldump客户端程序可以执行逻辑备份并生成一组SQL语句,包含原始数据库和表的定义以及表中的数据,以便实现对数据库的简单备份或复制(mysqldump命令可以生成CSV、XML格式的文件) > tips: > > 1.转储表的时候必须要有SELECT权限 > > 2.转储视图时必须要有SHOW VIEW权限 > > 3.转储触发器时必须要有TRIGGER权限 > > 4.如果没有--single-transaction选项时必须要有LOCK TABLES权限 > > 5.如果没有--no-tablespaces选项时必须要有PROCESS权限 > > 6.重新导入转储文件时也要有相应的权限 > > 7.由于mysqldump是逐行转储数据,所以不适用于大数据量的转储与导入 这样使用: ```bash mysqldump [options] db_name [tbl_name ...] mysqldump [options] --databases db_name ... mysqldump [options] --all-databases ``` 如果在db_name后面没有指定任何的表名,或使用--databases或者--alldatabases选项,那么整个数据库都会被转储 mysqldump中有如下常用选项,可以在命令行中指定,也可以在选项文件中通过\[mysqldump\]和\[client\]组进行指定 ![](https://i-blog.csdnimg.cn/direct/97f3b5d705c546b1b5971edf45f82efb.png) ![](https://i-blog.csdnimg.cn/direct/7985bf7a992d46efae32d2c467f4f03f.png) 可以这样使用: ```bash mysqldump test_db > /root/dump.sql -uroot -p ``` 相当于打了个包 ![](https://i-blog.csdnimg.cn/direct/62e545b23ed44800821f5e7fa954eb1d.png) ##### mysqladmin mysqladmin是一个MySQL服务器管理程序,可以用来检查服务器的配置和当前状态,以及创建和删除数据库... ```bash mysqladmin [options] command [command-arg] [command [command-arg]] ... ``` 这是mysqladmin的常用命令: version(显示来自服务器的版本信息) ```bash mysqladmin version -uroot -p ``` ![](https://i-blog.csdnimg.cn/direct/ad36bb01b58f4b599cfa91beb0f5395f.png) 查看来自服务器的版本信息: ```bash mysqladmin status -uroot -p ``` ![](https://i-blog.csdnimg.cn/direct/09da392c5234424d899be7038471a505.png) > Uptime:MySQL服务器已经运行的秒数 > > Threads:活动线程(客户端)的数量 > > Questions:自服务器启动以来客户端的问题(查询)数 > > Slow queries:慢SQL的查询数 > > Opens:服务器已经打开的表数 > > Flush tables:服务器已经执行flush-\*、refresh和reload命令的数量 > > Open tables当前打开的表数 2.create db_name :创建⼀个数据库名为db_name 3. drop db_name :删除名为 db_name 的数据库及其所有表 4. extended-status:显⽰服务器状态变量的值 5. flush-hosts :刷新主机缓存中的所有信息 6. flush-logs \[log_type ...\] :刷新所有⽇志 7.log_type :中可以提供以下⼀种或多种⽇志类型binary,engine,error,general,relay,slow,多个类型之间⽤空格分隔 7. flush-privileges :重新加载授权表 8. flush-status :清除状态变量 9. flush-tables :刷新所有表 10. flush-threads :刷新线程缓存 11. password new_password : 设置新密码 • 如果密码中有空格必须⽤双引号把密码包裹起来 • password 后可以省略新密码,mysqladmin会在之后提⽰输⼊新密码 • password 做为最后⼀个command时才可以省略密码值,否则下⼀个参数将作为密码被设置 Warning有可能存在安全问题 ![](https://i-blog.csdnimg.cn/direct/f1f544b2880b453f9097d5b36987823d.jpeg) 12. ping :检查服务器是否可⽤ 13. processlist :显⽰活动服务器线程的列表(默认MySQL服务器可以维护150个活动链接,如果链接被用完,可以kill手动结束休眠时间最长的那个线程) 14. kill id , id ,...:终⽌服务器线程。如果给出了多个线程ID值,则列表中不能有空格 15. reload :重新加载授权表 16. refresh : 刷新所有表 17. shutdown : 停⽌服务器 18. start-replica : 在副本服务器上开始复制,MySQL8.0.26及以后的版本使⽤此命令 19. start-slave : 在副本服务器上开始复制,MySQL8.0.26之前使⽤此命令 20. status : 显⽰简短的服务器状态消息 21. stop-replica : 停⽌副本服务器上的复制,MySQL8.0.26及以后的版本使⽤此命令 22. stop-slave : 停⽌副本服务器上的复制,MySQL8.0.26之前使⽤此命令 23. variables : 显⽰服务器系统变量及其值 看看就得了,记不下来的 荷叶饭你怎么看 ##### mysqlshow mysqlshow客户端可用于快速查看存在哪些数据库,数据库的表以及表中的列或者索引 具体的操作可以参考一下官方给出的操作文档: [https://dev.mysql.com/doc/refman/8.0/en/mysqlshow.html![icon-default.png?t=O83A](https://csdnimg.cn/release/blog_editor_html/release2.3.7/ckeditor/plugins/CsdnLink/icons/icon-default.png)https://dev.mysql.com/doc/refman/8.0/en/mysqlshow.html](https://dev.mysql.com/doc/refman/8.0/en/mysqlshow.html "https://dev.mysql.com/doc/refman/8.0/en/mysqlshow.html")![](https://i-blog.csdnimg.cn/direct/32ae9c11ed6f4270ae99f5e28af7d469.png) 和公共选项也差不多 可以使用这样的语法: ```bash mysqlshow [options] [db_name [tbl_name [col_name]]] ``` db_name tbl_name col_name可以使用通配符\*、?、%或_ 如果没有指定数据库,则显示所有数据库名称列表 如果没有指定表,则显示数据库中所有匹配的表 如果没有指定列,则显示表中所有匹配的列和列类型 输出仅显示当前权限可以访问的数据库、表或者列的名称 ```bash mysqlshow test_db -uroot -p ``` ![](https://i-blog.csdnimg.cn/direct/598e9f1f2c5e4bba8e7b15b519b2a634.png) ```bash mysqlshow test_db student -uroot -p ``` ![](https://i-blog.csdnimg.cn/direct/0f4ff83fd22a44729b4c72eba4e615d9.png) ```bash mysqlshow test_db student id -uroot -p ``` ![](https://i-blog.csdnimg.cn/direct/ba58294ff22d475cb8c840a6899b08d6.png) ##### mysqldumpslow 在使用MySQL数据库的时候,我们经常进行查询操作,有些查询语句执行的时间非常长,当执行时间超过设定的 阈值的时候,我们称这个查询为慢查询,慢查询的相关信息通常需要用日志记录下来(慢查询日志),mysqldumpslow可以解析慢查询日志文件并汇总其内容 通常情况下,mysqldumpslow会将相似的查询分组并显示摘要输出,一般会把数字和字符串用N和S代替,想要显示真实的值可以使用-a和-n选项 ```bash mysqldumpslow [options] [log_file ...] ``` 常用选项: ![](https://i-blog.csdnimg.cn/direct/dd818a4cc1324ce1b940367d89b9a5f2.png) 这个主要用于优化SQL语句 (因为是慢查询日志) -s sort_type sort_type可选值: > t,at:按查询时间或平均查询时间排序,默认排序 > > l,al:按锁占用时间或平均锁占用时间排序 > > r,ar:按发送的行数或平均发送的行数排序 > > c:按计数排序 ##### mysqlbinlog mysqlbinlog可以处理二进制日志文件 什么是二进制文件捏? 我们平时对数据库的修改(增删改),都会被描述成一个事件,每一个事件都会以二进制的形式记录在一个文件里,这个文件就是服务器的二进制文件(Binary Log或binlog) 主要在主从复制的场景里使用,大概就是写入主节点(修改数据时都会把对应的事件记录在binlog里),从节点读取主节点的binlog,解析后执行对应的SQL ![](https://i-blog.csdnimg.cn/direct/f1a869e8dce64290a9de14aa3dfd2eca.jpeg) mysqlbinlog可以以文本形式显示二进制日志文件中的内容 binlog的默认保存路径是数据目录: > Linux下默认目录:/var/lib/mysql > > Windows下默认目录:C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Data 这都是二进制日志文件: ![](https://i-blog.csdnimg.cn/direct/c32d7ea170b14bc7bf5b7c9d23588350.png) 这是一些常用的选项: ![](https://i-blog.csdnimg.cn/direct/a018e4bdee054410bad39d65b5338d74.png) ![](https://i-blog.csdnimg.cn/direct/4a7423e8e4ac4c25950e72464ab73694.png) --base64-output=value,value有这些允许的值(默认是AUTO): > 🐣 AUTO ("automatic")或 UNSPEC ("unspecified")在必要时⾃动显⽰BINLOG语句 > > 如果使⽤mysqlbinlog重新执行⼆进制⽇志⽂件内容,那么使⽤ AUTO 选项是唯⼀安全的⾏为,其他选项值仅⽤于调试或测试,如果 --base64-output 没有指定,那么默认值是 AUTO 🐣 NEVER 不显示BINLOG语句 > > 🐣 DECODE-ROWS 不显示加密内容,可以配合mysqlbinlog的 -verbose 选项以注释的形式只显⽰事件的SQL语句 ##### mysqlslap mysqlslap是一个诊断程序,用于模拟MySQL服务器的客户端负载,并报告每个阶段的时间,就好比多个客户端正在访问服务器一样,,, ```cpp mysqlslap [options] ``` 可以通过--create或--query选项,指定包含SQL语句的字符串或包含SQL语句的文件 如果指定一个包含SQL语句的文件,默认情况下每行必须包含一条语句(隐式语句分隔符是换行符) 如果要把一条语句分为多行书写,可以使用--delimiter选项指定不同的分隔符 不能在文件中包含注释,因为mysqlslap不能解析注释 > mysqlslap运行分为三个阶段: > > 🐣创建测试数据阶段:创建用于测试的库、表或数据,这个阶段使用单个客户端链接 > > 🐥 运行负载测试阶段:可使用许多客户端链接 > > 🐤清理阶段:执行删除表,断开链接等操作,这个解读那使用单个客户端链接 这是自定义创建查询语句,创建五十个客户端链接,每个客户端进行两百次select查询(在一行内输入命令): ```cpp mysqlslap --delimiter=";" --create="CREATE TABLE a (b int);INSERT INTO a VALUES (23);" --query="SELECT * FROM a" --concurrency=50 --iterations=200 ``` ![](https://i-blog.csdnimg.cn/direct/3d275fffdec24f8f89b39695c6109b7b.png) 这是让mysqlslap用包含两个INT列和三个VARCHAR列的自动构建查询的SQL语句,使用五个客户端,每个客户端查询20次 ```bash mysqlslap --concurrency=5 --iterations=20 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql ``` ![](https://i-blog.csdnimg.cn/direct/03abded1b55d4fa5844edfa2da1c2502.png) 这是从指定的文件(但是我还没有这文件,只是展示一下写法)中加载创建、插入和查询SQL语句,SQL文件中的语句以;分割,使用五个客户端,每个客户端查询5次: ```sql mysqlslap --concurrency=5 --iterations=5 --query=query.sql --create=create.sql --delimiter=";" ``` 常用选项: ![](https://i-blog.csdnimg.cn/direct/c6f69b4c299e423e80590a26607e036e.png) ![](https://i-blog.csdnimg.cn/direct/4e08b8cc55ae4ec99758445ab590cc35.png) ![](https://i-blog.csdnimg.cn/direct/9a5ab7c7918a459e80c81886b786e0ed.png)

相关推荐
JavaGuide7 小时前
公司来的新人用字符串存储日期,被组长怒怼了...
后端·mysql
怒放吧德德10 小时前
MySQL篇:MySQL主从集群同步延迟问题
后端·mysql·面试
数据智能老司机11 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
Eip不易也不e11 小时前
教程之同时安装两个版本的 mysql
mysql
数据智能老司机11 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
松果猿12 小时前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
Kagol12 小时前
macOS 和 Windows 操作系统下如何安装和启动 MySQL / Redis 数据库
redis·后端·mysql
无名之逆12 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s91236010112 小时前
rust 同时处理多个异步任务
java·数据库·rust
数据智能老司机12 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构