目录
[二. mysqld ------ MySQL服务器](#二. mysqld —— MySQL服务器)
[编辑 3.2.mysql客户端选项](#编辑 3.2.mysql客户端选项)
[3.3.MySQL 选项(配置)文件](#3.3.MySQL 选项(配置)文件)
[3.3.1.1.在Unix和 Linux系统上读取的其他不常用选项文件](#3.3.1.1.在Unix和 Linux系统上读取的其他不常用选项文件)
一.有哪些MySQL程序
我们在安装完MySQL之后,我们去它的安装目录下面看看,有没有什么新奇的玩意。
MySQL安装完成通常会包含如下程序:
-
Linux系统程序⼀般在/usr/bin⽬录下,可以通过命令查看:
ll /usr/bin/mysql*

ll /usr/sbin/mysql*

- windows系统⽬录:你的安装路径\MySQLServer8.0\bin
例如我的安装目录下面就有这些

关于上面这些程序,我们可以去mysql官网上面看看:MySQL :: MySQL Documentation


在这里就能看到这些mysql程序了
MySQL 常用程序一览表
程序名 | 作用 | 特别说明 |
---|---|---|
mysqld |
MySQL 服务器守护进程。 | 要想使用客户端 程序,mysqld 必须正在运行,因为 客户端通过连接到服务器来访问数据库。 |
mysql |
MySQL 命令行客户端。 | 这个就是我们日常最常用的东西。用于交互式输入 SQL 语句 或 批量执行 SQL 脚本文件。 |
mysqlcheck |
表维护客户端。 | 用于检查、修复、分析和优化数据库表。 |
mysqldump |
数据库逻辑备份客户端。 | 将 MySQL 数据库/表的结构和数据 导出(转储)到 SQL、文本或 XML 文件。 |
mysqlimport |
数据导入客户端。 | 将文本文件 (如 CSV)中的数据导入 到数据库的表 中。是 LOAD DATA INFILE 的封装。 |
mysqladmin |
管理操作客户端。 | 执行管理任务:创建/删除数据库、重载权限表、刷新表到磁盘、重开日志文件 等。也可检索服务器版本、进程和状态信息。 |
mysqlshow |
信息显示客户端。 | 显示 数据库、表、列和索引 的结构信息。 |
mysqldumpslow |
慢查询日志分析工具。 | 用于读取、解析和汇总 MySQL 慢查询日志的内容,便于定位性能问题。 |
mysqlbinlog |
二进制日志处理工具。 | 用于读取 MySQL 二进制日志文件 ,并输出其中包含的 SQL 语句 。 常用于数据恢复 和主从复制。 |
mysqlslap |
负载模拟与基准测试工具。 | 模拟多个客户端并发访问 MySQL 服务器,测试服务器性能 ,并报告每个阶段所用时间(如查询平均响应时间)。 |
每个MySQL程序都有许多不同的选项。
⼤多数程序都提供⼀个--help 选项,您可以使⽤该选项 来获取程序不同选项的描述。
例如:mysql --help,可以通过在命令⾏或配置⽂件中指定选项来覆 盖MySQL程序的默认选项值 。
下面我们就介绍一下其中几个mysql程序,如果你想了解更多,请去官网。
由于篇幅限制,我们这里就先简单的介绍一下mysqld和mysql这两个。
二. mysqld ------ MySQL服务器
- mysqld也被称为MySQL服务器,是⼀个多线程程序,对**数据⽬录(可以理解为mysqld的工作目录)**进⾏访问管理(包含数据库和 表)。
- 数据⽬录也是其他信息(如⽇志⽂件和状态⽂件)的默认存储位置。
- 当MySQL服务器(mysqld)启动时,会侦听指定的端⼝、处理来⾃客⼾端程序的⽹络连接,并管理不同客⼾ 端对数据库的访问
mysqld程序有许多选项可以在启动时指定。运⾏以下命令查看完整的选项列表:
mysqld --verbose --help

有关MySQL服务器命令选项、系统变量和状态变量的完整描述,我们在服务器MySQL服务器配置 与管理专题中进⾏详细介绍 。
三.mysql------MySQL客户端
3.1.连接mysql客⼾端
mysql是⼀个简单的SQLshell,可以输⼊命令和执⾏SQL语句,当执⾏SQL语句时,查询结果以 ASCII 表格式显⽰
mysql的基本使⽤⾮常简单,回顾⼀下连接数据库的⽅式,打开终端并输⼊以下命令:
bash
# 连接MySQL服务器,⻓选项格式
mysql --user=user_name --password [db_name]
# 短选项格式
mysql -uuser_name -p [db_name]
短选项格式连接mysql
-
不指定数据库登陆
mysql -u 用户名 -p


-
指定数据库登陆
mysql -u 用户名 -p [数据库名]

长选项连接mysql
-
不指定数据库登陆
mysql --user=用户名 --password

-
指定数据库连接
mysql --user=用户名 --password 数据库名
3.2.mysql客户端选项
mysql客户端选项指定选项的方法主要有下面3种
- 在mysql后⾯的命令⾏中列出选项
- 在mysql后⾯指定配置⽂件的路径,以便在程序启动时读取配置⽂件中的选项,并解析对应程序选项的值,并应用在启动参数中(这样子我们启动mysql的时候再也不需要那些什么-u -p 了)
- 使⽤环境变量中的选项 (这个不建议)
关于第2点,我们看一个例子


我们把这个目标复制下来
bash
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" "--defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" "-uroot" "-p" "--default-character-set=utf8mb4"
那上面这个什么意思呢?
- "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" : MySQL客户端程序路径
- "--defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" : 核心配置文件指定
- "-uroot" : 用户名(可移至配置文件)
- "-p" : 密码提示(可移至配置文件 )
- "--default-character-set=utf8mb4" : 字符集(可移至配置文件)
比如说
我想将用户名和密码,字符集都添加到配置文件里面
- 配置文件修改
在
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
中添加:
bash[client] # 客户端专用配置段 user = root # 等价于 -uroot password = your_password # 自动填入密码(注意安全!) default-character-set = utf8mb4 # 字符集配置
- 简化后启动命令
bash"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" "--defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini"
3.2.1.mysql常用选项
我们可以去官网看看选项啊
MySQL :: MySQL 8.0 Reference Manual :: 6.5.1.1 mysql Client Options

由于选项很多,我们只选择讲解一些 。
长格式选项 | 短格式选项 | 说明 |
---|---|---|
--host=主机名 |
-h 主机名 |
连接到指定主机上的MySQL服务(默认主机号是127.0.0.1 localhost) |
--port=端口号 |
-P 端口号 |
指定TCP/IP 连接使用的端口号(默认端口号是3306) |
--user=用户名 |
-u 用户名 |
用于连接到MySQL服务器的用户名 |
--password[=密码] |
-p[密码] |
用于连接到MySQL服务器的密码。[]表示可选,如果没有给出,会提示用户输入 |
--defaults-file=文件名 |
使用指定的选项文件。如果该文件不存在,则会发生错误。 | |
--default-character-set= 字符集名字 |
将作为客户端和当前连接的默认字符集,例:utf8mb4 | |
--database=数据库名字 |
-D 数据库名字 |
要使用的数据库 |
--compress |
-C |
这个不太常用,如果可能,压缩客户端和服务器之间传输的所有信息 |
--reconnect |
如果客户端与服务器的连接丢失,自动尝试重新连接 | |
--quick |
-q |
不缓存查询结果,收到一行打印一行,如果输出被挂起,可能会降低服务器速度,谨慎使用 |
`--protocol={TCP | SOCKET | PIPE |
--delimiter=分隔符 |
设置SQL语句分隔符。默认值为分号(; )。这个一般是用于创建存储过程的。 |
|
--execute="SQL语句" |
-e "SQL语句" |
执行指定的SQL语句并退出。 |
--version |
-V |
显示版本信息并退出。这个比较常用。 |
--help |
-? |
显示帮助信息并退出。 |
这些就是很常用的一些,至于你想要学习更多的东西的话,请去官网。
如果选项的值中包含空格,那么值需要包含在双引号中
3.2.2.在命令⾏中使⽤选项
命令行中指定选项遵循以下规则:
- 1.选项应在程序名之后给出
- 2.选项以单破折号"-"或双破折号"--"号开头,-表示短格式,--表示长格式,例如:-?和 --help都表示MySQL程序显示他的帮助消息


- 3.选项名称区分大小写。
比如说-v 和 -V 都是合法的,但含义不同,它们分别是 --verbose(尽可能详细的显示结果) 和 --version(版本) 选项的相应缩写形式
bash
# 以下两个等价
mysqld --verbose --help
mysqld -v -?
bash
# 以下两个等价
mysql --version
mysql -V
- **4.某些选项需要在后面指定一个值。**例如,-h 127.0.0.1 或 --host=127.0.0.1 表示向客户端程序指定 MySQL 服务器主机
bash
mysql -h 127.0.0.1 2
mysql --host=127.0.0.1
- 5.对于带值的长格式选项,通常用 = 符号分隔选项名称和值。
- 对于带值的短选项,选项值可以紧跟在选项之后,也可以用空格隔开。
- 例如:--host=127.0.0.1、-h127.0.0.1 和 -h 127.0.0.1 是等价的。
- 但是对于密码选项的短格式,如果要指定密码,选项与值之间不能有空格,如下所示:
bash
mysql -ptest # test表示密码,但没有指定要访问的数据库
mysql -p test # test 表示指定了访问的数据库,但没有指定密码


- 在命令行中,第一个不带破折号 - 的值通常被解析为要访问的数据库名,因此 --database 选项一般可以省略。
假设你有一个名为
my_database
的数据库,并且你想使用 MySQL 命令行客户端连接到这个数据库。
- 1.使用
--database
选项明确指定数据库通常情况下,你可以通过以下方式连接到数据库:
bashmysql -u your_username -p --database=my_database
系统会提示你输入密码,然后连接到
my_database
数据库。
- 2.省略
--database
选项直接指定数据库名根据规则,第一个不带破折号的值会被解析为数据库名。因此,上面的命令可以简化为:
mysql -u your_username -p my_database
在这种情况下,
my_database
是第一个没有前缀-
或--
的参数,所以 MySQL 客户端会自动将其解释为目标数据库名。总结
完整写法 :
mysql -u your_username -p --database=my_database
简写写法 :
mysql -u your_username -p my_database
两种方式效果相同,但后者更简洁,适用于快速访问特定数据库。
- 6.破折号 (-) 和下划线 (_) 在大多数情况下可以互换使用,但前导破折号不能转为下划线。 例如:
--skip-grant-tables
和--skip_grant_tables
是等价的。
这样子的情况其实还挺多的啊。
- --skip-grant-tables 和 --skip_grant_tables 是等价的
- --max-connections 和 --max_connections 是等价的
- --innodb-buffer-pool-size 和 --innodb_buffer_pool_size 是等价的
- --table-definition-cache 和 --table_definition_cache 是等价的
- --tmp-table-size 和 --tmp_table_size 是等价的
- --query-cache-size 和 --query_cache_size 是等价的
- --thread-cache-size 和 --thread_cache_size 是等价的
- ......
至于更多的,可以去官网上面看啊,挺多的
- 7.对于采用数值的选项,该值可以带有后缀 K、M 或 G 以指示乘数 1024、1024^2 或 1024^3。
我知道大家有点懵
以下是关于 数值选项后缀 K、M、G 的使用示例,说明它们分别代表 1024、1024²(即 1024×1024)和 1024³(即 1024×1024×1024):
-
设置缓冲池大小为 1G:
--innodb-buffer-pool-size=1G
表示 1 × 1024 × 1024 × 1024 字节,即 1,073,741,824 字节
-
设置最大连接数为 500:
--max-connections=500
这里没有后缀,表示直接使用 500
-
设置临时表大小为 64M:
--tmp-table-size=64M
表示 64 × 1024 × 1024 字节,即 67,108,864 字节
-
设置查询缓存大小为 32M:
--query-cache-size=32M
表示 32 × 1024 × 1024 字节,即 33,554,432 字节
-
设置每秒允许连接的数量为 16K:
--thread-stack=16K
表示 16 × 1024 字节,即 16,384 字节
-
设置日志文件大小为 256M:
--innodb-log-file-size=256M
表示 256 × 1024 × 1024 字节,即 268,435,456 字节
-
设置排序缓冲区大小为 2M:
--sort-buffer-size=2M
表示 2 × 1024 × 1024 字节,即 2,097,152 字节
这些后缀让配置更简洁易读,特别是在处理大数值时。例如写成 1G 比写成 1073741824 更直观。
- 8.在命令行中包含空格的选项值必须用引号引起来。
示例:--execute (or -e)
选项与 mysql
一起使用时,表示将一个或多个 SQL 语句发送给服务器执行并显示结果。
3.3.MySQL 选项(配置)文件
大多数 MySQL 程序可以从选项文件(配置文件)中读取启动选项。
可在选项文件中指定常用选项,避免每次运行程序时都在命令行中输入它们。
大部分选项文件都是纯文本格式,可使用任何文本编辑器创建。
- 使用
--defaults-file
选项可以指定要使用的选项文件,客户端程序会读取并应用选项文件中的相关配置。
bash
# Linux
mysql --defaults-file=/etc/mysql/my.cnf -u root -p
# windows下
mysql "--defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" -u root -p
3.3.1.Linux环境下默认配置文件的路径
在ubuntu系统里面
这个/etc/mysql/my.cnf就是最终的配置文件。也就是默认配置文件。
我们可以进去/etc/mysql/my.cnf看看

- 客户端配置文件
我们进去这个conf.d目录里面看看

嗯?还是我们的配置文件mysql.cnf。
我们打开看看

- 服务端配置文件
我们注意到/etc/mysql/目录下面还有一个mysql.conf.d这个目录,我们进去看看

嗯?这里也有配置文件!!

其实这里我们不必花费太多精力来记这个什么客户端配置文件和服务端配置文件,我们以后配置文件,统一去/etc/mysql/my.cnf配置。
虽然Linux把客户端配置文件和服务端配置文件做了区分,但是我们一般不会分别在对应配置文件中配置,而是把所有配置都写在默认的配置文件/etc/mysql/my.cnf。
3.3.1.1.在Unix和 Linux系统上读取的其他不常用选项文件
如果在使用mysql程序的时候,如果没有指定配置文件的路径,就会自动读取默认路径下的配置文件。
- 指定了配置文件的路径
bash
mysql "--defaults-file=/etc/mysql/my.cnf" -u root -p
- 没有指定配置文件的路径
bash
mysql -u root -p
也就是说,除了我们上面说的那个默认配置文件/etc/mysql/my.cnf之外,还有其他的配置文件!!!!
那这些另外的配置文件在哪里呢?
文件名 | 说明 | 读取顺序 | 优先级 |
---|---|---|---|
/etc/my.cnf | 全局 | 第1个 | 最低 |
/etc/mysql/my.cnf | 全局 | 第2个 | 第6高 |
$MYSQL_HOME/my.cnf | 服务器特定选项(仅限服务器) | 第3个 | 第5高 |
defaults-extra-file | 如果存在其他选项文件可以通过 --defaults-extra-file 选项指定。 | 第4个 | 第4高 |
~/.my.cnf | 用户特定选项 | 第5个 | 第3高 |
~/.mylogin.cnf | 用户特定的登录路径选项(仅限客户端) | 第6个 | 第2高 |
DATADIR/mysqld-auto.cnf | 系统变量(仅限服务器) | 第7个 | 最高 |
注意一下:Linux或者Unix系统里面的配置文件都是.cnf结尾的
- MySQL 按以上表格中的顺序查找并读取选项文件。
- 如果文件不存在则需要手动创建。
- 读取顺序从上到下,后读取的文件中配置的选项优先级越高
- 怎么理解优先级?
对于两个配置文件中配置了相同的选项,优先级高的文件的选项会覆盖掉优先级低的文件的选项
就好像我先在/etc/my.cnf设置了port=3305,然后我又在优先级更高的/etc/mysql/my.cnf里面设置了port=3306,那真正设置的port其实是3306。这就是优先级的作用
- ~ 表示当前用户的主目录
- MYSQL_HOME是设置的环境变量路径
- DATADIR 代表MySQL数据目录
- mysqld-auto.cnf的优先级最高
对于服务器,有一个例外:数据目录中的mysqld-auto.cnf选项文件是最后处理的,因此它甚至优先于命令行选项。
我们来注意一下
- defaults-extra-file和defaults-file的区别
| Command-Line Format |
--defaults-extra-file=file_name
|
Type File name **在全局选项文件之后读取此选项文件,但(在Unix上)在用户选项文件之前读取。**如果文件不存在或无法访问,则会发生错误。如果file_name不是绝对路径名,则会相对于当前目录进行解释。
也就是说使用defaults-extra-file的话所有配置文件都会被加载。
| Command-Line Format |
--defaults-file=file_name
|
Type File name 只会使用给定的选项文件。如果文件不存在或无法访问,则会发生错误。如果file_name不是绝对路径名,则会相对于当前目录进行解释。
这个就是使用defaults-file的话只会加载指定的配置文件。
对于Linux系统中,我们一般不太会用那些乱七八糟的配置文件,我们一般都是使用默认配置文件/etc/mysql/my.cnf的
3.3.2.Windows环境下配置文件的路径
其实这个一般是在C:\ProgramData\MySQL\MySQL Server 8.0\my.ini的

这里面就是一些配置信息。
对于这个配置文件,我们在修改之前,一定要备份好我们的配置文件,然后才去修改。
如果你不记得你的mysql的安装路径,那可以像下面这样子做
我们把这个目标复制下来
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" "--defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" "-uroot" "-p" "--default-character-set=utf8mb4"
- --defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini就是我们的默认配置文件
3.3.2.1.windows不常用配置文件的路径
如果在使用mysql程序的时候,如果没有指定配置文件的路径,就会自动读取默认路径下的配置文件。
- 指定了配置文件的路径
bash
mysql "--defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" -u root -p
- 没有指定配置文件的路径
bash
mysql -u root -p
也就是说,除了我们上面说的那个默认配置文件****C:\ProgramData\MySQL\MySQL Server 8.0\my.ini 之外,还有其他的配置文件!!!!
那这些另外的配置文件在哪里呢?
我们分别说说
- MySQL 按以下表格中的顺序查找并读取选项文件。
- 如果文件不存在则需要手动创建。
- 读取顺序从上到下,后读取的文件中配置的选项优先级越高
我们看看这些不常用的配置文件具体在哪里?
文件名 | 说明 | 读取顺序 | 优先级 |
---|---|---|---|
%WINDIR%\my.ini, %WINDIR%\my.cnf | 全局 | 最先读取 | 最低 |
C:\my.ini, C:\my.cnf | 全局 | 第2个读取 | 第5高 |
BASEDIR\my.ini, BASEDIR\my.cnf | 全局 | 第3个读取 | 第4高 |
defaults-extra-file | 如果存在其他选项文件可以通过 --defaults-extra-file 选项指定 | 第4个读取 | 第3高 |
%APPDATA%\MySQL.mylogin.cnf | 登录路径选项(仅限客户端) | 第5个读取 | 第2高 |
DATADIR\mysqld-auto.cnf | 系统变量(仅限服务器) | 最后读取 | 最高 |
- 我们Windows里面的配置文件的后缀名可能是.cnf或者.ini
注意:我们的默认配置文件C:\ProgramData\MySQL\MySQL Server 8.0\my.ini的读取顺序,不是最先也不是最后,就可能在上面的任意一个位置上
- %WINDIR% 表示 Windows 目录的位置,可以通过命令查看

我们可以看看有没有my.ini或者my.cnf,显然是没有的


- BASEDIR 表示 MySQL 的安装目录
这个安装路径怎么找?
如果你不记得你的mysql的安装路径,那可以像下面这样子做


我们把这个起始位置复制下来
"C:\Program Files\MySQL\MySQL Server 8.0\bin\"
那么C:\Program Files\MySQL\MySQL Server 8.0就是我们的安装目录
- %APPDATA%表示应用程序数据的目录

这个是仅仅针对客户端的,所以我们不必太在意,因为我们都不会用的。
- DATADIR 代表MySQL数据目录
这个目录一般是C:\ProgramData\MySQL\MySQL Server 8.0
使用 MySQL Installer安装MySQL成功后,my.ini默认在该目录下。
对于我们的C:\ProgramData\MySQL\MySQL Server 8.0\my.ini,这个是最常用的配置文件!!!我们以后基本就使用这个来配置文件。
3.3.3.选项(配置)文件的语法
运⾏MySQL程序时在命令⾏上指定的任何⻓选项都可以在选项⽂件中指定。
特别注意啊!!是长选项,不是短选项
至于选项列表我们可以去官网看看即可:MySQL :: MySQL 8.4 Reference Manual :: 6.5.1.1 mysql Client Options
- 规则一:选项⽂件中指定选项时,省略两个前导破折号,并且每⼀⾏表⽰⼀个选项
例如:--quick和--host=127.0.0.1在选项文件中应表示成quick和 host=127.0.0.1
bash
quick
host=127.0.0.1
#注意一定要换行,因为每一行表示一个选项
- 规则二:选项文件中的空行会被忽略。 非空行可以采用以下任一形式进行注释:
Kotlin
#comment
或者
;comment
注释行以#或;开头,注释可以从一行的中间开始。
我们可以去Linux系统的/etc/mysql/my.cnf看看

注释都是使用#开头的
- 规则三:[group] 用于设置选项的程序或组的名称,不区分大小写。 如果选项组名称与程序名称相同,则组中的选项专门应用于该程序。例如,[mysqld]和[mysql]组分别适用于mysqld服务端程序和 mysql客户端程序
- **规则四:**opt_name 相当于命令行上的选项名,这种一般是用于设置那些没有值的选项的写法,比如说batch
- **规则五:**opt_name=value 选项名对应的值,这种一般是用于设置那些有值的选项的写法,比如说:host=127.0.0.1。
- 可以使用转义序列\b,\t,\n,\r,\\和\s来表示退格符、制表 符、换行符、回车符、反斜杠和空格字符
规则四和规则五就是我们的写法
TIPS:
- 1.选项名称和值中的前导和尾随空格会自动删除
- 2.在windows系统中设置路径应该使用转义字符
bashbasedir="C:\\Program Files\\MySQL\\MySQL Server 8.0" # 或 basedir="C:/Program Files/MySQL/MySQL Server 8.0"
- 规则六: [client] :MySQL发行版中所有客户端程序都会读取并应用这个组下的选项**(除了mysqld)**, 在这个组下可以指定适用于所有客户端程序的通用选项,例如配置用户名和密码(但要确保只有 自己才可以访问这个文件以防止密码泄漏)
接下来我们来举一个例子
我们去默认的配置文件/etc/mysql/my.cnf里添加下面这些东西
bash
[client]
host=127.0.0.1
port=3306
user=root
password=123456

然后我们执行mysql

我们发现直接运行mysql,不用输入用户名密码可以直接成功登录!!!
神奇吧!!!
- 规则七: 可以通过**[客户端程序名]** 的形式为不同的客户端程序指定选项。
- 例如[mysql],当运行 mysql程序时会读取并应用该组下的配置,如果选项名与[client]重复,[client]中的 选项将会被覆盖
例如,我们在规则六的那个例子的基础之上,我们再添加下面这个
bash
#设置为必须输入密码
[mysql]
password

选项名password与[client]里面的password重复,[client]中的 password将会被覆盖 ,也就是说现在密码是空的。
我们重新启动一下mysql

发现需要输入密码了。

- 规则八:为特定MySQL版本设置选项可以使用[mysqld-5.7]、[mysqld-8.0]的组名
MySQL 配置文件支持基于版本的条件配置 ,通过 [mysqld-<version>]
格式的组名实现。这种机制允许你为不同版本的 MySQL 服务器定制配置,避免版本兼容性问题。
规则说明:
-
通用配置组 :
[mysqld]
适用于所有版本 -
版本特定组 :
[mysqld-5.7]
或[mysqld-8.0]
仅当 MySQL 主版本匹配时才生效 -
优先级:版本组 > 通用组(同选项时版本组覆盖通用组)
bash
# 通用配置(所有版本生效)
[mysqld]
max_connections = 200
tmp_table_size = 32M
# 仅对 MySQL 5.7 生效
[mysqld-5.7]
innodb_file_format = Barracuda # 5.7专有参数
innodb_large_prefix = ON
tmp_table_size = 64M # 覆盖通用配置
# 仅对 MySQL 8.0 生效
[mysqld-8.0]
authentication_policy = mysql_native_password,caching_sha2_password # 8.0专有参数
tmp_table_size = 128M # 覆盖通用配置
这个规则八了解一下即可。
- 规则九:在选项文件中使用 !include指令来包含其他选项文件
假设我们有一个主选项文件 /etc/mysql/my.cnf
,我们想要在这个主文件中包含另一个位于 /home/mydir/myopt.cnf
的选项文件。我们可以在 /etc/mysql/my.cnf
文件中添加以下行:
bash
!include /home/mydir/myopt.cnf
这样,当MySQL程序读取 /etc/mysql/my.cnf
文件时,它也会读取并应用 /home/mydir/myopt.cnf
文件中指定的选项。
- 规则十:在选项文件中使用!includedir指令来搜索指定目录中的其他选项文件,例如:!include /home/mydir ,但不保证目录中选项文件的读取顺序
假设我们有一个主选项文件 /etc/mysql/my.cnf
,我们想要在这个主文件中包含 /home/mydir
目录下的所有选项文件。根据操作系统的不同,!includedir
的行为也会有所不同:
- 在Unix/Linux系统中:
我们可以在 /etc/mysql/my.cnf
文件中添加以下行:
bash
!includedir /home/mydir
这样,MySQL会搜索 /home/mydir
目录下的所有以 .cnf 为后缀的文件,并读取和应用这些文件中指定的选项。
- 在Windows系统中:
假设我们的目录路径为 C:\mydir
,我们可以在选项文件中添加以下行:
bash
!includedir C:/mydir
这样,MySQL会搜索 C:\mydir
目录下的所有以 .ini 或 .cnf 为后缀的文件,并读取和应用这些文件中指定的选项。
关于客户端组配置的注意事项:
无论使用 !include 还是 !includedir 指令,MySQL都只会读取包含文件中当前客户端的组配置。例如,如果当前运行的是
mysql
客户端程序,那么MySQL只会读取包含文件中[mysql]
组下的选项配置。假设
/home/mydir
目录下包含以下两个选项文件:
/home/mydir/option1.cnf
:
bash[client] default-character-set = utf8mb4 [mysqld] max_connections = 500
/home/mydir/option2.cnf
:
bash[mysql] user = root password = 123456 [mysqldump] quick
当使用
mysql
客户端程序时,MySQL会读取并应用/home/mydir/option1.cnf
文件中的[client]
组和/home/mydir/option2.cnf
文件中的[mysql]
组的选项配置,即设置默认字符集为utf8mb4
,并使用root
用户和密码123456
登录。而[mysqld]
和[mysqldump]
组的选项配置则不会被mysql
客户端程序读取和应用。
- 在Windows中请确保在配置文件的最后一行加一个换行符,否则该行将被忽略
3.3.4.案例:设置客户端全局编码格式
在Linux下编辑全局配置文件默认位置/etc/mysql/my.cnf,初始内容如下:
bash
vim /etc/mysql/my.cnf
在已有内容下方输入相应的配置,我们要为客户端设置全局的编码格式为utf8mb4,那么在
client\]节点下指定相应的选项即可 ```bash [client] # 所有客户端程序者会读取这个节点下的配置信息 default-character-set=utf8mb4 # 指定编码格式为utf8mb4 ```  > 关于配置文件,我们暂且先讲这么多。不过要注意的是,**以后我们修改配置文件之前,一定要先备份一份,然后再去修改配置文件** ### 3.4.mysql客户端命令 在介绍mysql客户端命令之前,我们先看看SQL语句 * **使⽤mysql客⼾端程序连接到数据库服务器之后,可以发送SQL语句到服务器执⾏,并以";"(分 号)、\\g 或\\G结束** TIPS: * **1. ;与\\g结束表⽰以表格形式展⽰结果** * **2. \\G结束表⽰以⾏形式展⽰结果**   对于这个\\G,我们可以举个例子看看 use mysql; select * from user;  我们看是一堆乱七八糟的。我们接下来看看下面这个\\G的。 select * from user\G 这就是\\G的用武之处。 *** ** * ** *** * **如果当前已经输⼊了⼀部分SQL语句想重新输⼊可以输⼊Control+C中断当前输⼊**  假如这个时候我发现我打错命令了,我现在就可以**Control+C中断当前输⼊**。  #### 3.4.1.见一见mysql客户端命令 MySQL 客户端命令是 `mysql` 命令行工具内置的一组指令,用于管理该工具自身的连接、环境设置、输入输出行为以及与本地操作系统的交互。 它们以特定关键字(如 `use`, `exit`)或反斜杠加字母(如 `\u`, `\q`)开头,通常不需要分号结尾,并且只在当前的客户端会话中有效,不直接影响数据库服务器上的数据或结构。它们是高效使用 `mysql` 命令行客户端的必备工具。 * **在当前模式下,可以输⼊help或者\\h 查看mysql客户端命令列表** 这些就是我们这一节的主角------mysql客户端命令  那怎么理解这个呢?其实这些都是客户端命令。 每个命令有两个名称: 1. **完整名称 (如 clear, connect, exit)** 2. **快捷别名 (括号内的 Y?, Yc, Yr, Yq 等)。** 例如: * `?` 等同于 `help` * `\c` 等同于 `clear` (注意在命令行里输入 `\c` 而不是 `Yc`) * `\q` 等同于 `quit` 或 `exit` * `\u` 等同于 `use` * `\r` 等同于 `connect` (注意是 `\r` 不是 `Yr`) 左侧是完整命令,右侧是别名  **常用客户端命令详解** *** ** * ** *** **help (\h, ?):**显示当前这份帮助信息。  *** ** * ** *** **clear (\c): 清除当前输入行** 。如果你正在输入一个很长的 SQL 语句但输错了,不想继续输入,可以用 `\c` 清除当前行,回到干净的 `mysql>` 提示符。  注意这个时候不能使用clear  *** ** * ** *** **connect (\r):** **重新连接到服务器。**可选参数:`connect [database_name] [host_name]`。例如 `\r mydb localhost`。  *** ** * ** *** **use (\u): 切换到另一个数据库** 。这是非常常用的命令。`use database_name;` (注意这里 `use` 是客户端命令,但后面的 `database_name` 是参数,整个命令以分号结尾是告诉客户端执行这个切换操作)。  上面这3种用法都是一样的。 *** ** * ** *** **exit / quit (\q): 退出 MySQL 命令行客户端**。  *** ** * ** *** **source (\.): 执行一个外部的 SQL 脚本文件** 。`source /path/to/your_script.sql;` 或 `\. /path/to/your_script.sql;`。这对于批量运行 SQL 命令非常有用。 这个我们下一小节专门举了一个例子来说明。 *** ** * ** *** **status (\s): 显示服务器状态信息**。包括服务器版本、连接 ID、当前数据库、字符集设置等。  *** ** * ** *** **system (\!): 在 *不退出* MySQL 客户端的情况下,执行操作系统命令** 。例如 `system ls -l;` (Linux/Mac) 或 `system dir;` (Windows)。执行完后会回到 `mysql>` 提示符。  这个就说明:**如果我们的数据库密码被泄露的话,那么那些人就会使用这个system来执行一些系统命令,然后对我们的服务器进行致命打击。还是非常危险的。** *** ** * ** *** **tee (\T):** **将所有后续输入和输出同时记录(追加)到一个文件中** 。`tee /path/to/output.log;`。输入 `notee;` 停止记录。  我们回去看看,发现刚好有这么一个文件  如果要取消掉这个,我们可以像下面这样子取消  我们回去看看  我们发现就没有发现它再 存储新的东西了。 *** ** * ** *** **ego (\G):** **将 *下一条* SQL 语句的结果以垂直格式(每列一行)显示**,而不是默认的表格格式。 这对于查看包含很多列或很长的文本字段的结果集非常方便。 用法:在 SQL 语句后输入 `\G` 代替 `;` 结尾。例如 `SELECT * FROM large_table WHERE id = 1\G`。 我们可以举个例子看看 use mysql; select * from user;  我们看是一堆乱七八糟的。我们接下来看看下面这个\\G的。 select * from user\G 这就是\\G的用武之处。 *** ** * ** *** **go (\g): 发送命令到服务器** 。**等同于输入分号 ;。通常直接输入** `;` 更常见。  *** ** * ** *** **prompt (\R): 自定义 `mysql>` 提示符** 。可以包含动态信息如当前时间、用户名、主机名、数据库名等。例如 `prompt \u@\h [\d]> `可能将提示符改成 `user@host> `。   怎么样?很奇怪吗? 我们接下来修改回之前的  *** ** * ** *** **delimiter (\d): 更改语句分隔符** 。默认是分号 `;`。在定义存储过程、函数、触发器时,这些对象体内本身会包含分号 `;`。为了能让客户端正确识别整个对象的定义语句(而不是把体内的分号当作结束),需要临时将分隔符改为其他符号(如 `$$` 或 `//`)。定义完后再改回分号 `;`。这是定义存储对象时的**必要步骤**。  我们发现它没有显示出结果来。但是我这个时候输入//的话,就会显示出结果。  这个时候,如果我们不使用这个分割符的话,我们就得把分割符还原到分号。  *** ** * ** *** * **warnings (\W): 在每条语句执行后显示警告信息**(如果产生了警告)。 * **nowarning (\w): 关闭每条语句执行后的警告信息显示**。 * `charset` (`\C`): **切换客户端使用的字符集** 。例如 `charset utf8mb4;`。确保客户端、连接、数据库字符集一致能避免乱码问题。 * `resetconnection` (`\x`): **重置连接上下文** 。清除用户变量、临时表、`PREPARE` 语句等会话状态信息,但**不会断开连接**。比断开重连更轻量。 *** ** * ** *** 我们上面列出的都是**控制客户端**的命令,也就是我们说的mysql客户端命令。 我们注意到下面还有一句话:**"For server side help, type 'help contents'"** 这条提示非常重要! 要获取关于 **SQL 语法本身** 的帮助(如 `SELECT`, `CREATE TABLE`, `ALTER USER` 等),需要在 `mysql>` 提示符下输入 `help contents;`。这会显示服务器端帮助的顶级目录。  然后你可以根据目录输入更具体的帮助命令,例如: * `help Data Types;` (查看数据类型帮助) * `help SELECT;` (查看 SELECT 语句语法) * `help CREATE TABLE;` (查看创建表语法) * `help contents;` 是获取所有 SQL 语法帮助的入口点。  #### 3.4.2.mysql客户端命令和SQL语句的区别 **核心区别解析:执行主体与目的** 最根本的区别在于**谁执行** 以及**执行什么**。 **MySQL 客户端命令** 是由你电脑上运行的 `mysql` 这个**命令行工具程序本身** 解释执行的。它们的作用纯粹是**管理你当前这个终端窗口的环境和与MySQL服务器的交互方式** 。想象一下,这个命令行工具就是一个操作台,客户端命令就是操作台上的按钮和旋钮:用来连接或断开服务器(`connect`, `quit`/`\q`)、切换当前操作的"工作区"(数据库,`use dbname;` 或 `\u dbname`)、控制屏幕上结果的显示格式(比如用 `\G` 垂直显示而不是表格)、把屏幕输出保存到文件(`tee file.log` / `notee`)、清除当前输入的错误命令(`clear` / `\c`)、执行保存在文件里的一批命令(`source script.sql;` 或 `\. script.sql`)、查看当前连接的状态信息(`status` / `\s`)、甚至临时在操作系统里执行个命令(`system ls` / `\! dir`)。这些操作**都不直接影响数据库里的数据本身** ,它们只影响你**如何操作** 和**看到什么**。 相反,**SQL 语句** 则是你通过 `mysql` 客户端这个"操作台"**发送给远程的 MySQL 数据库服务器进程 (mysqld)** 的指令。服务器接收到这些语句后,负责**真正操作数据库的内容和结构** 。这才是数据库的核心功能:查询数据 (`SELECT ...`)、添加新记录 (`INSERT INTO ...`)、修改现有数据 (`UPDATE ...`)、删除数据 (`DELETE FROM ...`)、创建或修改数据库、表、索引等结构 (`CREATE DATABASE/TABLE/INDEX ...`, `ALTER TABLE ...`, `DROP TABLE ...`)、管理谁可以访问什么 (`CREATE USER ...`, `GRANT ...`, `REVOKE ...`)、以及控制保证数据一致性的交易过程 (`START TRANSACTION`, `COMMIT`, `ROLLBACK`)。这些操作会**直接改变服务器上存储的持久化数据或元数据**。 **关键差异:语法规则与执行方式** 理解它们在 `mysql>` 提示符下如何输入和执行是避免混淆的关键,尤其是**分号 (`;`) 和反斜杠命令 (`\x`) 的使用**。 * **客户端命令:** * **识别方式:** 通常以**特定的关键词** 开头(如 `use`, `exit`, `status`, `source`, `system`, `prompt`, `delimiter`, `help`)或者更常见的**反斜杠 `\` 加一个字母** 的快捷方式(如 `\u` (use), `\q` (quit), `\s` (status), `\.` (source), `\!` (system), `\d` (delimiter), `\c` (clear))。 * **终结符:** **客户端命令 *不需要* 以分号 ; 结尾!** 输入命令后直接按回车即可执行。例如 `exit`, `\q`, `status`, `\s`, `\! ls`, `prompt MySQL>`。 * **执行:** 客户端程序看到这些特定开头(关键词或 `\`)的命令,会立即自己处理,不会发送给服务器。通常是单行执行。 * **SQL 语句:** * **识别方式:** 以 **SQL 关键字** 开头(如 `SELECT`, `INSERT`, `UPDATE`, `DELETE`, `CREATE`, `ALTER`, `DROP`, `SHOW`, `SET`, `GRANT`, `REVOKE`, `BEGIN`, `COMMIT`, `EXPLAIN`, `CALL`)。 * **终结符:** **必须** 以分号 `;` 或 `\G` 结尾!这是**强制要求** 。`;` 表示按默认表格格式返回结果,`\G` 表示按垂直格式(每行一个字段)返回结果。 * **多行输入:** SQL 语句可以跨越多行。当你输入一个 SQL 关键字(如 `SELECT`)后按回车,客户端会显示 `->`(或自定义的续行提示符),表示它知道你还在输入一个语句,会持续等待,直到你输入 `;` 或 `\G` 并按回车。这时,客户端才会把**你从 `SELECT` 开始到 `;或者``\G` 为止输入的所有内容** 作为一个完整的语句发送给服务器执行。`delimiter` 客户端命令的主要用途就是为了在定义包含分号 `;` 的存储过程等对象时,临时改变这个终结符(如改成 `$$`),避免客户端提前发送语句。 **作用范围与持久性** * **客户端命令:** 其效果**严格局限于你当前打开的 mysql 客户端会话窗口** 。你在这个窗口设置的提示符 (`prompt`)、开启的输出记录 (`tee`)、当前选择的数据库 (`use`)、字符集 (`charset`)、分隔符 (`delimiter`) 等,只影响这个窗口。**关闭窗口或退出 (`quit`),这些设置就消失了。**它们**不会**改变其他用户的会话或服务器本身的配置。 * **SQL 语句:** 其效果**直接作用于 MySQL 服务器** 。对数据的增删改查、对库/表/索引等对象的创建修改删除、对用户权限的授予撤销,这些操作会**持久化** 存储在服务器上(除非在事务中用 `ROLLBACK` 撤销未提交的修改)。一旦成功执行,这些变更对于所有拥有相应权限并连接到该服务器的用户和会话都是可见和有效的(受事务隔离级别约束)。`resetconnection` (`\x`) 是个特殊的客户端命令,它告诉客户端在会话层面清理一些状态(如用户变量、预编译语句、临时表),但**不会**回滚事务或断开连接,也不会删除持久化的数据或对象。 **获取帮助:泾渭分明** * **客户端命令帮助:** 如果你想知道有哪些客户端命令可用(像 `use`, `exit`, `source`, `status` 等)或者某个具体命令怎么用(比如 `prompt` 有哪些选项),在 `mysql>` 提示符下输入 `help` 或 `\h` 或 `?` (**注意:绝对不能加分号 ;** )。这会显示你最初看到的那个命令列表及其简要说明。输入 `help command_name` (如 `help use`) (**不加 `;`**) 可以查看某个命令更具体的帮助。 * **SQL 语法帮助:** 如果你想知道 SQL 语句怎么写(如 `SELECT` 的完整语法、`CREATE TABLE` 有哪些选项、有哪些数据类型可用),则需要在 `mysql>` 提示符下输入 `help contents;` (**必须加分号 ;** )。这会显示服务器端 SQL 帮助的目录。然后你可以根据目录输入更具体的帮助命令,例如 `help SELECT;`, `help CREATE TABLE;`, `help data types;`, `help SHOW;` (**都必须以 `;` 结尾**)。这个帮助系统的内容来源于 MySQL 服务器软件附带的文档。