【MySQL高阶】5.MySQL服务器简介

文章目录

  • [1. MySQL 服务器简介](#1. MySQL 服务器简介)
    • [1.1 服务器配置和默认值](#1.1 服务器配置和默认值)
    • [1.2 系统变量和选项](#1.2 系统变量和选项)
      • [1.2.1 简介](#1.2.1 简介)
      • [1.2.2 常用选项](#1.2.2 常用选项)
    • [1.3 使用系统变量](#1.3 使用系统变量)
    • [1.4 示例:服务器常用配置](#1.4 示例:服务器常用配置)
    • [1.5 查看状态变量](#1.5 查看状态变量)

1. MySQL 服务器简介

通常所说的 MySQL 服务器指的是mysqld程序,当运行mysqld后对外提供MySQL 服务,这个专题的内容涵盖了以下关于MySQL 服务器以及相关配置的内容,包括:

  • 服务器支持的启动选项。可以在命令行和配置文件中指定这些选项。
  • 服务器系统变量。反映了启动选项的当前状态和值,其中一些变量可以在服务器运行时修改。【系统变量可以修改】
  • 服务器状态变量。这些变量包含了有关运行时操作的计数器和统计信息。【状态变量不能被修改,只是代表当前状态而已,是一个指示器】
  • 服务器如何管理客户端连接。
  • 配置和使用时区支持。
  • 服务器端帮助功能。

1.1 服务器配置和默认值

mysqld 有很多选项和系统变量可以在启动时进行配置,要查看服务器的默认选项和系统变量值,可以执行以下命令:

mysql 复制代码
# 查看所有mysqld 选项和可配置的系统变量列表及默认值
root@guangchen-vm:/var/lib/mysql# mysqld --verbose --help
# 内容看起来像这样
abort-slave-event-count 0
allow-suspicious-udfs FALSE
archive ON
auto-increment-increment 1
auto-increment-offset 1
autocommit TRUE
automatic-sp-privileges TRUE
avoid-temporal-upgrade FALSE
back-log 80
basedir /usr/
... 省略
tmpdir /tmp
transaction-alloc-block-size 8192
transaction-isolation REPEATABLE-READ
transaction-prealloc-size 4096
transaction-read-only FALSE
transaction-write-set-extraction XXHASH64
updatable-views-with-limit YES
validate-user-plugins TRUE
verbose TRUE
wait-timeout 28800

查看服务器在运行时系统变量的值,连接到MySQL并执行以下语句:

mysql 复制代码
mysql> SHOW VARIABLES;

因为太多了,就不截图了,而且因为太多,可读性就差了,所以我们也可以:

mysql 复制代码
mysql> SHOW VARIABLES like 'tmpdir';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir        | /tmp  |
+---------------+-------+
1 row in set (0.00 sec)

mysql> 

如果实在记不住,也可以使用通配符:这个也是我们更加通用的场景

mysql 复制代码
mysql> SHOW VARIABLES like '%tmp%';
+---------------------------------+-----------+
| Variable_name                   | Value     |
+---------------------------------+-----------+
| default_tmp_storage_engine      | InnoDB    |
| innodb_tmpdir                   |           |
| internal_tmp_mem_storage_engine | TempTable |
| replica_load_tmpdir             | /tmp      |
| slave_load_tmpdir               | /tmp      |
| tmp_table_size                  | 16777216  |
| tmpdir                          | /tmp      |
+---------------------------------+-----------+
7 rows in set (0.00 sec)

mysql> 

查看服务器在运行时的一些统计和状态指示器,连接到MySQL并执行以下语句:

mysql 复制代码
mysql> SHOW STATUS;

系统变量和状态信息也可以使用 mysqladmin命令来查看:

mysql 复制代码
root@guangchen-vm:~# mysqladmin variables -uroot -p
root@guangchen-vm:~# mysqladmin extended-status -uroot -p

关于服务器的选项、系统变量、状态变量参考以下官网列表

这里简单解释一下对应网页的表头:

mysql 复制代码
Name	Cmd-Line	Option File	   System Var	    Status Var       Var Scope	Dynamic
变量名   是否支持CMD  是否支持选项文件  是不是一个系统变量  是不是一个状态变量  作用域      是否支持动态修改

注意:系统变量、状态变量的作用域分为: Global (全局),Session (当前会话或连接),或 两者都支持


1.2 系统变量和选项

1.2.1 简介

  • 当通过mysqld启动数据库服务器时,可以通过选项文件或命令行中提供选项,但是,在大多数情况下,为确保服务器每次运行时都使用相同的选项,最好的方法是在选项文件中指定相应的选项。

  • mysqld从选项文件中的 [mysqld][server] 组(节点)中读取选项内容

不过除了mysqld,还有其他的服务端启动脚本:这两个脚本都会先读取server这个里面的内容,再去读取各自的内容。

  • mysqld接受的选项可以通过 mysqld --verbose --help 查看,列表中的有些项目是可以在服务器启动时设置的系统变量,系统变量可以在连接MySQL后使用 SHOW VARIABLES; 语句查看,但有些内容只在 --help 中存在,使用 SHOW VARIABLES 时并没有显示,这是因为它们只是选项而不是系统变量。(也可以去官方文档查看)
    • mysqld --verbose --help:显示选项与系统变量
    • SHOW VARIABLES;:只显示系统变量

注意:选项值可以通过命令行和选项文件设置,部分系统变量可以通过SET语句动态设置值。


1.2.2 常用选项

选项 系统变量 说明
--character-set-server character_set_server 服务器的默认字符集,默认 utf8mb4 ,如果设置了这个变 量,还应该设置 collation_server 来指定字符集的排 序规则。MySQL8.0之前版本默认字符集是 latin1(这个字符集不能保存中文) ,建议明确指定此选项为 utf8mb4
--collation-server collation_server 服务器的默认排序,默认utf8mb4_0900_ai_ci utf8mb4:编码集 0900:表示unicode的版本是9 ai = accent insensitive重音不敏感,as是重音不敏感 ci = case insensitive大小写不敏感,cs是大小写敏感
--port port MySQL服务启动后监听的端口号
--datadir datadir MySQL服务器的数据目录
--default-storage-engine default_storage_engine 表的默认存储引擎
--log-output log_output 一般查询日志和慢速查询日志输出的目的地,值可以是 TABLE , FILENONE ,可以同时指定多个值, NONE 的优先级最高
--general-log general_log 是否启用一般查询日志。值为 0 (或 OFF )禁用日志,为 1 (或 ON )来启用日志。日志输出目录由 log_output 系 统变量控制
--general-log-file general_log_file 一般查询日志文件的名称(一般指定的是绝对路径)。默认值是host_name.log
--slow-query-log slow_query_log 是否启用慢查询日志。值为 0 (或 OFF )禁用日志,为 1 (或 ON )来启用日志。日志输出目录由 log_output 系 统变量控制
--slow-query-log-file slow_query_log_file 慢查询日志文件的名称(一般指定的是绝对路径)。默认值是host_name-slow.log
--long-query-time long_query_time 如果查询花费的时间超过这个数秒,服务器将增加 Slow_queries状态变量,如果慢速查询日志开启,查询将 被记录到慢速查询日志文件中,默认值为10,单位为秒
--log-error log_error 默认的错误日志目标。如果目标是控制台值为 stderr , 目标是一个文件,值为具体的文件名(一般指定的是绝对路径)
--log-bin N/A 指定用于二进制日志文件的基本名称
--server-id server_id 该变量指定服务器ID,默认为 1 。集群环境中server-id不能重复
--max-connections max_connections 允许客户端同时连接的最大数,可以理解为MySQL服务器支持的最大并发数
--table-open-cache table_open_cache 所有线程可以打开的表的数量
--innodb-log-buffer-size innodb_log_buffer_size InnoDB向磁盘写入日志文件的缓冲区大小,默认16MB
--innodb-buffer-pool-size innodb_buffer_pool_size InnoDB缓存表和索引数据的缓冲区大小,默认128MB
--innodb-redo-log-capacity innodb_redo_log_capacity 重做日志文件占用的磁盘空间
--innodb-thread-concurrency innodb_thread_concurrency 定义InnoDB内部允许的最大线程数,默认值 0 ,多用于高性能机器上的调优
--innodb-autoextend-increment innodb_autoextend_increment 自动扩展InnoDB系统表空间文件的增量大小(以兆为单 位)。默认值为64
--flush-time flush_time 如果将该值设置为非零值,则每flush_time秒关闭一次所 有表,以释放资源并将未刷新的数据同步到磁盘。
--join-buffer-size join_buffer_size 用于普通索引扫描、范围索引扫描和不使用索引从而执行 全表扫描的连接的缓冲区的最小大小,默认256KB
--max-allowed-packet max_allowed_packet 一个数据包的最大 小,默认值是64MB
--max-connect-errors max_connect_errors 来自客户端主机连续连接请求失败数达到指定值后,服务 器将阻止该客户端的连接。
--open-files-limit open_files_limit mysqld在操作系统中可用的文件描述符的数量
--sort-buffer-size sort_buffer_size 每个必须执行排序的会话分配的缓冲区大小
--binlog-row-event-max-size binlog_row_event_max_size 当记录基于行的二进制日志时,设置事件的最大值,必须 是256的倍数,默认值8192字节,如果事件不能分割,则 可能超过最值。

1.3 使用系统变量

  1. 以上我们介绍了通过选项文件和命令行设置相应系统变量的值,设置系统变量的语法与命令选项的语法相同,指定变量名称时,中间的破折号和下划线可以互换使用。

    例如, --general_log=ON--general-log=ON 是等价的。

  2. 当使用选项设置一个数值的变量时,可以带有后缀 KMG (大小写不限)表示 10241024^21024^3

    MySQL 8.0.14 开始,后缀也可以用 TPE 来表示 1024^41024^51024^6

示例:为服务器指定 256 KB 的排序缓冲区大小和 1 GB 的最大数据包大小

mysql 复制代码
# 在命令行的指定
mysqld --sort-buffer-size=256K --max-allowed-packet=1G
# 在选项文件中指定
[mysqld]
sort_buffer_size=256k
max_allowed_packet=1g
# 主要目的就是在硬件环境充裕的情况下压榨性能
  1. 系统变量有两个作用域,分别是 Global (全局)和 Session (会话)。

    Global 全局变量影响服务器的整体操作, Session 会话变量影响各个客户端连接的操作。

    给定的系统变量可以同时具有全局值和会话值,它们的关系如下:

    • 服务器启动时,会将每个全局变量初始化并设置默认值,具体的值可以通过命令行或选项文件更改。

    • 服务器为每个客户端维护一组 Session 变量,在客户端连接时使用相应全局变量的当前值进行初始化,也可以自己在单独的文件里面设置调整。

  2. 大部分系统变量是动态的,在服务器运行时可以通过 SET 语句动态更改,并且无需停止和重新启动服务器。

    在服务器运行时,使用 SET 语句设置系统变量,需要指定作用域【因为有些变量只有特定的作用域才生效,自己指定可以更加精准的执行,避免出现意外bug,也可以防止想改session的时候把global也改了】(也可以在前面加上@@ 修饰符),然后指定系统变量的名称,名称必须使用下划线而不是破折号。
    如下所示:设置全局系统变量最大连接数为1000

mysql 复制代码
mysql> SET GLOBAL max_connections = 1000;
mysql> SET @@GLOBAL.max_connections = 1000;

记得先查一下默认值,防止改不回来了:

mysql 复制代码
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> 

将全局系统变量持久化到 mysqld-auto.cnf 文件(同时设置运行时值):

不过默认情况下,这个文件在数据目录下是不存在的,只有通过执行SET PERSIST语句之后才自动生成。

没有这个文件是执行不了的。

一开始:没有这个文件

执行:

然后出现这个文件:

mysql 复制代码
# PERSIST 表示持久化的同时设置全局变量的值
mysql> SET PERSIST max_connections = 1000;
mysql> SET @@PERSIST.max_connections = 1000;

然后查看文件值:

shell 复制代码
root@yudukai:/var/lib/mysql# cat mysqld-auto.cnf
{"Version": 2, "mysql_dynamic_parse_early_variables": {"max_connections": {"Value": "1000", "Metadata": {"Host": "localhost", "User": "root", "Timestamp": 1778479176629805}}}}root@yudukai:/var/lib/mysql# 

将全局系统变量持久化到 mysqld-auto.cnf 文件(不设置运行时值):

就是设置下次启动的时候生效,但是本次不生效。

mysql 复制代码
# PERSIST 表示持久化的同时设置全局变量的值
mysql> SET PERSIST_ONLY max_connections = 1000;
mysql> SET @@PERSIST_ONLY.max_connections = 1000;

删除持久化的系统变量可以使用语句:

mysql 复制代码
RESET PERSIST IF EXISTS system_var_name;

例如:

mysql 复制代码
mysql> RESET PERSIST IF EXISTS max_connections;
Query OK, 0 rows affected (0.00 sec)

mysql> 

然后查看:

mysql 复制代码
root@yudukai:/var/lib/mysql# cat mysqld-auto.cnf
{"Version": 2}root@yudukai:/var/lib/mysql# 

设置 Session 系统变量,时区为"+8:00":

mysql 复制代码
mysql> SET SESSION time_zone='+8:00'; # SESSION只针对当前的l
mysql> SET @@SESSION.time_zone='+8:00';
mysql> SET @@time_zone='+8:00';

先查看目前的时区:

mysql 复制代码
mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+
1 row in set (0.01 sec)

mysql> SET SESSION time_zone='+8:00';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | +08:00 |
+---------------+--------+
1 row in set (0.00 sec)

mysql> show session variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | +08:00 |
+---------------+--------+
1 row in set (0.00 sec)

mysql> show global variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+
1 row in set (0.00 sec)

mysql> 

不过需要注意:time_zone只是是个系统变量,无法在选项文件和命令行配置,如果需要在后两者配置的话,需要使用default-time_zone


  1. 对于数值型的系统变量,用带有后缀的值指定时,只适用于选项方式,而不能用在 SET 方式中;SET 方式可以使用表达式为系统变量指定值,而在选项方式中不允许,如下所示:
mysql 复制代码
# 选项形式,其实很好理解,这个是文本,里面可以解析单位
root@guangchen-vm:~# mysqld --max_allowed_packet=16M # 允许
root@guangchen-vm:~# mysqld --max_allowed_packet=16*1024*1024 # 不允许计算

# 运行时SET形式,这个是运行时环境,本身支持计算
mysql> SET GLOBAL max_allowed_packet=16M; # 不允许写单位
mysql> SET GLOBAL max_allowed_packet=16*1024*1024; # 允许计算

说明:在设置全局变量时需要指定GLOBAL关键字的原因是为了防止出现以下问题:

  • 如果要删除的SESSION变量与GLOBAL变量名相同,那么具有修改全局变量权限的客户端可能会意外地更改GLOBAL变量,而不仅仅是只修改SESSION变量。
  • 如果已经有一个SESSION变量而且与GLOBAL变量同名,那么本意是要修改GLOBAL变量,可能只是修改了SESSION变量的值

所以没有明确指定 GLOBALSESSION 时,对于当前客户端来说 SESSION 的优先级更高
6. 要显示系统变量名称和值,请使用以下 SHOW VARIABLES 语句:

mysql 复制代码
mysql> SHOW VARIABLES;
  1. 可以使用 LIKE 子句显示与指定内容匹配的变量,也可以使用通配符
mysql 复制代码
# 查看指定的系统变量
SHOW VARIABLES LIKE 'max_join_size';
# 查看指定系统变量SESSION作用域的值
SHOW SESSION VARIABLES LIKE 'max_join_size';
# 查看包含指定内容的系统变量
SHOW VARIABLES LIKE '%size%';
# 查看包含指定内容系统变量的GLOBAL作用域的值
SHOW GLOBAL VARIABLES LIKE '%size%';
  1. 一部分系统变量是内置的,也有一些需要通过安装服务器插件或组件才可以使用

    • 比如用于审计插件 audit_log 实现了名为 audit_log_policy 的系统变量
    • 错误日志过滤组件 log_filter_dragnet 实现了名为 log_error_filter_rules 的系统变量。
  2. 所有可以动态设置的系统变量,请查看参考链接


1.4 示例:服务器常用配置

Linux系统下编辑:/etc/mysql/my.cnf

Windows系统下打开:C:/ProgramData/MySQL/MySQL Server 8.0/my.ini

注意:

  • 编辑前先备份原始文件
  • 如果要修改数据目录选项建议先停止MySQL服务,并把原data目录整体复制到新路径,配置完成后重启服务

`mysqld` 节点下添加以下内容:

mysql 复制代码
# MySQL 服务节点
[mysqld]
# MySQL 服务启动后监听的端口号,如果数据库服务在公网部署,建议修改默认端口号
port=3306
# 数据目录的路径,这里演示的是windows下的配置,注意分隔符用/,如果是\则需要转义为\\.
# 为什么要修改呢?因为这个东西的数据会越来越大,直到占满C盘,导致系统卡顿无法启动。
# 把原data目录整体复制到新路径
# 为什么要拷贝,不新建一个文件夹呢?因为MySQL数据库安装的过程中设置的一些东西会保存到对应的文件里面去,不整体复制的话,下次一些默认启动参数和密码没有就会导致服务器启动失败
datadir=D:/database/MySQL/data8.0

# MySQL 服务器的字符集与排序规则
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci 
# 新建表时使用的存储引擎,windows下已默认配置,最后一行需要换行,不然有的系统可能不会生效
default_storage_engine=INNODB

Linux查看datadir对应目录:

mysql 复制代码
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)

mysql> 

在修改datadir的时候可能出现权限问题,这个时候可以把对应权限改成MySQL。也就是改用户和用户组。


1.5 查看状态变量

MySQL服务器维护着当前系统信息的状态变量

可以使用 SHOW [GLOBAL | SESSION] STATUS [like status_name]; 语句查看这些变量和对应的值。

GLOBAL显示所有连接的值,SESSION显示当前连接的值。

mysql 复制代码
mysql> SHOW GLOBAL STATUS;
+-----------------------------------+------------+
| Variable_name | Value |
+-----------------------------------+------------+
| Aborted_clients | 0 | #未正确关闭连接而中止的连接数
| Aborted_connects | 0 | #连接MySQL服务器失败的次数
| Bytes_received | 155372598 | #从所有客户端接收的字节数
| Bytes_sent | 1176560426 | #发送给所有客户端的字节数
...
| Connections | 30023 | #尝试连接到MySQL服务器的次数,不论成功或失败
| Created_tmp_disk_tables | 0 | #创建内部磁盘临时表的数量
| Created_tmp_files | 3 | #创建了临时文件的数量
| Created_tmp_tables | 2 | #创建内部临时表的数量
...
| Threads_created | 217 | #为处理连接而创建的线程数
| Threads_running | 88 | #未休眠的线程数
| Uptime | 1389872 | #服务器已启动的秒数
+-----------------------------------+------------+

具体的状态变量及表示的意义可以参考官网文档

相关推荐
流星白龙1 小时前
【MySQL高阶】9.在一台机器上运行多个MySQL实例
数据库·mysql·adb
Rick19931 小时前
MySQL 优化器会选择【最小、最精准、最高效】的索引
数据库·mysql
byte轻骑兵1 小时前
【AVRCP】规范精讲[21]: 从轮询到主动推送,AVRCP通知事件全解析
服务器·网络·人机交互·avrcp·音频控制
团象科技1 小时前
跨境服务与产品多地域迭代场景下 生成式AI安全部署的实操路径观察
服务器·人工智能
mN9B2uk171 小时前
MySQL命令行导出数据库
c语言·数据库·mysql
STDD1 小时前
ATLAS MMO 专用服务器搭建教程:海盗生存 MMO 服务器开服指南
运维·服务器·php
j_xxx404_2 小时前
Linux 线程同步硬核解析:从条件变量、阻塞队列到信号量环形队列
linux·运维·服务器·c++·人工智能·ai·中间件
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第86题】【Mysql篇】第16题:MySQL 中锁的种类与行锁实现原理?
java·开发语言·数据库·mysql·面试
Yvonne爱编码2 小时前
数据库---Day9 视图(附完整数据库脚本+练习题)
数据库·mysql·oracle