目录
MySQL服务器( mysqld )是完成MySQL安装中大部分工作的主程序。 本章概述了MySQL Server,并介绍了一般服务器管理:
服务器配置
数据目录,尤其是
mysql
系统架构
服务器日志文件
管理单台机器上的多个服务器
有关管理主题的其他信息,另请参阅:
mysqld 是MySQL服务器。 以下讨论涵盖了这些MySQL服务器配置主题:
服务器支持的启动选项。 您可以在命令行,配置文件或两者上指定这些选项。
服务器系统变量。 这些变量反映了启动选项的当前状态和值,其中一些可以在服务器运行时进行修改。
服务器状态变量。 这些变量包含有关运行时操作的计数器和统
如何设置服务器SQL模式。 此设置修改SQL语法和语义的某些方面,例如,与其他数据库系统的代码兼容,或控制特定情况下的错误处理。
配置和使用IPv6支持。
配置和使用时区支持。
服务器端帮助功能。
服务器关闭过程。 根据表的类型(事务性或非事务性)以及是否使用复制,存在性能和可靠性考虑因素。
有关在MySQL 8.0中添加,弃用或删除的MySQL服务器变量和选项的列表,请参见 第1.5节“在MySQL 8.0中添加,弃用或删除的服务器和状态变量和选项” 。
并非所有MySQL服务器二进制文件和配置都支持所有存储引擎。 要了解如何确定MySQL服务器安装支持的存储引擎,请参见 第13.7.6.16节“SHOW ENGINES语法” 。
MySQL服务器 mysqld 有许多命令选项和系统变量,可以在启动时设置它们以配置其操作。 要确定服务器使用的缺省命令选项和系统变量值,请执行以下命令:
外壳> mysqld --verbose --help
该命令生成所有 mysqld 选项和可配置系统变量 的列表 。 它的输出包括默认选项和变量值,看起来像这样:
abort-slave-event-count 0 allow-suspicious-udfs FALSE 存档ON 自动递增 - 增量1 自动增量偏移1 autocommit TRUE automatic-sp-privileges TRUE 避免 - 时间升级FALSE back-log 80 basedir /home/jon/bin/mysql-8.0/ ... tmpdir / tmp transaction-alloc-block-size 8192 事务隔离REPEATABLE-READ transaction-prealloc-size 4096 transaction-read-only FALSE transaction-write-set-extraction OFF updatable-views-with-limit YES validate-user-plugins TRUE 详细是真的 等待超时28800
要查看服务器在运行时实际使用的当前系统变量值,请连接到它并执行以下语句:
MySQL的> SHOW VARIABLES;
要查看正在运行的服务器的某些统计和状态指示器,请执行以下语句:
MySQL的> SHOW STATUS;
使用 mysqladmin 命令 也可以使用系统变量和状态信息 :
shell>mysqladmin variables
shell>mysqladmin extended-status
有关所有命令选项,系统变量和状态变量的完整说明,请参阅以下部分:
可从Performance Schema获得更详细的监控信息;
请参见
第26章,
MySQL性能架构
。
此外,MySQL
sys
模式是一组对象,可以方便地访问性能模式收集的数据;
请参见
第27章,
MySQL sys Schema
。
如果在命令行上为 mysqld 或 mysqld_safe 指定了一个选项 ,则它仅对该服务器的调用保持有效。 要在每次运行服务器时使用该选项,请将其放在选项文件中。 请参见 第4.2.2.2节“使用选项文件” 。
MySQL服务器有许多操作参数,您可以使用命令行选项或配置文件(选项文件)在服务器启动时更改这些参数。 也可以在运行时更改许多参数。 有关在启动或运行时设置参数的一般说明,请参见 第5.1.7节“服务器命令选项” 和 第5.1.8节“服务器系统变量” 。
在Windows上,MySQL Installer与用户交互,并
my.ini
在基本安装目录中
创建一个名为
默认选项文件的文件。
在Windows上,
可能不会显示
.ini
或
.cnf
选项文件扩展名。
完成安装过程后,您可以随时编辑默认选项文件以修改服务器使用的参数。
例如,要在文件中使用参数设置,该参数设置
#
在行的开头
注释
,请删除
#
,并在必要时修改参数值。
要禁用设置,请
#
在行的开头
添加
或删除它。
对于非Windows平台,在服务器安装或数据目录初始化过程中不会创建默认选项文件。 按照 第4.2.2.2节“使用选项文件”中 给出的说明创建选项文件 。 如果没有选项文件,服务器只会以其默认设置启动 - 有关如何检查这些设置 , 请参见 第5.1.2节“服务器配置默认值” 。
有关选项文件格式和语法的其他信息,请参见 第4.2.2.2节“使用选项文件” 。
从MySQL 8.0.16开始,MySQL Server支持一个
--validate-config
选项,可以在不正常运行模式下运行服务器的情况下检查启动配置是否存在问题:
mysqld --validate-config
如果未找到任何错误,则服务器将以退出代码0终止。如果发现错误,服务器将显示诊断消息并以退出代码1终止。例如:
外壳> mysqld --validate-config --no-such-option
2018-11-05T17:50:12.738919Z 0 [错误] [MY-000068] [服务器]未知
选项'--no-such-option'。
2018-11-05T17:50:12.738962Z 0 [错误] [MY-010119] [服务器]正在中止
一旦发现任何错误,服务器就会终止。
要进行其他检查,请更正初始问题并
--validate-config
再次
运行服务器
。
对于前面的示例,
--validate-config
在显示错误消息时
使用
结果,服务器退出代码为1.警告和信息消息也可能会显示,具体取决于
log_error_verbosity
值,但不会立即生成验证终止或退出代码为1例如,此命令会生成多个警告,这两个警告都会显示。
但是没有错误发生,因此退出代码为0:
外壳>mysqld --validate-config --log_error_verbosity=2
--read-only=s --transaction_read_only=s
2018-11-05T15:43:18.445863Z 0 [警告] [MY-000076] [服务器]选项 'read_only':无法识别布尔值's'。设置为OFF。 2018-11-05T15:43:18.445882Z 0 [警告] [MY-000076] [服务器]选项 'transaction-read-only':无法识别布尔值's'。设置为OFF。
此命令产生相同的警告,但也是一个错误,因此错误消息与警告一起显示,退出代码为1:
外壳>mysqld --validate-config --log_error_verbosity=2
--no-such-option --read-only=s --transaction_read_only=s
2018-11-05T15:43:53.152886Z 0 [警告] [MY-000076] [服务器]选项 'read_only':无法识别布尔值's'。设置为OFF。 2018-11-05T15:43:53.152913Z 0 [警告] [MY-000076] [服务器]选项 'transaction-read-only':无法识别布尔值's'。设置为OFF。 2018-11-05T15:43:53.164889Z 0 [错误] [MY-000068] [服务器]未知 选项'--no-such-option'。 2018-11-05T15:43:53.165053Z 0 [错误] [MY-010119] [服务器]中止
该
--validate-config
选项
的范围
仅限于服务器可以在不经历正常启动过程的情况下执行的配置检查。
因此,配置检查不初始化存储引擎和其他插件,组件等,并且不验证与那些未初始化的子系统相关联的选项。
--validate-config
可以在任何时候使用,但在升级后特别有用,以检查先前与旧服务器一起使用的任何选项是否被升级后的服务器视为已弃用或已过时。
例如,
tx_read_only
系统变量在MySQL 5.7中已弃用,在8.0中已删除。
假设MySQL 5.7服务器在其
my.cnf
文件中
使用该系统变量运行
,然后升级到MySQL 8.0。
运行升级的服务器
--validate-config
以检查配置会产生以下结果:
外壳> mysqld --validate-config
2018-11-05T10:40:02.712141Z 0 [错误] [MY-000067] [服务器]未知变量
'tx_read_only = ON'。
2018-11-05T10:40:02.712178Z 0 [错误] [MY-010119] [服务器]正在中止
--validate-config
可以与
--defaults-file
选项一起
使用,
仅验证特定文件中的选项:
外壳> mysqld --defaults-file=./my.cnf-test --validate-config
2018-11-05T10:40:02.712141Z 0 [错误] [MY-000067] [服务器]未知变量
'tx_read_only = ON'。
2018-11-05T10:40:02.712178Z 0 [错误] [MY-010119] [服务器]正在中止
请记住
--defaults-file
,如果指定,则必须是命令行上的第一个选项。
(执行前面的示例,反转选项顺序会产生一条
--defaults-file
本身未知
的消息
。)
下表列出了适用于其中的所有命令行选项,系统变量和状态变量
mysqld
。
该表列出了一个统一列表中的命令行选项(Cmd-line),配置文件中有效的选项(选项文件),服务器系统变量(System Var)和状态变量(Status var),并指示每个选项的位置或变量有效。 如果在命令行或选项文件中设置的服务器选项与相应系统变量的名称不同,则会在相应选项的正下方注明变量名称。 对于系统和状态变量,变量(Var Scope)的范围是Global,Session或两者。 有关设置和使用选项和变量的详细信息,请参阅相应的项目说明。 在适当的情况下,提供有关物品的进一步信息的直接链接。
有关此表的特定于NDB集群的版本,请参见 第22.3.2.5节“NDB集群mysqld选项和变量参考” 。
表5.1命令行选项,系统变量和状态变量摘要
笔记:
1.此选项是动态的,但只有服务器应设置此信息。 您不应手动设置此变量的值。
下表列出了适用的所有系统变量
mysqld
。
该表列出了一个统一列表中的命令行选项(Cmd-line),配置文件中有效的选项(选项文件),服务器系统变量(System Var)和状态变量(Status var),并指示每个选项的位置或变量有效。 如果在命令行或选项文件中设置的服务器选项与相应系统变量的名称不同,则会在相应选项的正下方注明变量名称。 变量(Var Scope)的范围是Global,Session或两者。 有关设置和使用变量的详细信息,请参阅相应的项目说明。 在适当的情况下,提供有关物品的进一步信息的直接链接。
表5.2系统变量摘要
笔记:
1.此选项是动态的,但只有服务器应设置此信息。 您不应手动设置此变量的值。
下表列出了适用的所有状态变量
mysqld
。
该表列出了每个变量的数据类型和范围。 最后一列指示每个变量的范围是全局,会话还是两者。 有关设置和使用变量的详细信息,请参阅相应的项目说明。 在适当的情况下,提供有关物品的进一步信息的直接链接。
表5.3状态变量摘要
启动 mysqld 服务器时,可以使用 第4.2.2节“指定程序选项”中 所述的任何方法 指定程序选项 。 最常用的方法是在选项文件或命令行中提供选项。 但是,在大多数情况下,最好确保服务器每次运行时都使用相同的选项。 确保这一点的最佳方法是将它们列在选项文件中。 请参见 第4.2.2.2节“使用选项文件” 。 该部分还描述了选项文件格式和语法。
mysqld
从
[mysqld]
和
[server]
组中
读取选项
。
mysqld_safe的
读取选项
[mysqld]
,
[server]
,
[mysqld_safe]
,和
[safe_mysqld]
团体。
mysql.server
从
[mysqld]
和
[mysql.server]
组中
读取选项
。
mysqld 接受许多命令选项。 有关摘要,请执行以下命令:
mysqld --help
要查看完整列表,请使用以下命令:
mysqld --verbose --help
列表中的某些项目实际上是可以在服务器启动时设置的系统变量。
这些可以在运行时使用
SHOW
VARIABLES
语句
显示
。
前面的
mysqld
命令
显示的某些项目
不会出现
SHOW
VARIABLES
输出中;
这是因为它们只是选项,而不是系统变量。
以下列表显示了一些最常见的服务器选项。 其他选项在其他部分中描述:
影响安全性的选项:请参见 第6.1.4节“与安全相关的mysqld选项和变量” 。
与SSL相关的选项:请参见 第6.3.2节“加密连接的命令选项” 。
二进制日志控制选项:请参见 第5.4.4节“二进制日志” 。
与复制相关的选项:请参见 第17.1.6节“复制和二进制日志记录选项和变量” 。
加载插件(如可插拔存储引擎)的选项:请参见 第5.6.1节“安装和卸载插件” 。
特定于特定存储引擎的选项:请参见 第15.13节“InnoDB启动选项和系统变量” 和 第16.2.1节“MyISAM启动选项” 。
某些选项控制缓冲区或缓存的大小。 对于给定的缓冲区,服务器可能需要分配内部数据结构。 这些结构通常从分配给缓冲区的总内存中分配,并且所需的空间量可能取决于平台。 这意味着当您为控制缓冲区大小的选项指定值时,实际可用的空间量可能与指定的值不同。 在某些情况下,金额可能小于分配的金额。 服务器也可能向上调整值。 例如,如果为最小值为1024的选项指定值0,则服务器将该值设置为1024。
除非另有说明,否则缓冲区大小,长度和堆栈大小的值以字节为单位。
某些选项采用文件名值。
除非另行指定,否则默认文件位置是数据目录(如果值是相对路径名)。
要明确指定位置,请使用绝对路径名。
假设数据目录是
/var/mysql/data
。
如果文件值选项作为相对路径名给出,则它将位于
/var/mysql/data
。
如果该值是绝对路径名,则其位置由路径名指定。
您还可以使用变量名作为选项在服务器启动时设置服务器系统变量的值。
要为服务器系统变量赋值,请使用表单选项
。
例如,
将
变量
设置
为384MB的值。
--
var_name
=value
--sort_buffer_size=384M
sort_buffer_size
为变量赋值时,MySQL可能会自动更正该值以保持在给定范围内,或者如果仅允许某些值,则将值调整为最接近的允许值。
要限制在运行时可以使用
SET
语句
设置系统变量的
最大值,请
在服务器启动时
使用表单选项指定此最大值
。
--maximum-
var_name
=value
您可以使用该
SET
语句
在运行时更改大多数系统变量的值
。
请参见
第13.7.5.1节“变量赋值的SET语法”
。
第5.1.8节“服务器系统变量” 提供了所有变量的完整描述,以及在服务器启动和运行时设置它们的其他信息。 有关更改系统变量的信息,请参见 第5.1.1节“配置服务器” 。
--help
,
-?
属性 | 值 |
---|---|
命令行格式 | --help |
属性 | 值 |
---|---|
命令行格式 | --allow-suspicious-udfs[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
此选项控制是否
xxx
可以加载
仅包含
主函数符号的
用户定义函数
。
默认情况下,该选项处于关闭状态,只能加载至少具有一个辅助符号的UDF;
这可以防止尝试从包含合法UDF的共享对象文件加载函数。
请参见
第29.4.2.6节“UDF安全注意事项”
。
属性 | 值 |
---|---|
命令行格式 | --ansi |
使用标准(ANSI)SQL语法而不是MySQL语法。
要更精确地控制服务器SQL模式,请改用该
--sql-mode
选项。
请参见
第1.8节“MySQL标准符合性”
和
第5.1.11节“服务器SQL模式”
。
--basedir=
,
dir_name
-b
dir_name
属性 | 值 |
---|---|
命令行格式 | --basedir=dir_name |
系统变量 | basedir |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 目录名称 |
默认值 (> = 8.0.2) | parent of mysqld installation directory |
默认值 (<= 8.0.1) | configuration-dependent default |
MySQL安装目录的路径。
此选项设置
basedir
系统变量。
服务器可执行文件在启动时确定其自己的完整路径名,并使用其所在目录的父级作为默认
basedir
值。
这反过来使服务器能够
basedir
在搜索与服务器相关的信息时
使用它
,例如
share
包含错误消息
的
目录。
--character-set-client-handshake
属性 | 值 |
---|---|
命令行格式 | --character-set-client-handshake[={OFF|ON}] |
类型 | 布尔 |
默认值 | ON |
不要忽略客户端发送的字符集信息。
要忽略客户端信息并使用默认服务器字符集,请使用
--skip-character-set-client-handshake
;
这使得MySQL的行为与MySQL 4.0相似。
--chroot=
,
dir_name
-r
dir_name
属性 | 值 |
---|---|
命令行格式 | --chroot=dir_name |
类型 | 目录名称 |
使用
系统调用
在启动期间
将
mysqld
服务器置于封闭环境中
chroot()
。
这是建议的安全措施。
使用此选项有点限制
LOAD
DATA
和
SELECT
...
INTO OUTFILE
。
属性 | 值 |
---|---|
命令行格式 | --console |
平台特定 | 视窗 |
(仅限Windows。)导致默认错误日志目标为控制台。 这会影响将自己的输出目标基于默认目标的日志编写器。 请参见 第5.4.2节“错误日志” 。 如果使用此选项, mysqld 不会关闭控制台窗口。
--console
优先于
--log-error
两者都给出。
属性 | 值 |
---|---|
命令行格式 | --core-file[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
如果
mysqld
死了,
写一个核心文件
。
核心文件的名称和位置取决于系统。
在Linux上,名为的核心文件
被写入进程的当前工作目录,
mysqld
是数据目录。
表示服务器进程的进程ID。
在macOS上,名为的核心文件将
写入
目录。
在Solaris上,使用
coreadm
命令指定写入核心文件的位置以及如何命名。
core.
pid
pid
core.
pid
/cores
对于某些系统,要获取核心文件,还必须指定
mysqld_safe
--core-file-size
选项
。
请参见
第4.3.2节“
mysqld_safe
- MySQL服务器启动脚本”
。
在某些系统(如Solaris)上,如果您还使用该
选项
,则不会获得核心文件
。
可能存在其他限制或限制。
例如,可能需要执行
ulimit -c unlimited
--user
在启动服务器之前
。
请参阅系统文档。
该
innodb_buffer_pool_in_core_file
变量可用于减少支持它的操作系统上的核心文件的大小。
有关更多信息,请参见
第15.8.3.8节“从核心文件中排除缓冲池页面”
。
--daemonize
,
-D
属性 | 值 |
---|---|
命令行格式 | --daemonize[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
此选项使服务器作为传统的分叉守护程序运行,允许它与使用systemd进行过程控制的操作系统一起使用。 有关更多信息,请参见 第2.5.9节“使用systemd管理MySQL服务器” 。
--daemonize
与
--initialize
和
是互斥的
--initialize-insecure
。
如果使用该
--daemonize
选项
启动服务器
但未连接到tty设备,
--log-error=""
则在缺少显式日志记录选项的情况下使用
缺省错误日志
记录选项,以将错误输出定向到缺省日志文件。
-D
是...的同义词
--daemonize
。
--datadir=
,
dir_name
-h
dir_name
MySQL服务器数据目录的路径。
此选项设置
datadir
系统变量。
请参阅该变量的说明。
--debug[=
,
debug_options
]-# [
debug_options
]
属性 | 值 |
---|---|
命令行格式 | --debug[=debug_options] |
系统变量 | debug |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (Windows) | d:t:i:O,\mysqld.trace |
默认值 (Unix) | d:t:i:o,/tmp/mysqld.trace |
如果MySQL配置了
CMake
选项,您可以使用此选项获取
mysqld
正在执行
的跟踪文件
。
典型的
字符串是
。
默认是
在Unix和
-DWITH_DEBUG=1
debug_options
d:t:o,
file_name
d:t:i:o,/tmp/mysqld.trace
d:t:i:O,\mysqld.trace
Windows上。
使用
-DWITH_DEBUG=1
调试支持配置MySQL使您
--debug="d,parser_debug"
可以在启动服务器时
使用该
选项。
这会导致用于处理SQL语句的Bison解析器将解析器跟踪转储到服务器的标准错误输出。
通常,此输出将写入错误日志。
可以多次给出该选项。
以先前值
开头
+
或
-
添加或减去的值。
例如,
将值设置为
。
--debug=T
--debug=+P
P:T
有关更多信息,请参见 第29.5.4节“DBUG包” 。
属性 | 值 |
---|---|
命令行格式 | --debug-sync-timeout[=#] |
类型 | 整数 |
控制是否启用用于测试和调试的Debug Sync工具。
使用Debug Sync要求使用
CMake
选项
配置MySQL
(请参见
第2.9.4节“MySQL源配置选项”
)。
如果未编译Debug Sync,则此选项不可用。
选项值是以秒为单位的超时。
默认值为0,禁用Debug Sync。
要启用它,请指定大于0的值;
此值也将成为各个同步点的默认超时。
如果给出的选项没有值,则超时设置为300秒。
-DENABLE_DEBUG_SYNC=1
有关Debug Sync工具以及如何使用同步点的说明,请参阅 MySQL Internals:Test Synchronization 。
属性 | 值 |
---|---|
命令行格式 | --default-storage-engine=name |
系统变量 | default_storage_engine |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | InnoDB |
设置表的默认存储引擎。
请参见
第16章,
备用存储引擎
。
此选项仅为永久表设置存储引擎。
要为
TEMPORARY
表
设置存储引擎
,请设置
default_tmp_storage_engine
系统变量。
如果在服务器启动时禁用默认存储引擎,则必须将永久性和
TEMPORARY
表
的默认引擎设置为
其他引擎,否则服务器将无法启动。
属性 | 值 |
---|---|
命令行格式 | --default-time-zone=name |
类型 | 串 |
设置默认服务器时区。
此选项设置全局
time_zone
系统变量。
如果未指定此选项,则默认时区与系统时区相同(由
system_time_zone
系统变量
的值给定)
。
--defaults-extra-file=
file_name
在全局选项文件之后读取此选项文件,但在用户选项文件之前(在Unix上)。
如果文件不存在或无法访问,则会发生错误。
file_name
如果作为相对路径名而不是完整路径名给出,则相对于当前目录进行解释。
如果使用它,它必须是命令行上的第一个选项。
有关此选项和其他选项文件选项的其他信息,请参见 第4.2.2.3节“影响选项文件处理的命令行选项” 。
只读给定的选项文件。
如果文件不存在或无法访问,则会发生错误。
file_name
如果作为相对路径名而不是完整路径名给出,则相对于当前目录进行解释。
例外:即使有
--defaults-file
,
mysqld
读取
mysqld-auto.cnf
。
如果使用它,这必须是命令行上的第一个选项,除非服务器以
--defaults-file
和
--install
(或
--install-manual
)选项启动,
--install
(或
--install-manual
)必须是第一个。
有关此选项和其他选项文件选项的其他信息,请参见 第4.2.2.3节“影响选项文件处理的命令行选项” 。
不仅要读取常用选项组,还要读取通常名称和后缀的组
str
。
例如,
mysqld
通常会读取该
[mysqld]
组。
如果
--defaults-group-suffix=_other
给出
了该
选项,
mysqld
也会读取该
[mysqld_other]
组。
有关此选项和其他选项文件选项的其他信息,请参见 第4.2.2.3节“影响选项文件处理的命令行选项” 。
属性 | 值 |
---|---|
命令行格式 | --des-key-file=file_name |
弃用 | 是(在8.0.3中删除) |
在MySQL 8.0.3中删除了此选项。
--early-plugin-load=
plugin_list
属性 | 值 |
---|---|
命令行格式 | --early-plugin-load=plugin_list |
类型 | 串 |
默认值 | empty string |
此选项告诉服务器在加载强制内置插件之前和存储引擎初始化之前要加载哪些插件。
如果
--early-plugin-load
给出了
多个
选项,则仅使用最后一个选项。
选项值是以分号分隔的
值
和
值
列表
。
每个
都是要加载的插件的名称,并且
是包含插件代码的库文件的名称。
如果插件库的名称没有任何前面的插件名称,则服务器会加载库中的所有插件。
服务器在
系统变量
指定的目录中查找插件库文件
。
name
=
plugin_library
plugin_library
name
plugin_library
plugin_dir
例如,如果插件名为
myplug1
和
myplug2
有库文件
myplug1.so
和
myplug2.so
,使用此选项来执行早期的插件加载:
外壳> mysqld --early-plugin-load="myplug1=myplug1.so;myplug2=myplug2.so"
参数值周围使用引号,因为否则
;
某些命令解释器会将
分号(
)解释为特殊字符。
(例如,Unix shell将其视为命令终止符。)
每个命名的插件都会提前加载,
仅
用于
mysqld
的单次调用
。
重新启动后,插件不会提前加载,除非
--early-plugin-load
再次使用。
如果使用
--initialize
或
启动服务器
--initialize-insecure
,
--early-plugin-load
则未加载
指定的插件
。
如果运行服务器,则
--help
指定的插件
--early-plugin-load
已加载但未初始化。
此行为可确保插件选项显示在帮助消息中。
默认
--early-plugin-load
值为空。
要加载
keyring_file
插件,必须使用
--early-plugin-load
具有非空值
的显式
选项。
该
InnoDB
表空间加密功能依赖于
keyring_file
插件加密密钥管理和
keyring_file
插件之前必须存储引擎初始化加载,以便
InnoDB
为加密表恢复。
想要
keyring_file
在启动时加载插件的
管理员
应使用适当的非空选项值(例如,
keyring_file.so
在Unix和类Unix系统以及
keyring_file.dll
Windows上)。
有关
InnoDB
表空间加密的
信息
,请参见
第15.6.3.9节“InnoDB静态数据加密”
。
有关插件加载的一般信息,请参见
第5.6.1节“安装和卸载插件”
。
属性 | 值 |
---|---|
命令行格式 | --enable-named-pipe |
平台特定 | 视窗 |
启用对命名管道的支持。 此选项仅适用于Windows。
属性 | 值 |
---|---|
命令行格式 | --event-scheduler[=value] |
系统变量 | event_scheduler |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 (> = 8.0.3) | ON |
默认值 (<= 8.0.2) | OFF |
有效值 |
|
启用或禁用,启动或停止事件调度程序。
有关详细信息,请参阅
该
--event-scheduler
选项
。
--exit-info[=
,
flags
]-T [
flags
]
属性 | 值 |
---|---|
命令行格式 | --exit-info[=flags] |
类型 | 整数 |
这是一个不同标志的位掩码,可用于调试 mysqld 服务器。 除非您 确切 知道它的作用, 否则请勿使用此选项 !
属性 | 值 |
---|---|
命令行格式 | --external-locking[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
启用外部锁定(系统锁定),默认情况下禁用。
如果在
lockd
不能完全工作的系统(例如Linux)
上使用此选项
,则
mysqld
很容易
死锁。
要显式禁用外部锁定,请使用
--skip-external-locking
。
外部锁定仅影响
MyISAM
表访问。
有关更多信息,包括可以使用和不可以使用的条件,请参见
第8.11.5节“外部锁定”
。
在每个SQL语句之后刷新(同步)对磁盘的所有更改。 通常,MySQL仅在每个SQL语句之后写入对磁盘的所有更改,并让操作系统处理与磁盘的同步。 请参见 第B.4.3.3节“如果MySQL不断崩溃该怎么办” 。
如果
--flush
指定,则值
flush_time
无关紧要,并且更改为
flush_time
对刷新行为没有影响。
属性 | 值 |
---|---|
命令行格式 | --gdb[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
安装中断处理程序
SIGINT
(停止所需
的mysqld
与
^C
设置断点),并且禁止堆栈跟踪和核心文件处理。
请参见
第29.5节“调试和移植MySQL”
。
在Windows上,此选项还会禁止用于实现
RESTART
语句
的分叉
:分叉使一个进程充当另一个进程的监视器,另一个进程充当服务器。
但是,分叉使得确定要附加的服务器进程以进行调试更加困难,因此启动服务器时会
--gdb
抑制分叉。
对于使用此选项启动的服务器,
RESTART
只需退出并且不重新启动。
在非调试设置中,
--no-monitor
可用于抑制分支监视器进程。
属性 | 值 |
---|---|
命令行格式 | --general-log[={OFF|ON}] |
系统变量 | general_log |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
指定初始常规查询日志状态。
如果没有参数或参数为1,则该
--general-log
选项将启用日志。
如果省略或参数为0,则该选项将禁用日志。
--initialize
,
-I
属性 | 值 |
---|---|
命令行格式 | --initialize[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
此选项用于通过创建数据目录并填充
mysql
系统数据库中
的表来初始化MySQL安装
。
有关更多信息,请参见
第2.10.1节“初始化数据目录”
。
启动服务器时
--initialize
,某些功能不可用,这限制了该
--init-file
选项
指定的任何文件中允许的语句
。
有关更多信息,请参阅该选项的说明。
此外,
disabled_storage_engines
系统变量无效。
--ndbcluster
与...一起使用时,
该
选项将被忽略
--initialize
。
--initialize
是互斥的
--daemonize
。
-I
是...的同义词
--initialize
。
属性 | 值 |
---|---|
命令行格式 | --initialize-insecure[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
此选项用于通过创建数据目录并填充
mysql
系统数据库中
的表来初始化MySQL安装
。
这个选项意味着
--initialize
。
有关更多信息,请参阅该选项的说明以及
第2.10.1节“初始化数据目录”
。
--initialize-insecure
是互斥的
--daemonize
。
在启动时从此文件中读取SQL语句。 每个声明必须在一行上,不应包含注释。
如果服务器是使用
--initialize
或
--initialize-insecure
选项
启动的
,则它在bootstap模式下运行,并且某些功能不可用,这限制了文件中允许的语句。
这些包括与帐户管理(例如
CREATE
USER
或
GRANT
),复制和全局事务标识符
相关的语句
。
请参见
第17.1.3节“使用全局事务标识符复制”
。
--innodb-
xxx
设置
InnoDB
存储引擎
的选项
。
这些
InnoDB
选项在
第15.13节“InnoDB启动选项和系统变量”
中列出
。
属性 | 值 |
---|---|
命令行格式 | --install [service_name] |
平台特定 | 视窗 |
(仅限Windows)将服务器安装为在Windows启动期间自动启动的Windows服务。
MySQL
如果没有
service_name
给出值,则
默认服务名称
。
有关更多信息,请参见
第2.3.5.8节“将MySQL作为Windows服务启动”
。
如果使用
--defaults-file
和
--install
选项
启动服务器
,则
--install
必须先进行。
--install-manual
[
service_name
]
属性 | 值 |
---|---|
命令行格式 | --install-manual [service_name] |
平台特定 | 视窗 |
(仅限Windows)将服务器安装为必须手动启动的Windows服务。
它在Windows启动期间不会自动启动。
MySQL
如果没有
service_name
给出值,则
默认服务名称
。
有关更多信息,请参见
第2.3.5.8节“将MySQL作为Windows服务启动”
。
如果使用
--defaults-file
和
--install-manual
选项
启动服务器
,则
--install-manual
必须先进行。
--language=
lang_name
,
-L lang_name
属性 | 值 |
---|---|
命令行格式 | --language=name |
弃用 |
是;
使用
lc-messages-dir
|
系统变量 | language |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 目录名称 |
默认值 | /usr/local/mysql/share/mysql/english/ |
用于错误消息的语言。
lang_name
可以作为语言名称或作为安装语言文件的目录的完整路径名。
请参见
第10.11节“设置错误消息语言”
。
--lc-messages-dir
并且
--lc-messages
应该使用,而不是
--language
,其被弃用(并作为别名处理
--lc-messages-dir
)。
该
--language
选项将在未来的MySQL版本中删除。
属性 | 值 |
---|---|
命令行格式 | --large-pages[={OFF|ON}] |
系统变量 | large_pages |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
平台特定 | Linux的 |
类型 | 布尔 |
默认值 | OFF |
某些硬件/操作系统体系结构支持大于默认值的内存页(通常为4KB)。 此支持的实际实现取决于底层硬件和操作系统。 执行大量内存访问的应用程序可能会因为减少了转换后备缓冲区(TLB)丢失而使用大页面来提高性能。
MySQL支持Linux实现大页面支持(在Linux中称为HugeTLB)。
请参见
第8.12.3.2节“启用大页面支持”
。
有关大页面的Solaris支持,请参阅该
--super-large-pages
选项
的说明
。
--large-pages
默认情况下禁用。
属性 | 值 |
---|---|
命令行格式 | --lc-messages=name |
系统变量 | lc_messages |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | en_US |
用于错误消息的语言环境。
默认是
en_US
。
服务器将参数转换为语言名称,并将其与值组合
--lc-messages-dir
以生成错误消息文件的位置。
请参见
第10.11节“设置错误消息语言”
。
属性 | 值 |
---|---|
命令行格式 | --lc-messages-dir=dir_name |
系统变量 | lc_messages_dir |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 目录名称 |
错误消息所在的目录。
服务器将该值与值一起使用,
--lc-messages
以生成错误消息文件的位置。
请参见
第10.11节“设置错误消息语言”
。
属性 | 值 |
---|---|
命令行格式 | --local-service |
(仅限Windows)
--local-service
服务名称后面的选项会导致服务器使用
LocalService
具有有限系统权限
的
Windows帐户
运行
。
如果两个
--defaults-file
和
--local-service
给出以下服务名称,他们可以在任何顺序。
请参见
第2.3.5.8节“将MySQL作为Windows服务启动”
。
将默认错误日志目标设置为指定文件。 这会影响将自己的输出目标基于默认目标的日志编写器。 请参见 第5.4.2节“错误日志” 。
如果该选项没有命名文件,则Unix和类Unix系统上的默认错误日志目标是
数据目录中
指定的文件
。
除非
host_name
.err--pid-file
指定
了该
选项
,否则Windows上的默认目标是相同的
。
在这种情况下,文件名是PID文件基本名称,
.err
在数据目录中
带有后缀
。
如果该选项命名文件,则默认目标是该文件(
.err
如果名称没有后缀,则添加后缀),位于数据目录下,除非给出绝对路径名以指定其他位置。
如果错误日志输出无法重定向到错误日志文件,则会发生错误并且启动失败。
在Windows上,
--console
优先于
--log-error
两者都给出。
在这种情况下,默认错误日志目标是控制台而不是文件。
属性 | 值 |
---|---|
命令行格式 | --log-isam[=file_name] |
类型 | 文件名 |
记录
MyISAM
对此文件的
所有
更改(仅在调试时使用
MyISAM
)。
--log-queries-not-using-indexes
属性 | 值 |
---|---|
命令行格式 | --log-queries-not-using-indexes[={OFF|ON}] |
系统变量 | log_queries_not_using_indexes |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
如果在启用慢查询日志的情况下使用此选项,则会记录预期检索所有行的查询。 请参见 第5.4.5节“慢查询日志” 。 此选项并不一定意味着不使用索引。 例如,使用完整索引扫描的查询使用索引但会被记录,因为索引不会限制行数。
属性 | 值 |
---|---|
命令行格式 | --log-raw[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
写入通用查询日志,慢查询日志和二进制日志的某些语句中的密码将由服务器重写,而不是以纯文本形式发生。
通过使用该
--log-raw
选项
启动服务器,可以为通用查询日志禁止密码重写
。
此选项可用于诊断目的,以查看服务器收到的语句的确切文本,但出于安全原因,建议不要将其用于生产用途。
如果安装了查询重写插件,该
--log-raw
选项会影响语句日志记录,如下所示:
有关更多信息,请参见 第6.1.2.3节“密码和日志记录” 。
属性 | 值 |
---|---|
命令行格式 | --log-short-format[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
如果已激活,则将较少的信息记录到慢速查询日志中。
属性 | 值 |
---|---|
命令行格式 | --log-tc=file_name |
类型 | 文件名 |
默认值 | tc.log |
内存映射事务协调程序日志文件的名称(适用于禁用二进制日志时影响多个存储引擎的XA事务)。
默认名称是
tc.log
。
如果未作为完整路径名提供,则在数据目录下创建该文件。
此选项未使用。
属性 | 值 |
---|---|
命令行格式 | --log-tc-size=# |
类型 | 整数 |
默认值 | 6 * page size |
最低价值 | 6 * page size |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
内存映射事务协调器日志的大小(以字节为单位)。 默认值和最小值是页面大小的6倍,值必须是页面大小的倍数。
--log-warnings[=
,
level
]-W [
level
]
属性 | 值 |
---|---|
命令行格式 | --log-warnings[=#] |
弃用 | 是(在8.0.3中删除) |
系统变量 | log_warnings |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 2 |
最低价值 | 0 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
在MySQL 8.0.3中删除了此选项。
请改用
log_error_verbosity
系统变量。
属性 | 值 |
---|---|
命令行格式 | --low-priority-updates[={OFF|ON}] |
系统变量 | low_priority_updates |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
得到表修改操作(
INSERT
,
REPLACE
,
DELETE
,
UPDATE
),比选择较低优先级。
这也可以使用
{INSERT |
REPLACE | DELETE | UPDATE} LOW_PRIORITY ...
降低仅一个查询的优先级,或通过
SET
LOW_PRIORITY_UPDATES=1
更改一个线程中的优先级来完成。
这会影响只使用表级锁(仅存储引擎
MyISAM
,
MEMORY
,
MERGE
)。
请参见
第8.11.2节“表锁定问题”
。
--min-examined-row-limit=
number
属性 | 值 |
---|---|
命令行格式 | --min-examined-row-limit=# |
系统变量 | min_examined_row_limit |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
设置此选项后,检查少于
number
行的查询不会写入慢查询日志。
默认值为0。
属性 | 值 |
---|---|
命令行格式 | --memlock[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
将 mysqld 进程 锁定 在内存中。 如果您遇到操作系统导致 mysqld 交换到磁盘 的问题,此选项可能会有所帮助 。
--memlock
适用于支持
mlockall()
系统调用
的
系统;
这包括Solaris,大多数使用2.4或更高内核的Linux发行版,以及其他Unix系统。
在Linux系统上,您可以
mlockall()
通过检查系统
mman.h
文件中
是否定义它来判断是否支持(以及此选项)
,如下所示:
外壳> grep mlockall /usr/include/sys/mman.h
如果
mlockall()
支持,您应该在上一个命令的输出中看到类似以下内容:
extern int mlockall(int __flags)__ THROW;
使用此选项可能需要您运行服务器
root
,出于安全原因,这通常不是一个好主意。
请参见
第6.1.5节“如何以普通用户身份运行MySQL”
。
在Linux和其他系统上,您可以
root
通过更改
limits.conf
文件
来避免运行服务器的需要
。
请参见
第8.12.3.2节“启用大页面支持”中
有关
memlock
限制的说明
。
您不得尝试在不支持
mlockall()
系统调用
的
系统
上使用此选项
;
如果你这样做,
mysqld
很可能会在你尝试启动时崩溃。
属性 | 值 |
---|---|
命令行格式 | --myisam-block-size=# |
类型 | 整数 |
默认值 | 1024 |
最低价值 | 1024 |
最大价值 | 16384 |
用于
MyISAM
索引页
的块大小
。
--myisam-recover-options[=
option
[,option
]...]]
属性 | 值 |
---|---|
命令行格式 | --myisam-recover-options[=name] |
类型 | 列举 |
默认值 | OFF |
有效值 |
|
设置
MyISAM
存储引擎恢复模式。
该选项值的值的任意组合
OFF
,
DEFAULT
,
BACKUP
,
FORCE
,或
QUICK
。
如果指定多个值,请用逗号分隔。
指定不带参数的选项与指定相同
DEFAULT
,并使用显式值指定
""
禁用恢复(与值相同
OFF
)。
如果启用了恢复,则每次
mysqld
打开一个
MyISAM
表,它检查表是否标记为崩溃或未正确关闭。
(最后一个选项仅在禁用外部锁定的情况下
。)如果是这种情况,
mysqld
尝试修复它。
在桌子上检查。
如果表被破坏,
mysqld
以下选项会影响修复的工作方式。
选项 | 描述 |
---|---|
OFF |
没有恢复。 |
DEFAULT |
无需备份,强制或快速检查即可恢复。 |
BACKUP |
如果在恢复期间更改了数据文件,请将
文件
的备份保存
为
。
|
FORCE |
即使我们从
.MYD
文件中
丢失多行,也要运行恢复
。
|
QUICK |
如果没有任何删除块,请不要检查表中的行。 |
在服务器自动修复表之前,它会将有关修复的注释写入错误日志。
如果您希望能够在没有用户干预的情况下从大多数问题中恢复,则应使用这些选项
BACKUP,FORCE
。
即使某些行被删除,这也会强制修复表,但它会将旧数据文件保留为备份,以便您以后可以检查发生的情况。
请参见 第16.2.1节“MyISAM启动选项” 。
不要读任何选项文件。
如果由于从选项文件中读取未知选项而导致程序启动失败,
--no-defaults
则可用于防止它们被读取。
如果使用它,它必须是命令行上的第一个选项。
有关此选项和其他选项文件选项的其他信息,请参见 第4.2.2.3节“影响选项文件处理的命令行选项” 。
属性 | 值 |
---|---|
命令行格式 | --no-dd-upgrade[={OFF|ON}] |
介绍 | 8.0.4 |
弃用 | 8.0.16 |
类型 | 布尔 |
默认值 | OFF |
从MySQL 8.0.16开始,不推荐使用此选项。
它被该
--upgrade
选项
取代,该
选项可以更好地控制数据字典和服务器升级行为。
防止在MySQL服务器启动过程中自动升级数据字典表。 此选项通常用于在将现有安装就地升级到较新的MySQL版本后启动MySQL服务器,其中可能包括对数据字典表定义的更改。
什么时候
--no-dd-upgrade
指定了,并且服务器发现其数据字典的预期版本与数据字典本身中存储的版本不同,则启动失败并显示错误,指出禁止数据字典升级;
[错误] [MY-011091] [服务器]禁止数据字典升级 命令行选项'--no_dd_upgrade'。 [错误] [MY-010020] [服务器]数据字典初始化失败。
在正常启动期间,将服务器的数据字典版本与存储在数据字典中的版本进行比较,以确定是否应该升级数据字典表定义。 如果需要升级并且支持升级,则服务器将创建具有更新定义的数据字典表,将持久化元数据复制到新表,以原子方式将旧表替换为新表,并重新初始化数据字典。 如果不需要升级,则在不更新数据字典表的情况下继续启动。
属性 | 值 |
---|---|
命令行格式 | --no-monitor[={OFF|ON}] |
介绍 | 8.0.12 |
平台特定 | 视窗 |
类型 | 布尔 |
默认值 | OFF |
(仅限Windows)。
此选项禁止用于实现
RESTART
语句
的分叉
:分叉使一个进程充当另一个进程的监视器,充当服务器。
对于使用此选项启动的服务器,
RESTART
只需退出并且不重新启动。
--no-monitor
在MySQL 8.0.12之前不可用。
该
--gdb
选项可用作解决方法。
属性 | 值 |
---|---|
命令行格式 | --old-style-user-limits[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
启用旧式用户限制。
(在MySQL 5.0.3之前,帐户资源限制是针对用户连接的每个主机而不是
user
表
中的每个帐户行单独计算的
。)请参见
第6.2.20节“设置帐户资源限制”
。
--performance-schema-xxx
配置性能架构选项。 有关详细信息,请参见 第26.14节“性能模式命令选项” 。
服务器应在其中写入其进程ID的文件的路径名。
服务器在数据目录中创建文件,除非给出绝对路径名来指定不同的目录。
如果指定此选项,则必须指定值。
如果未指定此选项,MySQL将使用默认值
,其中
host_name
.pidhost_name
是主机的名称。
其他程序(如 mysqld_safe )使用进程标识文件 来确定服务器的进程标识。 在Windows上,此变量还会影响默认错误日志文件名。 请参见 第5.4.2节“错误日志” 。
指定与服务器插件有关的选项。
例如,许多存储引擎可以构建为插件,对于这样的引擎,可以使用
--plugin
前缀
指定它们的选项
。
因此,
可以将
--innodb-file-per-table
选项
InnoDB
指定为
--plugin-innodb-file-per-table
。
对于可以启用或禁用的布尔选项,也支持
--skip
前缀和其他替代格式(请参见
第4.2.2.4节“程序选项修饰符”
)。
例如,
--skip-plugin-innodb-file-per-table
禁用
innodb-file-per-table
。
--plugin
前缀
的基本原理
是,如果名称与内置服务器选项冲突,则可以明确指定插件选项。
例如,如果一个插件编写者命名插件
“
sql
”
并实现
“
模式
”
选项,则选项名称可能是
--sql-mode
,这将与同名的内置选项冲突。
在这种情况下,将解决对冲突名称的引用,以支持内置选项。
为避免歧义,用户可以将插件选项指定为
--plugin-sql-mode
。
使用的
--plugin
建议使用插件选项的前缀以避免任何歧义问题。
属性 | 值 |
---|---|
命令行格式 | --plugin-load=plugin_list |
系统变量 | plugin_load |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
此选项告诉服务器在启动时加载指定的插件。
如果
--plugin-load
给出了
多个
选项,则仅使用最后一个选项。
可以使用
--plugin-load-add
选项
指定要加载的其他插件
。
选项值是以分号分隔的
值
和
值
列表
。
每个
都是要加载的插件的名称,并且
是包含插件代码的库文件的名称。
如果插件库的名称没有任何前面的插件名称,则服务器会加载库中的所有插件。
服务器在
系统变量
指定的目录中查找插件库文件
。
name
=
plugin_library
plugin_library
name
plugin_library
plugin_dir
例如,如果插件名为
myplug1
和
myplug2
有库文件
myplug1.so
和
myplug2.so
,使用此选项来执行早期的插件加载:
外壳> mysqld --plugin-load="myplug1=myplug1.so;myplug2=myplug2.so"
这里的参数值使用引号,因为否则semicolon(
;
)被某些命令解释器解释为特殊字符。
(例如,Unix shell将其视为命令终止符。)
每个命名插件
都只
加载一次
mysqld
。
重新启动后,除非
--plugin-load
再次使用,
否则不会加载插件
。
这
与之
相反
INSTALL
PLUGIN
,它为
mysql.plugins
表
添加一个条目,以便
为每个正常的服务器启动加载插件。
在正常启动时,服务器通过读取
mysql.plugins
系统表
来确定要加载哪些插件
。
如果使用该
--skip-grant-tables
选项
启动服务器
,则不会查询该
mysql.plugins
表,也不会加载其中列出的插件。
--plugin-load
即使
--skip-grant-tables
给出
插件也可以加载插件
。
--plugin-load
还可以在启动时加载无法在运行时加载的插件。
有关插件加载的其他信息,请参见 第5.6.1节“安装和卸载插件” 。
属性 | 值 |
---|---|
命令行格式 | --plugin-load-add=plugin_list |
系统变量 | plugin_load_add |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
此选项补充了该
--plugin-load
选项。
--plugin-load-add
将插件或插件添加到要在启动时加载的插件集。
参数格式与for相同
--plugin-load
。
--plugin-load-add
可以用来避免将一大组插件指定为一个长的笨重的
--plugin-load
参数。
--plugin-load-add
可以在没有的情况下给出
--plugin-load
,但
--plugin-load-add
之前出现的
任何实例
--plugin-load
。
没有效果,因为
--plugin-load
重置要加载的插件集。
换句话说,这些选项:
--plugin-load = x --plugin-load-add = y
等同于此选项:
--plugin负载= “X; Y”
但这些选择:
--plugin-load-add = y --plugin-load = x
等同于此选项:
--plugin负荷= X
有关插件加载的其他信息,请参见 第5.6.1节“安装和卸载插件” 。
--port=
,
port_num
-P
port_num
侦听TCP / IP连接时使用的端口号。
在Unix和类Unix系统上,除非服务器由
root
操作系统用户
启动,否则端口号必须为1024或更高
。
将此选项设置为0会导致使用默认值。
属性 | 值 |
---|---|
命令行格式 | --port-open-timeout=# |
类型 | 整数 |
默认值 | 0 |
在某些系统上,当服务器停止时,TCP / IP端口可能不会立即可用。 如果服务器之后快速重新启动,则尝试重新打开端口可能会失败。 此选项指示服务器在无法打开时等待TCP / IP端口空闲的秒数。 默认是不等待。
打印程序名称以及从选项文件中获取的所有选项。
密码值被屏蔽。
如果使用它,它必须是命令行上的第一个选项,除了它可以在
--defaults-file
或
之后立即使用
--defaults-extra-file
。
有关此选项和其他选项文件选项的其他信息,请参见 第4.2.2.3节“影响选项文件处理的命令行选项” 。
属性 | 值 |
---|---|
命令行格式 | --remove [service_name] |
平台特定 | 视窗 |
(仅限Windows)删除MySQL Windows服务。
MySQL
如果没有
service_name
给出值,则
默认服务名称
。
有关更多信息,请参见
第2.3.5.8节“将MySQL作为Windows服务启动”
。
属性 | 值 |
---|---|
命令行格式 | --safe-user-create[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
如果启用此选项,则
GRANT
除非用户具有
系统表或表中任何列
的
INSERT
权限,
否则
用户无法使用该
语句
创建新的MySQL用户
mysql.user
。
如果您希望用户能够创建具有该用户有权授予的权限的新用户,则应授予该用户以下权限:
GRANT INSERT(用户)ON mysql.user TO'user_name
'@'host_name
';
这可确保用户无法直接更改任何权限列,但必须使用该
GRANT
语句为其他用户授予权限。
属性 | 值 |
---|---|
命令行格式 | --secure-auth[={OFF|ON}] |
弃用 | 是(在8.0.3中删除) |
系统变量 | secure_auth |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
有效值 | ON |
在MySQL 8.0.3中删除了此选项。
属性 | 值 |
---|---|
命令行格式 | --secure-file-priv=dir_name |
系统变量 | secure_file_priv |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | platform specific |
有效值 |
|
该选项设置
secure_file_priv
系统变量,它用于限制数据导入和导出操作,如那些由执行的效果
LOAD
DATA
和
SELECT
... INTO
OUTFILE
报表和
LOAD_FILE()
功能。
有关更多信息,请参阅的说明
secure_file_priv
。
属性 | 值 |
---|---|
命令行格式 | --shared-memory[={OFF|ON}] |
系统变量 | shared_memory |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
平台特定 | 视窗 |
类型 | 布尔 |
默认值 | OFF |
启用本地客户端的共享内存连接。 此选项仅在Windows上可用。
--shared-memory-base-name=
name
属性 | 值 |
---|---|
命令行格式 | --shared-memory-base-name=name |
系统变量 | shared_memory_base_name |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
平台特定 | 视窗 |
类型 | 串 |
默认值 | MYSQL |
用于共享内存连接的共享内存的名称。
此选项仅在Windows上可用。
默认名称是
MYSQL
。
名称区分大小写。
关闭在
MyISAM
表格
上同时选择和插入的功能
。
(仅当您认为已在此功能中发现错误时才使用此选项。)请参见
第8.11.3节“并发插入”
。
属性 | 值 |
---|---|
命令行格式 |
|
打开事件调度程序
OFF
。
这与禁用事件调度程序不同,后者需要设置
--event-scheduler=DISABLED
;
看到
该
--event-scheduler
选项
,以获取更多信息。
属性 | 值 |
---|---|
命令行格式 | --skip-grant-tables[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
此选项使服务器在不使用权限系统的情况下启动,这使得任何对服务器具有访问权限的人都可以
无限制地访问所有数据库
。
通过
从系统shell
执行
mysqladmin flush-privileges
或
mysqladmin reload
命令,或者
FLUSH PRIVILEGES
在连接到服务器后
发出MySQL
语句,
可以使正在运行的服务器再次开始使用授权表
。
如果使用
--skip-grant-tables
禁用身份验证检查
的
选项
启动服务器
,则服务器会
--skip-networking
自动
启用
以防止远程连接。
此选项还会导致服务器在其启动过程中禁止加载随
INSTALL
PLUGIN
语句
一起安装的用户定义函数(UDF),计划事件和插件
。
要使插件无论如何都要加载,请使用该
--plugin-load
选项。
--skip-grant-tables
也会导致
disabled_storage_engines
系统变量无效。
此选项不会导致在服务器启动期间禁止加载服务器组件。
FLUSH PRIVILEGES
可能由启动后执行的其他操作隐式执行(从而导致服务器再次开始使用授权表)。
例如,
mysql_upgrade
在升级过程中刷新权限。
属性 | 值 |
---|---|
命令行格式 | --skip-host-cache |
禁用内部主机缓存以实现更快的名称到IP解析。 禁用缓存后,服务器会在每次客户端连接时执行DNS查找。
使用
--skip-host-cache
类似于将
host_cache_size
系统变量
设置
为0,但
host_cache_size
更灵活,因为它还可用于在运行时调整大小,启用或禁用主机缓存,而不仅仅是在服务器启动时。
如果使用启动服务器
--skip-host-cache
,则不会阻止更改值
host_cache_size
,但此类更改不起作用,即使
host_cache_size
设置为大于0,
也不会重新启用缓存
。
有关主机缓存如何工作的更多信息,请参见 第8.12.4.2节“DNS查找优化和主机缓存” 。
禁用
InnoDB
存储引擎。
在这种情况下,由于默认存储引擎是
InnoDB
,服务器将不会启动,除非您还使用
--default-storage-engine
和
--default-tmp-storage-engine
将默认值设置为永久存储引擎和
TEMPORARY
表的
其他引擎
。
该
InnoDB
存储引擎不能被禁用,而
--skip-innodb
选项已被弃用,没有任何效果。
它的使用会导致警告。
此选项将在未来的MySQL版本中删除。
属性 | 值 |
---|---|
命令行格式 | --skip-name-resolve[={OFF|ON}] |
系统变量 | skip_name_resolve |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
检查客户端连接时,请勿解析主机名。
仅使用IP地址。
如果使用此选项,
Host
则授权表中的
所有
列值
都
必须是IP地址。
请参见
第8.12.4.2节“DNS查找优化和主机缓存”
。
根据系统的网络配置和
Host
帐户
的
值,客户端可能需要使用显式
--host
选项
进行连接
,例如
--host=127.0.0.1
或
--host=::1
。
尝试连接到主机
127.0.0.1
通常会解析为该
localhost
帐户。
但是,如果使用该
--skip-name-resolve
选项
运行服务器,则会失败
。
如果您打算这样做,请确保存在可以接受连接的帐户。
例如,要能够
root
使用
--host=127.0.0.1
或
连接
--host=::1
,请创建以下帐户:
创建用户'root'@'127.0.0.1'标识'root-password
'; 创建用户'root'@':: 1'IDENTIFIED BY'root-password
';
属性 | 值 |
---|---|
命令行格式 | --skip-networking |
系统变量 | skip_networking |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
根本不要监听TCP / IP连接。 所有与 mysqld的 交互 必须使用命名管道或共享内存(在Windows上)或Unix套接字文件(在Unix上)。 对于仅允许本地客户端的系统,强烈建议使用此选项。 请参见 第8.12.4.2节“DNS查找优化和主机缓存” 。
如果使用
--skip-grant-tables
禁用身份验证检查
的
选项
启动服务器
,则服务器可以
--skip-networking
阻止远程连接。
以“开头”选项
--ssl
指定是否允许客户端使用SSL进行连接,并指明在何处查找SSL密钥和证书。
请参见
第6.3.2节“加密连接的命令选项”
。
属性 | 值 |
---|---|
命令行格式 | --standalone |
平台特定 | 视窗 |
仅适用于Windows; 指示MySQL服务器不作为服务运行。
属性 | 值 |
---|---|
命令行格式 | --super-large-pages[={OFF|ON}] |
平台特定 | 的Solaris |
类型 | 布尔 |
默认值 | OFF |
在MySQL中标准使用大页面试图使用支持的最大大小,最多4MB。
在Solaris下,
“
超大页面
”
功能允许使用高达256MB的页面。
此功能适用于最新的SPARC平台。
可以使用
--super-large-pages
或
--skip-super-large-pages
选项
启用或禁用它
。
--symbolic-links
,
--skip-symbolic-links
属性 | 值 |
---|---|
命令行格式 | --symbolic-links[={OFF|ON}] |
弃用 | 8.0.2 |
类型 | 布尔 |
默认值 (> = 8.0.2) | OFF |
默认值 (<= 8.0.1) | ON |
启用或禁用符号链接支持。
在Unix上,启用符号链接意味着您可以
使用
语句
MyISAM
的
INDEX DIRECTORY
or
DATA DIRECTORY
选项
将
索引文件或数据文件
链接
到另一个目录
CREATE
TABLE
。
如果删除或重命名表,则其符号链接指向的文件也将被删除或重命名。
请参见
第8.12.2.2节“在Unix上使用MyISAM表的符号链接”
。
符号链接支持以及
--symbolic-links
控制它
的
选项已弃用,将在未来的MySQL版本中删除。
此外,默认情况下禁用该选项。
相关的
have_symlink
系统变量也已弃用,将在未来的MySQL版本中删除。
此选项在Windows上没有意义。
属性 | 值 |
---|---|
命令行格式 | --skip-show-database |
系统变量 | skip_show_database |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
此选项设置
skip_show_database
控制允许谁使用该
SHOW
DATABASES
语句
的
系统变量
。
请参见
第5.1.8节“服务器系统变量”
。
属性 | 值 |
---|---|
命令行格式 | --skip-stack-trace |
不要写堆栈跟踪。 在调试器下 运行 mysqld 时,此选项很有用 。 在某些系统上,您还必须使用此选项来获取核心文件。 请参见 第29.5节“调试和移植MySQL” 。
属性 | 值 |
---|---|
命令行格式 | --slow-query-log[={OFF|ON}] |
系统变量 | slow_query_log |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
指定初始慢查询日志状态。
如果没有参数或参数为1,则该
--slow-query-log
选项将启用日志。
如果省略或参数为0,则该选项将禁用日志。
属性 | 值 |
---|---|
命令行格式 | --slow-start-timeout=# |
类型 | 整数 |
默认值 | 15000 |
此选项控制Windows服务控制管理器的服务启动超时。 该值是服务控制管理器在启动期间尝试终止Windows服务之前等待的最大毫秒数。 默认值为15000(15秒)。 如果MySQL服务启动时间太长,您可能需要增加此值。 值为0表示没有超时。
属性 | 值 |
---|---|
命令行格式 | --socket={file_name|pipe_name} |
系统变量 | socket |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (其他) | /tmp/mysql.sock |
默认值 (Windows) | MySQL |
在Unix上,此选项指定侦听本地连接时要使用的Unix套接字文件。
默认值为
/tmp/mysql.sock
。
如果给出此选项,则服务器将在数据目录中创建该文件,除非给出绝对路径名以指定其他目录。
在Windows上,该选项指定在侦听使用命名管道的本地连接时要使用的管道名称。
默认值为
MySQL
(不区分大小写)。
--sql-mode=
value
[,value
[,value
...]]
属性 | 值 |
---|---|
命令行格式 | --sql-mode=name |
系统变量 | sql_mode |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 组 |
默认值 (> = 8.0.11) | ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE
ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSTITUTION |
默认值 (<= 8.0.4) | ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE
ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION |
有效值 (> = 8.0.11) |
|
有效值 (> = 8.0.1,<= 8.0.4) |
|
有效值 (8.0.0) |
|
设置SQL模式。 请参见 第5.1.11节“服务器SQL模式” 。
MySQL安装程序可以在安装过程中配置SQL模式。
如果SQL模式与默认模式或您期望的模式不同,请检查服务器在启动时读取的选项文件中的设置。
属性 | 值 |
---|---|
命令行格式 | --sysdate-is-now[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
SYSDATE()
默认情况下,返回它执行的时间,而不是它发生的语句开始执行的时间。
这与行为不同
NOW()
。
此选项导致
SYSDATE()
成为别名
NOW()
。
有关二进制日志和复制的影响的信息,请参阅用于描述
SYSDATE()
在
12.7节,“日期和时间函数”
和
SET
TIMESTAMP
在
第5.1.8节,“服务器系统变量”
。
--tc-heuristic-recover={COMMIT|ROLLBACK}
属性 | 值 |
---|---|
命令行格式 | --tc-heuristic-recover=name |
类型 | 列举 |
默认值 | COMMIT |
有效值 |
|
在启发式恢复过程中使用的决策类型。 要使用此选项, 必须安装 两个或多个支持 XA 事务的 存储引擎 。
属性 | 值 |
---|---|
命令行格式 | --temp-pool[={OFF|ON}] |
弃用 | 是(在8.0.1中删除) |
类型 | 布尔 |
默认值 (其他) | OFF |
默认值 (Linux) | ON |
此选项已过时,已在MySQL 8.0.1中删除。
属性 | 值 |
---|---|
命令行格式 | --transaction-isolation=name |
系统变量 | transaction_isolation |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | REPEATABLE-READ |
有效值 |
|
设置默认事务隔离级别。
该
level
值可以是
READ-UNCOMMITTED
,
READ-COMMITTED
,
REPEATABLE-READ
,或
SERIALIZABLE
。
请参见
第13.3.7节“SET TRANSACTION语法”
。
还可以使用
SET
TRANSACTION
语句或通过设置
transaction_isolation
系统变量
在运行时设置缺省事务隔离级别
。
属性 | 值 |
---|---|
命令行格式 | --transaction-read-only[={OFF|ON}] |
系统变量 | transaction_read_only |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
设置默认事务访问模式。 默认情况下,禁用只读模式,因此模式为读/写。
要在运行时设置默认事务访问模式,请使用该
SET
TRANSACTION
语句或设置
transaction_read_only
系统变量。
请参见
第13.3.7节“SET TRANSACTION语法”
。
--tmpdir=
,
dir_name
-t
dir_name
用于创建临时文件的目录的路径。
如果您的默认
/tmp
目录位于太小而无法容纳临时表的分区上,则
可能很有用
。
此选项接受以循环方式使用的多个路径。
路径应该用
:
Unix上
的冒号字符(
)和
;
Windows上的
分号字符(
)
分隔
。
--tmpdir
可以是非永久位置,例如基于内存的文件系统上的目录或服务器主机重新启动时清除的目录。
如果MySQL服务器充当复制从属服务器,并且您使用的是非永久性位置
--tmpdir
,请考虑使用该
--slave-load-tmpdir
选项
为从属服务器设置不同的临时目录
。
对于复制从属服务器,用于复制
LOAD
DATA
语句
的临时文件
存储在此目录中,因此使用永久位置它们可以在计算机重新启动后继续运行,尽管如果已删除临时文件,复制现在可以在重新启动后继续。
有关临时文件存储位置的更多信息,请参见 第B.4.3.5节“MySQL存储临时文件的位置” 。
属性 | 值 |
---|---|
命令行格式 | --upgrade=value |
介绍 | 8.0.16 |
类型 | 列举 |
默认值 | AUTO |
有效值 |
|
此选项控制服务器在启动时是否以及如何执行自动升级。 自动升级包括两个步骤:
第1步:数据字典升级。
此步骤升级:
mysql
架构中
的数据字典表
。
如果实际数据字典版本低于当前预期版本,则服务器升级数据字典。
如果它不能或阻止这样做,服务器将无法运行。
性能模式和
INFORMATION_SCHEMA
。
第2步:服务器升级。
此步骤包括所有其他升级任务。 如果现有安装数据的MySQL版本低于服务器预期,则必须升级:
模式中的系统表
mysql
(剩余的非数据字典表)。
该
sys
架构。
用户架构。
有关升级步骤1和2的详细信息,请参见 第2.11.3节“MySQL升级过程升级” 。
这些
--upgrade
选项的允许值:
AUTO
服务器会自动升级发现过期的任何内容(步骤1和2)。
如果
--upgrade
未明确指定,
则这是默认操作
。
NONE
服务器在启动过程中不执行自动升级步骤(跳过步骤1和2)。 由于此选项值会阻止数据字典升级,因此如果发现数据字典已过期,则服务器将退出并显示错误:
[错误] [MY-013381] [服务器]服务器因升级而关闭 必需的,但命令行选项'--upgrade = NONE'禁止。 [错误] [MY-010334] [服务器]无法初始化DD存储引擎 [错误] [MY-010020] [服务器]数据字典初始化失败。
MINIMAL
INFORMATION_SCHEMA
如有必要
,服务器会升级数据字典,性能模式和
(步骤1)。
请注意,使用此选项进行升级后,无法启动组复制,因为复制内部所依赖的系统表未更新,并且在其他区域中也可能显示减少的功能。
FORCE
INFORMATION_SCHEMA
如有必要
,服务器会升级数据字典,性能模式和
(步骤1)。
此外,服务器强制升级其他所有内容(步骤2)。
使用此选项预计服务器启动需要更长时间,因为服务器会检查所有模式中的所有对象。
FORCE
如果服务器认为不需要,则强制执行第2步操作。
例如,您可能认为系统表丢失或已损坏并且想要强制修复。
下表总结了服务器对每个选项值所采取的操作。
期权价值 | 服务器执行第1步? | 服务器执行第2步? |
---|---|---|
AUTO |
如有必要 | 如有必要 |
NONE |
没有 | 没有 |
MINIMAL |
如有必要 | 没有 |
FORCE |
如有必要 | 是 |
--user={
,
user_name
|user_id
}-u
{
user_name
|user_id
}
属性 | 值 |
---|---|
命令行格式 | --user=name |
类型 | 串 |
以
具有名称
或数字用户ID的用户身份
运行
mysqld
服务器
。
(
此上下文中的
“
用户
”
是指系统登录帐户,而不是授权表中列出的MySQL用户。)
user_name
user_id
启动
mysqld
as
时,
此选项是
必需的
。
服务器在其启动序列期间更改其用户ID,使其作为特定用户而不是作为特定用户运行
。
请参见
第6.1.1节“安全准则”
。
root
root
为了避免用户
--user=root
向
my.cnf
文件
添加
选项
(从而导致服务器以其运行
root
)
的可能安全漏洞
,
mysqld
仅使用
--user
指定
的第一个
选项,并在有多个
--user
选项时
生成警告
。
选项在
命令行选项之前
/etc/my.cnf
和之后
$MYSQL_HOME/my.cnf
处理,因此建议您将
--user
选项放入
/etc/my.cnf
并指定除以外的值
root
。
在选项
/etc/my.cnf
之前的任何其他被发现
--user
的选择,这确保了服务器作为比其他用户运行
root
,并且如果
--user
找到
任何其他
选项则会
发出警告
。
属性 | 值 |
---|---|
命令行格式 | --validate-config[={OFF|ON}] |
介绍 | 8.0.16 |
类型 | 布尔 |
默认值 | OFF |
验证服务器启动配置。
如果未找到任何错误,则服务器将以退出代码0终止。如果发现错误,服务器将显示诊断消息并以退出代码1终止。警告和信息消息也可能会显示,具体取决于
log_error_verbosity
值,但不要立即生成验证终止或退出代码为1.有关更多信息,请参见
第5.1.3节“服务器配置验证”
。
使用此选项
--help
可获得详细帮助选项。
--version
,
-V
显示版本信息并退出。
MySQL服务器维护许多配置其操作的系统变量。
每个系统变量都有一个默认值。
可以使用命令行或选项文件中的选项在服务器启动时设置系统变量。
其中大多数都可以在运行时使用动态更改
SET
语句
,这使您可以修改服务器的操作,而无需停止并重新启动它。
您还可以在表达式中使用系统变量值。
设置全局系统变量运行时值通常需要
SYSTEM_VARIABLES_ADMIN
或
SUPER
权限。
设置会话系统运行时变量值通常不需要特殊权限,可以由任何用户完成,但也有例外。
有关更多信息,请参见
第5.1.9.1节“系统变量权限”
有几种方法可以查看系统变量的名称和值:
要查看服务器将根据其编译的默认值以及它读取的任何选项文件使用的值,请使用以下命令:
mysqld --verbose --help
要仅根据其已编译的默认值查看服务器将使用的值,忽略任何选项文件中的设置,请使用以下命令:
mysqld --no-defaults --verbose --help
要查看正在运行的服务器使用的当前值,请使用
SHOW
VARIABLES
语句或Performance Schema系统变量表。
请参见
第26.12.13节“性能模式系统变量表”
。
本节提供每个系统变量的说明。 有关系统变量摘要表,请参见 第5.1.5节“服务器系统变量参考” 。 有关操作系统变量的更多信息,请参见 第5.1.9节“使用系统变量” 。
有关其他系统变量信息,请参阅以下部分:
第5.1.9节“使用系统变量” 讨论了设置和显示系统变量值的语法。
第5.1.9.2节“动态系统变量” 列出了可在运行时设置的变量。
有关调整系统变量的信息,请参见 第5.1.1节“配置服务器” 。
第15.13节“InnoDB启动选项和系统变量”
列出了
InnoDB
系统变量。
第22.3.3.9.2节“NDB集群系统变量” 列出了特定于NDB集群的系统变量。
有关特定于复制的服务器系统变量的信息,请参见 第17.1.6节“复制和二进制日志记录选项和变量” 。
以下变量描述中的一些涉及
“
启用
”
或
“
禁用
”
变量。
可以通过将这些变量
SET
设置为
ON
or
来启用这些变量
1
,或者通过将它们设置为
OFF
或
来禁用
这些变量
0
。
布尔变量可以在启动时被设置为的值
ON
,
TRUE
,
OFF
,和
FALSE
(不区分大小写),以及
1
和
0
。
请参见
第4.2.2.4节“程序选项修饰符”
。
某些系统变量控制缓冲区或缓存的大小。 对于给定的缓冲区,服务器可能需要分配内部数据结构。 这些结构通常从分配给缓冲区的总内存中分配,并且所需的空间量可能取决于平台。 这意味着当您为控制缓冲区大小的系统变量分配值时,实际可用的空间量可能与指定的值不同。 在某些情况下,金额可能小于分配的金额。 服务器也可能向上调整值。 例如,如果将值0指定给最小值为1024的变量,则服务器将该值设置为1024。
除非另有说明,否则缓冲区大小,长度和堆栈大小的值以字节为单位。
某些系统变量采用文件名值。
除非另行指定,否则默认文件位置是数据目录(如果值是相对路径名)。
要明确指定位置,请使用绝对路径名。
假设数据目录是
/var/mysql/data
。
如果文件值变量作为相对路径名给出,则它将位于下面
/var/mysql/data
。
如果该值是绝对路径名,则其位置由路径名指定。
属性 | 值 |
---|---|
命令行格式 | --activate-all-roles-on-login[={OFF|ON}] |
介绍 | 8.0.2 |
系统变量 | activate_all_roles_on_login |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
是否在用户登录服务器时启用自动激活所有授予的角色:
如果
activate_all_roles_on_login
启用,则服务器会在登录时激活授予每个帐户的所有角色。
这优先于使用指定的默认角色
SET DEFAULT
ROLE
。
如果
activate_all_roles_on_login
禁用,则服务器会
SET DEFAULT
ROLE
在登录时
激活指定的默认角色
(如果有)。
授予的角色包括明确授予用户的角色和
mandatory_roles
系统变量值中
指定的角色
。
activate_all_roles_on_login
仅在登录时应用,并在执行开始时存储在定义上下文中执行的存储程序和视图。
要更改会话中的活动角色,请使用
SET
ROLE
。
要更改存储程序的活动角色,应执行程序正文
SET
ROLE
。
属性 | 值 |
---|---|
命令行格式 | --admin-address=# |
介绍 | 8.0.14 |
系统变量 | admin_address |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
在管理网络接口上侦听TCP / IP连接的IP地址(请参见
第8.12.4.1节“MySQL如何处理客户端连接”
)。
没有默认
admin_address
值。
如果在启动时未指定此变量,则服务器不维护管理接口。
服务器还有一个
bind_address
系统变量,用于配置常规(非管理)客户端TCP / IP连接。
请参见
第8.12.4.1节“MySQL如何处理客户端连接”
。
如果
admin_address
指定,则其值必须满足以下要求:
该值必须是单个IPv4地址,IPv6地址或主机名。
该值不能指定一个通配符地址格式(
*
,
0.0.0.0
,或
::
)。
IP地址可以指定为IPv4或IPv6地址。 如果值是主机名,则服务器将名称解析为IP地址并绑定到该地址。 如果主机名解析为多个IP地址,则服务器将使用第一个IPv4地址(如果有),否则使用第一个IPv6地址。
服务器处理不同类型的地址,如下所示:
如果地址是IPv4映射地址,则服务器接受IPv4或IPv6格式的该地址的TCP / IP连接。
例如,如果绑定了服务器
::ffff:127.0.0.1
,则客户端可以使用
--host=127.0.0.1
或
连接
--host=::ffff:127.0.0.1
。
如果地址是
“
常规
”
IPv4或IPv6地址(例如
127.0.0.1
或
::1
),则服务器仅接受该IPv4或IPv6地址的TCP / IP连接。
如果绑定到该地址失败,则服务器会产生错误并且无法启动。
所述
admin_address
系统变量是类似于
bind_address
结合服务器的地址为普通客户端连接系统变量,但这些差异:
bind_address
允许多个地址。
admin_address
允许一个地址。
bind_address
允许通配符地址。
admin_address
才不是。
属性 | 值 |
---|---|
命令行格式 | --admin-port=port_num |
介绍 | 8.0.14 |
系统变量 | admin_port |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 33062 |
最低价值 | 0 |
最大价值 | 65535 |
用于管理网络接口上的连接的TCP / IP端口号(请参见 第8.12.4.1节“MySQL如何处理客户端连接” )。 将此变量设置为0会导致使用默认值。
admin_port
如果
admin_address
未指定,
则
设置
无效,
因为在这种情况下,服务器不维护管理网络接口。
authentication_windows_log_level
属性 | 值 |
---|---|
命令行格式 | --authentication-windows-log-level=# |
介绍 | 8.0.11 |
系统变量 | authentication_windows_log_level |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 2 |
最低价值 | 0 |
最大价值 | 4 |
仅当
authentication_windows
启用Windows身份验证插件并启用调试代码时,
此变量才可用
。
请参见
第6.4.1.6节“Windows可插入验证”
。
此变量设置Windows身份验证插件的日志记录级别。 下表显示了允许的值。
值 | 描述 |
---|---|
0 | 没有记录 |
1 | 仅记录错误消息 |
2 | 记录1级消息和警告消息 |
3 | 记录2级消息和信息说明 |
4 | 记录3级消息和调试消息 |
authentication_windows_use_principal_name
属性 | 值 |
---|---|
命令行格式 | --authentication-windows-use-principal-name[={OFF|ON}] |
介绍 | 8.0.11 |
系统变量 | authentication_windows_use_principal_name |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
仅当
authentication_windows
启用Windows身份验证插件时,
此变量才可用
。
请参见
第6.4.1.6节“Windows可插入验证”
。
使用该
InitSecurityContext()
函数进行
身份验证的客户端
应提供标识其连接的服务的字符串(
targetName
)。
MySQL使用运行服务器的帐户的主体名称(UPN)。
UPN具有表格
,无需在任何地方注册使用。
该UPN由服务器在认证握手开始时发送。
user_id
@computer_name
此变量控制服务器是否在初始质询中发送UPN。
默认情况下,该变量已启用。
出于安全原因,可以禁用它以避免将服务器的帐户名称作为明文发送到客户端。
如果禁用该变量,则服务器始终
0x00
在第一个质询中
发送一个
字节,客户端不指定
targetName
,因此使用NTLM身份验证。
如果服务器无法获取其UPN(主要发生在不支持Kerberos身份验证的环境中),则服务器不会发送UPN并使用NTLM身份验证。
属性 | 值 |
---|---|
命令行格式 | --autocommit[={OFF|ON}] |
系统变量 | autocommit |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
自动提交模式。
如果设置为1,则对表的所有更改都会立即生效。
如果设置为0,则必须使用
COMMIT
接受事务或
ROLLBACK
取消
事务
。
如果
autocommit
为0并且您将其更改为1,则MySQL会自动执行
COMMIT
任何打开的事务。
开始交易的另一种方法是使用
START
TRANSACTION
或
BEGIN
声明。
请参见
第13.3.1节“START TRANSACTION,COMMIT和ROLLBACK语法”
。
默认情况下,客户端连接以
autocommit
设置为1
开始
。要使客户端以默认值0开始,请
autocommit
通过使用该
--autocommit=0
选项
启动服务器来
设置全局
值
。
要使用选项文件设置变量,请包含以下行:
的[mysqld] 自动提交= 0
属性 | 值 |
---|---|
命令行格式 | --automatic-sp-privileges[={OFF|ON}] |
系统变量 | automatic_sp_privileges |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
当此变量的值为1(默认值)时
,如果用户无法执行和更改或删除例程,则
服务器会自动向
存储例程的创建者
授予
EXECUTE
和
ALTER ROUTINE
权限。
(
ALTER ROUTINE
需要权限才能删除例程。)当例程被删除时,服务器也会自动从创建者中删除这些权限。
如果
automatic_sp_privileges
为0,则服务器不会自动添加或删除这些权限。
例程的创建者是用于为其执行
CREATE
语句
的帐户
。
这可能
DEFINER
与例程定义中
命名的帐户
不同。
另请参见 第24.2.2节“存储例程和MySQL特权” 。
属性 | 值 |
---|---|
命令行格式 | --auto-generate-certs[={OFF|ON}] |
系统变量 | auto_generate_certs |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
如果服务器是使用OpenSSL编译的,则此变量可用(请参见 第6.3.4节“SSL库相关功能” )。 它控制服务器是否自动生成数据目录中的SSL密钥和证书文件(如果它们尚不存在)。
启动时,如果
auto_generate_certs
启用
了
系统变量
,则服务器会自动在数据目录中生成服务器端和客户端SSL证书和密钥文件
,不会
--ssl
指定
除
指定
之外的SSL选项
,并且数据中缺少服务器端SSL文件目录。
这些文件使用SSL启用安全客户端连接;
请参见
第6.3.1节“配置MySQL以使用加密连接”
。
有关SSL文件自动生成的更多信息,包括文件名和特性,请参见 第6.3.3.1节“使用MySQL创建SSL和RSA证书和密钥”
该
sha256_password_auto_generate_rsa_keys
和
caching_sha2_password_auto_generate_rsa_keys
系统变量相关,但所需要的使用RSA在unencypted连接的安全密码交换RSA密钥对文件控制自动生成。
属性 | 值 |
---|---|
命令行格式 | --avoid-temporal-upgrade[={OFF|ON}] |
弃用 | 是 |
系统变量 | avoid_temporal_upgrade |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
此变量控制是否
ALTER
TABLE
隐式升级发现为5.6.4之前格式的时间列(
TIME
和
DATETIME
,
TIMESTAMP
不支持小数秒精度的列)。
升级此类列需要进行表重建,这可防止使用可能以其他方式应用于要执行的操作的快速更改。
默认情况下禁用此变量。
启用它会导致
ALTER
TABLE
不重建时间列,从而能够利用可能的快速更改。
此变量已弃用,将在以后的MySQL版本中删除。
属性 | 值 |
---|---|
命令行格式 | --back-log=# |
系统变量 | back_log |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | -1
(表示自动调整大小;不指定此文字值)
|
最低价值 | 1 |
最大价值 | 65535 |
MySQL可以拥有的未完成连接请求的数量。
当主MySQL线程在很短的时间内获得很多连接请求时,这就会发挥作用。
然后,主线程检查连接并启动新线程需要一些时间(尽管很少)。
该
back_log
值表示在MySQL暂时停止回答新请求之前的短时间内可以堆叠的请求数。
只有在短时间内预期有大量连接时,才需要增加此值。
换句话说,此值是传入TCP / IP连接的侦听队列的大小。
您的操作系统对此队列的大小有自己的限制。
Unix
listen()
系统调用
的手册页
应该有更多细节。
检查操作系统文档以获取此变量的最大值。
back_log
不能设置高于您的操作系统限制。
默认值为值
max_connections
,它允许允许的积压调整为允许的最大连接数。
属性 | 值 |
---|---|
命令行格式 | --basedir=dir_name |
系统变量 | basedir |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 目录名称 |
默认值 (> = 8.0.2) | parent of mysqld installation directory |
默认值 (<= 8.0.1) | configuration-dependent default |
MySQL安装基目录的路径。
属性 | 值 |
---|---|
命令行格式 | --big-tables[={OFF|ON}] |
系统变量 | big_tables |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
如果启用,则服务器将所有临时表存储在磁盘而不是内存中。
这可以防止
需要大型临时表的操作的
大多数
错误
,但也会减慢内存表就足够的查询速度。
The table
tbl_name
is fullSELECT
新连接的默认值是
OFF
(使用内存中的临时表)。
通常,永远不需要启用此变量。
当内存
内部
临时表由
TempTable
存储引擎
管理
(默认值),并且
TempTable
超出了
TempTable
存储引擎
可占用的最大内存量时
,
存储引擎会开始将数据存储到磁盘上的临时文件中。
当内存临时表由
MEMORY
存储引擎
管理时
,内存表会根据需要自动转换为基于磁盘的表。
有关更多信息,请参阅
第8.4.4节“MySQL中的内部临时表使用”
。
属性 | 值 |
---|---|
命令行格式 | --bind-address=addr |
系统变量 | bind_address |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | * |
MySQL服务器侦听一个或多个网络套接字以进行TCP / IP连接。
每个套接字绑定到一个地址,但地址可以映射到多个网络接口。
要指定服务器应如何侦听TCP / IP连接,请
bind_address
在服务器启动时
设置
系统变量。
服务器还有一个
admin_address
系统变量,可在专用接口上启用管理连接。
请参见
第8.12.4.1节“MySQL如何处理客户端连接”
。
如果
bind_address
指定,则其值必须满足以下要求:
之前的MySQL 8.0.13,
bind_address
接受一个单独的地址值,其可以指定单个非通配符IP地址或主机名,或在允许对多个网络接口侦听的通配符地址格式中的一种(
*
,
0.0.0.0
,或
::
)。
从MySQL 8.0.13开始,
bind_address
接受刚刚描述的单个值或逗号分隔值列表。
当变量命名多个值的列表时,每个值必须指定一个非通配符IP地址或主机名;
没有人可以指定一个通配符地址格式(
*
,
0.0.0.0
,或
::
)。
IP地址可以指定为IPv4或IPv6地址。 对于作为主机名的任何值,服务器会将名称解析为IP地址并绑定到该地址。 如果主机名解析为多个IP地址,则服务器将使用第一个IPv4地址(如果有),否则使用第一个IPv6地址。
服务器处理不同类型的地址,如下所示:
如果地址是
*
,则服务器接受所有服务器主机IPv4接口上的TCP / IP连接,如果服务器主机支持IPv6,则接受所有IPv6接口上的TCP /
IP连接。
使用此地址允许所有服务器接口上的IPv4和IPv6连接。
该值是默认值。
如果该选项指定多个值的列表,则不允许使用此值。
如果地址是
0.0.0.0
,则服务器接受所有服务器主机IPv4接口上的TCP / IP连接。
如果该选项指定多个值的列表,则不允许使用此值。
如果地址是
::
,则服务器接受所有服务器主机IPv4和IPv6接口上的TCP / IP连接。
如果该选项指定多个值的列表,则不允许使用此值。
如果地址是IPv4映射地址,则服务器接受IPv4或IPv6格式的该地址的TCP / IP连接。
例如,如果绑定了服务器
::ffff:127.0.0.1
,则客户端可以使用
--host=127.0.0.1
或
连接
--host=::ffff:127.0.0.1
。
如果地址是
“
常规
”
IPv4或IPv6地址(例如
127.0.0.1
或
::1
),则服务器仅接受该IPv4或IPv6地址的TCP / IP连接。
如果绑定到任何地址失败,服务器将产生错误并且无法启动。
例子:
bind_address=*
服务器侦听
*
通配符
指定的所有IPv4或IPv6地址
。
bind_address=198.51.100.20
服务器仅侦听
198.51.100.20
IPv4地址。
bind_address=198.51.100.20,2001:db8:0:f101::1
服务器侦听
198.51.100.20
IPv4地址和
2001:db8:0:f101::1
IPv6地址。
bind_address=198.51.100.20,*
这会产生错误,因为在
bind_address
命名多个值列表
时不允许使用通配符地址
。
当
bind_address
命名单个值(通配符或非通配符)时,服务器侦听单个套接字,通配符地址可以绑定到多个网络接口。
当
bind_address
命名多个值的列表时,服务器每个值侦听一个套接字,每个套接字绑定到单个网络接口。
套接字的数量与指定的值的数量成线性关系。
根据操作系统连接接受效率,长值列表可能会因接受TCP / IP连接而导致性能下降。
由于文件描述符是为侦听套接字分配的,因此可能需要增加
open_files_limit
系统变量。
如果要将服务器绑定到特定地址,请确保
mysql.user
系统表包含具有管理权限的帐户,可用于连接到该地址。
否则,您将无法关闭服务器。
例如,如果将服务器绑定到
*
,则可以使用所有现有帐户连接到
该服务器
。
但是,如果将服务器绑定到
::1
,则它仅接受该地址上的连接。
在这种情况下,首先要确保
'root'@'::1'
该
mysql.user
表
存在于
表中,这样您仍然可以连接到服务器以将其关闭。
属性 | 值 |
---|---|
命令行格式 | --block-encryption-mode=# |
系统变量 | block_encryption_mode |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | aes-128-ecb |
此变量控制基于块的算法(如AES)的块加密模式。
它会影响
AES_ENCRYPT()
和的
加密
AES_DECRYPT()
。
block_encryption_mode
取值为
格式
的值
,其中
是以位为单位的密钥长度,
是加密模式。
该值不区分大小写。
允许的
值为128,192和256.允许的加密模式取决于MySQL是使用OpenSSL还是使用wolfSSL编译的:
aes-
keylen
-mode
keylen
mode
keylen
加入OpenSSL,允许
mode
的值是:
ECB
,
CBC
,
CFB1
,
CFB8
,
CFB128
,
OFB
对于wolfSSL,允许
mode
值是:
ECB
,
CBC
例如,此语句使AES加密函数使用256位密钥长度和CBC模式:
SET block_encryption_mode ='aes-256-cbc';
尝试设置
block_encryption_mode
为包含不受支持的密钥长度的值或SSL库不支持的模式
时发生错误
。
属性 | 值 |
---|---|
命令行格式 | --bulk-insert-buffer-size=# |
系统变量 | bulk_insert_buffer_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 8388608 |
最低价值 | 0 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
MyISAM
使用一种特殊的树状缓存来做出更快的批量插入
INSERT ...
SELECT
,
INSERT ... VALUES (...), (...),
...
以及
LOAD
DATA
对非空表添加数据时。
此变量以每个线程的字节数限制缓存树的大小。
将其设置为0将禁用此优化。
默认值为8MB。
从MySQL 8.0.14开始,设置此系统变量的会话值是一种受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
caching_sha2_password_auto_generate_rsa_keys
属性 | 值 |
---|---|
命令行格式 | --caching-sha2-password-auto-generate-rsa-keys[={OFF|ON}] |
介绍 | 8.0.4 |
系统变量 | caching_sha2_password_auto_generate_rsa_keys |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
如果服务器是使用OpenSSL编译的,则此变量可用(请参见 第6.3.4节“SSL库相关功能” )。 服务器使用它来确定是否在数据目录中自动生成RSA私钥/公钥对文件(如果它们尚不存在)。
在启动时,如果满足所有这些条件,则服务器会自动在数据目录中生成RSA私钥/公钥对文件:
sha256_password_auto_generate_rsa_keys
或者
caching_sha2_password_auto_generate_rsa_keys
启用系统变量;
没有指定RSA选项;
数据目录中缺少RSA文件。
这些密钥对文件通过未加密的连接使用RSA进行安全密码交换,以便对由
sha256_password
or或
caching_sha2_password
plugin
进行身份验证的帐户进行安全密码交换
。
请参见
第6.4.1.2节“SHA-256可插拔认证”
和
第6.4.1.3节“高速缓存SHA-2可插拔认证”
。
有关RSA文件自动生成的更多信息,包括文件名和特性,请参见 第6.3.3.1节“使用MySQL创建SSL和RSA证书和密钥”
该
auto_generate_certs
系统变量是相关的,但控制SSL证书,并需要使用SSL安全连接密钥文件的自动生成。
caching_sha2_password_private_key_path
属性 | 值 |
---|---|
命令行格式 | --caching-sha2-password-private-key-path=file_name |
介绍 | 8.0.3 |
系统变量 | caching_sha2_password_private_key_path |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
默认值 | private_key.pem |
此变量指定
caching_sha2_password
身份验证插件
的RSA私钥文件的路径名
。
如果文件被命名为相对路径,则相对于服务器数据目录进行解释。
该文件必须采用PEM格式。
由于此文件存储私钥,因此应限制其访问模式,以便只有MySQL服务器才能读取它。
有关的信息
caching_sha2_password
,请参见
第6.4.1.3节“缓存SHA-2可插入身份验证”
。
caching_sha2_password_public_key_path
属性 | 值 |
---|---|
命令行格式 | --caching-sha2-password-public-key-path=file_name |
介绍 | 8.0.3 |
系统变量 | caching_sha2_password_public_key_path |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
默认值 | public_key.pem |
此变量指定
caching_sha2_password
身份验证插件
的RSA公钥文件的路径名
。
如果文件被命名为相对路径,则相对于服务器数据目录进行解释。
该文件必须采用PEM格式。
有关
caching_sha2_password
客户端如何请求RSA公钥的信息,请参见
第6.4.1.3节“缓存SHA-2可插入身份验证”
。
属性 | 值 |
---|---|
系统变量 | character_set_client |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (> = 8.0.1) | utf8mb4 |
默认值 (8.0.0) | utf8 |
从客户端到达的语句的字符集。
当客户端连接到服务器时,使用客户端请求的字符集设置此变量的会话值。
(许多客户端支持一个
--default-character-set
选项,可以明确指定此字符集。另请参见
第10.4节“连接字符集和排序”
。)变量的全局值用于在客户端请求的情况下设置会话值值未知或不可用,或者服务器配置为忽略客户端请求:
客户端请求服务器不知道的字符集。
例如,启用日语的客户端
sjis
在连接到未配置
sjis
支持
的服务器时会
请求
。
客户端来自早于MySQL 4.1的MySQL版本,因此不会请求字符集。
mysqld
是使用该
--skip-character-set-client-handshake
选项
启动的
,这会导致它忽略客户端字符集配置。
这会再现MySQL 4.0的行为,如果您希望在不升级所有客户端的情况下升级服务器,这将非常有用。
某些字符集不能用作客户端字符集。
尝试将它们用作
character_set_client
值会产生错误。
请参见
不允许的客户端字符集
。
属性 | 值 |
---|---|
系统变量 | character_set_connection |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (> = 8.0.1) | utf8mb4 |
默认值 (8.0.0) | utf8 |
用于文字的字符集,没有字符集导入器和数字到字符串转换。 有关介绍人的信息,请参见 第10.3.8节“字符集介绍人” 。
属性 | 值 |
---|---|
系统变量 | character_set_database |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (> = 8.0.1) | utf8mb4 |
默认值 (8.0.0) | latin1 |
脚注 | 此选项是动态的,但只有服务器应设置此信息。 您不应手动设置此变量的值。 |
默认数据库使用的字符集。
每当默认数据库更改时,服务器都会设置此变量。
如果没有默认数据库,则该变量具有相同的值
character_set_server
。
从MySQL 8.0.14开始,设置此系统变量的会话值是一种受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
不推荐使用
全局
变量
character_set_database
和
collation_database
系统变量,将在未来的MySQL版本中删除它们。
不建议为会话
character_set_database
和
collation_database
系统变量
分配值,
并且分配会产生警告。
会话变量将在MySQL的未来版本中变为只读,并且赋值将产生错误。
仍然可以访问会话变量以确定默认数据库的数据库字符集和排序规则。
属性 | 值 |
---|---|
命令行格式 | --character-set-filesystem=name |
系统变量 | character_set_filesystem |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | binary |
文件系统字符集。
此变量用于解释引用文件名的字符串文字,例如在
LOAD
DATA
和
SELECT
... INTO
OUTFILE
语句和
LOAD_FILE()
函数中。
这样的文件名从转换
character_set_client
到
character_set_filesystem
发生文件打开尝试之前。
默认值为
binary
,表示不进行转换。
对于允许使用多字节文件名的系统,不同的值可能更合适。
例如,如果系统使用UTF-8表示文件名,则设置
character_set_filesystem
为
'utf8mb4'
。
从MySQL 8.0.14开始,设置此系统变量的会话值是一种受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
属性 | 值 |
---|---|
系统变量 | character_set_results |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (> = 8.0.1) | utf8mb4 |
默认值 (8.0.0) | utf8 |
用于将查询结果返回给客户端的字符集。 这包括结果数据,如列值,结果元数据(如列名称)和错误消息。
属性 | 值 |
---|---|
命令行格式 | --character-set-server=name |
系统变量 | character_set_server |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (> = 8.0.1) | utf8mb4 |
默认值 (8.0.0) | latin1 |
服务器默认字符集。
请参见
第10.14节“字符集配置”
。
如果设置此变量,还应设置
collation_server
为字符集指定排序规则。
属性 | 值 |
---|---|
系统变量 | character_set_system |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | utf8 |
服务器用于存储标识符的字符集。
价值总是如此
utf8
。
属性 | 值 |
---|---|
命令行格式 | --character-sets-dir=dir_name |
系统变量 | character_sets_dir |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 目录名称 |
安装字符集的目录。 请参见 第10.14节“字符集配置” 。
属性 | 值 |
---|---|
命令行格式 | --check-proxy-users[={OFF|ON}] |
系统变量 | check_proxy_users |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
一些身份验证插件为自己实现代理用户映射(例如,PAM和Windows身份验证插件)。
默认情况下,其他身份验证插件不支持代理用户。
其中,有些人可以要求MySQL服务器本身根据授予的代理权限映射代理用户:
mysql_native_password
,
sha256_password
。
如果
check_proxy_users
启用
了
系统变量,则服务器会对发出此类请求的任何身份验证插件执行代理用户映射。
但是,可能还需要启用特定于插件的系统变量以利用服务器代理用户映射支持:
对于
mysql_native_password
插件,启用
mysql_native_password_proxy_users
。
对于
sha256_password
插件,启用
sha256_password_proxy_users
。
有关用户代理的信息,请参见 第6.2.18节“代理用户” 。
属性 | 值 |
---|---|
系统变量 | collation_connection |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
连接字符集的排序规则。
collation_connection
对于文字字符串的比较很重要。
对于具有列值的字符串的比较,
collation_connection
无关紧要,因为列具有自己的排序规则,其具有更高的排序规则优先级(请参见
第10.8.4节“表达式中的排序规则强制”
)。
属性 | 值 |
---|---|
系统变量 | collation_database |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (> = 8.0.1) | utf8mb4_0900_ai_ci |
默认值 (8.0.0) | latin1_swedish_ci |
脚注 | 此选项是动态的,但只有服务器应设置此信息。 您不应手动设置此变量的值。 |
默认数据库使用的排序规则。
每当默认数据库更改时,服务器都会设置此变量。
如果没有默认数据库,则该变量具有相同的值
collation_server
。
从MySQL 8.0.14开始,设置此系统变量的会话值是一种受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
不推荐使用
全局
变量
character_set_database
和
collation_database
系统变量,将在未来的MySQL版本中删除它们。
不建议为会话
character_set_database
和
collation_database
系统变量
分配值,
并且分配会产生警告。
会话变量将在MySQL的未来版本中变为只读,并且赋值将产生错误。
仍然可以访问会话变量以确定默认数据库的数据库字符集和排序规则。
属性 | 值 |
---|---|
命令行格式 | --collation-server=name |
系统变量 | collation_server |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (> = 8.0.1) | utf8mb4_0900_ai_ci |
默认值 (8.0.0) | latin1_swedish_ci |
服务器的默认排序规则。 请参见 第10.14节“字符集配置” 。
属性 | 值 |
---|---|
命令行格式 | --completion-type=# |
系统变量 | completion_type |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | NO_CHAIN |
有效值 |
|
交易完成类型。 此变量可以采用下表中显示的值。 可以使用名称值或相应的整数值来指定变量。
值 | 描述 |
---|---|
NO_CHAIN
(或0)
|
COMMIT
并且
ROLLBACK
不受影响。
这是默认值。
|
CHAIN
(或1)
|
COMMIT
并且
ROLLBACK
分别等同于
COMMIT AND CHAIN
和
ROLLBACK AND CHAIN
。
(新事务立即启动,其隔离级别与刚刚终止的事务相同。)
|
RELEASE
(或2)
|
COMMIT
并且
ROLLBACK
分别等同于
COMMIT RELEASE
和
ROLLBACK RELEASE
。
(终止事务后服务器断开连接。)
|
completion_type
影响以
START
TRANSACTION
或
开头
或
BEGIN
以
COMMIT
或以
ROLLBACK
。
结尾的
交易
。
它不适用于执行
第13.3.3节“导致隐式提交
的语句”中列出的
语句所导致的隐式提交
。
它也没有申请
XA
COMMIT
,
XA
ROLLBACK
或当
autocommit=1
。
属性 | 值 |
---|---|
命令行格式 | --concurrent-insert[=#] |
系统变量 | concurrent_insert |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | AUTO |
有效值 |
|
如果
AUTO
(默认值),MySQL允许
INSERT
和
SELECT
语句同时运行
MyISAM
在数据文件中间没有空闲块的表。
如果启动
mysqld的
使用
--skip-new
,这个变量被设置为
NEVER
。
此变量可以采用下表中显示的值。 可以使用名称值或相应的整数值来指定变量。
值 | 描述 |
---|---|
NEVER
(或0)
|
禁用并发插入 |
AUTO
(或1)
|
(默认值)为
MyISAM
没有孔的表
启用并发插入
|
ALWAYS
(或2)
|
为所有
MyISAM
表
启用并发插入
,即使是那些有漏洞的表。
对于带孔的表,如果另一个线程正在使用,则在表的末尾插入新行。
否则,MySQL获取正常的写锁定并将该行插入到孔中。
|
另请参见 第8.11.3节“并发插入” 。
属性 | 值 |
---|---|
命令行格式 | --connect-timeout=# |
系统变量 | connect_timeout |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 10 |
最低价值 | 2 |
最大价值 | 31536000 |
mysqld
服务器在响应之前等待连接数据包
的秒数
Bad handshake
。
默认值为10秒。
connect_timeout
如果客户经常遇到表单错误,
增加该
值可能会有所帮助
。
Lost connection to MySQL server at
'
XXX
', system error:
errno
是否在服务器崩溃时写入核心文件。
此变量由
--core-file
选项
设置
。
属性 | 值 |
---|---|
命令行格式 | --create-admin-listener-thread[={OFF|ON}] |
介绍 | 8.0.14 |
系统变量 | create_admin_listener_thread |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
是否在管理网络接口上使用专用侦听线程进行客户端连接(请参见 第8.12.4.1节“MySQL如何处理客户端连接” )。 默认设置是使用用于普通连接的侦听器线程来实现管理接口。
根据平台类型和工作负载等因素,您可能会发现此变量的一个设置比其他设置产生更好的性能。
create_admin_listener_thread
如果
admin_address
未指定,
则
设置
无效,
因为在这种情况下,服务器不维护管理网络接口。
属性 | 值 |
---|---|
命令行格式 | --cte-max-recursion-depth=# |
介绍 | 8.0.3 |
系统变量 | cte_max_recursion_depth |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 1000 |
最低价值 | 0 |
最大价值 | 4294967295 |
公用表表达式(CTE)的最大递归深度。 服务器终止执行任何CTE,该CTE递归的级别高于此变量的值。 有关更多信息,请参阅 限制公用表表达式递归 。
MySQL服务器数据目录的路径。
相对于当前目录解析相对路径。
如果服务器将自动启动(即,在您无法假设当前目录的上下文中),最好将该
datadir
值
指定
为绝对路径。
在MySQL 8.0.3中删除了此系统变量。
在MySQL 8.0.3中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --debug[=debug_options] |
系统变量 | debug |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (Windows) | d:t:i:O,\mysqld.trace |
默认值 (Unix) | d:t:i:o,/tmp/mysqld.trace |
此变量指示当前的调试设置。
它仅适用于使用调试支持构建的服务器。
初始值来自
--debug
服务器启动时给出
的
选项
实例的值
。
可以在运行时设置全局和会话值。
设置此系统变量的会话值是受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
指定以当前值开头
+
或
-
从中添加或减去值的值:
mysql>SET debug = 'T';
mysql>SELECT @@debug;
+ --------- + | @@ debug | + --------- + | T | + --------- + mysql>SET debug = '+P';
mysql>SELECT @@debug;
+ --------- + | @@ debug | + --------- + | P:T | + --------- + mysql>SET debug = '-P';
mysql>SELECT @@debug;
+ --------- + | @@ debug | + --------- + | T | + --------- +
有关更多信息,请参见 第29.5.4节“DBUG包” 。
属性 | 值 |
---|---|
系统变量 | debug_sync |
范围 | 会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
此变量是Debug Sync工具的用户界面。
使用Debug Sync要求使用
CMake
选项
配置MySQL
(请参见
第2.9.4节“MySQL源配置选项”
)。
如果未编译Debug Sync,则此系统变量不可用。
-DENABLE_DEBUG_SYNC=1
全局变量值是只读的,表示设施是否已启用。
默认情况下,调试Sync被禁用和值
debug_sync
是
OFF
。
如果服务器开始
,这里
是一个超时值大于0,调试同步启用和更大的价值
是
其次是信号的名字。
此外,
成为各个同步点的默认超时。
--debug-sync-timeout=
N
N
debug_sync
ON -
current signal
N
会话值可由任何用户读取,并且具有与全局变量相同的值。 可以将会话值设置为控制同步点。
设置此系统变量的会话值是受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
有关Debug Sync工具以及如何使用同步点的说明,请参阅 MySQL Internals:Test Synchronization 。
属性 | 值 |
---|---|
命令行格式 | --default-authentication-plugin=plugin_name |
系统变量 | default_authentication_plugin |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 (> = 8.0.4) | caching_sha2_password |
默认值 (<= 8.0.3) | mysql_native_password |
有效值 (> = 8.0.3) |
|
有效值 (<= 8.0.2) |
|
默认的身份验证插件。 允许这些值:
mysql_native_password
:使用MySQL本机密码;
请参见
第6.4.1.1节“本机可插入认证”
。
sha256_password
:使用SHA-256密码;
请参见
第6.4.1.2节“SHA-256可插拔认证”
。
caching_sha2_password
:使用SHA-256密码;
请参见
第6.4.1.3节“缓存SHA-2可插入认证”
。
在MySQL 8.0中,
caching_sha2_password
是默认的身份验证插件而不是
mysql_native_password
。
有关此更改对服务器操作的影响以及服务器与客户端和连接器的兼容性的信息,请参阅
caching_sha2_password作为首选身份验证插件
。
该
default_authentication_plugin
值会影响服务器操作的这些方面:
它确定服务器为创建的新帐户分配的身份验证插件
CREATE
USER
和
GRANT
未明确指定身份验证插件的语句。
对于使用以下语句创建的帐户,服务器将帐户与默认身份验证插件相关联,并为该帐户分配给定密码,根据该插件的要求进行哈希处理:
创建用户...由' cleartext password
' 标识;
属性 | 值 |
---|---|
介绍 | 8.0.11 |
系统变量 | default_collation_for_utf8mb4 |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
有效值 |
|
供复制内部使用。
此系统变量设置为
utf8mb4
字符集
的默认排序规则
。
变量的值从主设备复制到从设备,以便从设备可以正确处理源自具有不同默认排序规则的主设备的数据
utf8mb4
。
此变量主要用于支持从MySQL 5.7或更早版本的主服务器复制到MySQL 8.0从服务器,或者使用MySQL
5.7主节点和一个或多个MySQL 8.0辅助节点进行组复制。
utf8mb4
MySQL 5.7中
的默认排序规则
是
utf8mb4_general_ci
,但是
utf8mb4_0900_ai_ci
在MySQL 8.0中。
该变量在早于MySQL
8.0的版本中不存在,因此如果从属服务器没有收到变量的值,则它假定主服务器来自早期版本,并将该值设置为先前的默认排序规则
utf8mb4_general_ci
。
设置此系统变量的会话值是受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
默认
utf8mb4
排序规则用于以下语句中:
CREATE
TABLE
并且
对于表字符集或列字符集
,
ALTER
TABLE
都有一个
CHARACTER SET utf8mb4
没有
COLLATION
子句的子句。
CREATE
DATABASE
并且
ALTER
DATABASE
有一个
CHARACTER SET utf8mb4
没有
COLLATION
条款的条款。
包含
没有
子句
的表单的字符串文字的任何语句
。
_utf8mb4'
some
text
'COLLATE
属性 | 值 |
---|---|
命令行格式 | --default-password-lifetime=# |
系统变量 | default_password_lifetime |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大价值 | 65535 |
此变量定义全局自动密码到期策略。
默认
default_password_lifetime
值为0,禁用自动密码到期。
如果值为
default_password_lifetime
正整数
N
,则表示允许的密码生存期;
密码必须每天更改
N
。
可以使用
CREATE
USER
和
ALTER
USER
语句
的密码到期选项根据需要覆盖全局密码到期策略
。
请参见
第6.2.15节“密码管理”
。
属性 | 值 |
---|---|
命令行格式 | --default-storage-engine=name |
系统变量 | default_storage_engine |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | InnoDB |
默认存储引擎。
此变量仅为永久表设置存储引擎。
要为
TEMPORARY
表
设置存储引擎
,请设置
default_tmp_storage_engine
系统变量。
要查看哪些存储引擎可用并已启用,请使用该
SHOW
ENGINES
语句或查询该
INFORMATION_SCHEMA
ENGINES
表。
如果在服务器启动时禁用默认存储引擎,则必须将永久性和
TEMPORARY
表
的默认引擎设置为
其他引擎,否则服务器将无法启动。
属性 | 值 |
---|---|
命令行格式 | --default-table-encryption=# |
介绍 | 8.0.16 |
系统变量 | default_table_encryption |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 布尔 |
默认值 | OFF |
定义在创建模式和常规表空间时应用于模式和常规表空间的默认加密设置,而不指定
ENCRYPTION
子句。
该
default_table_encryption
变量仅适用于用户创建的模式和常规表空间。
它不管理
mysql
系统表空间的
加密
。
设置运行时值
default_table_encryption
需要
SYSTEM_VARIABLES_ADMIN
和
TABLE_ENCRYPTION_ADMIN
权限或
SUPER
权限。
default_table_encryption
支持
SET
PERSIST
和
SET
PERSIST_ONLY
语法。
请参见
第5.1.9.3节“持久系统变量”
。
有关更多信息,请参阅 为架构和常规表空间定义加密默认值 。
属性 | 值 |
---|---|
命令行格式 | --default-tmp-storage-engine=name |
系统变量 | default_tmp_storage_engine |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 列举 |
默认值 | InnoDB |
TEMPORARY
表
的默认存储引擎
(使用
CREATE
TEMPORARY
TABLE
)
创建
。
要为永久表设置存储引擎,请设置
default_storage_engine
系统变量。
另请参阅有关可能值的变量的讨论。
如果在服务器启动时禁用默认存储引擎,则必须将永久性和
TEMPORARY
表
的默认引擎设置为
其他引擎,否则服务器将无法启动。
属性 | 值 |
---|---|
命令行格式 | --default-week-format=# |
系统变量 | default_week_format |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大价值 | 7 |
用于该
WEEK()
功能
的默认模式值
。
请参见
第12.7节“日期和时间函数”
。
属性 | 值 |
---|---|
命令行格式 | --delay-key-write[={OFF|ON|ALL}] |
系统变量 | delay_key_write |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | ON |
有效值 |
|
此变量指定如何使用延迟键写入。
它仅适用于
MyISAM
表格。
延迟键写入会导致在写入之间不刷新键缓冲区。
另请参见
第16.2.1节“MyISAM启动选项”
。
此变量可以具有以下值之一,以影响
DELAY_KEY_WRITE
可在
CREATE
TABLE
语句中
使用
的
表选项的
处理
。
选项 | 描述 |
---|---|
OFF |
DELAY_KEY_WRITE
被忽略了。
|
ON |
MySQL尊重
语句中
DELAY_KEY_WRITE
指定的
任何
选项
CREATE
TABLE
。
这是默认值。
|
ALL |
所有新打开的表都被视为已
DELAY_KEY_WRITE
启用选项
创建
。
|
如果将此变量设置为
ALL
,则在使用
MyISAM
表时
,不应使用
其他程序(例如另一个MySQL服务器或
myisamchk
)中的表。
这样做会导致索引损坏。
如果
DELAY_KEY_WRITE
为表启用了,则不会在每次索引更新时为表刷新密钥缓冲区,但仅在表关闭时才刷新。
这会大大加快对密钥的写入速度,但是如果使用此功能,则应
MyISAM
通过使用
--myisam-recover-options
选项
启动服务器
来添加所有
表的
自动检查
(例如,
--myisam-recover-options=BACKUP,FORCE
)。
请参见
第5.1.7节“服务器命令选项”
和
第16.2.1节“MyISAM启动选项”
。
如果启用外部锁定
--external-locking
,则对使用延迟键写入的表的索引损坏没有保护。
属性 | 值 |
---|---|
命令行格式 | --delayed-insert-limit=# |
弃用 | 是 |
系统变量 | delayed_insert_limit |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 100 |
最低价值 | 1 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
不推荐使用此系统变量(因为
DELAYED
不支持插入),并且将在以后的版本中删除。
属性 | 值 |
---|---|
命令行格式 | --delayed-insert-timeout=# |
弃用 | 是 |
系统变量 | delayed_insert_timeout |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 300 |
不推荐使用此系统变量(因为
DELAYED
不支持插入),并且将在以后的版本中删除。
属性 | 值 |
---|---|
命令行格式 | --delayed-queue-size=# |
弃用 | 是 |
系统变量 | delayed_queue_size |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 1000 |
最低价值 | 1 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
不推荐使用此系统变量(因为
DELAYED
不支持插入),并且将在以后的版本中删除。
属性 | 值 |
---|---|
命令行格式 | --disabled-storage-engines=engine[,engine]... |
系统变量 | disabled_storage_engines |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | empty string |
此变量指示哪些存储引擎不能用于创建表或表空间。
例如,要防止
创建
新
表
MyISAM
或
FEDERATED
表,请在服务器选项文件中使用以下行启动服务器:
的[mysqld] disabled_storage_engines = “的MyISAM,FEDERATED”
默认情况下,
disabled_storage_engines
为空(没有引擎禁用),但可以将其设置为一个或多个引擎的逗号分隔列表(不区分大小写)。
值中指定的任何引擎都不能用于创建表或表空间,
CREATE
TABLE
或者
CREATE
TABLESPACE
不能用于
ALTER
TABLE ...
ENGINE
或
ALTER
TABLESPACE ... ENGINE
更改现有表或表空间的存储引擎。
尝试这样做会导致
ER_DISABLED_STORAGE_ENGINE
错误。
disabled_storage_engines
不限制为现有的表的其它DDL语句,比如
CREATE
INDEX
,
TRUNCATE
TABLE
,
ANALYZE
TABLE
,
DROP
TABLE
,或
DROP
TABLESPACE
。
这允许平滑过渡,以便可以通过诸如以下方式将使用禁用引擎的现有表或表空间迁移到允许的引擎
。
ALTER
TABLE ...
ENGINE
permitted_engine
允许将
default_storage_engine
或
default_tmp_storage_engine
系统变量
设置
为禁用的存储引擎。
这可能会导致应用程序出现异常或失败,尽管这可能是开发环境中用于识别使用已禁用引擎的应用程序的有用技术,以便可以对其进行修改。
disabled_storage_engines
被禁用,如果服务器开始的任何选项没有影响:
--initialize
,
--initialize-insecure
,
--skip-grant-tables
。
设置
disabled_storage_engines
可能会导致
mysql_upgrade
出现问题
。
有关详细信息,请参见
第4.4.5节“
mysql_upgrade
- 检查和升级MySQL表”
。
disconnect_on_expired_password
属性 | 值 |
---|---|
命令行格式 | --disconnect-on-expired-password[={OFF|ON}] |
系统变量 | disconnect_on_expired_password |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
此变量控制服务器处理具有过期密码的客户端的方式:
如果客户端指示它可以处理过期密码,则该值
disconnect_on_expired_password
无关紧要。
服务器允许客户端连接,但将其置于沙盒模式。
如果客户端未指示它可以处理过期密码,则服务器根据以下值处理客户端
disconnect_on_expired_password
:
如果
disconnect_on_expired_password
:已启用,则服务器将断开客户端连接。
如果
disconnect_on_expired_password
:已禁用,则服务器允许客户端连接,但将其置于沙箱模式。
有关与过期密码处理相关的客户端和服务器设置的交互的更多信息,请参见 第6.2.16节“过期密码的服务器处理” 。
属性 | 值 |
---|---|
命令行格式 | --div-precision-increment=# |
系统变量 | div_precision_increment |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 4 |
最低价值 | 0 |
最大价值 | 30 |
该变量表示增加操作员执行的除法运算结果的比例的位数
/
。
默认值为4.最小值和最大值分别为0和30。
以下示例说明了增加默认值的效果。
MySQL的>SELECT 1/7;
+ -------- + | 1/7 | + -------- + | 0.1429 | + -------- + mysql>SET div_precision_increment = 12;
mysql>SELECT 1/7;
+ ---------------- + | 1/7 | + ---------------- + | 0.142857142857 | + ---------------- +
dragnet.log_error_filter_rules
属性 | 值 |
---|---|
命令行格式 | --dragnet.log-error-filter-rules=value |
介绍 | 8.0.4 |
系统变量 | dragnet.log_error_filter_rules |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | IF prio>=INFORMATION THEN drop. IF EXISTS source_line THEN unset source_line. |
用于控制
log_filter_dragnet
错误日志过滤器组件的
操作的过滤器规则
。
如果
log_filter_dragnet
未安装,则不
dragnet.log_error_filter_rules
可用。
如果
log_filter_dragnet
已安装但未启用,则更改
dragnet.log_error_filter_rules
无效。
从MySQL 8.0.12开始,可以查询
dragnet.Status
状态变量以确定最近分配的结果
dragnet.log_error_filter_rules
。
在MySQL 8.0.12之前,
dragnet.log_error_filter_rules
在运行时
成功分配会
生成一个确认新值的注释:
MySQL的>SET GLOBAL dragnet.log_error_filter_rules = 'IF prio <> 0 THEN unset prio.';
查询正常,0行受影响,1警告(0.00秒) MySQL的>SHOW WARNINGS\G
*************************** 1。排******************** ******* 等级:注意 代码:4569 消息:接受过滤器配置: SET @@ GLOBAL.dragnet.log_error_filter_rules = '如果prio!=错误那么未设置prio。';
显示的值
表示在成功解析规则集并将其编译为内部形式后
SHOW
WARNINGS
的
“
反编译
”
规范表示。
从语义上讲,这个规范形式与赋值的值相同
dragnet.log_error_filter_rules
,但是在赋值和规范值之间可能存在一些差异,如前面的示例所示:
该
<>
运营商变更为
!=
。
数字优先级0更改为相应的优先级符号
ERROR
。
可选空格已删除。
有关其他信息,请参见 第5.4.2.3节“错误日志过滤类型” 和 第5.5.3节“错误日志组件” 。
属性 | 值 |
---|---|
命令行格式 | --end-markers-in-json[={OFF|ON}] |
系统变量 | end_markers_in_json |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 布尔 |
默认值 | OFF |
优化器JSON输出是否应添加结束标记。 请参阅 MySQL Internals:end_markers_in_json系统变量 。
属性 | 值 |
---|---|
命令行格式 | --eq-range-index-dive-limit=# |
系统变量 | eq_range_index_dive_limit |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 200 |
最低价值 | 0 |
最大价值 | 4294967295 |
此变量指示在估计合格行数时,优化程序应从使用索引dives切换到索引统计信息时相等比较条件中的相等范围数。
它适用于评估具有这些等效形式之一的表达式,其中优化程序使用非唯一索引来查找
col_name
值:
col_name
IN(val1
,...,valN
)col_name
=val1
OR ... ORcol_name
=valN
在这两种情况下,表达式都包含
N
相等范围。
优化程序可以使用索引潜水或索引统计进行行估计。
如果
eq_range_index_dive_limit
大于0,则优化程序使用现有索引统计信息而不是索引潜水(如果存在
eq_range_index_dive_limit
或更多相等范围)。
因此,要允许使用索引潜水达到
N
相等范围,请设置
eq_range_index_dive_limit
为
N
+ 1.要禁用索引统计信息并始终使用索引潜水
N
,请将其设置
eq_range_index_dive_limit
为0。
有关更多信息,请参阅 多值比较的等式范围优化 。
要更新的最佳估计表索引统计信息,使用
ANALYZE TABLE
。
生成消息的最后一个语句导致的错误数。 此变量是只读的。 请参见 第13.7.6.17节“显示错误语法” 。
属性 | 值 |
---|---|
命令行格式 | --event-scheduler[=value] |
系统变量 | event_scheduler |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 (> = 8.0.3) | ON |
默认值 (<= 8.0.2) | OFF |
有效值 |
|
此变量指示事件调度程序的状态;
可能的值是
ON
,,
OFF
和
DISABLED
,默认
值为
ON
。
在“事件”
一章
的“
概述”部分
中更详细地讨论了此变量及其对事件调度程序操作的影响
。
explicit_defaults_for_timestamp
属性 | 值 |
---|---|
命令行格式 | --explicit-defaults-for-timestamp[={OFF|ON}] |
弃用 | 是 |
系统变量 | explicit_defaults_for_timestamp |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 (> = 8.0.2) | ON |
默认值 (<= 8.0.1) | OFF |
此系统变量确定服务器是否为
列中的
默认值和
NULL
值处理
启用某些非标准行为
TIMESTAMP
。
默认情况下,
explicit_defaults_for_timestamp
启用,禁用非标准行为。
禁用会
explicit_defaults_for_timestamp
导致警告。
设置此系统变量的会话值是受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
如果
explicit_defaults_for_timestamp
禁用,则服务器启用非标准行为并按
TIMESTAMP
如下方式
处理
列:
TIMESTAMP
未使用该
NULL
属性
显式声明的列将使用该
属性自动声明
NOT
NULL
。
NULL
允许
为此类列分配值,
并将列设置为当前时间戳。
TIMESTAMP
表中
的第一
列(如果未使用
NULL
属性或显式
DEFAULT
或
ON UPDATE
属性
显式
声明)将使用
DEFAULT CURRENT_TIMESTAMP
和
ON UPDATE CURRENT_TIMESTAMP
属性
自动声明
。
TIMESTAMP
第一个后面的列,如果没有使用
NULL
属性或显式
DEFAULT
属性
显式声明
,则自动声明为
DEFAULT '0000-00-00
00:00:00'
(
“
零
”
时间戳)。
对于未为此类列指定显式值的插入行,将分配该列,
'0000-00-00
00:00:00'
并且不会发出警告。
根据是否
NO_ZERO_DATE
启用了
严格的SQL模式或
SQL模式,默认值
'0000-00-00
00:00:00'
可能无效。
请注意,
TRADITIONAL
SQL模式包括严格模式和
NO_ZERO_DATE
。
请参见
第5.1.11节“服务器SQL模式”
。
刚刚描述的非标准行为已弃用,将在未来的MySQL版本中删除。
如果
explicit_defaults_for_timestamp
启用,则服务器将禁用非标准行为并按
TIMESTAMP
如下方式
处理
列:
无法为
TIMESTAMP
列指定值
NULL
以将其设置为当前时间戳。
要分配当前时间戳,请将列设置为
CURRENT_TIMESTAMP
或等同义词
NOW()
。
TIMESTAMP
未使用该
NOT NULL
属性
显式声明的列
将使用
NULL
attribute和permit
NULL
值
自动声明
。
为此类列分配一个值,
NULL
将其设置为
NULL
,而不是当前时间戳。
TIMESTAMP
使用该
NOT NULL
属性
声明的列
不允许
NULL
值。
对于
NULL
为此类列
指定的插入,
结果是单行插入的错误或启用了严格的SQL模式,或者
'0000-00-00
00:00:00'
是为禁用严格SQL模式的多行插入插入的。
在任何情况下都不会为列分配一个值,
NULL
将其设置为当前时间戳。
TIMESTAMP
使用该
NOT NULL
属性
显式声明
但没有显式
DEFAULT
属性的列被视为没有默认值。
对于为此类列指定无显式值的插入行,结果取决于SQL模式。
如果启用了严格的SQL模式,则会发生错误。
如果未启用严格SQL模式,则使用隐式默认值声明该列,
'0000-00-00
00:00:00'
并发出警告。
这类似于MySQL如何处理其他时间类型,如
DATETIME
。
没有
TIMESTAMP
使用
DEFAULT
CURRENT_TIMESTAMP
或
ON UPDATE
CURRENT_TIMESTAMP
属性
自动声明列
。
必须明确指定这些属性。
如果
explicit_defaults_for_timestamp
在服务器启动时禁用,则会在错误日志中显示此警告:
[警告]不推荐使用具有隐式DEFAULT值的TIMESTAMP。 请使用--explicit_defaults_for_timestamp服务器选项(请参阅 文档更多细节)。
如警告所示,要禁用已弃用的非标准行为,请
explicit_defaults_for_timestamp
在服务器启动时
启用
系统变量。
explicit_defaults_for_timestamp
本身已被弃用,因为它的唯一目的是允许控制
TIMESTAMP
将来MySQL版本中要删除的
已弃用
行为。
当删除这些行为时,
explicit_defaults_for_timestamp
将没有任何目的,也将被删除。
有关其他信息,请参见 第11.3.4节“TIMESTAMP和DATETIME的自动初始化和更新” 。
属性 | 值 |
---|---|
系统变量 | external_user |
范围 | 会议 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
在身份验证过程中使用的外部用户名,由用于验证客户端的插件设置。
使用本机(内置)MySQL身份验证,或者如果插件未设置值,则此变量为
NULL
。
请参见
第6.2.18节“代理用户”
。
如果
ON
,服务器在每个SQL语句之后刷新(同步)对磁盘的所有更改。
通常,MySQL仅在每个SQL语句之后写入对磁盘的所有更改,并让操作系统处理与磁盘的同步。
请参见
第B.4.3.3节“如果MySQL不断崩溃该怎么办”
。
ON
如果
使用该
选项
启动
mysqld
,则
将此变量设置为
--flush
。
如果
flush
启用,则值
flush_time
无关紧要,并且更改为
flush_time
对刷新行为没有影响。
属性 | 值 |
---|---|
命令行格式 | --flush-time=# |
系统变量 | flush_time |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
如果将其设置为非零值,则每秒都会关闭所有表
flush_time
以释放资源并将未刷新的数据同步到磁盘。
此选项最适用于资源最少的系统。
如果
flush
启用,则值
flush_time
无关紧要,并且更改为
flush_time
对刷新行为没有影响。
属性 | 值 |
---|---|
系统变量 | foreign_key_checks |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 布尔 |
默认值 | ON |
如果设置为1(默认值),
InnoDB
则检查表的
外键约束
。
如果设置为0,则会忽略外键约束,但有几个例外。
重新创建已删除的表时,如果表定义不符合引用该表的外键约束,则会返回错误。
同样,
ALTER
TABLE
如果错误地形成外键定义
,
操作将返回错误。
有关更多信息,请参见
第13.1.20.6节“使用FOREIGN KEY约束”
。
设置此变量对
NDB
表的
影响与对
表的
影响相同
InnoDB
。
通常,在正常操作期间启用此设置,以强制
参照完整性
。
禁用外键检查对于
InnoDB
以不同于父/子关系所需的顺序
重新加载
表
非常有用
。
请参见
第15.6.1.5节“InnoDB和FOREIGN KEY约束”
。
设置
foreign_key_checks
为0也会影响数据定义语句:
DROP
SCHEMA
即使模式包含具有模式外部表引用的外键的表,也
DROP
TABLE
删除
模式,并
删除具有其他表引用的外键的表。
设置
foreign_key_checks
为1不会触发现有表数据的扫描。
因此,添加到表中的
foreign_key_checks
= 0
行将不会进行一致性验证。
即使使用,也不允许删除外键约束所需的索引
foreign_key_checks=0
。
在删除索引之前必须删除外键约束。
属性 | 值 |
---|---|
命令行格式 | --ft-boolean-syntax=name |
系统变量 | ft_boolean_syntax |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | + -><()~*:""&| |
使用的布尔全文搜索支持的运算符列表
IN BOOLEAN MODE
。
请参见
第12.9.2节“布尔全文搜索”
。
默认变量值是
'+ -><()~*:""&|'
。
更改值的规则如下:
运算符函数由字符串中的位置确定。
替换值必须为14个字符。
每个字符必须是ASCII非字母数字字符。
第一个或第二个字符必须是空格。
除了在第11和12位引用运算符的短语外,不允许重复。这两个字符不需要相同,但它们是唯一可能的两个字符。
位置10,13,和14(在缺省情况下被设定为
:
,
&
和
|
)被保留用于未来的扩展。
属性 | 值 |
---|---|
命令行格式 | --ft-max-word-len=# |
系统变量 | ft_max_word_len |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
最低价值 | 10 |
要包含在
MyISAM
FULLTEXT
索引
中的单词的最大长度
。
FULLTEXT
MyISAM
更改此变量后,必须重建表上的
索引
。
使用
。
REPAIR TABLE
tbl_name
QUICK
属性 | 值 |
---|---|
命令行格式 | --ft-min-word-len=# |
系统变量 | ft_min_word_len |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 4 |
最低价值 | 1 |
要包含在
MyISAM
FULLTEXT
索引
中的单词的最小长度
。
FULLTEXT
MyISAM
更改此变量后,必须重建表上的
索引
。
使用
。
REPAIR TABLE
tbl_name
QUICK
属性 | 值 |
---|---|
命令行格式 | --ft-query-expansion-limit=# |
系统变量 | ft_query_expansion_limit |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 20 |
最低价值 | 0 |
最大价值 | 1000 |
使用的全文搜索所使用的热门匹配数
WITH QUERY EXPANSION
。
属性 | 值 |
---|---|
命令行格式 | --ft-stopword-file=file_name |
系统变量 | ft_stopword_file |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
从中读取停用词列表的文件,用于对
MyISAM
表
进行全文搜索
。
除非给出绝对路径名以指定其他目录,否则服务器将在数据目录中查找该文件。
使用文件中的所有单词;
评论
不予
尊重。
默认情况下,使用内置的停用词列表(如
storage/myisam/ft_static.c
文件中
所定义
)。
将此变量设置为空字符串(
''
)将禁用停用词过滤。
另请参见
第12.9.4节“全文停用词”
。
FULLTEXT
MyISAM
更改此变量或停用词文件的内容后,必须重建表上的
索引
。
使用
。
REPAIR TABLE
tbl_name
QUICK
属性 | 值 |
---|---|
命令行格式 | --general-log[={OFF|ON}] |
系统变量 | general_log |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
是否启用常规查询日志。
该值可以是0(或
OFF
)以禁用日志,或1(或
ON
)以启用日志。
默认值取决于是否
--general_log
给出
了该
选项。
日志输出的目标由
log_output
系统变量
控制
;
如果该值为
NONE
,则即使启用了日志,也不会写入任何日志条目。
属性 | 值 |
---|---|
命令行格式 | --general-log-file=file_name |
系统变量 | general_log_file |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
默认值 | host_name.log |
常规查询日志文件的名称。
默认值为
,但可以使用
host_name
.log--general_log_file
选项
更改初始值
。
属性 | 值 |
---|---|
命令行格式 | --group-concat-max-len=# |
系统变量 | group_concat_max_len |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 1024 |
最低价值 | 4 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
GROUP_CONCAT()
函数
的最大允许结果长度(以字节为单位)
。
默认值为1024。
YES
如果
zlib
压缩库可供服务器使用,
NO
如果不可用。
如果没有,
则不能使用
COMPRESS()
和
UNCOMPRESS()
功能。
在MySQL 8.0.3中删除了此系统变量。
YES
如果
mysqld
支持动态加载插件,
NO
如果没有。
如果值为
NO
,则不能使用诸如
--plugin-load
在服务器启动
INSTALL
PLUGIN
时加载插件或在运行时加载插件
的
语句
等选项
。
YES
如果服务器支持空间数据类型,
NO
如果不支持。
此变量是别名
have_ssl
。
YES
if语句概要分析功能是否存在,
NO
如果不
存在
。
如果存在,
profiling
系统变量将控制是启用还是禁用此功能。
请参见
第13.7.6.31节“显示配置文件语法”
。
此变量已弃用,将在以后的MySQL版本中删除。
MySQL 8.0.3中删除了查询缓存。
have_query_cache
不推荐使用,总是具有值
NO
,并将在未来的MySQL版本中删除。
YES
如果
RTREE
索引可用,
NO
如果没有。
(这些用于
MyISAM
表中的
空间索引
。)
YES
如果
mysqld
支持SSL连接,
NO
如果不
支持
。
DISABLED
表示服务器是使用SSL支持编译的,但未使用适当的
选项
启动
。
有关更多信息,请参见
第6.3.5节“使用支持加密连接构建MySQL”
。
--ssl-
xxx
属性 | 值 |
---|---|
系统变量 | have_statement_timeout |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
语句执行超时功能是否可用(请参阅
语句执行时优化程序提示
)。
NO
如果无法初始化此功能使用的后台线程,则
该值可以是
。
YES
如果启用了符号链接支持,
NO
如果没有。
这在Unix上是必需的,以支持
DATA DIRECTORY
和
INDEX DIRECTORY
表选项。
如果使用该
--skip-symbolic-links
选项
启动服务器
,则值为
DISABLED
。
此变量在Windows上没有意义。
符号链接支持以及
--symbolic-links
控制它
的
选项已弃用,将在未来的MySQL版本中删除。
此外,默认情况下禁用该选项。
相关的
have_symlink
系统变量也已弃用,将在未来的MySQL版本中删除。
histogram_generation_max_mem_size
属性 | 值 |
---|---|
命令行格式 | --histogram-generation-max-mem-size=# |
介绍 | 8.0.2 |
系统变量 | histogram_generation_max_mem_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 20000000 |
最低价值 | 1000000 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
可用于生成直方图统计信息的最大内存量。 请参见 第8.9.6节“优化程序统计信息” 和 第13.7.3.1节“分析表语法” 。
设置此系统变量的会话值是受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
属性 | 值 |
---|---|
命令行格式 | --host-cache-size=# |
系统变量 | host_cache_size |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | -1
(表示自动调整大小;不指定此文字值)
|
最低价值 | 0 |
最大价值 | 65536 |
此变量控制主机缓存的大小,以及
host_cache
公开缓存内容
的性能模式
表
的大小
。
将大小设置为0将禁用主机缓存。
在运行时更改高速缓存大小会导致隐式
FLUSH HOSTS
操作,该操作会清除主机高速缓存,截断
host_cache
表并取消阻止任何被阻止的主机。
默认值自动调整为128,加上1表示
max_connections
最多500
的值,加上1表示值的
每个增量20超过500,
max_connections
上限为2000。
使用该
--skip-host-cache
选项类似于将
host_cache_size
系统变量
设置
为0,但
host_cache_size
更灵活,因为它还可用于在运行时调整大小,启用和禁用主机缓存,而不仅仅是在服务器启动时。
启动服务器
--skip-host-cache
并不会阻止更改值
host_cache_size
,但这些更改不起作用,即使
host_cache_size
在运行时将大于0设置
为高速缓存,也不会重新启用高速缓存
。
有关主机缓存如何工作的更多信息,请参见 第8.12.4.2节“DNS查找优化和主机缓存” 。
服务器在启动时将此变量设置为服务器主机名。
此变量是变量的同义词
last_insert_id
。
它存在与其他数据库系统的兼容性。
您可以使用它来读取其值
SELECT @@identity
,并使用它进行设置
SET identity
。
属性 | 值 |
---|---|
命令行格式 | --init-connect=name |
系统变量 | init_connect |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
服务器为每个连接的客户端执行的字符串。 该字符串由一个或多个SQL语句组成,以分号字符分隔。
对于具有
CONNECTION_ADMIN
或
SUPER
特权的
用户,
init_connect
不执行
内容
。
这样做是为了使错误的值
init_connect
不会阻止所有客户端连接。
例如,该值可能包含语法错误的语句,从而导致客户端连接失败。
init_connect
对于具有
CONNECTION_ADMIN
或
SUPER
权限的
用户,
不执行
它们会使他们打开连接并修复该
init_connect
值。
从MySQL 8.0.5开始,
init_connect
任何密码过期的客户端用户都会跳过执行。
这样做是因为这样的用户不能执行任意语句,因此
init_connect
执行将失败,导致客户端无法连接。
跳过
init_connect
执行使用户能够连接和更改密码。
服务器丢弃由值中的语句生成的任何结果集
init_connect
。
information_schema_stats_expiry
属性 | 值 |
---|---|
命令行格式 | --information-schema-stats-expiry=# |
介绍 | 8.0.3 |
系统变量 | information_schema_stats_expiry |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 86400 |
最低价值 | 0 |
最大价值 | 31536000 |
某些
INFORMATION_SCHEMA
表包含提供表统计信息的列:
STATISTICS.CARDINALITY TABLES.AUTO_INCREMENT TABLES.AVG_ROW_LENGTH TABLES.CHECKSUM TABLES.CHECK_TIME TABLES.CREATE_TIME TABLES.DATA_FREE TABLES.DATA_LENGTH TABLES.INDEX_LENGTH TABLES.MAX_DATA_LENGTH TABLES.TABLE_ROWS TABLES.UPDATE_TIME
这些列表示动态表元数据; 也就是说,随着表格内容的变化而变化的信息。
默认情况下,MySQL的检索从这些列的缓存值
mysql.index_stats
和
mysql.table_stats
这比直接从存储引擎检索统计数据更有效,当列查询字典表。
如果缓存的统计信息不可用或已过期,MySQL将从存储引擎中检索最新的统计信息,并将它们缓存在
mysql.index_stats
和
mysql.table_stats
字典表中。
后续查询将检索缓存的统计信息,直到缓存的统计信息过期。
该
information_schema_stats_expiry
会话变量定义的时间段之前缓存统计到期。
默认值为86400秒(24小时),但时间段可以延长至一年。
要随时更新给定表的缓存值,请使用
ANALYZE TABLE
。
要始终直接从存储引擎检索最新统计信息并绕过缓存值,请设置
information_schema_stats_expiry
为
0
。
在这些情况下,
查询统计信息列不会在
mysql.index_stats
和
mysql.table_stats
字典表中
存储或更新统计信息
:
缓存的统计信息尚未过期。
何时
information_schema_stats_expiry
设置为0。
当服务器开始
read_only
,
super_read_only
,
transaction_read_only
,或
innodb_read_only
模式。
当查询还提取性能架构数据时。
information_schema_stats_expiry
是一个会话变量,每个客户端会话可以定义自己的到期值。
从存储引擎检索并由一个会话缓存的统计信息可供其他会话使用。
有关相关信息,请参见 第8.2.3节“优化INFORMATION_SCHEMA查询” 。
--init-file
启动服务器时
使用该
选项
指定的文件的名称
。
这应该是一个包含您希望服务器在启动时执行的SQL语句的文件。
每个声明必须在一行上,不应包含注释。
有关更多信息,请参阅的说明
--init-file
。
innodb_
xxx
InnoDB
系统变量在
第15.13节“InnoDB启动选项和系统变量”
中列出
。
这些变量控制表的存储,内存使用和I / O模式的许多方面
InnoDB
,并且现在
InnoDB
作为默认存储引擎
尤其重要
。
插入
值
时
由以下
语句
INSERT
或
ALTER
TABLE
语句使用的
AUTO_INCREMENT
值。
这主要用于二进制日志。
属性 | 值 |
---|---|
命令行格式 | --interactive-timeout=# |
系统变量 | interactive_timeout |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 28800 |
最低价值 | 1 |
服务器在关闭之前等待交互式连接上的活动的秒数。
交互式客户端定义为使用该
CLIENT_INTERACTIVE
选项
的客户端
mysql_real_connect()
。
另见
wait_timeout
。
internal_tmp_disk_storage_engine
属性 | 值 |
---|---|
命令行格式 | --internal-tmp-disk-storage-engine=# |
删除 | 8.0.16 |
系统变量 | internal_tmp_disk_storage_engine |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | INNODB |
有效值 |
|
在MySQL 8.0.16及更高版本中,磁盘内部临时表总是使用
InnoDB
存储引擎;
从MySQL 8.0.16开始,此变量已被删除,因此不再受支持。
在MySQL 8.0.16之前,此变量确定用于磁盘内部临时表的
存储引擎
(请参阅磁盘内部临时表的
存储引擎
)。
允许的值是
MYISAM
和
INNODB
(默认值)。
internal_tmp_mem_storage_engine
属性 | 值 |
---|---|
命令行格式 | --internal-tmp-mem-storage-engine=# |
介绍 | 8.0.2 |
系统变量 | internal_tmp_mem_storage_engine |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 列举 |
默认值 | TempTable |
有效值 |
|
内存内部临时表的存储引擎(请参见
第8.4.4节“MySQL中的内部临时表使用”
)。
允许的值是
TempTable
(默认值)和
MEMORY
。
所述
优化器
使用由限定的存储引擎
internal_tmp_mem_storage_engine
在存储器内部临时表。
属性 | 值 |
---|---|
命令行格式 | --join-buffer-size=# |
系统变量 | join_buffer_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 262144 |
最低价值 | 128 |
最大值 (其他,64位平台) | 18446744073709547520 |
最大值 (其他,32位平台) | 4294967295 |
最大值 (Windows) | 4294967295 |
用于普通索引扫描,范围索引扫描和不使用索引的连接的缓冲区的最小大小,从而执行全表扫描。
通常,获得快速连接的最佳方法是添加索引。
在
join_buffer_size
无法添加索引时,增加
值
以获得更快的完全连接。
为两个表之间的每个完整连接分配一个连接缓冲区。
对于未使用索引的多个表之间的复杂连接,可能需要多个连接缓冲区。
除非使用批量密钥访问(BKA),否则设置缓冲区大于保存每个匹配行所需的增益并且所有连接至少分配最小大小都没有收益,因此请谨慎使用此变量全局设置为较大值。 最好保持全局设置较小,仅在进行大型连接的会话中更改为更大的设置。 如果全局大小大于使用它的大多数查询所需的内存分配时间,则会导致性能大幅下降。
使用BKA时,值
join_buffer_size
定义了每个请求到存储引擎的批量密钥的大小。
缓冲区越大,对连接操作的右侧表的顺序访问就越多,这可以显着提高性能。
默认值为256KB。
允许的最大设置为
join_buffer_size
4GB-1。
64位平台允许更大的值(64位Windows除外,其中大值被截断为4GB-1并带有警告)。
有关连接缓冲的其他信息,请参见 第8.2.1.6节“嵌套循环连接算法” 。 有关批量密钥访问的信息,请参见 第8.2.1.11节“阻止嵌套循环和批量密钥访问连接” 。
属性 | 值 |
---|---|
命令行格式 | --keep-files-on-create[={OFF|ON}] |
系统变量 | keep_files_on_create |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
如果
MyISAM
创建
的
表没有
DATA DIRECTORY
选项,
.MYD
则在数据库目录中创建
该
文件。
默认情况下,如果
在这种情况下
MyISAM
找到现有
.MYD
文件,则会覆盖它。
这同样适用于
.MYI
没有
INDEX
DIRECTORY
选项
创建的表的文件
。
若要禁止此行为,请将
keep_files_on_create
变量
设置
为
ON
(1),在这种情况下,
MyISAM
不会覆盖现有文件并返回错误。
默认值为
OFF
(0)。
如果
MyISAM
使用
DATA DIRECTORY
或
INDEX
DIRECTORY
选项
创建表
并且
找到
现有
.MYD
或
.MYI
文件,则MyISAM始终返回错误。
它不会覆盖指定目录中的文件。
属性 | 值 |
---|---|
命令行格式 | --key-buffer-size=# |
系统变量 | key_buffer_size |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 8388608 |
最低价值 | 8 |
最大值 (64位平台) | OS_PER_PROCESS_LIMIT |
最大值 (32位平台) | 4294967295 |
MyISAM
表的
索引块
是缓冲的,并由所有线程共享。
key_buffer_size
是用于索引块的缓冲区的大小。
密钥缓冲区也称为密钥缓存。
key_buffer_size
在32位平台上,
允许的最大设置为
4GB-1。
64位平台允许更大的值。
有效最大大小可能会更小,具体取决于您的可用物理RAM和操作系统或硬件平台强加的每进程RAM限制。
此变量的值表示请求的内存量。
在内部,服务器尽可能多地分配内存,但实际分配可能更少。
您可以增加该值以获得所有读取和多次写入的更好的索引处理;
在一个系统的主要功能是使用。运行MySQL
MyISAM
存储引擎,机器总内存的25%是此变量的可接受值。
但是,您应该知道,如果您将值设置得太大(例如,超过机器总内存的50%),您的系统可能会开始翻页并变得非常慢。
这是因为MySQL依靠操作系统来执行数据读取的文件系统缓存,因此您必须为文件系统缓存留出一些空间。
您还应该考虑您可能正在使用的任何其他存储引擎的内存要求
MyISAM
。
要在同时写入多行时获得更高的速度,请使用
LOCK TABLES
。
请参见
第8.2.5.1节“优化INSERT语句”
。
您可以通过发出检查键值缓冲区的性能
SHOW STATUS
声明和检查
Key_read_requests
,
Key_reads
,
Key_write_requests
,和
Key_writes
状态变量。
(参见
第13.7.6节“显示语法”
。)
Key_reads/Key_read_requests
比率通常应小于0.01。
Key_writes/Key_write_requests
如果您主要使用更新和删除,则
该
比率通常接近1,但如果您倾向于同时执行影响多行的更新或者您正在使用
DELAY_KEY_WRITE
表选项
,则
该
比率可能会小得多
。
使用的密钥缓冲区的分数可以
key_buffer_size
结合
Key_blocks_unused
状态变量和缓冲区块大小
来确定
,缓冲区块大小可以从
key_cache_block_size
系统变量中获得:
1 - ((Key_blocks_unused * key_cache_block_size)/ key_buffer_size)
此值是近似值,因为密钥缓冲区中的某些空间是在内部为管理结构分配的。 影响这些结构的开销量的因素包括块大小和指针大小。 随着块大小的增加,密钥缓冲区丢失到开销的百分比趋于降低。 较大的块导致较少的读取操作(因为每次读取获得更多的键),但相反地,未检查的键的读取的增加(如果不是块中的所有键都与查询相关)。
可以创建多个
MyISAM
密钥缓存。
4GB的大小限制单独应用于每个缓存,而不是组。
请参见
第8.10.2节“MyISAM密钥缓存”
。
属性 | 值 |
---|---|
命令行格式 | --key-cache-age-threshold=# |
系统变量 | key_cache_age_threshold |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 300 |
最低价值 | 100 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
此值控制缓冲区从密钥缓存的热子列表到热子列表的降级。 较低的值会导致降级更快发生。 最小值为100.默认值为300.请参见 第8.10.2节“MyISAM密钥缓存” 。
属性 | 值 |
---|---|
命令行格式 | --key-cache-block-size=# |
系统变量 | key_cache_block_size |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 1024 |
最低价值 | 512 |
最大价值 | 16384 |
密钥缓存中块的大小(以字节为单位)。 默认值为1024.请参见 第8.10.2节“MyISAM密钥缓存” 。
属性 | 值 |
---|---|
命令行格式 | --key-cache-division-limit=# |
系统变量 | key_cache_division_limit |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 100 |
最低价值 | 1 |
最大价值 | 100 |
密钥缓存缓冲区列表的热和热子列表之间的分割点。 该值是用于暖子列表的缓冲区列表的百分比。 允许的值范围为1到100.默认值为100.请参见 第8.10.2节“MyISAM密钥缓存” 。
属性 | 值 |
---|---|
系统变量 | large_files_support |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
是否 使用大文件支持选项编译 mysqld 。
属性 | 值 |
---|---|
命令行格式 | --large-pages[={OFF|ON}] |
系统变量 | large_pages |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
平台特定 | Linux的 |
类型 | 布尔 |
默认值 | OFF |
是否启用了大页面支持(通过
--large-pages
选项)。
请参见
第8.12.3.2节“启用大页面支持”
。
属性 | 值 |
---|---|
系统变量 | large_page_size |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
如果启用了大页面支持,则会显示内存页面的大小。 仅在Linux上支持大内存页面; 在其他平台上,此变量的值始终为0.请参见 第8.12.3.2节“启用大页面支持” 。
要返回的值
LAST_INSERT_ID()
。
当您
LAST_INSERT_ID()
在更新表的语句中
使用时,它将存储在二进制日志
中。
设置此变量不会更新
mysql_insert_id()
C API函数
返回的值
。
属性 | 值 |
---|---|
命令行格式 | --lc-messages=name |
系统变量 | lc_messages |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | en_US |
用于错误消息的语言环境。
默认是
en_US
。
服务器将参数转换为语言名称,并将其与值组合
lc_messages_dir
以生成错误消息文件的位置。
请参见
第10.11节“设置错误消息语言”
。
属性 | 值 |
---|---|
命令行格式 | --lc-messages-dir=dir_name |
系统变量 | lc_messages_dir |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 目录名称 |
错误消息所在的目录。
服务器将该值与值一起使用,
lc_messages
以生成错误消息文件的位置。
请参见
第10.11节“设置错误消息语言”
。
属性 | 值 |
---|---|
命令行格式 | --lc-time-names=value |
系统变量 | lc_time_names |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
此变量指定控制用于显示日期和月份名称和缩写的语言的语言环境。
此变量影响从输出
DATE_FORMAT()
,
DAYNAME()
和
MONTHNAME()
功能。
区域设置名称是POSIX样式的值,例如
'ja_JP'
或
'pt_BR'
。
'en_US'
无论系统的区域设置如何,
默认值都是如此
。
有关详细信息,请参见
第10.15节“MySQL服务器区域设置支持”
。
服务器具有的许可证类型。
属性 | 值 |
---|---|
命令行格式 | --local-infile[={OFF|ON}] |
系统变量 | local_infile |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 (> = 8.0.2) | OFF |
默认值 (<= 8.0.1) | ON |
此变量控制
语句的
服务器端
LOCAL
功能
LOAD
DATA
。
根据
local_infile
设置,服务器拒绝或允许客户端
LOCAL
启用的客户端
加载本地数据
。
要显式地使服务器拒绝或允许
LOAD
DATA
LOCAL
语句(无论在构建时或运行时如何配置客户端程序和库)
,分别启用
具有
禁用或启用的
mysqld
local_infile
。
local_infile
也可以在运行时设置。
有关更多信息,请参见
第6.1.6节“LOAD DATA LOCAL的安全问题”
。
属性 | 值 |
---|---|
命令行格式 | --lock-wait-timeout=# |
系统变量 | lock_wait_timeout |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 31536000 |
最低价值 | 1 |
最大价值 | 31536000 |
此变量指定尝试获取元数据锁的超时(以秒为单位)。 允许值范围为1到31536000(1年)。 默认值为31536000。
此超时适用于使用元数据锁的所有语句。
这些措施包括对表,视图DML和DDL操作,存储过程和存储功能,以及
LOCK TABLES
,
FLUSH TABLES
WITH READ LOCK
和
HANDLER
语句。
这个超时不适用于隐含访问系统表
mysql
的数据库,如通过修改授权表
GRANT
或
REVOKE
报表或表格记录语句。
超时适用于直接访问的系统表,例如with
SELECT
或
UPDATE
。
超时值分别适用于每个元数据锁定尝试。
给定语句可能需要多个锁,因此语句可能会
lock_wait_timeout
在报告超时错误之前
阻塞的时间长于该
值。
发生锁定超时时,
ER_LOCK_WAIT_TIMEOUT
会报告。
lock_wait_timeout
还定义了
LOCK
INSTANCE FOR BACKUP
语句在放弃之前等待锁定
的时间量
。
属性 | 值 |
---|---|
系统变量 | locked_in_memory |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
默认错误日志目标。
如果目标是控制台,则值为
stderr
。
否则,目标是文件,
log_error
值是文件名。
请参见
第5.4.2节“错误日志”
。
属性 | 值 |
---|---|
命令行格式 | --log-error-filter-rules=value |
介绍 | 8.0.2 |
删除 | 8.0.4 |
系统变量 | log_error_filter_rules |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | set by server |
错误记录的过滤规则。 此变量未使用。 它已在MySQL 8.0.4中删除。
属性 | 值 |
---|---|
命令行格式 | --log-error-services=value |
介绍 | 8.0.2 |
系统变量 | log_error_services |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | log_filter_internal; log_sink_internal |
用于启用错误日志记录的组件。
变量可以包含具有0,1或许多元素的列表。
在后一种情况下,元素可以用分号或(从MySQL 8.0.12开始)逗号分隔,可选地后跟空格。
给定的设置不能同时使用分号和逗号分隔符。
组件顺序很重要,因为服务器按列出的顺序执行组件。
log_error_services
必须首先安装值中
指定的任何可加载(未内置)组件
INSTALL COMPONENT
。
有关更多信息,请参见
第5.4.2.1节“错误日志组件配置”
。
属性 | 值 |
---|---|
命令行格式 | --log-error-suppression-list=value |
介绍 | 8.0.13 |
系统变量 | log_error_suppression_list |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | empty string |
该
log_error_suppression_list
系统变量适用于用于错误日志事件,并指定时,他们用的优先级进行打压的事件
WARNING
或
INFORMATION
。
例如,如果特定类型的警告
在错误日志中
被认为是不合需要的
“
噪声
”
,因为它经常发生但不感兴趣,则可以抑制它。
此变量影响由
log_filter_internal
错误日志过滤器组件
执行的
过滤,该组件默认启用(请参见
第5.5.3节“错误日志组件”
)。
如果
log_filter_internal
禁用,
log_error_suppression_list
则无效。
该
log_error_suppression_list
值可以是无抑制的空字符串,或者是指示要抑制的错误代码的一个或多个逗号分隔值的列表。
错误代码可以用符号或数字形式指定。
可以使用或不使用
MY-
前缀
指定数字代码
。
数字部分中的前导零并不重要。
允许的代码格式示例:
ER_SERVER_SHUTDOWN_COMPLETE MY-000031 000031 MY-31 31
对于可读性和可移植性,符号值优于数值。 有关允许的错误符号和数字的信息,请参见 第B.3节“错误消息参考” 。
log_error_suppression_list
结合
的效果
log_error_verbosity
。
有关其他信息,请参见
第5.4.2.4节“基于优先级的错误日志过滤(log_filter_internal)”
。
属性 | 值 |
---|---|
命令行格式 | --log-error-verbosity=# |
系统变量 | log_error_verbosity |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 (> = 8.0.4) | 2 |
默认值 (<= 8.0.3) | 3 |
最低价值 | 1 |
最大价值 | 3 |
该
log_error_verbosity
系统变量指定用于处理用于错误日志事件的详细程度。
此变量影响由
log_filter_internal
错误日志过滤器组件
执行的
过滤,该组件默认启用(请参见
第5.5.3节“错误日志组件”
)。
如果
log_filter_internal
禁用,
log_error_verbosity
则无效。
用于错误日志事件具有的优先级
ERROR
,
WARNING
或
INFORMATION
。
log_error_verbosity
根据写入日志的消息允许的优先级来控制详细程度,如下表所示。
允许的消息优先级 | log_error_verbosity值 |
---|---|
ERROR |
1 |
ERROR
,
WARNING
|
2 |
ERROR
,
WARNING
,
INFORMATION
|
3 |
还有一个优先事项
SYSTEM
。
无论
log_error_verbosity
值
如何,都会将有关非错误情况的系统消息打印到错误日志中
。
这些消息包括启动和关闭消息,以及对设置的一些重大更改。
log_error_verbosity
结合
的效果
log_error_suppression_list
。
有关其他信息,请参见
第5.4.2.4节“基于优先级的错误日志过滤(log_filter_internal)”
。
属性 | 值 |
---|---|
命令行格式 | --log-output=name |
系统变量 | log_output |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 组 |
默认值 | FILE |
有效值 |
|
一般查询日志和慢查询日志输出的目标或目标。
该值是一个列表选自一个或多个以逗号分隔的话
TABLE
,
FILE
和
NONE
。
TABLE
选择记录到
系统数据库中
的
general_log
和
slow_log
表
mysql
。
FILE
选择记录到日志文件。
NONE
禁用日志记录。
如果
NONE
值存在,则它优先于存在的任何其他单词。
TABLE
并且
FILE
可以同时选择两个日志输出目的地。
此变量选择日志输出目标,但不启用日志输出。
为此,请启用
general_log
和
slow_query_log
系统变量。
对于
FILE
日志记录,
系统变量
general_log_file
和
slow_query_log_file
系统变量确定日志文件位置。
有关更多信息,请参见
第5.4.1节“选择常规查询日志和慢查询日志输出目标”
。
属性 | 值 |
---|---|
命令行格式 | --log-queries-not-using-indexes[={OFF|ON}] |
系统变量 | log_queries_not_using_indexes |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
是否将不使用索引的查询记录到慢查询日志中。 请参见 第5.4.5节“慢查询日志” 。
属性 | 值 |
---|---|
命令行格式 | --log-slow-admin-statements[={OFF|ON}] |
系统变量 | log_slow_admin_statements |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
在写入慢查询日志的语句中包含慢速管理语句。
行政陈述包括
ALTER
TABLE
,
ANALYZE TABLE
,
CHECK
TABLE
,
CREATE INDEX
,
DROP
INDEX
,
OPTIMIZE TABLE
,和
REPAIR TABLE
。
属性 | 值 |
---|---|
命令行格式 | --log-slow-extra[={OFF|ON}] |
介绍 | 8.0.14 |
系统变量 | log_slow_extra |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
如果启用了慢查询日志并且输出目标包含
FILE
,则服务器会将其他字段写入日志文件行,以提供有关慢语句的信息。
请参见
第5.4.5节“慢查询日志”
。
TABLE
输出不受影响。
属性 | 值 |
---|---|
命令行格式 | --log-syslog[={OFF|ON}] |
弃用 | 8.0.2(在8.0.13中删除) |
系统变量 | log_syslog |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 (Windows,<= 8.0.1) | ON |
默认值 (Unix,<= 8.0.1) | OFF |
默认值 (> = 8.0.2) | ON
(启用错误记录到系统日志时)
|
在MySQL 8.0之前,此变量控制是否执行错误记录到系统日志(Windows
syslog
上
的事件日志,以及
Unix和类Unix系统)。
在MySQL 8.0中,
log_sink_syseventlog
日志组件实现了对系统日志的错误记录(请参见
第5.4.2.7节“记录到系统日志的错误”
),因此可以通过将该组件添加到
log_error_services
系统变量
来启用此类型的日志记录
。
log_syslog
已移除。
(在MySQL 8.0.13之前,
log_syslog
存在但已被弃用且无效。)
属性 | 值 |
---|---|
命令行格式 | --log-syslog-facility=value |
删除 | 8.0.13 |
系统变量 | log_syslog_facility |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | daemon |
此变量已在MySQL 8.0.13中删除,并替换为
syseventlog.facility
。
属性 | 值 |
---|---|
命令行格式 | --log-syslog-include-pid[={OFF|ON}] |
删除 | 8.0.13 |
系统变量 | log_syslog_include_pid |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
此变量已在MySQL 8.0.13中删除,并替换为
syseventlog.include_pid
。
属性 | 值 |
---|---|
命令行格式 | --log-syslog-tag=tag |
删除 | 8.0.13 |
系统变量 | log_syslog_tag |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | empty string |
此变量已在MySQL 8.0.13中删除,并替换为
syseventlog.tag
。
属性 | 值 |
---|---|
命令行格式 | --log-timestamps=# |
系统变量 | log_timestamps |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | UTC |
有效值 |
|
此变量控制写入错误日志的消息中的时间戳的时区,以及写入文件的一般查询日志和慢查询日志消息。
它不会影响一般查询日志的时区和写入表(
mysql.general_log
,
mysql.slow_log
)的
慢查询日志消息
。
CONVERT_TZ()
通过设置会话
time_zone
系统变量,
可以将从这些表中检索的行从本地系统时区转换为任何所需的时区
。
允许的
log_timestamps
值是
UTC
(默认值)和
SYSTEM
(本地系统时区)。
时间戳使用ISO 8601 / RFC 3339格式编写:
YYYY-MM-DDThh:mm:ss.uuuuuu
加上
Z
表示祖鲁时间(UTC)或
±hh:mm
(与UTC的偏移
)
的尾值
。
log_throttle_queries_not_using_indexes
属性 | 值 |
---|---|
命令行格式 | --log-throttle-queries-not-using-indexes=# |
系统变量 | log_throttle_queries_not_using_indexes |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
如果
log_queries_not_using_indexes
启用,则
log_throttle_queries_not_using_indexes
变量限制可以写入慢查询日志的每分钟此类查询的数量。
值0(默认值)表示
“
无限制
”
。
有关更多信息,请参见
第5.4.5节“慢查询日志”
。
属性 | 值 |
---|---|
命令行格式 | --log-warnings[=#] |
弃用 | 是(在8.0.3中删除) |
系统变量 | log_warnings |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 2 |
最低价值 | 0 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
在MySQL 8.0.3中删除了此系统变量。
请改用
log_error_verbosity
系统变量。
属性 | 值 |
---|---|
命令行格式 | --long-query-time=# |
系统变量 | long_query_time |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 数字 |
默认值 | 10 |
最低价值 | 0 |
如果查询花费的时间超过此秒数,则服务器会递增
Slow_queries
状态变量。
如果启用了慢查询日志,则查询将记录到慢查询日志文件中。
此值是实时测量的,而不是CPU时间,因此在负载较轻的系统上低于阈值的查询可能会高于严重负载的阈值。
最小值和默认值分别
long_query_time
为0和10。
该值可以指定为微秒的分辨率。
请参见
第5.4.5节“慢查询日志”
。
属性 | 值 |
---|---|
命令行格式 | --low-priority-updates[={OFF|ON}] |
系统变量 | low_priority_updates |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
如果设置为
1
所有
INSERT
,
UPDATE
,
DELETE
和
LOCK TABLE
WRITE
语句等到有没有挂起
SELECT
或
LOCK TABLE
READ
受影响的表。
这会影响只使用表级锁只存储引擎(例如
MyISAM
,
MEMORY
和
MERGE
)。
属性 | 值 |
---|---|
系统变量 | lower_case_file_system |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
此变量描述数据目录所在的文件系统上文件名的区分大小写。
OFF
表示文件名区分大小写,
ON
表示它们不区分大小写。
此变量是只读的,因为它反映了文件系统属性并设置它对文件系统没有影响。
属性 | 值 |
---|---|
命令行格式 | --lower-case-table-names[=#] |
系统变量 | lower_case_table_names |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大价值 | 2 |
如果设置为0,则表名称按指定方式存储,并且比较区分大小写。 如果设置为1,则表名称以小写形式存储在磁盘上,并且比较不区分大小写。 如果设置为2,则表名称将按给定方式存储,但会以小写形式进行比较。 此选项也适用于数据库名称和表别名。 有关其他详细信息,请参见 第9.2.2节“标识符区分大小写” 。
在Windows上,默认值为1.在macOS上,默认值为2.在Linux上,不支持值2; 服务器强制该值为0。
你应该
不
设置
lower_case_table_names
,如果你所在的数据目录驻留在不区分大小写的文件系统(如Windows或Mac系统)的系统上运行MySQL为0。
它是一种不受支持的组合,在
使用错误的
字母大小写
运行
操作
时可能导致挂起状况
。
使用
,使用不同的字母大小写访问表名可能会导致索引损坏。
INSERT INTO ...
SELECT ... FROM
tbl_name
tbl_name
MyISAM
如果您尝试
--lower_case_table_names=0
在不区分大小写的文件系统上
启动服务器,则会打印一条错误消息并退出服务器
。
如果您正在使用
InnoDB
表,则应在所有平台上将此变量设置为1以强制将名称转换为小写。
此变量的设置会影响复制过滤选项在区分大小写方面的行为。 有关更多信息,请参见 第17.2.5节“服务器如何评估复制过滤规则” 。
禁止
lower_case_table_names
使用与初始化
服务器时使用的
设置不同的设置启动服务器。
限制是必要的,因为各种数据字典表字段使用的排序规则基于初始化服务器时定义的设置,并且使用不同的设置重新启动服务器会导致标识符的排序和比较方式不一致。
属性 | 值 |
---|---|
命令行格式 | --mandatory-roles=value |
介绍 | 8.0.2 |
系统变量 | mandatory_roles |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | empty string |
服务器应视为必需的角色。
实际上,这些角色会自动授予每个用户,但设置
mandatory_roles
实际上不会更改任何用户帐户,并且授予的角色在
mysql.role_edges
系统表
中不可见
。
变量值是以逗号分隔的角色名称列表。 例:
SET PERSIST mandatory_roles ='`role1` @`%`,`role2`,role3,role4 @ localhost';
除了
设置全局系统变量运行时值通常所需的特权
或
特权
之外,
设置运行时值还
mandatory_roles
需要
ROLE_ADMIN
特权
。
SYSTEM_VARIABLES_ADMIN
SUPER
角色名称由
格式
的用户部分和主机部分组成
。
主机部分(如果省略)默认为
。
有关其他信息,请参见
第6.2.5节“指定角色名称”
。
user_name
@host_name
%
该
mandatory_roles
值是一个字符串,因此用户名和主机名(如果引用)必须以允许在引用字符串中引用的方式编写。
在值命名的角色
mandatory_roles
不能被撤销
REVOKE
或下降
DROP
ROLE
或
DROP
USER
。
要防止会话默认为系统会话,具有该
SYSTEM_USER
权限
的角色
不能列在
mandatory_roles
系统变量
的值中
:
如果
mandatory_roles
在启动时为具有该
SYSTEM_USER
特权
的角色分配了一个角色
,则服务器会将消息写入错误日志并退出。
如果
mandatory_roles
在运行时为具有该
SYSTEM_USER
特权
的角色分配了一个角色,
则会发生错误并且该
mandatory_roles
值保持不变。
强制角色(如明确授予的角色)在激活之前不会生效(请参阅
激活角色
)。
在登录时,如果
activate_all_roles_on_login
启用
了
系统变量
,则会对所有授予的角色进行角色
激活;
否则,或者对于设置为默认角色的角色。
在运行时,
SET
ROLE
激活角色。
分配给
mandatory_roles
但以后创建
时不存在的角色
可能需要特殊处理才能被视为强制性。
有关详细信息,请参阅
定义强制角色
。
SHOW
GRANTS
根据
第13.7.6.21节“SHOW GRANTS语法”中
描述的规则显示强制角色
。
属性 | 值 |
---|---|
命令行格式 | --max-allowed-packet=# |
系统变量 | max_allowed_packet |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 (> = 8.0.3) | 67108864 |
默认值 (<= 8.0.2) | 4194304 |
最低价值 | 1024 |
最大价值 | 1073741824 |
一个数据包或任何生成/中间字符串的最大大小,或
mysql_stmt_send_long_data()
C API函数
发送的任何参数
。
默认值为64MB。
数据包消息缓冲区初始化为
net_buffer_length
字节,但
max_allowed_packet
在需要时
可以增长到
字节。
默认情况下,此值很小,可以捕获大量(可能不正确)的数据包。
如果使用大
BLOB
列或长字符串,
则必须增加此值
。
它应该与
BLOB
您想要使用
的最大值一样大
。
协议限制为
max_allowed_packet
1GB。
该值应为1024的倍数;
nonmultiples向下舍入到最接近的倍数。
通过更改
max_allowed_packet
变量
的值来更改消息缓冲区大小时,
如果客户端程序允许,还应更改客户端的缓冲区大小。
max_allowed_packet
内置于客户端库
的默认
值为1GB,但单个客户端程序可能会覆盖此值。
例如,
mysql
和
mysqldump的
默认值分别为16MB和24MB。
它们还允许您通过
max_allowed_packet
在命令行或选项文件中
进行设置来更改客户端值
。
此变量的会话值是只读的。
客户端最多可以接收与会话值一样多的字节。
但是,服务器不会向客户端发送比当前全局
max_allowed_packet
值
更多的字节
。
(如果在客户端连接后更改全局值,则全局值可能小于会话值。)
属性 | 值 |
---|---|
命令行格式 | --max-connect-errors=# |
系统变量 | max_connect_errors |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 100 |
最低价值 | 1 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
在
max_connect_errors
没有成功连接的情况下中断来自主机的连续连接请求
后
,服务器会阻止该主机进一步连接。
如果
max_connect_errors
在上一次连接中断后,
在少于
尝试的次数
内成功建立了来自主机的连接,则主机
的错误计数将清零。
但是,一旦主机被阻止,刷新主机缓存是解除阻塞的唯一方法。
要刷新主机缓存,请执行
语句,截断Performance Schema
表
FLUSH HOSTS
的
TRUNCATE TABLE
语句
host_cache
或
mysqladmin flush-hosts
命令。
有关主机缓存如何工作的更多信息,请参见 第8.12.4.2节“DNS查找优化和主机缓存” 。
属性 | 值 |
---|---|
命令行格式 | --max-connections=# |
系统变量 | max_connections |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 151 |
最低价值 | 1 |
最大价值 | 100000 |
允许的最大同时客户端连接数。 有关更多信息,请参见 第8.12.4.1节“MySQL如何处理客户端连接” 。
属性 | 值 |
---|---|
命令行格式 | --max-delayed-threads=# |
弃用 | 是 |
系统变量 | max_delayed_threads |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 20 |
最低价值 | 0 |
最大价值 | 16384 |
不推荐使用此系统变量(因为
DELAYED
不支持插入),并且将在以后的版本中删除。
属性 | 值 |
---|---|
命令行格式 | --max-digest-length=# |
系统变量 | max_digest_length |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 1024 |
最低价值 | 0 |
最大价值 | 1048576 |
每个会话保留的最大内存字节数,用于计算规范化语句摘要。 在摘要计算期间使用该空间量后,将发生截断:不会收集来自已解析语句的其他标记或将其计入其摘要值。 仅在解析的令牌的许多字节之后不同的语句产生相同的规范化语句摘要,并且如果比较或者如果聚合用于摘要统计则被认为是相同的。
减小
max_digest_length
值会减少内存使用量,但如果仅在结尾处有所不同,则会导致更多语句的摘要值无法区分。
增加该值可以区分更长的语句,但会增加内存使用,特别是对于涉及大量同时会话的工作负载(服务器
max_digest_length
为每个会话
分配
字节数)。
解析器使用此系统变量作为其计算的规范化语句摘要的最大长度的限制。
如果性能模式跟踪语句摘要,则使用该模式制作摘要值的副本
performance_schema_max_digest_length
。
系统变量作为其存储的摘要最大长度的限制。
因此,如果
performance_schema_max_digest_length
小于
max_digest_length
,则相对于原始摘要值截断存储在性能模式中的摘要值。
有关 语句摘要的 更多信息,请参见 第26.10节“性能模式语句摘要和采样” 。
属性 | 值 |
---|---|
命令行格式 | --max-error-count=# |
系统变量 | max_error_count |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 (> = 8.0.3) | 1024 |
默认值 (<= 8.0.2) | 64 |
最低价值 | 0 |
最大价值 | 65535 |
要存储以供
SHOW
ERRORS
和
SHOW
WARNINGS
语句
显示的最大错误,警告和信息消息数
。
这与诊断区域中的条件区域数量相同,因此可以检查的条件数量相同
GET
DIAGNOSTICS
。
属性 | 值 |
---|---|
命令行格式 | --max-execution-time=# |
系统变量 | max_execution_time |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 0 |
SELECT
语句
的执行超时
,以毫秒为单位。
如果值为0,则不启用超时。
max_execution_time
适用如下:
全局
max_execution_time
值为新连接提供会话值的默认值。
会话值适用
SELECT
于在会话中执行的不包含
优化程序提示或为
0的执行。
MAX_EXECUTION_TIME(
N
)N
max_execution_time
适用于只读
SELECT
语句。
不是只读的语句是那些调用存储函数的语句,该函数将数据修改为副作用。
max_execution_time
对于
SELECT
存储程序中的语句,将
被忽略
。
属性 | 值 |
---|---|
命令行格式 | --max-heap-table-size=# |
系统变量 | max_heap_table_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 16777216 |
最低价值 | 16384 |
最大值 (64位平台) | 1844674407370954752 |
最大值 (32位平台) | 4294967295 |
此变量设置
MEMORY
允许
用户创建的
表增长
的最大大小
。
变量的值用于计算
MEMORY
表
MAX_ROWS
值。
设置此变量对任何现有的无影响
MEMORY
的表,除非表是用一份声明中重新创建如
CREATE
TABLE
或结构改变
ALTER
TABLE
或
TRUNCATE
TABLE
。
服务器重新启动还会将现有
MEMORY
表
的最大大小设置
为全局
max_heap_table_size
值。
此变量还与
tmp_table_size
限制内部内存表的大小
一起使用
。
请参见
第8.4.4节“MySQL中的内部临时表使用”
。
max_heap_table_size
没有被复制。
有关更多信息
,
请参见
第17.4.1.21节“复制和存储器表”
和
第17.4.1.38节“复制和变量”
。
属性 | 值 |
---|---|
弃用 | 是 |
系统变量 | max_insert_delayed_threads |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
此变量是其同义词
max_delayed_threads
。
不推荐使用此系统变量(因为
DELAYED
不支持插入),并且将在以后的版本中删除。
属性 | 值 |
---|---|
命令行格式 | --max-join-size=# |
系统变量 | max_join_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 18446744073709551615 |
最低价值 | 1 |
最大价值 | 18446744073709551615 |
不允许声明可能需要检查多
max_join_size
行(对于单表语句)或行组合(对于多表语句)或者可能比
max_join_size
磁盘搜索
更多的语句
。
通过设置此值,您可以捕获未正确使用键的语句,这可能需要很长时间。
如果您的用户倾向于执行缺少
WHERE
子句的
连接,
需要很长时间或返回数百万行,请设置它。
有关更多信息,请参阅
使用安全更新模式(--safe-updates)
。
将此变量设置
DEFAULT
为非重置值,
sql_big_selects
以
重置
to的值
0
。
如果
sql_big_selects
再次
设置该
值,
max_join_size
则忽略
该
变量。
属性 | 值 |
---|---|
命令行格式 | --max-length-for-sort-data=# |
系统变量 | max_length_for_sort_data |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 (> = 8.0.1) | 4096 |
默认值 (8.0.0) | 1024 |
最低价值 | 4 |
最大价值 | 8388608 |
索引值大小的截止值,用于确定
filesort
要使用的算法。
请参见
第8.2.1.15节“ORDER BY Optimization”
。
属性 | 值 |
---|---|
命令行格式 | --max-points-in-geometry=# |
系统变量 | max_points_in_geometry |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 65536 |
最低价值 | 3 |
最大价值 | 1048576 |
函数
points_per_circle
参数
的最大值
ST_Buffer_Strategy()
。
属性 | 值 |
---|---|
命令行格式 | --max-prepared-stmt-count=# |
系统变量 | max_prepared_stmt_count |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 16382 |
最低价值 | 0 |
最大价值 | 1048576 |
此变量限制服务器中已准备语句的总数。 它可以在可能存在拒绝服务攻击的环境中使用,这些攻击基于通过准备大量语句来运行服务器内存不足。 如果该值设置为低于当前预准备语句数,则现有语句不受影响且可以使用,但在当前数字低于限制之前,不能准备新语句。 默认值为16,382。 允许的值范围为0到100万。 将值设置为0将禁用预准备语句。
属性 | 值 |
---|---|
命令行格式 | --max-seeks-for-key=# |
系统变量 | max_seeks_for_key |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 (64位平台) | 18446744073709551615 |
默认值 (32位平台) | 4294967295 |
最低价值 | 1 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
根据键查找行时,限制假定的最大查找次数。 MySQL优化器假定在通过扫描索引搜索表中的匹配行时,无论索引的实际基数如何,都不需要超过此数量的键搜索(请参见 第13.7.6.22节“SHOW INDEX语法” )。 通过将其设置为较低的值(例如,100),您可以强制MySQL更喜欢索引而不是表扫描。
属性 | 值 |
---|---|
命令行格式 | --max-sort-length=# |
系统变量 | max_sort_length |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 1024 |
最低价值 | 4 |
最大价值 | 8388608 |
排序数据值时使用的字节数。
服务器仅使用
max_sort_length
每个值
的第一个
字节,并忽略其余的值。
因此,仅第一后不同的值
max_sort_length
的字节相比较如相等
GROUP BY
,
ORDER
BY
和
DISTINCT
操作。
增加价值
max_sort_length
也可能需要增加价值
sort_buffer_size
。
有关详细信息,请参见
第8.2.1.15节“ORDER BY优化”
属性 | 值 |
---|---|
命令行格式 | --max-sp-recursion-depth[=#] |
系统变量 | max_sp_recursion_depth |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最大价值 | 255 |
可以递归调用任何给定存储过程的次数。 此选项的默认值为0,这将完全禁用存储过程中的递归。 最大值为255。
存储过程递归增加了对线程堆栈空间的需求。
如果增加值
max_sp_recursion_depth
,可能需要通过增加
thread_stack
服务器启动时
的值来增加线程堆栈大小
。
在MySQL 8.0.3中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --max-user-connections=# |
系统变量 | max_user_connections |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大价值 | 4294967295 |
允许任何给定MySQL用户帐户的最大并发连接数。 值0(默认值)表示 “ 无限制。 ”
此变量具有可在服务器启动或运行时设置的全局值。 它还具有只读会话值,该值指示适用于与当前会话关联的帐户的有效同时连接限制。 会话值初始化如下:
如果用户帐户具有非零
MAX_USER_CONNECTIONS
资源限制,则会话
max_user_connections
值将设置为该限制。
否则,会话
max_user_connections
值将设置为全局值。
使用
CREATE
USER
or
ALTER
USER
语句
指定帐户资源限制
。
请参见
第6.2.20节“设置帐户资源限制”
。
属性 | 值 |
---|---|
命令行格式 | --max-write-lock-count=# |
系统变量 | max_write_lock_count |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 (64位平台) | 18446744073709551615 |
默认值 (32位平台) | 4294967295 |
最低价值 | 1 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
在这许多写锁之后,允许在其间处理一些挂起的读锁请求。
写锁定请求的优先级高于读取锁定请求。
但是,如果
max_write_lock_count
设置为某个低值(例如10),则如果已经传递了读取锁定请求以支持10个写入锁定请求,则读取锁定请求可能优先于挂起的写入锁定请求。
通常不会发生此行为,因为
max_write_lock_count
默认情况下具有非常大的值。
属性 | 值 |
---|---|
命令行格式 | --mecab-rc-file=file_name |
系统变量 | mecab_rc_file |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
mecab_rc_file
设置MeCab全文解析器时使用
该
选项。
该
mecab_rc_file
选项定义
mecabrc
配置文件
的路径,该
文件是MeCab的配置文件。
该选项是只读的,只能在启动时设置。
该
mecabrc
配置文件需要初始化仲裁处。
有关MeCab全文解析器的信息,请参见 第12.9.9节“MeCab全文解析器插件” 。
有关可在MeCab
mecabrc
配置文件中
指定的选项的信息
,请参阅
Google Developers
站点
上的
MeCab文档
。
属性 | 值 |
---|---|
命令行格式 | --metadata-locks-cache-size=# |
弃用 | 是(在8.0.13中删除) |
系统变量 | metadata_locks_cache_size |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 1024 |
最低价值 | 1 |
最大价值 | 1048576 |
在MySQL 8.0.13中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --metadata-locks-hash-instances=# |
弃用 | 是(在8.0.13中删除) |
系统变量 | metadata_locks_hash_instances |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 8 |
最低价值 | 1 |
最大价值 | 1024 |
在MySQL 8.0.13中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --min-examined-row-limit=# |
系统变量 | min_examined_row_limit |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
检查少于此行数的查询不会记录到慢查询日志中。
属性 | 值 |
---|---|
命令行格式 | --multi-range-count=# |
弃用 | 是(在8.0.3中删除) |
系统变量 | multi_range_count |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 256 |
最低价值 | 1 |
最大价值 | 4294967295 |
在MySQL 8.0.3中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --myisam-data-pointer-size=# |
系统变量 | myisam_data_pointer_size |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 6 |
最低价值 | 2 |
最大价值 | 7 |
以字节为单位的默认指针大小,通过使用
CREATE
TABLE
用于
MyISAM
表没有当
MAX_ROWS
指定选项。
此变量不能小于2或大于7.默认值为6.请参见
第B.4.2.11节“表已满”
。
属性 | 值 |
---|---|
命令行格式 | --myisam-max-sort-file-size=# |
系统变量 | myisam_max_sort_file_size |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 (64位平台) | 9223372036854775807 |
默认值 (32位平台) | 2147483648 |
MySQL正在允许而重新创建一个使用临时文件的最大尺寸
MyISAM
指数(期间
REPAIR
TABLE
,
ALTER
TABLE
或
LOAD
DATA
)。
如果文件大小大于此值,则使用密钥缓存创建索引,这样会更慢。
该值以字节为单位。
如果
MyISAM
索引文件超过此大小且磁盘空间可用,则增加该值可能有助于提高性能。
该空间必须在包含原始索引文件所在目录的文件系统中可用。
属性 | 值 |
---|---|
命令行格式 | --myisam-mmap-size=# |
系统变量 | myisam_mmap_size |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 (64位平台) | 18446744073709551615 |
默认值 (32位平台) | 4294967295 |
最低价值 | 7 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
用于内存映射压缩
MyISAM
文件
的最大内存量
。
如果使用了许多压缩
MyISAM
表,则可以减小该值以减少内存交换问题的可能性。
属性 | 值 |
---|---|
系统变量 | myisam_recover_options |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
--myisam-recover-options
选项
的价值
。
请参见
第5.1.7节“服务器命令选项”
。
属性 | 值 |
---|---|
命令行格式 | --myisam-repair-threads=# |
系统变量 | myisam_repair_threads |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 1 |
最低价值 | 1 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
如果此值大于1,
MyISAM
则在此
Repair by sorting
过程
中并行创建表索引(每个索引在其自己的线程中)
。
默认值为1。
多线程修复仍然是 beta级质量的 代码。
属性 | 值 |
---|---|
命令行格式 | --myisam-sort-buffer-size=# |
系统变量 | myisam_sort_buffer_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 8388608 |
最低价值 | 4096 |
最大值 (其他,64位平台) | 18446744073709551615 |
最大值 (其他,32位平台) | 4294967295 |
最大值 (Windows,64位平台) | 18446744073709551615 |
最大值 (Windows,32位平台) | 4294967295 |
排序时被分配的缓冲区的大小
MyISAM
一期间索引
REPAIR
TABLE
与创建索引时或
CREATE
INDEX
或
ALTER
TABLE
。
属性 | 值 |
---|---|
命令行格式 | --myisam-stats-method=name |
系统变量 | myisam_stats_method |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | nulls_unequal |
有效值 |
|
服务器
NULL
在收集有关
MyISAM
表
的索引值分布的统计信息时
如何处理
值
。
这个变量有三个可能的值
nulls_equal
,
nulls_unequal
和
nulls_ignored
。
因为
nulls_equal
,所有
NULL
索引值都被视为相等,并形成一个大小等于
NULL
值
数的单个值组
。
因为
nulls_unequal
,
NULL
值被认为是不相等的,并且每个
NULL
值形成大小为1的不同值组。因为
nulls_ignored
,
NULL
值被忽略。
用于生成表统计信息的方法会影响优化程序如何选择索引以执行查询,如 第8.3.8节“InnoDB和MyISAM索引统计信息收集”中所述 。
属性 | 值 |
---|---|
命令行格式 | --myisam-use-mmap[={OFF|ON}] |
系统变量 | myisam_use_mmap |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
使用内存映射来读写
MyISAM
表。
mysql_native_password_proxy_users
属性 | 值 |
---|---|
命令行格式 | --mysql-native-password-proxy-users[={OFF|ON}] |
系统变量 | mysql_native_password_proxy_users |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
此变量控制
mysql_native_password
内置身份验证插件
是否
支持代理用户。
除非
check_proxy_users
启用
了
系统变量,
否则它无效
。
有关用户代理的信息,请参见
第6.2.18节“代理用户”
。
属性 | 值 |
---|---|
命令行格式 | --named-pipe[={OFF|ON}] |
系统变量 | named_pipe |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
平台特定 | 视窗 |
类型 | 布尔 |
默认值 | OFF |
(仅限Windows。)指示服务器是否支持通过命名管道的连接。
属性 | 值 |
---|---|
命令行格式 | --named-pipe-full-access-group=value |
介绍 | 8.0.14 |
系统变量 | named_pipe_full_access_group |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
平台特定 | 视窗 |
类型 | 串 |
默认值 | *everyone* |
有效值 |
|
(仅限Windows。)在MySQL服务器创建的命名管道上授予客户端的访问控制设置为现有
--enable-named-pipe
命令行选项
成功通信所需的最小值
ON
。
较新的MySQL客户端软件无需任何其他配置即可打开命名管道连接,但旧版客户端软件可能仍需要完全访问才能打开命名管道连接。
此变量设置Windows本地组的名称,其成员被MySQL服务器授予足够的访问权限以使用较旧的命名管道客户端。
最初,该值
'*everyone*'
默认
设置为
,允许Windows上Everyone组的用户继续使用旧客户端,直到升级旧客户端。
相反,将值设置为空字符串意味着不会授予Windows用户对命名管道的完全访问权限。
默认值
'*everyone*'
提供了一种与语言无关的方式来引用Windows上的Everyone组。
理想情况下,
mysql_old_client_users
应在Windows中创建
新的Windows本地组名称(例如
),然后在绝对需要访问旧版客户端软件时用于替换此变量的默认值。
在这种情况下,将组的成员资格限制为尽可能少的用户,在客户端软件升级时从组中删除用户。
尝试使用较旧的命名管道客户端打开与MySQL的连接的组的非成员在Windows管理员将用户添加到组中之后将被拒绝访问,然后用户注销并登录(由视窗)。
属性 | 值 |
---|---|
命令行格式 | --net-buffer-length=# |
系统变量 | net_buffer_length |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 16384 |
最低价值 | 1024 |
最大价值 | 1048576 |
每个客户端线程都与连接缓冲区和结果缓冲区相关联。
两者都以给定的大小开始,
net_buffer_length
但
max_allowed_packet
根据需要
动态放大到
字节。
结果缓冲区缩小到
net_buffer_length
每个SQL语句之后。
通常不应更改此变量,但如果内存很少,则可以将其设置为客户端发送的语句的预期长度。
如果语句超过此长度,则会自动放大连接缓冲区。
net_buffer_length
可设置
的最大值
为1MB。
此变量的会话值是只读的。
属性 | 值 |
---|---|
命令行格式 | --net-read-timeout=# |
系统变量 | net_read_timeout |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 30 |
最低价值 | 1 |
在中止读取之前等待来自连接的更多数据的秒数。
当服务器从客户端读取时,
net_read_timeout
超时值是否控制何时中止。
当服务器写入客户端时,
net_write_timeout
超时值是否控制何时中止。
另见
slave_net_timeout
。
属性 | 值 |
---|---|
命令行格式 | --net-retry-count=# |
系统变量 | net_retry_count |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 10 |
最低价值 | 1 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
如果通信端口上的读取或写入中断,请在放弃之前重试多次。 在FreeBSD上应该设置相当高的值,因为内部中断被发送到所有线程。
属性 | 值 |
---|---|
命令行格式 | --net-write-timeout=# |
系统变量 | net_write_timeout |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 60 |
最低价值 | 1 |
在中止写入之前等待块写入连接的秒数。
另见
net_read_timeout
。
此变量在MySQL 4.0中用于打开一些4.1行为,并保留以便向后兼容。
它的价值永远
OFF
。
在NDB Cluster中,将此变量设置为
ON
可以使用除
表
之外的分区类型
KEY
或
LINEAR KEY
使用
NDB
表。
此功能仅供参考,在生产中不受支持
。
有关其他信息,请参阅
用户定义的分区和NDB存储引擎(NDB群集)
。
属性 | 值 |
---|---|
命令行格式 | --ngram-token-size=# |
系统变量 | ngram_token_size |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 2 |
最低价值 | 1 |
最大价值 | 10 |
定义n-gram全文解析器的n-gram标记大小。
该
ngram_token_size
选项是只读的,只能在启动时修改。
默认值为2(bigram)。
最大值为10。
有关如何配置此变量的更多信息,请参见 第12.9.8节“ngram全文分析器” 。
属性 | 值 |
---|---|
命令行格式 | --offline-mode[={OFF|ON}] |
系统变量 | offline_mode |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
服务器是否处于 “ 离线模式 ” ,具有以下特征:
没有
CONNECTION_ADMIN
或具有
SUPER
权限的
已连接客户端用户
在下一个请求时会断开连接,并出现相应的错误。
断开连接包括终止正在运行的语句和释放锁。
此类客户端也无法启动新连接,并收到相应的错误。
具有
CONNECTION_ADMIN
或
SUPER
特权的
已连接客户端用户
未断开连接,并且可以启动新连接以管理服务器。
允许复制从属线程继续将数据应用于服务器。
只有拥有
SYSTEM_VARIABLES_ADMIN
或
SUPER
权限的
用户
才能控制离线模式。
要将服务器置于脱机模式,请将
offline_mode
系统变量
的值更改
OFF
为
ON
。
要恢复正常操作,请
offline_mode
从
更改
ON
为
OFF
。
在脱机模式下,被拒绝访问的客户端会收到
ER_SERVER_OFFLINE_MODE
错误。
old
是一个兼容性变量。
默认情况下禁用它,但可以在启动时启用它以将服务器还原为旧版本中存在的行为。
当
old
启用时,它改变索引提示到之前的MySQL 5.1.17使用的默认范围。
也就是说,没有
FOR
子句的
索引提示
仅适用于索引如何用于行检索而不适用于解析
ORDER
BY
或
GROUP BY
子句。
(请参见
第8.9.4节“索引提示”
。)注意在复制设置中启用此功能。
使用基于语句的二进制日志记录,为主服务器和从服务器设置不同的模式可能会导致复制错误。
属性 | 值 |
---|---|
命令行格式 | --old-alter-table[={OFF|ON}] |
系统变量 | old_alter_table |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
启用此变量时,服务器不使用处理
ALTER
TABLE
操作
的优化方法
。
它恢复使用临时表,复制数据,然后将临时表重命名为原始,如MySQL 5.0及更早版本所使用的那样。
有关操作的更多信息
ALTER
TABLE
,请参见
第13.1.9节“ALTER TABLE语法”
。
ALTER TABLE ... DROP PARTITION
与
old_alter_table=ON
重建分区表,并尝试将数据从下降分区移动到另一个分区与兼容
PARTITION ... VALUES
的定义。
将删除无法移动到其他分区的数据。
在早期版本中,
ALTER TABLE ... DROP PARTITION
与
old_alter_table=ON
存储在分区删除数据并删除该分区。
属性 | 值 |
---|---|
命令行格式 | --old-passwords=value |
弃用 | 是(在8.0.11中删除) |
系统变量 | old_passwords |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | 0 |
有效值 |
|
在MySQL 8.0.11中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --open-files-limit=# |
系统变量 | open_files_limit |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 5000, with possible adjustment |
最低价值 | 0 |
最大价值 | platform dependent |
mysqld可
从操作系统
获得的文件描述符数
。
mysqld
setrlimit()
通过设置此变量或
mysqld_safe
--open-files-limit
选项
使用启动时请求的值来
保留描述符
。
如果
mysqld
给出错误,
您应该尝试增加此变量的值
。
在内部,此变量的最大值是最大无符号整数值,但实际最大值取决于平台。
Too many open files
运行时变量值表示系统实际允许的文件描述符数,可能与启动时请求的值不同。 如果无法分配所请求的文件描述符数, mysqld 会向错误日志写入警告。
有效
open_files_limit
值是基于在系统启动时指定的值(如果有的话)和的值
max_connections
和
table_open_cache
使用这些公式:
1)10 + max_connections +(table_open_cache * 2) 2)max_connections * 5 3)操作系统限制如果是肯定的 4)如果操作系统限制为无限: 启动时指定的open_files_limit值,如果没有则为5000
服务器尝试使用这三个值中的最大值来获取文件描述符的数量。 如果无法获得那么多描述符,则服务器会尝试获得系统允许的数量。
在MySQL无法更改打开文件数的系统上,该值为0。
在Unix上,该值不能设置为大于 ulimit -n 。
属性 | 值 |
---|---|
命令行格式 | --optimizer-prune-level=# |
系统变量 | optimizer_prune_level |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 1 |
最低价值 | 0 |
最大价值 | 1 |
控制在查询优化期间应用的启发式方法,以从优化器搜索空间中修剪不太有希望的部分计划。 值0禁用启发式,以便优化程序执行穷举搜索。 值为1会导致优化程序根据中间计划检索的行数来修剪计划。
属性 | 值 |
---|---|
命令行格式 | --optimizer-search-depth=# |
系统变量 | optimizer_search_depth |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 62 |
最低价值 | 0 |
最大价值 | 62 |
查询优化器执行的最大搜索深度。 大于查询中关系数的值会产生更好的查询计划,但需要更长时间才能为查询生成执行计划。 小于查询中关系数的值会更快地返回执行计划,但生成的计划可能远非最佳。 如果设置为0,系统会自动选择合理的值。
属性 | 值 |
---|---|
命令行格式 | --optimizer-switch=value |
系统变量 | optimizer_switch |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 组 |
有效值 (> = 8.0.13) |
|
有效值 (> = 8.0.3,<= 8.0.12) |
|
有效值 (<= 8.0.2) |
|
该
optimizer_switch
系统变量能够在优化行为的控制。
此变量的值是一组标志,每个标志的值为
on
或
off
指示是启用还是禁用相应的优化程序行为。
此变量具有全局值和会话值,可以在运行时更改。
可以在服务器启动时设置全局默认值。
要查看当前的优化程序标志集,请选择变量值:
MySQL的> SELECT @@optimizer_switch\G
*************************** 1。排******************** *******
@@ optimizer_switch:index_merge = on,index_merge_union = on,
index_merge_sort_union =开,
index_merge_intersection =开,
engine_condition_pushdown =开,
index_condition_pushdown =开,
MRR =开,上mrr_cost_based =,
block_nested_loop =开,batched_key_access =关,
物化=开,半连接=上,loosescan =开,
firstmatch =开,duplicateweedout =开,
subquery_materialization_cost_based =开,
use_index_extensions =开,
condition_fanout_filter =开,derived_merge =开,
use_invisible_indexes =关,skip_scan =上
有关此变量的语法及其控制的优化器行为的更多信息,请参见 第8.9.2节“可切换的优化” 。
属性 | 值 |
---|---|
命令行格式 | --optimizer-trace=value |
系统变量 | optimizer_trace |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
此变量控制优化程序跟踪。 有关详细信息,请参阅 MySQL内部:跟踪优化程序 。
属性 | 值 |
---|---|
命令行格式 | --optimizer-trace-features=value |
系统变量 | optimizer_trace_features |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
此变量启用或禁用所选的优化程序跟踪功能。 有关详细信息,请参阅 MySQL内部:跟踪优化程序 。
属性 | 值 |
---|---|
命令行格式 | --optimizer-trace-limit=# |
系统变量 | optimizer_trace_limit |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 1 |
要显示的最大优化程序跟踪数。 有关详细信息,请参阅 MySQL内部:跟踪优化程序 。
属性 | 值 |
---|---|
命令行格式 | --optimizer-trace-max-mem-size=# |
系统变量 | optimizer_trace_max_mem_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 (> = 8.0.4) | 1048576 |
默认值 (<= 8.0.3) | 16384 |
存储的优化程序跟踪的最大累积大小。 有关详细信息,请参阅 MySQL内部:跟踪优化程序 。
属性 | 值 |
---|---|
命令行格式 | --optimizer-trace-offset=# |
系统变量 | optimizer_trace_offset |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | -1 |
要显示的优化程序跟踪的偏移量。 有关详细信息,请参阅 MySQL内部:跟踪优化程序 。
performance_schema_
xxx
性能模式系统变量在 第26.15节“性能模式系统变量” 中列出 。 这些变量可用于配置性能模式操作。
属性 | 值 |
---|---|
命令行格式 | --parser-max-mem-size=# |
系统变量 | parser_max_mem_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 (64位平台) | 18446744073709551615 |
默认值 (32位平台) | 4294967295 |
最低价值 | 10000000 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
解析器可用的最大内存量。 默认值对可用内存没有限制。 可以减少该值以防止因解析长或复杂的SQL语句而导致的内存不足情况。
属性 | 值 |
---|---|
命令行格式 | --partial-revokes[={OFF|ON}] |
介绍 | 8.0.16 |
系统变量 | partial_revokes |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 |
|
启用此变量可以部分撤消权限。
具体而言,对于具有全局级别权限的用户,
partial_revokes
可以撤消特定模式的权限,同时为其他模式保留特权。
例如,
UPDATE
可以限制
具有全局
特权
的用户
在
mysql
系统架构
上行使此特权
。
(或者,换句话说,用户可以
UPDATE
对除模式之外的所有模式
执行
权限
mysql
。)从这个意义上讲,用户的全局
UPDATE
特权被部分撤销。
启用后,
partial_revokes
如果任何帐户具有权限限制
,
则无法禁用。
如果存在任何此类帐户,则禁用
partial_revokes
失败:
对于尝试
partial_revokes
在启动时
禁用
,服务器会记录错误消息并启用
partial_revokes
。
对于
partial_revokes
在运行时
禁用的尝试
,会发生错误并且
partial_revokes
值保持不变。
要
partial_revokes
在这种情况下
禁用
,请先修改具有部分撤销权限的每个帐户,方法是重新授予权限或删除帐户。
有关更多信息,包括有关删除部分撤消的说明,请参见 第6.2.12节“使用部分撤消的权限限制” 。
属性 | 值 |
---|---|
命令行格式 | --password-history=# |
介绍 | 8.0.3 |
系统变量 | password_history |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大价值 | 4294967295 |
此变量根据所需的最小密码更改次数定义用于控制先前密码重用的全局策略。 对于先前使用的帐户密码,此变量指示在重复使用密码之前必须进行的后续帐户密码更改的数量。 如果值为0(默认值),则根据密码更改次数没有重用限制。
对此变量的更改会立即应用于使用该
PASSWORD HISTORY DEFAULT
选项
定义的所有帐户
。
可以使用
和
语句
的
PASSWORD HISTORY
选项
根据需要覆盖各个帐户的全局更改密码重用策略
。
请参见
第6.2.15节“密码管理”
。
CREATE
USER
ALTER USER
属性 | 值 |
---|---|
命令行格式 | --password-require-current[={OFF|ON}] |
介绍 | 8.0.13 |
系统变量 | password_require_current |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
此变量定义用于控制是否尝试更改帐户密码的全局策略必须指定要替换的当前密码。
对此变量的更改会立即应用于使用该
PASSWORD REQUIRE CURRENT
DEFAULT
选项
定义的所有帐户
。
可以使用
和
语句
的
PASSWORD
REQUIRE
选项
根据需要覆盖个人帐户所需的全局验证所需策略
。
请参见
第6.2.15节“密码管理”
。
CREATE
USER
ALTER USER
属性 | 值 |
---|---|
命令行格式 | --password-reuse-interval=# |
介绍 | 8.0.3 |
系统变量 | password_reuse_interval |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大价值 | 4294967295 |
此变量定义用于根据已用时间控制先前密码重用的全局策略。 对于先前使用的帐户密码,此变量指示在重复使用密码之前必须经过的天数。 如果值为0(默认值),则基于经过的时间没有重用限制。
对此变量的更改会立即应用于使用该
PASSWORD REUSE INTERVAL
DEFAULT
选项
定义的所有帐户
。
可以使用
和
语句
的
PASSWORD REUSE INTERVAL
选项
根据需要覆盖个人帐户的全局时间流逝密码重用策略
。
请参见
第6.2.15节“密码管理”
。
CREATE
USER
ALTER USER
属性 | 值 |
---|---|
命令行格式 | --persisted-globals-load[={OFF|ON}] |
系统变量 | persisted_globals_load |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
是否从
mysqld-auto.cnf
数据目录中
的
文件
加载持久配置设置
。
服务器通常在启动所有其他选项文件后处理此文件(请参见
第4.2.2.2节“使用选项文件”
)。
禁用
persisted_globals_load
会导致服务器启动顺序跳过
mysqld-auto.cnf
。
要修改的内容
mysqld-auto.cnf
,使用
SET
PERSIST
,
SET
PERSIST_ONLY
和
RESET
PERSIST
语句。
请参见
第5.1.9.3节“持久系统变量”
。
persist_only_admin_x509_subject
属性 | 值 |
---|---|
命令行格式 | --persist-only-admin-x509-subject=string |
介绍 | 8.0.14 |
系统变量 | persist_only_admin_x509_subject |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | empty string |
SET
PERSIST
并将
SET
PERSIST_ONLY
系统变量保存到
mysqld-auto.cnf
数据目录中
的
选项文件中(请参见
第13.7.5.1节“变量赋值的SET语法”
)。
持久化系统变量可启用影响后续服务器重新启动的运行时配置更改,这样便于远程管理,无需直接访问MySQL服务器主机选项文件。
但是,某些系统变量是不可消费的,或仅在某些限制条件下持久存在。
该
persist_only_admin_x509_subject
系统变量指定的SSL证书X.509主题值,用户必须有能够坚持系统变量的持续限制。
默认值为空字符串,它禁用主题检查,以便任何用户都不能持久保留受限制的系统变量。
如果
persist_only_admin_x509_subject
是非空的,则使用加密连接连接到服务器并提供具有指定主题值的SSL证书的用户可以
SET
PERSIST_ONLY
用来持久保留受限制的系统变量。
有关持久限制的系统变量和配置MySQL以启用的说明的信息
persist_only_admin_x509_subject
,请参见
第5.1.9.4节“不可容忍和持久限制的系统变量”
。
进程标识文件的路径名。
可以使用该
--pid-file
选项
设置此变量
。
服务器在数据目录中创建文件,除非给出绝对路径名来指定不同的目录。
如果指定该
--pid-file
选项,则必须指定值。
如果未指定该
--pid-file
选项,MySQL将使用默认值
,其中
host_name
.pidhost_name
是主机的名称。
其他程序(如 mysqld_safe )使用进程标识文件 来确定服务器的进程标识。 在Windows上,此变量还会影响默认错误日志文件名。 请参见 第5.4.2节“错误日志” 。
属性 | 值 |
---|---|
命令行格式 | --plugin-dir=dir_name |
系统变量 | plugin_dir |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 目录名称 |
默认值 | BASEDIR/lib/plugin |
插件目录的路径名。
如果服务器可以写入插件目录,则用户可以使用可执行代码将可执行代码写入目录中的文件
SELECT
... INTO DUMPFILE
。
这可以通过
plugin_dir
对服务器
进行
只读或通过设置
--secure-file-priv
到
SELECT
可以安全地
进行
写入
的目录
来防止
。
服务器侦听TCP / IP连接的端口号。
可以使用该
--port
选项
设置此变量
。
属性 | 值 |
---|---|
命令行格式 | --preload-buffer-size=# |
系统变量 | preload_buffer_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 32768 |
最低价值 | 1024 |
最大价值 | 1073741824 |
预加载索引时分配的缓冲区大小。
属性 | 值 |
---|---|
命令行格式 | --print-identified-with-as-hex[={OFF|ON}] |
介绍 | 8.0.17 |
系统变量 | print_identified_with_as_hex |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
IDENTIFIED
WITH
输出子句中
显示的密码哈希值
SHOW
CREATE USER
可能包含对终端显示和其他环境有不利影响的不可打印字符。
启用
print_identified_with_as_hex
导致
SHOW CREATE USER
将此类哈希值显示为十六进制字符串而不是常规字符串文字。
不包含不可打印字符的哈希值仍显示为常规字符串文字,即使启用了此变量也是如此。
如果设置为0或
OFF
(默认值),则禁用语句分析。
如果设置为1
ON
,则启用语句分析,并且
SHOW
PROFILE
和
SHOW
PROFILES
语句提供对分析信息的访问。
请参见
第13.7.6.31节“显示配置文件语法”
。
此变量已弃用,将在以后的MySQL版本中删除。
profiling
启用了
用于维护分析信息的语句数
。
默认值为15.最大值为100.将值设置为0可有效禁用分析。
请参见
第13.7.6.31节“显示配置文件语法”
。
此变量已弃用,将在以后的MySQL版本中删除。
属性 | 值 |
---|---|
系统变量 | protocol_version |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
MySQL服务器使用的客户端/服务器协议的版本。
属性 | 值 |
---|---|
系统变量 | proxy_user |
范围 | 会议 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
如果当前客户端是另一个用户的代理,则此变量是代理用户帐户名。
否则,这个变量是
NULL
。
请参见
第6.2.18节“代理用户”
。
属性 | 值 |
---|---|
系统变量 | pseudo_slave_mode |
范围 | 会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
此变量供内部服务器使用。
从MySQL 8.0.14开始,设置此系统变量的会话值是一种受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
在MySQL 8.0.14及更高版本中,
pseudo_slave_mode
对处理设置一个或多个不支持或未知SQL模式的语句具有以下影响:
如果为true,则服务器忽略不支持的模式并发出警告。
如果为false,则服务器拒绝该语句
ER_UNSUPPORTED_SQL_MODE
。
mysqlbinlog 在执行任何其他SQL之前将此变量设置为true。
属性 | 值 |
---|---|
系统变量 | pseudo_thread_id |
范围 | 会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
此变量供内部服务器使用。
从MySQL 8.0.14开始,设置此系统变量的会话值是一种受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
属性 | 值 |
---|---|
命令行格式 | --query-alloc-block-size=# |
系统变量 | query_alloc_block_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 8192 |
最低价值 | 1024 |
最大价值 | 4294967295 |
块大小 | 1024 |
为在语句解析和执行期间创建的对象分配的内存块的分配大小。 如果您遇到内存碎片问题,则可能有助于增加此参数。
属性 | 值 |
---|---|
命令行格式 | --query-cache-limit=# |
弃用 | 是(在8.0.3中删除) |
系统变量 | query_cache_limit |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 1048576 |
最低价值 | 0 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
在MySQL 8.0.3中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --query-cache-min-res-unit=# |
弃用 | 是(在8.0.3中删除) |
系统变量 | query_cache_min_res_unit |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 4096 |
最低价值 | 512 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
在MySQL 8.0.3中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --query-cache-size=# |
弃用 | 是(在8.0.3中删除) |
系统变量 | query_cache_size |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 (64位平台,> = 8.0.1) | 0 |
默认值 (64位平台,8.0.0) | 1048576 |
默认值 (32位平台,> = 8.0.1) | 0 |
默认值 (32位平台,8.0.0) | 1048576 |
最低价值 | 0 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
在MySQL 8.0.3中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --query-cache-type=# |
弃用 | 是(在8.0.3中删除) |
系统变量 | query_cache_type |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | 0 |
有效值 |
|
在MySQL 8.0.3中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --query-cache-wlock-invalidate[={OFF|ON}] |
弃用 | 是(在8.0.3中删除) |
系统变量 | query_cache_wlock_invalidate |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
在MySQL 8.0.3中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --query-prealloc-size=# |
系统变量 | query_prealloc_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 8192 |
最低价值 | 8192 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
块大小 | 1024 |
用于语句解析和执行的持久缓冲区的大小。
不在语句之间释放此缓冲区。
如果您正在运行复杂查询,则较大的
query_prealloc_size
值可能有助于提高性能,因为它可以减少服务器在查询执行操作期间执行内存分配的需要。
属性 | 值 |
---|---|
系统变量 | rand_seed1 |
范围 | 会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
该
rand_seed1
和
rand_seed2
作为唯一的会话变量存在变数,并且可以设置,但不能读取。
变量 - 但不是它们的值 - 显示在输出中
SHOW
VARIABLES
。
这些变量的目的是支持
RAND()
函数的
复制
。
对于调用的语句,
RAND()
主服务器将两个值传递给从服务器,在那里它们用于为随机数生成器设定种子。
从站使用这些值来设置会话变量
rand_seed1
,
rand_seed2
因此
RAND()
从站上生成的值与主站上的值相同。
请参阅说明
rand_seed1
。
属性 | 值 |
---|---|
命令行格式 | --range-alloc-block-size=# |
系统变量 | range_alloc_block_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 4096 |
最低价值 | 4096 |
最大值 (64位平台) | 18446744073709547520 |
最大价值 | 4294967295 |
块大小 | 1024 |
进行范围优化时分配的块大小。
属性 | 值 |
---|---|
命令行格式 | --range-optimizer-max-mem-size=# |
系统变量 | range_optimizer_max_mem_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 8388608 |
最低价值 | 0 |
最大价值 | 18446744073709551615 |
范围优化器的内存消耗限制。 值为0表示 “ 无限制。 “ 如果优化程序考虑的执行计划使用范围访问方法,但优化程序估计此方法所需的内存量将超过限制,则会放弃该计划并考虑其他计划。 有关更多信息,请参阅 限制内存使用以进行范围优化 。
属性 | 值 |
---|---|
系统变量 | rbr_exec_mode |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | STRICT |
有效值 |
|
供
mysqlbinlog
内部使用
。
此变量在
IDEMPOTENT
模式和
STRICT
模式
之间切换服务器
。
IDEMPOTENT
mode导致
mysqlbinlog
BINLOG
生成的语句中
的duplicate-key和no-key-found错误
被
抑制
。
在服务器上重放基于行的二进制日志时,此模式非常有用,该服务器会导致与现有数据冲突。
当您
通过将以下内容写入输出来
指定
选项
时,
mysqlbinlog
设置此模式
:
--idempotent
SET SESSION RBR_EXEC_MODE = IDEMPOTENT;
从MySQL 8.0.14开始,设置此系统变量的会话值是一种受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
属性 | 值 |
---|---|
命令行格式 | --read-buffer-size=# |
系统变量 | read_buffer_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 131072 |
最低价值 | 8200 |
最大价值 | 2147479552 |
对
MyISAM
表
执行顺序扫描的每个线程为其扫描的每个
表分配此大小的缓冲区(以字节为单位)。
如果执行许多顺序扫描,则可能需要增加此值,默认值为131072.此变量的值应为4KB的倍数。
如果将其设置为不是4KB的倍数的值,则其值将向下舍入到最接近的4KB的倍数。
对于所有存储引擎,此选项也在以下上下文中使用:
在为行排序时,用于缓存临时文件(不是临时表)中的索引
ORDER
BY
。
用于批量插入分区。
用于缓存嵌套查询的结果。
read_buffer_size
还用于另一种特定于存储引擎的方式:确定
MEMORY
表
的内存块大小
。
有关不同操作期间内存使用的更多信息,请参见 第8.12.3.1节“MySQL如何使用内存” 。
当
read_only
启用了系统变量,该服务器允许除外谁拥有用户没有客户端更新
CONNECTION_ADMIN
或
SUPER
特权。
默认情况下禁用此变量。
服务器还支持
super_read_only
系统变量(默认情况下禁用),它具有以下效果:
如果
super_read_only
启用,则服务器禁止客户端更新,即使是具有此
SUPER
权限的
用户也是如此
。
设置
super_read_only
于
ON
隐含强制
read_only
到
ON
。
设置
read_only
于
OFF
隐含强制
super_read_only
到
OFF
。
即使
read_only
启用,服务器也允许这些操作:
如果服务器是复制从属,则由从属线程执行的更新。
在复制设置中,
read_only
在从服务器
上启用
以确保从服务器仅接受来自主服务器而不是来自客户端的更新
非常有用
。
写入系统表
mysql.gtid_executed
,该
表
存储当前二进制日志文件中不存在的已执行事务的GTID。
使用
ANALYZE
TABLE
或
OPTIMIZE
TABLE
陈述。
只读模式的目的是防止更改表结构或内容。
分析和优化不符合此类更改。
这意味着,例如,可以使用
mysqlcheck --all-databases --analyze
执行对只读复制从属的一致性检查
。
TEMPORARY
表格
操作
。
插入日志表(
mysql.general_log
和
mysql.slow_log
);
请参见
第5.4.1节“选择常规查询日志和慢查询日志输出目标”
。
对Performance Schema表的更新,例如
UPDATE
或
TRUNCATE
TABLE
操作。
read_only
主服务器上的
更改
不会复制到从属服务器。
可以在从属服务器上设置该值,而与主服务器上的设置无关。
以下条件适用于启用尝试
read_only
(包括
启用
导致的隐式尝试
super_read_only
):
如果您有任何显式锁(获取
LOCK
TABLES
)或具有挂起事务
,则尝试失败并发生错误
。
尝试阻塞,而其他客户端具有任何正在进行的语句,活动
LOCK TABLES WRITE
或持续提交,直到锁被释放并且语句和事务结束。
虽然尝试启用
read_only
是挂起的,但其他客户端对表锁或开始事务的请求也会
read_only
一直
阻塞,直到
设置
为止
。
如果存在保存元数据锁的活动事务,则尝试将阻止,直到这些事务结束。
read_only
可以在持有全局读锁(获取
FLUSH
TABLES WITH READ
LOCK
)时
启用,
因为这不涉及表锁。
属性 | 值 |
---|---|
命令行格式 | --read-rnd-buffer-size=# |
系统变量 | read_rnd_buffer_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 262144 |
最低价值 | 1 |
最大价值 | 2147483647 |
此变量用于从
MyISAM
表中
读取
,对于任何存储引擎,用于多范围读取优化。
在
MyISAM
按键排序操作之后按排序顺序
从
表中
读取行时
,将通过此缓冲区读取行以避免磁盘搜索。
请参见
第8.2.1.15节“ORDER BY Optimization”
。
将变量设置为较大的值可以大大提高
ORDER BY
性能。
但是,这是为每个客户端分配的缓冲区,因此不应将全局变量设置为较大的值。
而是仅从需要运行大型查询的客户端中更改会话变量。
有关不同操作期间内存使用的更多信息,请参见 第8.12.3.1节“MySQL如何使用内存” 。 有关多量程读取优化的信息,请参见 第8.2.1.10节“多量程读取优化” 。
属性 | 值 |
---|---|
命令行格式 | --regexp-stack-limit=# |
介绍 | 8.0.4 |
系统变量 | regexp_stack_limit |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 8000000 |
最低价值 | 0 |
最大价值 | 2147483647 |
用于由
REGEXP_LIKE()
类似函数
执行的正则表达式匹配操作的内部堆栈的最大可用内存(以字节为单位)
(请参见
第12.5.2节“正则表达式”
)。
属性 | 值 |
---|---|
命令行格式 | --regexp-time-limit=# |
介绍 | 8.0.4 |
系统变量 | regexp_time_limit |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 32 |
最低价值 | 0 |
最大价值 | 2147483647 |
由
REGEXP_LIKE()
类似函数
执行的正则表达式匹配操作的时间限制
(请参见
第12.5.2节“正则表达式”
)。
此限制表示为匹配引擎执行的最大允许步数,因此仅间接影响执行时间。
通常,它大约为毫秒。
属性 | 值 |
---|---|
命令行格式 | --require-secure-transport[={OFF|ON}] |
系统变量 | require_secure_transport |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
客户端与服务器的连接是否需要使用某种形式的安全传输。
启用此变量时,服务器仅允许使用SSL的TCP / IP连接,或允许使用套接字文件(在Unix上)或共享内存(在Windows上)的连接。
服务器拒绝不安全的连接尝试,该尝试因
ER_SECURE_TRANSPORT_REQUIRED
错误
而失败
。
此功能补充了每个帐户的SSL要求,这些要求优先。
例如,如果定义了一个帐户
REQUIRE SSL
,则启用
require_secure_transport
不能使用该帐户使用Unix套接字文件进行连接。
服务器可能没有可用的安全传输。
例如,如果在未指定任何SSL证书或密钥文件且
shared_memory
禁用系统变量的
情况下启动,则Windows上的服务器不支持安全传输
。
在这些情况下,尝试
require_secure_transport
在启动时
启用
会导致服务器将消息写入错误日志并退出。
尝试在运行时启用变量失败并显示
ER_NO_SECURE_TRANSPORTS_CONFIGURED
错误。
另请参阅将 加密连接配置为必需 。
属性 | 值 |
---|---|
介绍 | 8.0.3 |
系统变量 | resultset_metadata |
范围 | 会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | FULL |
有效值 |
|
对于元数据传输是可选的连接,客户端设置
resultset_metadata
系统变量以控制服务器是否返回结果集元数据。
允许的值是
FULL
(返回所有元数据;这是默认值)和
NONE
(不返回元数据)。
对于非元数据可选的连接,设置
resultset_metadata
为
NONE
产生错误。
有关管理结果集元数据传输的详细信息,请参见 第28.7.27节“C API可选结果集元数据” 。
secondary_engine_cost_threshold
属性 | 值 |
---|---|
介绍 | 8.0.16 |
系统变量 | secondary_engine_cost_threshold |
范围 | 会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 数字 |
默认值 | 100000.000000 |
最低价值 | 0 |
最大价值 | DBL_MAX (maximum double value) |
供将来使用。
属性 | 值 |
---|---|
命令行格式 | --schema-definition-cache=# |
系统变量 | schema_definition_cache |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 256 |
最低价值 | 256 |
最大价值 | 524288 |
定义可以保留在字典对象缓存中的架构定义对象(已使用和未使用)的数量限制。
当使用的数量小于定义的容量时,未使用的模式定义对象仅保留在字典对象缓存中
schema_definition_cache
。
设置
0
意味着模式定义对象仅在字典对象缓存中使用时保留。
有关更多信息,请参见 第14.4节“字典对象高速缓存” 。
属性 | 值 |
---|---|
命令行格式 | --secure-auth[={OFF|ON}] |
弃用 | 是(在8.0.3中删除) |
系统变量 | secure_auth |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
有效值 | ON |
在MySQL 8.0.3中删除了此系统变量。
属性 | 值 |
---|---|
命令行格式 | --secure-file-priv=dir_name |
系统变量 | secure_file_priv |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | platform specific |
有效值 |
|
此变量用于限制数据导入和导出操作,如那些由执行的效果
LOAD
DATA
和
SELECT
... INTO
OUTFILE
报表和
LOAD_FILE()
功能。
仅允许具有此
FILE
权限的
用户执行这些操作
。
secure_file_priv
可以设置如下:
如果为空,则变量无效。 这不是一个安全的设置。
如果设置为目录名称,则服务器会将导入和导出操作限制为仅适用于该目录中的文件。 目录必须存在; 服务器不会创建它。
如果设置为
NULL
,则服务器禁用导入和导出操作。
默认值是特定于平台的,取决于
CMake
选项
的值,
如下表所示。
要在
源代码构建时明确
指定默认
值,请使用
CMake
选项。
INSTALL_LAYOUT
secure_file_priv
INSTALL_SECURE_FILE_PRIVDIR
INSTALL_LAYOUT
值
|
默认
secure_file_priv
值
|
---|---|
STANDALONE
,
WIN
|
空 |
DEB
,
RPM
,
SLES
,
SVR4
|
/var/lib/mysql-files |
除此以外 | mysql-files
在
CMAKE_INSTALL_PREFIX
价值
之下
|
服务器检查
secure_file_priv
启动时
的值,
如果值不安全,则会向错误日志写入警告。
如果非
NULL
值为空,或者值是数据目录或其子目录,或者是所有用户都可访问的目录,则将其视为不安全。
如果
secure_file_priv
设置为不存在的路径,则服务器会将错误消息写入错误日志并退出。
属性 | 值 |
---|---|
命令行格式 | --server-id=# |
系统变量 | server_id |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 (> = 8.0.3) | 1 |
默认值 (<= 8.0.2) | 0 |
最低价值 | 0 |
最大价值 | 4294967295 |
指定服务器ID。
此变量由
--server-id
选项
设置
。
的
server_id
系统变量被默认设置为1。
可以使用此缺省ID启动服务器,但是启用二进制日志记录时,如果未使用该
--server-id
选项
明确指定服务器标识,则会发出信息性消息
。
对于复制拓扑中使用的服务器,必须为每个复制服务器指定唯一的服务器ID,范围为1到2 32 - 1. “ 唯一 ” 表示每个ID必须与正在使用的每个其他ID不同任何其他复制主机或从机。 有关其他信息,请参见 第17.1.6.2节“复制主选项和变量” 和 第17.1.6.3节“复制从选项和变量” 。
如果服务器ID设置为0,则进行二进制日志记录,但服务器ID为0的主服务器拒绝来自从服务器的任何连接,服务器ID为0的从服务器拒绝连接到主服务器。 请注意,虽然您可以将服务器ID动态更改为非零值,但这样做不会立即启动复制。 您必须更改服务器ID,然后重新启动服务器以初始化复制从站。
有关更多信息,请参见 第17.1.2.2节“设置复制从站配置” 。
属性 | 值 |
---|---|
命令行格式 | --session-track-gtids=value |
系统变量 | session_track_gtids |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | OFF |
有效值 |
|
控制服务器是否跟踪当前会话中的GTID并将其返回给客户端。
根据变量值,在执行每个事务结束时,服务器GTID由跟踪器捕获并返回给客户端。
session_track_gtids
允许
这些
值:
OFF
:跟踪器不收集GTID。
这是默认值。
OWN_GTID
:跟踪器收集由成功提交的读/写事务生成的GTID。
ALL_GTIDS
:跟踪器
gtid_executed
在当前事务提交时
收集
系统变量中的
所有GTID
,无论事务是读/写还是只读。
session_track_gtids
无法在事务上下文中设置。
有关会话状态跟踪的更多信息,请参见 第5.1.15节“客户端会话状态更改的服务器跟踪” 。
属性 | 值 |
---|---|
命令行格式 | --session-track-schema[={OFF|ON}] |
系统变量 | session_track_schema |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
控制服务器是否在当前会话中设置默认架构(数据库)时跟踪,并通知客户端使架构名称可用。
如果启用了模式名称跟踪器,则每次设置默认模式时都会发生名称通知,即使新模式名称与旧模式名称相同也是如此。
有关会话状态跟踪的更多信息,请参见 第5.1.15节“客户端会话状态更改的服务器跟踪” 。
属性 | 值 |
---|---|
命令行格式 | --session-track-state-change[={OFF|ON}] |
系统变量 | session_track_state_change |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
控制服务器是否跟踪当前会话状态的更改,并在状态发生更改时通知客户端。 可以报告客户端会话状态的这些属性的更改:
默认架构(数据库)。
系统变量的特定于会话的值。
用户定义的变量。
临时表。
准备好的陈述。
如果启用了会话状态跟踪器,则会对涉及跟踪的会话属性的每个更改发生通知,即使新属性值与旧属性值相同也是如此。 例如,将用户定义的变量设置为其当前值会产生通知。
该
session_track_state_change
变量仅控制何时发生更改的通知,而不是更改的内容。
例如,在设置默认架构或跟踪会话系统变量时会发生状态更改通知,但通知不包括架构名称或变量值。
要接收模式名称或会话系统变量值的通知
,请分别
使用
session_track_schema
或
session_track_system_variables
系统变量。
为
session_track_state_change
自己
分配值
不被视为状态更改,因此不会报告。
但是,如果其名称中列出了其名称,则对其进行的
session_track_system_variables
任何分配都会导致新值的通知。
有关会话状态跟踪的更多信息,请参见 第5.1.15节“客户端会话状态更改的服务器跟踪” 。
session_track_system_variables
属性 | 值 |
---|---|
命令行格式 | --session-track-system-variables=# |
系统变量 | session_track_system_variables |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | time_zone, autocommit, character_set_client, character_set_results,
character_set_connection |
控制服务器是否跟踪会话系统变量的分配,并通知客户端每个分配的变量的名称和值。
变量值是以逗号分隔的变量列表,用于跟踪分配。
默认情况下,通知的启用
time_zone
,
autocommit
,
character_set_client
,
character_set_results
,和
character_set_connection
。
(后三个变量是那些受影响的变量
SET
NAMES
。)
特殊值
*
使服务器跟踪所有会话变量的分配。
如果给定,则必须单独指定此值,而不指定特定的系统变量名称。
要禁用会话变量分配的通知,请设置
session_track_system_variables
为空字符串。
如果启用了会话系统变量跟踪,则对跟踪的会话变量的所有分配都会发出通知,即使新值与旧值相同也是如此。
有关会话状态跟踪的更多信息,请参见 第5.1.15节“客户端会话状态更改的服务器跟踪” 。
session_track_transaction_info
属性 | 值 |
---|---|
命令行格式 | --session-track-transaction-info=value |
系统变量 | session_track_transaction_info |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | OFF |
有效值 |
|
控制服务器是否跟踪当前会话中事务的状态和特征,并通知客户端使此信息可用。
session_track_transaction_info
允许
这些
值:
OFF
:禁用事务状态跟踪。
这是默认值。
STATE
:启用没有特征跟踪的事务状态跟踪。
状态跟踪使客户端能够确定事务是否正在进行以及是否可以将其移动到其他会话而不进行回滚。
CHARACTERISTICS
:启用事务状态跟踪,包括特征跟踪。
特征跟踪使客户端能够确定如何在另一个会话中重新启动事务,以使其具有与原始会话中相同的特征。
以下特征与此相关:
隔离级别 只读 读写 一致的快照
对于客户端将事务安全地重定位到另一个会话,它必须不仅跟踪事务状态而且还跟踪事务特征。
此外,客户端必须跟踪
transaction_isolation
和
transaction_read_only
系统变量以正确确定会话默认值。
(要跟踪这些变量,请将它们列在
session_track_system_variables
系统变量
的值中
。)
有关会话状态跟踪的更多信息,请参见 第5.1.15节“客户端会话状态更改的服务器跟踪” 。
sha256_password_auto_generate_rsa_keys
属性 | 值 |
---|---|
命令行格式 | --sha256-password-auto-generate-rsa-keys[={OFF|ON}] |
系统变量 | sha256_password_auto_generate_rsa_keys |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
如果服务器是使用OpenSSL编译的,则此变量可用(请参见 第6.3.4节“SSL库相关功能” )。 服务器使用它来确定是否在数据目录中自动生成RSA私钥/公钥对文件(如果它们尚不存在)。
在启动时,如果满足所有这些条件,则服务器会自动在数据目录中生成RSA私钥/公钥对文件:
sha256_password_auto_generate_rsa_keys
或者
caching_sha2_password_auto_generate_rsa_keys
启用系统变量;
没有指定RSA选项;
数据目录中缺少RSA文件。
这些密钥对文件通过未加密的连接使用RSA进行安全密码交换,以便对由
sha256_password
or或
caching_sha2_password
plugin
进行身份验证的帐户进行安全密码交换
。
请参见
第6.4.1.2节“SHA-256可插拔认证”
和
第6.4.1.3节“高速缓存SHA-2可插拔认证”
。
有关RSA文件自动生成的更多信息,包括文件名和特性,请参见 第6.3.3.1节“使用MySQL创建SSL和RSA证书和密钥”
该
auto_generate_certs
系统变量是相关的,但控制SSL证书,并需要使用SSL安全连接密钥文件的自动生成。
sha256_password_private_key_path
属性 | 值 |
---|---|
命令行格式 | --sha256-password-private-key-path=file_name |
系统变量 | sha256_password_private_key_path |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
默认值 | private_key.pem |
如果使用OpenSSL编译MySQL,则此变量可用(请参见
第6.3.4节“SSL库依赖功能”
)。
其值是
sha256_password
身份验证插件
的RSA私钥文件的路径名
。
如果文件被命名为相对路径,则相对于服务器数据目录进行解释。
该文件必须采用PEM格式。
由于此文件存储私钥,因此应限制其访问模式,以便只有MySQL服务器才能读取它。
有关信息
sha256_password
,请参见
第6.4.1.2节“SHA-256可插拔认证”
。
属性 | 值 |
---|---|
命令行格式 | --sha256-password-proxy-users[={OFF|ON}] |
系统变量 | sha256_password_proxy_users |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
此变量控制
sha256_password
内置身份验证插件
是否
支持代理用户。
除非
check_proxy_users
启用
了
系统变量,
否则它无效
。
有关用户代理的信息,请参见
第6.2.18节“代理用户”
。
sha256_password_public_key_path
属性 | 值 |
---|---|
命令行格式 | --sha256-password-public-key-path=file_name |
系统变量 | sha256_password_public_key_path |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
默认值 | public_key.pem |
如果使用OpenSSL编译MySQL,则此变量可用(请参见
第6.3.4节“SSL库依赖功能”
)。
其值是
sha256_password
身份验证插件
的RSA公钥文件的路径名
。
如果文件被命名为相对路径,则相对于服务器数据目录进行解释。
该文件必须采用PEM格式。
由于此文件存储公钥,因此可以将副本自由分发给客户端用户。
(使用RSA密码加密连接到服务器时明确指定公钥的客户端必须使用与服务器使用的公钥相同的公钥。)
有关
sha256_password
客户端如何指定RSA公钥的信息,请参见
第6.4.1.2节“SHA-256可插拔认证”
。
属性 | 值 |
---|---|
命令行格式 | --shared-memory[={OFF|ON}] |
系统变量 | shared_memory |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
平台特定 | 视窗 |
类型 | 布尔 |
默认值 | OFF |
(仅限Windows。)服务器是否允许共享内存连接。
属性 | 值 |
---|---|
命令行格式 | --shared-memory-base-name=name |
系统变量 | shared_memory_base_name |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
平台特定 | 视窗 |
类型 | 串 |
默认值 | MYSQL |
(仅限Windows。)用于共享内存连接的共享内存的名称。
在单个物理计算机上运行多个MySQL实例时,这非常有用。
默认名称是
MYSQL
。
名称区分大小写。
属性 | 值 |
---|---|
命令行格式 | --show-compatibility-56[={OFF|ON}] |
弃用 | 是(在8.0.1中删除) |
系统变量 | show_compatibility_56 |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
此变量用于过渡期间,在此期间,表中的系统和状态变量信息
INFORMATION_SCHEMA
被移动到性能模式表。
该转换期在MySQL 8.0.1中结束,此时此变量已被删除。
有关从
INFORMATION_SCHEMA
表
迁移到性能架构
表的建议,请参阅
迁移到性能架构系统和状态变量表
。
属性 | 值 |
---|---|
命令行格式 | --show-create-table-verbosity[={OFF|ON}] |
介绍 | 8.0.11 |
系统变量 | show_create_table_verbosity |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
SHOW
CREATE TABLE
ROW_FORMAT
如果行格式是默认格式,则
通常不显示
表选项。
无论是否为默认格式,
启用此变量都会导致
SHOW CREATE TABLE
显示
ROW_FORMAT
。
属性 | 值 |
---|---|
命令行格式 | --show-old-temporals[={OFF|ON}] |
弃用 | 是 |
系统变量 | show_old_temporals |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
是否
SHOW CREATE TABLE
输出包括注释来发现在预5.6.4格式标志颞柱(
TIME
,
DATETIME
,和
TIMESTAMP
列不为小数精度秒支持)。
默认情况下禁用此变量。
如果启用,
SHOW
CREATE TABLE
输出如下所示:
CREATE TABLE`mytbl`( `ts` timestamp / * 5.5二进制格式* / NOT NULL DEFAULT CURRENT_TIMESTAMP, `dt` datetime / * 5.5二进制格式* / DEFAULT NULL, `t`时间/ * 5.5二进制格式* / DEFAULT NULL )DEFAULT CHARSET = utf8mb4
表格
COLUMN_TYPE
列的
输出
INFORMATION_SCHEMA.COLUMNS
也会受到类似的影响。
此变量已弃用,将在以后的MySQL版本中删除。
属性 | 值 |
---|---|
命令行格式 | --skip-external-locking[={OFF|ON}] |
系统变量 | skip_external_locking |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
这是
OFF
如果
mysqld的
使用外部锁定(锁定系统),
ON
如果外部锁定被禁用。
这仅影响
MyISAM
表访问。
此变量由
--external-locking
or
--skip-external-locking
选项
设置
。
默认情况下禁用外部锁定。
外部锁定仅影响
MyISAM
表访问。
有关更多信息,包括可以使用和不可以使用的条件,请参见
第8.11.5节“外部锁定”
。
属性 | 值 |
---|---|
命令行格式 | --skip-name-resolve[={OFF|ON}] |
系统变量 | skip_name_resolve |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
此变量是从
--skip-name-resolve
选项
的值设置的
。
如果是
OFF
,
mysqld
在检查客户端连接时解析主机名。
如果是
ON
,
mysqld
只使用IP号码;
在这种情况下,
Host
授权表中的
所有
列值必须是IP地址或
localhost
。
请参见
第8.12.4.2节“DNS查找优化和主机缓存”
。
属性 | 值 |
---|---|
命令行格式 | --skip-networking |
系统变量 | skip_networking |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
这是
ON
服务器仅允许本地(非TCP / IP)连接。
在Unix上,本地连接使用Unix套接字文件。
在Windows上,本地连接使用命名管道或共享内存。
可以
ON
使用该
--skip-networking
选项
将此变量设置为
。
属性 | 值 |
---|---|
命令行格式 | --skip-show-database |
系统变量 | skip_show_database |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
这可以防止人们在
SHOW
DATABASES
没有
SHOW DATABASES
权限的情况下
使用该
语句
。
如果您担心用户能够查看属于其他用户的数据库,则可以提高安全性。
其效果取决于
SHOW DATABASES
权限:如果变量值为
ON
,
SHOW
DATABASES
则仅允许具有该
SHOW
DATABASES
权限的
用户使用
该语句,并且该语句将显示所有数据库名称。
如果值为
OFF
,
SHOW
DATABASES
则允许所有用户使用,但仅显示用户具有该
SHOW
DATABASES
权限或其他权限的
那些数据库的名称
。
因为任何静态全局特权被认为是所有数据库的特权,任何静态全局特权使用户能够看到所有的数据库名称
SHOW
DATABASES
或通过检查
SCHEMATA
表
INFORMATION_SCHEMA
,除了已经在通过局部撤销数据库级别被限制的数据库。
属性 | 值 |
---|---|
命令行格式 | --slow-launch-time=# |
系统变量 | slow_launch_time |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 2 |
如果创建线程的时间超过这么多秒,则服务器会递增
Slow_launch_threads
状态变量。
属性 | 值 |
---|---|
命令行格式 | --slow-query-log[={OFF|ON}] |
系统变量 | slow_query_log |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
是否启用慢查询日志。
该值可以是0(或
OFF
)以禁用日志,或1(或
ON
)以启用日志。
默认值取决于是否
--slow_query_log
给出
了该
选项。
日志输出的目标由
log_output
系统变量
控制
;
如果该值为
NONE
,则即使启用了日志,也不会写入任何日志条目。
“
慢
”
由
long_query_time
变量
的值决定
。
请参见
第5.4.5节“慢查询日志”
。
属性 | 值 |
---|---|
命令行格式 | --slow-query-log-file=file_name |
系统变量 | slow_query_log_file |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
默认值 | host_name-slow.log |
慢查询日志文件的名称。
默认值为
,但可以使用
host_name
-slow.log--slow_query_log_file
选项
更改初始值
。
属性 | 值 |
---|---|
命令行格式 | --socket={file_name|pipe_name} |
系统变量 | socket |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (其他) | /tmp/mysql.sock |
默认值 (Windows) | MySQL |
在Unix平台上,此变量是用于本地客户端连接的套接字文件的名称。
默认是
/tmp/mysql.sock
。
(对于某些分发格式,目录可能不同,例如
/var/lib/mysql
RPM。)
在Windows上,此变量是用于本地客户端连接的命名管道的名称。
默认值为
MySQL
(不区分大小写)。
属性 | 值 |
---|---|
命令行格式 | --sort-buffer-size=# |
系统变量 | sort_buffer_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 262144 |
最低价值 | 32768 |
最大值 (其他,64位平台) | 18446744073709551615 |
最大值 (其他,32位平台) | 4294967295 |
最大值 (Windows) | 4294967295 |
必须执行排序的每个会话都会分配此大小的缓冲区。
sort_buffer_size
并非特定于任何存储引擎,并且以一般方式应用于优化。
至少该
sort_buffer_size
值必须足够大,以容纳排序缓冲区中的十五个元组。
此外,增加价值
max_sort_length
可能需要增加价值
sort_buffer_size
。
有关更多信息,请参见
第8.2.1.15节“ORDER BY优化”
如果
Sort_merge_passes
在
SHOW
GLOBAL
STATUS
输出中
看到
每秒
很多
,则可以考虑增加
sort_buffer_size
值以加速
ORDER BY
或
GROUP
BY
通过查询优化或改进的索引无法改进的操作。
优化器尝试计算出需要多少空间,但可以分配更多空间,直到极限。 将其设置为大于全局所需的大小将减慢大多数排序的查询。 最好将其作为会话设置增加,并且仅适用于需要更大尺寸的会话。 在Linux上,存在256KB和2MB的阈值,其中较大的值可能显着减慢内存分配,因此您应该考虑保持低于其中一个值。 尝试为您的工作量找到最佳价值。 请参见 第B.4.3.5节“MySQL存储临时文件的位置” 。
允许的最大设置为
sort_buffer_size
4GB-1。
64位平台允许更大的值(64位Windows除外,其中大值被截断为4GB-1并带有警告)。
属性 | 值 |
---|---|
系统变量 | sql_auto_is_null |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 布尔 |
默认值 | OFF |
如果启用此变量,则在成功插入自动生成的
AUTO_INCREMENT
值
的语句之后
,您可以通过发出以下格式的语句来查找该值:
SELECT * FROMtbl_name
WHERE为auto_col
NULL
如果语句返回一行,则返回的值与调用该
LAST_INSERT_ID()
函数时
的值相同
。
有关详细信息,包括多行插入后的返回值,请参见
第12.15节“信息函数”
。
如果未
AUTO_INCREMENT
成功插入
任何
值,则该
SELECT
语句不返回任何行。
某些ODBC程序(如Access)使用通过比较
检索
AUTO_INCREMENT
值
的行为
IS NULL
。
请参阅
获取自动增量值
。
可以通过设置
sql_auto_is_null
为
禁用此行为
OFF
。
在MySQL 8.0.16之前,
仅在执行语句时才执行
to
的转换,
以便
执行
期间
的值
确定查询是否已转换。
在MySQL 8.0.16及更高版本中,转换在语句准备期间执行。
WHERE
auto_col
IS NULLWHERE
auto_col
=
LAST_INSERT_ID()sql_auto_is_null
默认值
sql_auto_is_null
是
OFF
。
属性 | 值 |
---|---|
系统变量 | sql_big_selects |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 布尔 |
默认值 | ON |
如果设置为
OFF
,则MySQL将中止
SELECT
可能需要很长时间才能执行的语句(即,优化程序估计已检查行的数量超过其值的语句
max_join_size
)。
当发出不可取的
WHERE
陈述
时,这很有用
。
新连接的默认值是
ON
允许所有
SELECT
语句。
如果将
max_join_size
系统变量
设置为
除以外的值
DEFAULT
,
sql_big_selects
则设置为
OFF
。
属性 | 值 |
---|---|
系统变量 | sql_buffer_result |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 布尔 |
默认值 | OFF |
如果启用,
sql_buffer_result
则会将
SELECT
语句的
强制结果
放入临时表中。
这有助于MySQL尽早释放表锁,并且在需要很长时间将结果发送给客户端的情况下可能是有益的。
默认值为
OFF
。
属性 | 值 |
---|---|
系统变量 | sql_log_off |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
有效值 |
|
此变量控制是否对当前会话禁用对常规查询日志的日志记录(假设已启用常规查询日志本身)。
默认值为
OFF
(即启用日志记录)。
要禁用或启用当前会话的常规查询日志记录,请将会话
sql_log_off
变量
设置
为
ON
或
OFF
。
设置此系统变量的会话值是受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
属性 | 值 |
---|---|
命令行格式 | --sql-mode=name |
系统变量 | sql_mode |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 组 |
默认值 (> = 8.0.11) | ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE
ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSTITUTION |
默认值 (<= 8.0.4) | ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE
ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION |
有效值 (> = 8.0.11) |
|
有效值 (> = 8.0.1,<= 8.0.4) |
|
有效值 (8.0.0) |
|
当前服务器的SQL模式,可以动态设置。 有关详细信息,请参见 第5.1.11节“服务器SQL模式” 。
MySQL安装程序可以在安装过程中配置SQL模式。
如果SQL模式与默认模式或您期望的模式不同,请检查服务器在启动时读取的选项文件中的设置。
如果启用(默认值),则
Note
级别增量
诊断
warning_count
和服务器记录它们。
如果禁用,则
Note
诊断不会增加
warning_count
,服务器也不会记录它们。
mysqldump
包含用于禁用此变量的输出,以便重新加载转储文件不会对不影响重新加载操作完整性的事件产生警告。
属性 | 值 |
---|---|
系统变量 | sql_quote_show_create |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
如果启用(默认值),则服务器为
语句
SHOW CREATE TABLE
和
SHOW CREATE DATABASE
语句
引用标识符
。
如果禁用,则禁用引用。
默认情况下启用此选项,以便复制适用于需要引用的标识符。
请参见
第13.7.6.10节“SHOW CREATE TABLE语法”
和
第13.7.6.6节“SHOW CREATE DATABASE语法”
。
属性 | 值 |
---|---|
命令行格式 | --sql-require-primary-key[={OFF|ON}] |
介绍 | 8.0.13 |
系统变量 | sql_require_primary_key |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 布尔 |
默认值 | OFF |
创建新表或更改现有表结构的语句是否强制要求表具有主键。
设置此系统变量的会话值是受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
启用此变量有助于避免在表没有主键时可能发生的基于行的复制中的性能问题。 假设表没有主键,更新或删除修改多行。 在主服务器上,可以使用单个表扫描执行此操作,但是在使用基于行的复制进行复制时,会导致对从属服务器上要修改的每一行进行表扫描。 使用主键,不会发生这些表扫描。
sql_require_primary_key
适用于基表和
TEMPORARY
表,并且对其值的更改将复制到从属服务器。
启用时,
sql_require_primary_key
具有以下效果:
尝试创建没有主键的新表失败并显示错误。
这包括
CREATE TABLE ...
LIKE
。
它还包括
CREATE TABLE ...
SELECT
,除非该
CREATE
TABLE
部分包含主键定义。
尝试从现有表中删除主键失败并显示错误,但
ALTER TABLE
允许
删除主键并在同一
语句中
添加主键
。
即使表还包含
UNIQUE NOT NULL
索引,
删除主键也会失败
。
尝试导入没有主键的表失败并显示错误。
属性 | 值 |
---|---|
系统变量 | sql_safe_updates |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 布尔 |
默认值 | OFF |
如果这个变量被启用,
UPDATE
并且
DELETE
不中使用的关键语句
WHERE
条款或
LIMIT
条款产生错误。
这使得捕获
UPDATE
和
DELETE
未正确使用键的语句
成为可能,
并且
可能会更改或删除大量行。
默认值为
OFF
。
对于
mysql
客户端,
sql_safe_updates
可以使用该
--safe-updates
选项
启用
。
有关更多信息,请参阅
使用安全更新模式(--safe-updates)
。
属性 | 值 |
---|---|
系统变量 | sql_select_limit |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
从
SELECT
语句
返回的最大行数
。
有关更多信息,请参阅
使用安全更新模式(--safe-updates)
。
新连接的默认值是服务器允许每个表的最大行数。
典型的默认值为(2
32
)-1或(2
64
)-1。
如果更改了限制,则可以通过指定值来恢复默认值
DEFAULT
。
如果a
SELECT
有一个
LIMIT
子句,
LIMIT
则优先于值
sql_select_limit
。
属性 | 值 |
---|---|
系统变量 | sql_warnings |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
此变量控制单行
INSERT
语句
是否
在发生警告时生成信息字符串。
默认是
OFF
。
将值设置
ON
为生成信息字符串。
属性 | 值 |
---|---|
命令行格式 | --ssl-ca=file_name |
系统变量 | ssl_ca |
范围 | 全球 |
动态 (> = 8.0.16) | 是 |
动态 (<= 8.0.15) | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
具有受信任SSL证书颁发机构列表的文件的路径。
从MySQL 8.0.16开始,此变量是动态的,可以在运行时进行修改,以影响服务器用于新连接的SSL上下文。 请参阅 加密连接的服务器端运行时配置 。 在MySQL 8.0.16之前,只能在服务器启动时设置此变量。
属性 | 值 |
---|---|
命令行格式 | --ssl-capath=dir_name |
系统变量 | ssl_capath |
范围 | 全球 |
动态 (> = 8.0.16) | 是 |
动态 (<= 8.0.15) | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 目录名称 |
包含PEM格式的受信任SSL CA证书的目录的路径。
从MySQL 8.0.16开始,此变量是动态的,可以在运行时进行修改,以影响服务器用于新连接的SSL上下文。 请参阅 加密连接的服务器端运行时配置 。 在MySQL 8.0.16之前,只能在服务器启动时设置此变量。
属性 | 值 |
---|---|
命令行格式 | --ssl-cert=file_name |
系统变量 | ssl_cert |
范围 | 全球 |
动态 (> = 8.0.16) | 是 |
动态 (<= 8.0.15) | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
用于建立安全连接的SSL证书文件的名称。
从MySQL 8.0.16开始,此变量是动态的,可以在运行时进行修改,以影响服务器用于新连接的SSL上下文。 请参阅 加密连接的服务器端运行时配置 。 在MySQL 8.0.16之前,只能在服务器启动时设置此变量。
属性 | 值 |
---|---|
命令行格式 | --ssl-cipher=name |
系统变量 | ssl_cipher |
范围 | 全球 |
动态 (> = 8.0.16) | 是 |
动态 (<= 8.0.15) | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
SSL加密的允许密码列表。
从MySQL 8.0.16开始,此变量是动态的,可以在运行时进行修改,以影响服务器用于新连接的SSL上下文。 请参阅 加密连接的服务器端运行时配置 。 在MySQL 8.0.16之前,只能在服务器启动时设置此变量。
属性 | 值 |
---|---|
命令行格式 | --ssl-crl=file_name |
系统变量 | ssl_crl |
范围 | 全球 |
动态 (> = 8.0.16) | 是 |
动态 (<= 8.0.15) | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
包含证书吊销的文件的路径以PEM格式列出。 对revocation-list功能的支持取决于用于编译MySQL的SSL库。 请参见 第6.3.4节“SSL库相关功能” 。
从MySQL 8.0.16开始,此变量是动态的,可以在运行时进行修改,以影响服务器用于新连接的SSL上下文。 请参阅 加密连接的服务器端运行时配置 。 在MySQL 8.0.16之前,只能在服务器启动时设置此变量。
属性 | 值 |
---|---|
命令行格式 | --ssl-crlpath=dir_name |
系统变量 | ssl_crlpath |
范围 | 全球 |
动态 (> = 8.0.16) | 是 |
动态 (<= 8.0.15) | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 目录名称 |
包含PEM格式的证书吊销列表的文件的目录的路径。 对revocation-list功能的支持取决于用于编译MySQL的SSL库。 请参见 第6.3.4节“SSL库相关功能” 。
从MySQL 8.0.16开始,此变量是动态的,可以在运行时进行修改,以影响服务器用于新连接的SSL上下文。 请参阅 加密连接的服务器端运行时配置 。 在MySQL 8.0.16之前,只能在服务器启动时设置此变量。
属性 | 值 |
---|---|
命令行格式 | --ssl-fips-mode={OFF|ON|STRICT} |
介绍 | 8.0.11 |
系统变量 | ssl_fips_mode |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | OFF |
有效值 |
|
控制是否在服务器端启用FIPS模式。
所述
ssl_fips_mode
系统变量与其它的不同
的选项,因为它不用于控制服务器的许可证是否加密连接,而是影响允许哪些加密操作。
请参见
第6.5节“FIPS支持”
。
--ssl-
xxx
ssl_fips_mode
允许
这些
值:
OFF
(或0):禁用FIPS模式。
ON
(或1):启用FIPS模式。
STRICT
(或2):启用
“
严格
”
FIPS模式。
如果OpenSSL的FIPS对象模块不可用时,对于唯一的允许值
ssl_fips_mode
是
OFF
。
在这种情况下,设置
ssl_fips_mode
为
ON
或
STRICT
启动时会导致服务器生成错误消息并退出。
属性 | 值 |
---|---|
命令行格式 | --ssl-key=file_name |
系统变量 | ssl_key |
范围 | 全球 |
动态 (> = 8.0.16) | 是 |
动态 (<= 8.0.15) | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
用于建立安全连接的SSL密钥文件的名称。
从MySQL 8.0.16开始,此变量是动态的,可以在运行时进行修改,以影响服务器用于新连接的SSL上下文。 请参阅 加密连接的服务器端运行时配置 。 在MySQL 8.0.16之前,只能在服务器启动时设置此变量。
属性 | 值 |
---|---|
命令行格式 | --stored-program-cache=# |
系统变量 | stored_program_cache |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 256 |
最低价值 | 16 |
最大价值 | 524288 |
为每个连接的高速缓存存储例程数设置软上限。 此变量的值是根据MySQL服务器分别为存储过程和存储函数维护的两个高速缓存中的每个高速缓存中保存的例程数来指定的。
每当执行存储的例程时,在解析例程中的第一个或顶级语句之前检查该高速缓存大小; 如果相同类型的例程(存储过程或正在执行的存储过程)的数量超过此变量指定的限制,则刷新相应的高速缓存并释放先前为高速缓存的对象分配的内存。 这允许安全地刷新缓存,即使存储的例程之间存在依赖关系。
存储过程和存储的函数高速缓存与 字典对象高速缓存 的存储的程序定义高速缓存分区并行存在 。 存储过程和存储的函数高速缓存是每个连接,而存储的程序定义高速缓存是共享的。 存储过程和存储的函数高速缓存中对象的存在不依赖于存储的程序定义高速缓存中的对象的存在,反之亦然。 有关更多信息,请参见 第14.4节“字典对象高速缓存” 。
stored_program_definition_cache
属性 | 值 |
---|---|
命令行格式 | --stored-program-definition-cache=# |
系统变量 | stored_program_definition_cache |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 256 |
最低价值 | 256 |
最大价值 | 524288 |
定义可以保存在字典对象缓存中的已存储程序定义对象(已使用和未使用)的数量限制。
当使用的数量小于定义的容量时,未使用的存储程序定义对象仅保留在字典对象缓存中
stored_program_definition_cache
。
设置为0表示存储的程序定义对象仅在使用时保存在字典对象缓存中。
存储的程序定义高速缓存分区与使用该
stored_program_cache
选项
配置的存储过程和存储的函数高速缓存并行存在
。
该
stored_program_cache
选项为每个连接的高速缓存存储过程或函数的数量设置软上限,并在每次连接执行存储过程或函数时检查限制。
另一方面,存储的程序定义高速缓存分区是共享高速缓存,其存储用于其他目的的存储的程序定义对象。
存储的程序定义高速缓存分区中对象的存在不依赖于存储过程高速缓存或存储的函数高速缓存中的对象的存在,反之亦然。
有关相关信息,请参见 第14.4节“字典对象缓存” 。
属性 | 值 |
---|---|
命令行格式 | --super-read-only[={OFF|ON}] |
系统变量 | super_read_only |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
如果
read_only
启用
了
系统变量,则服务器仅允许具有该
SUPER
权限的
用户进行客户端更新
。
如果
super_read_only
还启用
了
系统变量,则服务器甚至禁止具有的客户端更新
SUPER
。
有关
read_only
只读模式的说明以及有关如何
read_only
和
super_read_only
交互的
信息,
请参阅
系统变量的说明
。
super_read_only
主服务器上的
更改
不会复制到从属服务器。
可以在从属服务器上设置该值,而与主服务器上的设置无关。
属性 | 值 |
---|---|
命令行格式 | --syseventlog.facility=value |
介绍 | 8.0.13 |
系统变量 | syseventlog.facility |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | daemon |
写入错误日志输出的工具
syslog
(发送消息的程序类型)。
除非
log_sink_syseventlog
安装
了
错误日志组件,
否则此变量不可用
。
请参见
第5.4.2.7节“记录到系统日志的错误”
。
允许的值可能因操作系统而异;
请参阅您的系统
syslog
文档。
Windows上不存在此变量。
属性 | 值 |
---|---|
命令行格式 | --syseventlog.include-pid[={OFF|ON}] |
介绍 | 8.0.13 |
系统变量 | syseventlog.include_pid |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
是否在写入的每行错误日志输出中包含服务器进程ID
syslog
。
除非
log_sink_syseventlog
安装
了
错误日志组件,
否则此变量不可用
。
请参见
第5.4.2.7节“记录到系统日志的错误”
。
Windows上不存在此变量。
属性 | 值 |
---|---|
命令行格式 | --syseventlog.tag=tag |
介绍 | 8.0.13 |
系统变量 | syseventlog.tag |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | empty string |
要写入错误日志输出
syslog
或Windows事件日志中
的服务器标识符的标记
。
除非
log_sink_syseventlog
安装
了
错误日志组件,
否则此变量不可用
。
请参见
第5.4.2.7节“记录到系统日志的错误”
。
默认情况下,未设置任何标记,因此服务器标识符仅
MySQL
在Windows上以及
mysqld
其他平台上。
如果
tag
指定
了标记值
,则将其附加到带有前导连字符的服务器标识符,从而生成
(或
在Windows上)
syslog
标识符
。
mysqld-
tag
MySQL-
tag
在Windows上,要使用尚不存在的标记,必须从具有管理员权限的帐户运行服务器,以允许为标记创建注册表项。 如果标记已存在,则不需要提升权限。
属性 | 值 |
---|---|
系统变量 | system_time_zone |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
服务器系统时区。
当服务器开始执行时,它从机器默认值继承时区设置,可能由用于运行服务器或启动脚本的帐户环境修改。
该值用于设置
system_time_zone
。
通常,时区由
TZ
环境变量
指定
。
它也可以使用
mysqld_safe
脚本
的
--timezone
选项
指定
。
的
system_time_zone
变量不同于
time_zone
。
虽然它们可能具有相同的值,但后一个变量用于初始化连接的每个客户端的时区。
请参见
第5.1.13节“MySQL服务器时区支持”
。
属性 | 值 |
---|---|
命令行格式 | --table-definition-cache=# |
系统变量 | table_definition_cache |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | -1
(表示自动调整大小;不指定此文字值)
|
最低价值 | 400 |
最大价值 | 524288 |
可以存储在定义高速缓存中的表定义数。 如果使用大量表,则可以创建大型表定义高速缓存以加快表的打开速度。 与普通表缓存不同,表定义缓存占用的空间更少,不使用文件描述符。 最小值为400.默认值基于以下公式,上限为2000:
MIN(400 + table_open_cache / 2,2000)
For
InnoDB
,
table_definition_cache
充当
InnoDB
数据字典高速缓存
中打开表实例数量的软限制
。
如果打开的表实例的数量超过
table_definition_cache
设置,则LRU机制开始标记用于驱逐的表实例,并最终将它们从数据字典高速缓存中删除。
该限制有助于解决在下一次服务器重新启动之前将使用大量内存来缓存很少使用的表实例的情况。
具有缓存元数据的表实例数可能高于定义的限制
table_definition_cache
,因为具有外键关系的父表和子表实例未放置在LRU列表中,并且不会从内存中逐出。
此外,还
table_definition_cache
定义了
InnoDB
可以一次打开的每表文件表空间
数的软限制,该
表空间也由
innodb_open_files
。
如果同时
设置
table_definition_cache
和
innodb_open_files
,则使用最高设置。
如果未设置任何变量
table_definition_cache
,则使用具有更高默认值的
变量
。
如果打开的表空间文件句柄的数量超过
table_definition_cache
or
定义的限制
innodb_open_files
,则LRU机制在表空间文件LRU列表中搜索完全刷新且当前未扩展的文件。
每次打开新表空间时都会执行此过程。
如果没有
“
非活动
”
表空间,不关闭任何表空间文件。
表定义高速缓存与 字典对象高速缓存 的表定义高速缓存分区并行存在 。 两个缓存都存储表定义,但服务于MySQL服务器的不同部分。 一个缓存中的对象不依赖于另一个缓存中的存在对象。 有关更多信息,请参见 第14.4节“字典对象高速缓存” 。
table_encryption_privilege_check
属性 | 值 |
---|---|
命令行格式 | --table-encryption-privilege-check[={OFF|ON}] |
介绍 | 8.0.16 |
系统变量 | table_encryption_privilege_check |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
控制
TABLE_ENCRYPTION_ADMIN
在创建或更改加密与
default_table_encryption
设置
不同的模式或常规表空间
时,或者在创建或更改加密设置与默认模式加密不同的表时
发生
的
权限检查
。
默认情况下禁用该检查。
table_encryption_privilege_check
在运行时
设置
需要该
SUPER
权限。
table_encryption_privilege_check
支持
SET
PERSIST
和
SET
PERSIST_ONLY
语法。
请参见
第5.1.9.3节“持久系统变量”
。
有关更多信息,请参阅 为架构和常规表空间定义加密默认值 。
属性 | 值 |
---|---|
命令行格式 | --table-open-cache=# |
系统变量 | table_open_cache |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 (> = 8.0.4) | 4000 |
默认值 (<= 8.0.3) | 2000 |
最低价值 | 1 |
最大价值 | 524288 |
所有线程的打开表的数量。
增加此值会增加
mysqld
所需的
文件描述符数
。
您可以通过检查
Opened_tables
状态变量
来检查是否需要增加表缓存
。
请参见
第5.1.10节“服务器状态变量”
。
如果值
Opened_tables
很大并且您不
FLUSH
TABLES
经常
使用
(这只会强制关闭并重新打开所有表),那么您应该增加
table_open_cache
变量
的值
。
有关表缓存的更多信息,请参见
第8.4.3.1节“MySQL如何打开和关闭表”
。
属性 | 值 |
---|---|
命令行格式 | --table-open-cache-instances=# |
系统变量 | table_open_cache_instances |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 16 |
最低价值 | 1 |
最大价值 | 64 |
打开表缓存实例的数量。
为了通过减少会话之间的争用来提高可伸缩性,可以将打开表缓存划分为几个较小的大小
table_open_cache
/的
缓存实例
table_open_cache_instances
。
会话需要仅锁定一个实例以访问DML语句。
这会在实例之间对高速缓存进行分段访问,从而在有许多会话访问表时允许使用高速缓存的操作具有更高的性能。
(DDL语句仍然需要锁定整个缓存,但这些语句比DML语句要频繁得多。)
对于常规使用16个或更多内核的系统,建议使用值8或16。
属性 | 值 |
---|---|
命令行格式 | --tablespace-definition-cache=# |
系统变量 | tablespace_definition_cache |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 256 |
最低价值 | 256 |
最大价值 | 524288 |
定义可以保留在字典对象缓存中的表空间定义对象(已使用和未使用)的数量限制。
当使用的数量小于定义的容量时,未使用的表空间定义对象仅保留在字典对象缓存中
tablespace_definition_cache
。
设置
0
意味着表空间定义对象仅在字典对象缓存中使用时保留。
有关更多信息,请参见 第14.4节“字典对象高速缓存” 。
属性 | 值 |
---|---|
命令行格式 | --temptable-max-ram=# |
介绍 | 8.0.2 |
系统变量 | temptable_max_ram |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 1073741824 |
最低价值 | 2097152 |
最大价值 | 2^64-1 |
定义
TempTable
存储引擎在开始在磁盘上存储数据之前
可以占用的最大内存量
。
默认值为1073741824字节(1GiB)。
有关更多信息,请参见
第8.4.4节“MySQL中的内部临时表使用”
。
属性 | 值 |
---|---|
命令行格式 | --temptable-use-mmap[={OFF|ON}] |
介绍 | 8.0.16 |
系统变量 | temptable_use_mmap |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
定义当TempTable存储引擎占用的内存量超过
temptable_max_ram
变量
定义的限制时,TempTable存储引擎是否为内部内存临时表分配空间作为内存映射的临时文件
。
当
temptable_use_mmap
被禁用时,不是Temptable存储引擎使用
InnoDB
的磁盘上的内部临时表来代替。
有关更多信息,请参见
第8.4.4节“MySQL中的内部临时表使用”
。
属性 | 值 |
---|---|
命令行格式 | --thread-cache-size=# |
系统变量 | thread_cache_size |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | -1
(表示自动调整大小;不指定此文字值)
|
最低价值 | 0 |
最大价值 | 16384 |
服务器应缓存多少个线程以供重用。
当客户端断开连接时,如果客户端的线程少于
thread_cache_size
线程,
则将其放入缓存中
。
如果可能,通过重用从高速缓存中获取的线程来满足线程请求,并且仅当高速缓存为空时才创建新线程。
如果您有许多新连接,可以增加此变量以提高性能。
通常,如果您有一个良好的线程实现,这不会提供显着的性能改进。
但是,如果您的服务器每秒看到数百个连接,则通常应该设置
thread_cache_size
足够高,以便大多数新连接使用缓存线程。
通过检查
Connections
和
Threads_created
状态变量
之间的差异
,您可以看到线程缓存的效率。
有关详细信息,请参见
第5.1.10节“服务器状态变量”
。
默认值基于以下公式,上限为100:
8 +(max_connections / 100)
属性 | 值 |
---|---|
命令行格式 | --thread-handling=name |
系统变量 | thread_handling |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | one-thread-per-connection |
有效值 |
|
服务器用于连接线程的线程处理模型。
允许的值是
no-threads
(服务器使用单个线程来处理一个连接)和
one-thread-per-connection
(服务器使用一个线程来处理每个客户端连接)。
no-threads
在Linux下调试很有用;
请参见
第29.5节“调试和移植MySQL”
。
属性 | 值 |
---|---|
命令行格式 | --thread-pool-algorithm=# |
介绍 | 8.0.11 |
系统变量 | thread_pool_algorithm |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大价值 | 1 |
此变量控制线程池插件使用的算法:
值0(默认值)使用保守的低并发算法,该算法经过最好的测试,并且已知可以产生非常好的结果。
值1会增加并发性并使用更积极的算法,有时已知该算法在最佳线程数上的性能提高了5-10%,但随着连接数量的增加,性能会下降。 它的使用应被视为实验性的,不受支持。
仅当启用了线程池插件时,此变量才可用。 请参见 第5.6.3节“MySQL企业线程池”
thread_pool_high_priority_connection
属性 | 值 |
---|---|
命令行格式 | --thread-pool-high-priority-connection=# |
介绍 | 8.0.11 |
系统变量 | thread_pool_high_priority_connection |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大价值 | 1 |
此变量影响执行前新语句的排队。 如果值为0(false,默认值),则语句排队使用低优先级队列和高优先级队列。 如果值为1(true),则排队语句始终转到高优先级队列。
仅当启用了线程池插件时,此变量才可用。 请参见 第5.6.3节“MySQL企业线程池”
thread_pool_max_unused_threads
属性 | 值 |
---|---|
命令行格式 | --thread-pool-max-unused-threads=# |
介绍 | 8.0.11 |
系统变量 | thread_pool_max_unused_threads |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大价值 | 4096 |
线程池中允许的最大未使用线程数。 此变量可以限制休眠线程使用的内存量。
值0(默认值)表示对休眠线程数没有限制。
的值
N
,其中
N
大于0意味着1个消费者线程和
N
-1储备线程。
在这种情况下,如果一个线程准备好睡眠但睡眠线程的数量已经达到最大值,则线程退出而不是进入休眠状态。
休眠线程作为消费者线程或预留线程休眠。 线程池允许一个线程在休眠时成为消费者线程。 如果一个线程进入休眠状态并且没有现有的消费者线程,它将作为消费者线程休眠。 当必须唤醒线程时,如果存在消费者线程,则选择该消费者线程。 仅当没有消费者线程被唤醒时,才会选择保留线程。
仅当启用了线程池插件时,此变量才可用。 请参见 第5.6.3节“MySQL企业线程池”
属性 | 值 |
---|---|
命令行格式 | --thread-pool-prio-kickup-timer=# |
介绍 | 8.0.11 |
系统变量 | thread_pool_prio_kickup_timer |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 1000 |
最低价值 | 0 |
最大价值 | 4294967294 |
此变量影响等待在低优先级队列中执行的语句。 该值是等待语句移动到高优先级队列之前的毫秒数。 默认值为1000(1秒)。 值的范围是0到2 32 - 2。
仅当启用了线程池插件时,此变量才可用。 请参见 第5.6.3节“MySQL企业线程池”
属性 | 值 |
---|---|
命令行格式 | --thread-pool-size=# |
介绍 | 8.0.11 |
系统变量 | thread_pool_size |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 16 |
最低价值 | 1 |
最大价值 | 64 |
线程池中的线程组数。 这是控制线程池性能的最重要参数。 它会影响可以同时执行的语句数。 默认值为16,允许值范围为1到64。 如果指定了此范围之外的值,则不会加载线程池插件,并且服务器会将消息写入错误日志。
仅当启用了线程池插件时,此变量才可用。 请参见 第5.6.3节“MySQL企业线程池”
属性 | 值 |
---|---|
命令行格式 | --thread-pool-stall-limit=# |
介绍 | 8.0.11 |
系统变量 | thread_pool_stall_limit |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 6 |
最低价值 | 4 |
最大价值 | 600 |
此变量影响执行语句。 该值是语句在被定义为停顿之前必须在开始执行之后完成的时间量,此时线程池允许线程组开始执行另一个语句。 该值以10毫秒为单位进行测量,因此值(默认值)为60毫秒。 值的范围是4到600(40ms到6s)。 短等待值允许线程更快地启动。 短值也可以更好地避免死锁情况。 长等待值对于包含长时间运行语句的工作负载很有用,以避免在当前执行时发出太多新语句。
仅当启用了线程池插件时,此变量才可用。 请参见 第5.6.3节“MySQL企业线程池”
属性 | 值 |
---|---|
命令行格式 | --thread-stack=# |
系统变量 | thread_stack |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 (64位平台,> = 8.0.2) | 286720 |
默认值 (64位平台,<= 8.0.1) | 262144 |
默认值 (32位平台,> = 8.0.2) | 221184 |
默认值 (32位平台,<= 8.0.1) | 196608 |
最低价值 | 131072 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
块大小 | 1024 |
每个线程的堆栈大小。 默认值足以进行正常操作。 如果线程堆栈大小太小,则会限制服务器可以处理的SQL语句的复杂性,存储过程的递归深度以及其他消耗内存的操作。
在MySQL 8.0.3中删除了此系统变量。
当前时区。
此变量用于初始化连接的每个客户端的时区。
默认情况下,它的初始值是
'SYSTEM'
(表示
“
使用值
system_time_zone
”
)。
可以使用该
--default-time-zone
选项
在服务器启动时显式指定该值
。
请参见
第5.1.13节“MySQL服务器时区支持”
。
如果设置为
SYSTEM
,则每个需要时区计算的MySQL函数调用都会调用系统库来确定当前系统时区。
此调用可能受全局互斥锁保护,从而导致争用。
设置此客户端的时间。
如果使用二进制日志还原行,则用于获取原始时间戳。
timestamp_value
应该是一个Unix纪元时间戳(一个像返回
UNIX_TIMESTAMP()
的值,而不是
'YYYY-MM-DD hh:mm:ss'
格式
的值
)或
DEFAULT
。
设置
timestamp
为常量值会使其保留该值,直到再次更改为止。
设置
timestamp
为
DEFAULT
使其值为访问时的当前日期和时间。
在MySQL 8.0,
timestamp
是一个
DOUBLE
,而不是
BIGINT
因为它的值包括微秒的部分。
SET timestamp
影响返回的值
NOW()
但不
影响
SYSDATE()
。
这意味着二进制日志中的时间戳设置对调用没有影响
SYSDATE()
。
可以使用
--sysdate-is-now
选项
启动服务器
SYSDATE()
以使其成为别名
NOW()
,在这种情况下
SET timestamp
会影响这两个函数。
属性 | 值 |
---|---|
命令行格式 | --tls-ciphersuites=ciphersuite_list |
介绍 | 8.0.16 |
系统变量 | tls_ciphersuites |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | empty string |
服务器允许加密连接的TLSv1.3密码组。 该值是一个或多个以冒号分隔的密码组名称的列表。 可以为此变量命名的密码套件取决于用于编译MySQL的SSL库。 有关详细信息,请参见 第6.3.6节“加密连接协议和密码” 。
属性 | 值 |
---|---|
命令行格式 | --tls-version=protocol_list |
系统变量 | tls_version |
范围 | 全球 |
动态 (> = 8.0.16) | 是 |
动态 (<= 8.0.15) | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 (> = 8.0.16) |
|
默认值 (> = 8.0.11,<= 8.0.15) | TLSv1,TLSv1.1,TLSv1.2 |
默认值 (<= 8.0.4) |
|
服务器允许加密连接的协议。 该值是一个或多个以逗号分隔的协议名称的列表。 可以为此变量命名的协议取决于用于编译MySQL的SSL库。 有关详细信息,请参见 第6.3.6节“加密连接协议和密码” 。
从MySQL 8.0.16开始,此变量是动态的,可以在运行时进行修改,以影响服务器用于新连接的SSL上下文。 请参阅 加密连接的服务器端运行时配置 。 在MySQL 8.0.16之前,只能在服务器启动时设置此变量。
属性 | 值 |
---|---|
命令行格式 | --tmp-table-size=# |
系统变量 | tmp_table_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 16777216 |
最低价值 | 1024 |
最大价值 | 18446744073709551615 |
内部内存临时表的最大大小。
此变量不适用于用户创建的
MEMORY
表。
实际限制是根据
tmp_table_size
和
max_heap_table_size
的较小
值确定的
。
如果内存中的临时表超出限制,MySQL会自动将其转换为磁盘上的临时表。
有关
详细信息,
请参阅
磁盘内部临时表的存储引擎
。
如果您执行许多高级
查询并且内存
很多
tmp_table_size
,
max_heap_table_size
则
增加
(以及
必要时)
的值
GROUP BY
。
您可以将创建的内部磁盘上临时表的数量与通过比较
Created_tmp_disk_tables
和
Created_tmp_tables
变量
的值创建的内部临时表的总数进行比较
。
另请参见 第8.4.4节“MySQL中的内部临时表使用” 。
用于创建临时文件的目录的路径。
如果您的默认
/tmp
目录位于太小而无法容纳临时表的分区上,则
可能很有用
。
此变量可以设置为以循环方式使用的多个路径的列表。
路径应该用
:
Unix上
的冒号字符(
)和
;
Windows上的
分号字符(
)
分隔
。
tmpdir
可以是非永久位置,例如基于内存的文件系统上的目录或服务器主机重新启动时清除的目录。
如果MySQL服务器充当复制从属服务器,并且您使用的是非永久性位置
tmpdir
,请考虑使用该
slave_load_tmpdir
变量
为从属服务器设置不同的临时目录
。
对于复制从属服务器,用于复制
LOAD
DATA
语句
的临时文件
存储在此目录中,因此使用永久位置它们可以在计算机重新启动后继续运行,尽管如果已删除临时文件,复制现在可以在重新启动后继续。
有关临时文件存储位置的更多信息,请参见 第B.4.3.5节“MySQL存储临时文件的位置” 。
属性 | 值 |
---|---|
命令行格式 | --transaction-alloc-block-size=# |
系统变量 | transaction_alloc_block_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 8192 |
最低价值 | 1024 |
最大价值 | 131072 |
块大小 | 1024 |
增加需要内存的每事务内存池的字节数。
请参阅说明
transaction_prealloc_size
。
属性 | 值 |
---|---|
命令行格式 | --transaction-isolation=name |
系统变量 | transaction_isolation |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | REPEATABLE-READ |
有效值 |
|
事务隔离级别。
默认是
REPEATABLE-READ
。
事务隔离级别有三个范围:全局,会话和下一个事务。 这个三范围实现导致一些非标准的隔离级别分配语义,如稍后所述。
要在启动时设置全局事务隔离级别,请使用
--transaction-isolation
服务器选项。
在运行时,可以使用
SET
语句
直接设置隔离级别,
以便为
transaction_isolation
系统变量赋值,或者间接使用
SET
TRANSACTION
语句。
如果
transaction_isolation
直接
设置
为包含空格的隔离级别名称,则名称应括在引号内,并用空格替换空格。
例如,使用此
SET
语句设置全局值:
SET GLOBAL transaction_isolation ='READ-COMMITTED';
设置全局
transaction_isolation
值可设置所有后续会话的隔离级别。
现有会话不受影响。
要设置会话或下一级
transaction_isolation
值,请使用该
SET
语句。
对于大多数会话系统变量,这些语句是设置值的等效方法:
SET @@ SESSION。var_name
=value
; SET SESSIONvar_name
=value
; SETvar_name
=value
; SET @@var_name
=value
;
如前所述,除了全局和会话范围之外,事务隔离级别还具有下一个事务范围。
要启用下一个事务范围,
SET
分配会话系统变量值的语法具有非标准语义
transaction_isolation
:
要设置会话隔离级别,请使用以下任何语法:
SET @@ SESSION.transaction_isolation =value
; SET SESSION transaction_isolation =value
; SET transaction_isolation =value
;
对于每种语法,这些语义适用:
设置会话中执行的所有后续事务的隔离级别。
在交易中允许,但不影响当前正在进行的交易。
如果在事务之间执行,则覆盖设置下一事务隔离级别的任何先前语句。
对应于
SET
SESSION TRANSACTION ISOLATION LEVEL
(使用
SESSION
关键字)。
要设置下一个事务隔离级别,请使用以下语法:
SET @@ transaction_isolation = value
;
对于该语法,这些语义适用:
仅为会话中执行的下一个单个事务设置隔离级别。
后续事务将恢复为会话隔离级别。
交易中不允许。
对应于
SET
TRANSACTION ISOLATION LEVEL
(没有
SESSION
关键字)。
有关
SET
TRANSACTION
它及其与
transaction_isolation
系统变量的
关系的
更多信息
,请参见
第13.3.7节“SET TRANSACTION语法”
。
属性 | 值 |
---|---|
命令行格式 | --transaction-prealloc-size=# |
系统变量 | transaction_prealloc_size |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 4096 |
最低价值 | 1024 |
最大价值 | 131072 |
块大小 | 1024 |
有一个每事务内存池,各种与事务相关的分配从中获取内存。
池的初始大小(以字节为单位)
transaction_prealloc_size
。
对于池中无法满足的每个分配,因为它没有足够的可用内存,因此池会增加
transaction_alloc_block_size
字节数。
事务结束时,池被截断为
transaction_prealloc_size
字节。
通过使
transaction_prealloc_size
足够大以包含单个事务中的所有语句,您可以避免许多
malloc()
调用。
属性 | 值 |
---|---|
命令行格式 | --transaction-read-only[={OFF|ON}] |
系统变量 | transaction_read_only |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
交易访问模式。
值可以是
OFF
(读/写;默认值)或
ON
(只读)。
事务访问模式有三个范围:全局,会话和下一个事务。 这种三范围实现导致一些非标准的访问模式分配语义,如稍后所述。
要在启动时设置全局事务访问模式,请使用
--transaction-read-only
服务器选项。
在运行时,可以使用
SET
语句
直接设置访问模式,
以便为
transaction_read_only
系统变量赋值,或者间接使用
SET
TRANSACTION
语句。
例如,使用此
SET
语句设置全局值:
SET GLOBAL transaction_read_only = ON;
设置全局
transaction_read_only
值可设置所有后续会话的访问模式。
现有会话不受影响。
要设置会话或下一级
transaction_read_only
值,请使用该
SET
语句。
对于大多数会话系统变量,这些语句是设置值的等效方法:
SET @@ SESSION。var_name
=value
; SET SESSIONvar_name
=value
; SETvar_name
=value
; SET @@var_name
=value
;
如前所述,除了全局和会话范围之外,事务访问模式还具有下一个事务范围。
要启用下一个事务范围,
SET
分配会话系统变量值的语法具有非标准语义
transaction_read_only
,
要设置会话访问模式,请使用以下任何语法:
SET @@ SESSION.transaction_read_only =value
; SET SESSION transaction_read_only =value
; SET transaction_read_only =value
;
对于每种语法,这些语义适用:
设置会话中执行的所有后续事务的访问模式。
在交易中允许,但不影响当前正在进行的交易。
如果在事务之间执行,则覆盖设置下一事务访问模式的任何先前语句。
对应于
SET
SESSION TRANSACTION {READ WRITE | READ ONLY}
(使用
SESSION
关键字)。
要设置下一个事务访问模式,请使用以下语法:
SET @@ transaction_read_only = value
;
对于该语法,这些语义适用:
仅为会话中执行的下一个单个事务设置访问模式。
后续事务将恢复为会话访问模式。
交易中不允许。
对应于
SET
TRANSACTION {READ WRITE | READ ONLY}
(没有
SESSION
关键字)。
有关
SET
TRANSACTION
它及其与
transaction_read_only
系统变量的
关系的
更多信息
,请参见
第13.3.7节“SET TRANSACTION语法”
。
属性 | 值 |
---|---|
弃用 | 是(在8.0.3中删除) |
系统变量 | tx_isolation |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | REPEATABLE-READ |
有效值 |
|
在MySQL 8.0.3中删除了此系统变量。
请
transaction_isolation
改用。
属性 | 值 |
---|---|
弃用 | 是(在8.0.3中删除) |
系统变量 | tx_read_only |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
在MySQL 8.0.3中删除了此系统变量。
请
transaction_read_only
改用。
属性 | 值 |
---|---|
系统变量 | unique_checks |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 布尔 |
默认值 | ON |
如果设置为1(默认值),
InnoDB
则执行表中
二级索引的唯一性检查
。
如果设置为0,则允许存储引擎假定输入数据中不存在重复键。
如果您确定您的数据不包含唯一性违规,则可以将其设置为0以加快大型表的导入速度
InnoDB
。
将此变量设置为0 不需要 存储引擎忽略重复键。 仍然允许引擎检查它们并在检测到它们时发出重复键错误。
属性 | 值 |
---|---|
命令行格式 | --updatable-views-with-limit[={OFF|ON}] |
系统变量 | updatable_views_with_limit |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 布尔 |
默认值 | 1 |
如果update语句包含
LIMIT
子句
,则此变量控制是否可以在视图不包含基础表中定义的主键的所有列时对视图进行更新
。
(此类更新通常由GUI工具生成。)更新是一个
UPDATE
或
DELETE
语句。
这里的主键表示a
PRIMARY KEY
或
UNIQUE
不包含列
的
索引
NULL
。
变量可以有两个值:
1
或
YES
:仅发出警告(不是错误消息)。
这是默认值。
0
或
NO
:禁止更新。
属性 | 值 |
---|---|
介绍 | 8.0.13 |
系统变量 | use_secondary_engine |
范围 | 会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 列举 |
默认值 | ON |
有效值 |
|
供将来使用。
validate_password.
xxx
该
validate_password
组件实现了一组具有表单名称的系统变量
。
这些变量会影响该组件的密码测试;
请参见
第6.4.3.2节“密码验证选项和变量”
。
validate_password.
xxx
属性 | 值 |
---|---|
命令行格式 | --validate-user-plugins[={OFF|ON}] |
系统变量 | validate_user_plugins |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
如果启用此变量(默认值),则服务器会检查每个用户帐户,并在发现会导致帐户无法使用的条件时生成警告:
该帐户需要未加载的身份验证插件。
该帐户需要
sha256_password
或
caching_sha2_password
身份验证插件,但服务器启动时既没有启用SSL也没有启用RSA。
启用
validate_user_plugins
会降低服务器初始化速度
FLUSH PRIVILEGES
。
如果您不需要额外检查,则可以在启动时禁用此变量以避免性能下降。
服务器的版本号。
该值还可能包括指示服务器构建或配置信息的后缀。
-debug
表示服务器是在启用调试支持的情况下构建的。
属性 | 值 |
---|---|
系统变量 | version_comment |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
该
CMake的
配置程序有一个
COMPILATION_COMMENT_SERVER
选项,允许评论构建MySQL时指定。
此变量包含该注释的值。
(在MySQL 8.0.14之前,
version_comment
由
COMPILATION_COMMENT
选项
设置
。)请参见
第2.9.4节“MySQL源配置选项”
。
属性 | 值 |
---|---|
系统变量 | version_compile_machine |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
服务器二进制文件的类型。
属性 | 值 |
---|---|
系统变量 | version_compile_os |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
构建MySQL的操作系统类型。
属性 | 值 |
---|---|
介绍 | 8.0.11 |
系统变量 | version_compile_zlib |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
已编译
zlib
库
的版本
。
属性 | 值 |
---|---|
命令行格式 | --wait-timeout=# |
系统变量 | wait_timeout |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 28800 |
最低价值 | 1 |
最大价值 (其他) | 31536000 |
最大值 (Windows) | 2147483 |
服务器在关闭非交互式连接之前等待活动的秒数。
在线程启动时,会话
wait_timeout
值从全局
wait_timeout
值或
全局
值
初始化
interactive_timeout
,具体取决于客户端的类型(由
CLIENT_INTERACTIVE
connect选项
定义
mysql_real_connect()
)。
另见
interactive_timeout
。
生成消息的最后一个语句产生的错误,警告和注释的数量。 此变量是只读的。 请参见 第13.7.6.40节“显示警告语法” 。
属性 | 值 |
---|---|
命令行格式 | --windowing-use-high-precision[={OFF|ON}] |
介绍 | 8.0.2 |
系统变量 | windowing_use_high_precision |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 布尔 |
默认值 | ON |
是否在不损失精度的情况下计算窗口操作。 请参见 第8.2.1.20节“窗口函数优化” 。
MySQL服务器维护许多配置其操作的系统变量。
第5.1.8节“服务器系统变量”
描述了这些变量的含义。
每个系统变量都有一个默认值。
可以使用命令行或选项文件中的选项在服务器启动时设置系统变量。
它们中的大多数可以在服务器运行时通过
SET
语句
动态更改
,这使您可以修改服务器的操作,而无需停止并重新启动它。
您还可以在表达式中使用系统变量值。
内置了许多系统变量。系统变量也可以由服务器插件或组件安装:
安装插件时会公开由服务器插件实现的系统变量,并且名称以插件名称开头。
例如,
audit_log
插件实现了一个名为的系统变量
audit_log_policy
。
服务器组件实现的系统变量在安装组件时公开,其名称以特定于组件的前缀开头。
例如,
log_filter_dragnet
错误日志过滤器组件实现了一个名为的系统变量
log_error_filter_rules
,其全名是
dragnet.log_error_filter_rules
。
要引用此变量,请使用全名。
存在两个系统变量的范围。 全局变量会影响服务器的整体操作。 会话变量会影响其对各个客户端连接的操作。 给定的系统变量可以同时具有全局值和会话值。 全局和会话系统变量相关如下:
服务器启动时,会将每个全局变量初始化为其默认值。 可以通过命令行或选项文件中指定的选项更改这些默认值。 (请参见 第4.2.2节“指定程序选项” 。)
服务器还为每个连接的客户端维护一组会话变量。
使用相应全局变量的当前值在连接时初始化客户端的会话变量。
例如,客户端的SQL模式由会话
sql_mode
值
控制,会话
值在客户端连接到全局
sql_mode
值
的值时初始化
。
对于某些系统变量,会话值不会从相应的全局值初始化; 如果是,则在变量描述中指出。
通过在命令行或选项文件中使用选项,可以在服务器启动时全局设置系统变量值。
当使用启动选项设置一个变量,需要一个数字值,该值可以与一个后缀被给予
K
,
M
或
G
(大写或小写),以指示1024一乘法器,1024
2
或1024
3
;
也就是说,分别是千字节,兆字节或千兆字节的单位。
从MySQL 8.0.14的,后缀也可以是
T
,
P
和
E
以指示1024乘法器
4
,1024
5
或1024
6
。
因此,以下命令启动服务器
InnoDB
日志文件大小为16兆字节,最大数据包大小为1千兆字节:
mysqld --innodb-log-file-size = 16M --max-allowed-packet = 1G
在选项文件中,这些变量设置如下:
的[mysqld] innodb_log_file_size = 16M max_allowed_packet的= 1G
后缀字母的字母无关紧要;
16M
和
16m
是等价的,因为是
1G
和
1g
。
要限制在运行时可以使用
SET
语句
设置系统变量的
最大值,请
在服务器启动时
使用表单选项指定此最大值
。
例如,要防止
在运行时
将值
增加到大于32MB,请使用该选项
。
--maximum-
var_name
=value
innodb_log_file_size
--maximum-innodb-log-file-size=32M
许多系统变量都是动态的,可以在运行时使用该
SET
语句
进行更改
。
有关列表,请参见
第5.1.9.2节“动态系统变量”
。
要使用更改系统变量
SET
,请按名称引用它,可选地在其前面加上修饰符。
以下示例简要说明了此语法:
设置全局系统变量:
SET GLOBAL max_connections = 1000; SET @@ GLOBAL.max_connections = 1000;
将全局系统变量保留到
mysqld-auto.cnf
文件中(并设置运行时值):
SET PERSIST max_connections = 1000; SET @@ PERSIST.max_connections = 1000;
将全局系统变量保留到
mysqld-auto.cnf
文件中(不设置运行时值):
SET PERSIST_ONLY back_log = 1000; SET @@ PERSIST_ONLY.back_log = 1000;
设置会话系统变量:
SET SESSION sql_mode ='TRADITIONAL'; SET @@ SESSION.sql_mode ='TRADITIONAL'; SET @@ sql_mode ='TRADITIONAL';
有关
SET
语法的
完整详细信息
,请参见
第13.7.5.1节“变量赋值的SET语法”
。
有关设置和保留系统变量的权限要求的说明,请参见
第5.1.9.1节“系统变量权限”
在服务器启动时设置变量时,可以使用指定值乘数的后缀,但不能
SET
在运行时
设置值
。
另一方面,
SET
您可以使用表达式分配变量的值,但在服务器启动时设置变量时,这不是真的。
例如,以下第一行在服务器启动时是合法的,但第二行不是:
shell>mysql --max_allowed_packet=16M
shell>mysql --max_allowed_packet=16*1024*1024
相反,以下第二行在运行时是合法的,但第一行不是:
mysql>SET GLOBAL max_allowed_packet=16M;
mysql>SET GLOBAL max_allowed_packet=16*1024*1024;
某些系统变量可以
SET
通过将它们设置为
ON
or
来启用
1
,或者通过将它们设置为
OFF
或
来禁用
0
。
但是,要在命令行或选项文件中设置此类变量,必须将其设置为
1
或
0
;
将其设置为
ON
或
OFF
将不起作用。
例如,在命令行上,
--delay_key_write=1
可以工作但
--delay_key_write=ON
不能。
要显示系统变量名称和值,请使用以下
SHOW
VARIABLES
语句:
MySQL的> SHOW VARIABLES;
+ --------------------------------- + --------------- -------------------- +
| Variable_name | 价值|
+ --------------------------------- + --------------- -------------------- +
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| automatic_sp_privileges | ON |
| back_log | 151 |
| basedir | / home / mysql / |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8mb4 |
| character_set_filesystem | 二进制|
| character_set_results | utf8 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | / home / mysql / share / mysql / charsets / |
| collation_connection | utf8_general_ci |
| collation_database | utf8mb4_0900_ai_ci |
| collation_server | utf8mb4_0900_ai_ci |
...
| innodb_autoextend_increment | 8 |
| innodb_buffer_pool_size | 8388608 |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
...
| 版本| 8.0.1-dmr-log |
| version_comment | 来源分布|
| version_compile_machine | i686 |
| version_compile_os | suse-linux |
| wait_timeout | 28800 |
+ --------------------------------- + --------------- -------------------- +
使用
LIKE
子句,语句仅显示与模式匹配的变量。
要获取特定变量名称,请使用
LIKE
如下所示
的
子句:
显示变量如'max_join_size'; 显示会话变量类似'max_join_size';
要获取名称与模式匹配的变量列表,请
%
在
LIKE
子句中
使用
通配符
:
显示变量如'%size%'; 显示全球变量如'%size%';
通配符可用于要匹配的模式中的任何位置。
严格来说,因为
_
是一个匹配任何单个字符的通配符,你应该将其转义为
\_
按字面意思匹配它。
实际上,这很少是必要的。
因为
SHOW
VARIABLES
,如果你既
GLOBAL
没有
指定也
没有
SESSION
,MySQL返回
SESSION
值。
GLOBAL
在设置
GLOBAL
-only变量
时
需要
关键字
但在检索变量
时
不需要
关键字
的原因
是为了防止将来出现问题:
如果
SESSION
要删除与
GLOBAL
变量
同名的
变量,具有足以修改全局变量的权限的客户端可能会意外地更改
GLOBAL
变量而不仅仅是
SESSION
变量用于其自己的会话。
如果
SESSION
要添加
的
变量与变量同名
GLOBAL
,则打算更改
GLOBAL
变量
的客户端
可能只发现自己的
SESSION
变量已更改。
系统变量可以具有影响整个服务器操作的全局值,仅影响当前会话的会话值,或两者:
对于动态系统变量,该
SET
语句可用于更改其全局或会话运行时值(或两者),以影响当前服务器实例的操作。
(有关动态变量的信息,请参见
第5.1.9.2节“动态系统变量”
。)
对于某些全局系统变量,
SET
可以使用它们将其值保存到
mysqld-auto.cnf
数据目录中
的
文件,以影响后续启动的服务器操作。
(有关持久化系统变量和
mysqld-auto.cnf
文件的信息,请参见
第5.1.9.3节“持久系统变量”
。)
对于持久化的全局系统变量,
RESET
PERSIST
可用于从中删除它们的值
mysqld-auto.cnf
,以影响后续启动的服务器操作。
本节介绍在运行时为系统变量赋值的操作所需的权限。 这包括影响运行时值的操作以及持久保存值的操作。
要设置全局系统变量,请使用
SET
带有相应关键字
的
语句。
这些特权适用:
要设置全局系统变量运行时值,请使用
SET
GLOBAL
需要
SYSTEM_VARIABLES_ADMIN
或
SUPER
特权
的
语句
。
要将全局系统变量保留到
mysqld-auto.cnf
文件(并设置运行时值),请使用
SET
PERSIST
需要
SYSTEM_VARIABLES_ADMIN
或
SUPER
权限
的
语句
。
要将全局系统变量保留到
mysqld-auto.cnf
文件中(不设置运行时值),请使用
SET
PERSIST_ONLY
需要
SYSTEM_VARIABLES_ADMIN
和
PERSIST_RO_VARIABLES_ADMIN
权限
的
语句
。
SET
PERSIST_ONLY
可以用于动态和只读系统变量,但对于持久化只读变量特别有用,因为这些变量
SET
PERSIST
无法使用。
某些全局系统变量是持久限制的(请参见
第5.1.9.4节“不可容忍和持久限制的系统变量”
)。
要保留这些变量,请使用该
SET
PERSIST_ONLY
语句,该语句需要先前描述的权限。
此外,您必须使用加密连接连接到服务器,并提供具有
persist_only_admin_x509_subject
系统变量
指定的Subject值的SSL证书
。
要从文件中删除持久化的全局系统变量
mysqld-auto.cnf
,请使用该
RESET
PERSIST
语句。
这些特权适用:
对于动态系统变量,
RESET
PERSIST
需要
SYSTEM_VARIABLES_ADMIN
或
SUPER
权限。
对于只读系统变量,
RESET
PERSIST
需要
SYSTEM_VARIABLES_ADMIN
和
PERSIST_RO_VARIABLES_ADMIN
权限。
对于持久限制变量,
RESET
PERSIST
不需要使用特定SSL证书对服务器进行加密连接。
如果全局系统变量对前面的权限要求有任何例外,则变量描述表示这些例外。
示例包括
default_table_encryption
和
mandatory_roles
,需要其他权限。
这些附加权限适用于设置全局运行时值的操作,但不适用于持久保存该值的操作。
要设置会话系统变量运行时值,请使用该
SET
SESSION
语句。
与设置全局运行时值相反,设置会话运行时值通常不需要特殊权限,任何用户都可以使用它来影响当前会话。
对于某些系统变量,设置会话值可能会在当前会话之外产生影响,因此是受限制的操作,只能由具有特殊权限的用户执行:
从MySQL 8.0.14开始,所需的权限是
SESSION_VARIABLES_ADMIN
。
任何具有
SYSTEM_VARIABLES_ADMIN
或
SUPER
有效
SESSION_VARIABLES_ADMIN
含义并且无需
SESSION_VARIABLES_ADMIN
明确
授予的用户
。
在MySQL 8.0.14之前,所需的权限是
SYSTEM_VARIABLES_ADMIN
或
SUPER
。
如果会话系统变量受限制,则变量描述指示该限制。
例子包括
binlog_format
和
sql_log_bin
。
设置这些变量的会话值会影响当前会话的二进制日志记录,但也可能对服务器复制和备份的完整性产生更广泛的影响。
SESSION_VARIABLES_ADMIN
使管理员能够最小化之前已被授予的用户的权限足迹,
SYSTEM_VARIABLES_ADMIN
或者
SUPER
使他们能够修改受限制的会话系统变量。
假设管理员已创建以下角色以授予设置受限会话系统变量的能力:
CREATE ROLE set_session_sysvars; GRANT SYSTEM_VARIABLES_ADMIN ON *。* TO set_session_sysvars;
授予该
set_session_sysvars
角色的
任何用户
(以及具有该角色的用户)都可以设置受限制的会话系统变量。
但是,该用户还能够设置全局系统变量,这可能是不合需要的。
通过修改角色来
SESSION_VARIABLES_ADMIN
代替
SYSTEM_VARIABLES_ADMIN
,角色特权可以减少到设置受限制的会话系统变量的能力,而不是其他任何东西。
要修改角色,请使用以下语句:
GRANT SESSION_VARIABLES_ADMIN ON *。* TO set_session_sysvars; REVOKE SYSTEM_VARIABLES_ADMIN ON *。* FROM set_session_sysvars;
修改角色具有直接影响:授予
set_session_sysvars
角色的
任何帐户
不再具有
SYSTEM_VARIABLES_ADMIN
且无法设置全局系统变量而未明确授予该功能。
类似
GRANT
/
REVOKE
序列可以应用于
SYSTEM_VARIABLES_ADMIN
直接
授予的任何帐户,
而不是通过角色。
许多服务器系统变量是动态的,可以在运行时设置。 请参见 第13.7.5.1节“变量赋值的SET语法” 。 有关设置系统变量的权限要求的说明,请参见 第5.1.9.1节“系统变量权限”
下表列出了适用的所有动态系统变量
mysqld
。
该表列出了每个变量的数据类型和范围。 最后一列指示每个变量的范围是全局,会话还是两者。 有关设置和使用变量的详细信息,请参阅相应的项目说明。 在适当的情况下,提供有关物品的进一步信息的直接链接。
具有
“
string
”
类型的变量
采用字符串值。
具有
“
数字
”
类型的变量
采用数值。
具有
“
boolean
”
类型的变量
可以设置为0,1
ON
或
OFF
。
标记为
“
枚举
”的
变量
通常应设置为变量的可用值之一,但也可以设置为与所需枚举值对应的数字。
对于枚举的系统变量,第一个枚举值对应于0.这与
ENUM
用于表列的数据类型,第一个枚举值对应于1。
表5.4动态系统变量摘要
MySQL服务器维护配置其操作的系统变量。
系统变量可以具有影响整个服务器操作的全局值,影响当前会话的会话值,或两者。
许多系统变量是动态的,可以在运行时使用该
SET
语句
更改,
以影响当前服务器实例的操作。
SET
还可以用于将某些全局系统变量持久保存到
mysqld-auto.cnf
数据目录中
的
文件,以影响后续启动的服务器操作。
RESET
PERSIST
从中删除持久设置
mysqld-auto.cnf
。
以下讨论描述了持久化系统变量的各个方面:
在运行时持久保存全局系统变量的功能使服务器配置能够在服务器启动时保持不变。
尽管可以在启动时从
my.cnf
选项文件
设置许多系统变量
,或者在运行时使用该
SET
语句
设置许多系统变量
,但配置服务器的这些方法要么需要登录访问服务器主机,要么不提供在运行时持久配置服务器的功能。远程:
修改选项文件需要直接访问该文件,这需要登录访问MySQL服务器主机。 这并不总是方便的。
修改系统变量
SET
GLOBAL
是一种运行时功能,可以从本地或远程主机运行的客户端完成,但这些更改仅影响当前运行的服务器实例。
这些设置不是持久性的,不会延续到后续服务器启动。
为了增加服务器配置的管理功能,超出了通过编辑选项文件或使用可实现的功能
SET
GLOBAL
,MySQL提供了
SET
语法
变体,
将系统变量设置保存到
mysqld-auto.cnf
数据目录中
的文件名为
file。
例子:
SET PERSIST max_connections = 1000; SET @@ PERSIST.max_connections = 1000; SET PERSIST_ONLY back_log = 100; SET @@ PERSIST_ONLY.back_log = 100;
MySQL还提供了一个
RESET
PERSIST
从中删除持久化系统变量
的
语句
mysqld-auto.cnf
。
通过持久化系统变量执行的服务器配置具有以下特征:
持久设置是在运行时进行的。
持久设置是永久性的。 它们适用于服务器重启。
可以从本地客户端或从远程主机连接的客户端进行持久设置。 这提供了从中央客户端主机远程配置多个MySQL服务器的便利。
要保留系统变量,您无需具有对MySQL服务器主机的登录访问权限或对选项文件的文件系统访问权限。 使用MySQL权限系统控制持久设置的能力。 请参见 第5.1.9.1节“系统变量权限” 。
具有足够权限的管理员可以通过保留系统变量来重新配置服务器,然后通过执行
RESTART
语句
使服务器立即使用更改的设置
。
持久设置提供有关错误的即时反馈。
手动输入的设置中的错误可能要到很晚才发现。
SET
持久化系统变量的语句可以避免设置格式错误的可能性,因为具有语法错误的设置不会成功,也不会更改服务器配置。
这些
SET
语法选项可用于持久化系统变量:
要将全局系统变量持久保存到
mysqld-auto.cnf
数据目录中
的
选项文件,请在变量名前面加上
PERSIST
关键字或
@@PERSIST.
限定符:
SET PERSIST max_connections = 1000; SET @@ PERSIST.max_connections = 1000;
比如
SET
GLOBAL
,
SET
PERSIST
设置全局变量运行时值,但也将变量设置写入
mysqld-auto.cnf
文件(如果有的话,替换任何现有的变量设置)。
要在
mysqld-auto.cnf
不设置全局变量运行时值的情况下将
全局系统变量保留到
文件,请在变量名前面加上
PERSIST_ONLY
关键字或
@@PERSIST_ONLY.
限定符:
SET PERSIST_ONLY back_log = 1000; SET @@ PERSIST_ONLY.back_log = 1000;
比如
PERSIST
,
PERSIST_ONLY
将变量设置写入
mysqld-auto.cnf
。
但是,与之不同
PERSIST
,
PERSIST_ONLY
不会修改全局变量运行时值。
这
PERSIST_ONLY
适用于配置只能在服务器启动时设置的只读系统变量。
有关更多信息
SET
,请参见
第13.7.5.1节“变量赋值的SET语法”
。
这些
RESET
PERSIST
语法选项可用于删除持久化的系统变量:
要从中删除所有持久变量
mysqld-auto.cnf
,请在
RESET
PERSIST
不命名任何系统变量的情况下
使用
:
重置持有人;
要从中删除特定的持久变量
mysqld-auto.cnf
,请在语句中对其进行命名:
重置持有人system_var_name
;
这包括插件系统变量,即使当前未安装插件也是如此。 如果文件中不存在该变量,则会发生错误。
要从文件中删除特定的持久变量
mysqld-auto.cnf
,但如果文件中不存在该变量,则产生警告而不是错误
IF EXISTS
,请在以前的语法中
添加一个
子句:
如果存在,重置持续system_var_name
;
有关更多信息
RESET
PERSIST
,请参见
第13.7.7.7节“重置PERSIST语法”
。
使用
SET
一个全局系统变量坚持到的值
DEFAULT
或者它的字面默认值赋给变量的默认值,并增加了对变量的设置
mysqld-auto.cnf
。
要从文件中删除变量,请使用
RESET
PERSIST
。
某些系统变量无法持久化。 请参见 第5.1.9.4节“不可容忍且持久限制的系统变量” 。
如果在
SET
执行语句
时安装了插件,则可以持久保存由插件实现的系统变量
。
如果仍然安装了插件,则持久插件变量的分配将对后续服务器重新启动生效。
如果不再安装插件,则在服务器读取
mysqld-auto.cnf
文件
时,插件变量将不存在
。
在这种情况下,服务器会向错误日志写入警告并继续:
目前未知的变量' var_name
'
从持久化的配置文件中读取
性能模式
persisted_variables
表提供了
mysqld-auto.cnf
文件
的SQL接口
,允许在运行时使用
SELECT
语句
检查其内容
。
请参见
第26.12.13.1节“性能模式persisted_variables表”
。
性能模式
variables_info
表包含显示最近设置每个系统变量的用户的时间和位置的信息。
请参见
第26.12.13.2节“性能模式variables_info表”
。
RESET
PERSIST
persisted_variables
因为表内容对应于
mysqld-auto.cnf
文件
的内容,所以
会影响
表的内容
。
另一方面,因为
RESET
PERSIST
不更改变量值,所以在
variables_info
重新启动服务器之前
它对
表
的内容没有影响
。
该
mysqld-auto.cnf
文件使用这样的
JSON
格式(为了便于阅读,略微重新格式化):
{ “版本”:1, “mysql_server”:{ “max_connections”:{ “价值”:“152”, “元数据”:{ “时间戳”:1.519921356e + 15, “用户”:“root”, “主持人”:“localhost” } }, “transaction_isolation”:{ “价值”:“读书承诺”, “元数据”:{ “时间戳”:1.519921553e + 15, “用户”:“root”, “主持人”:“localhost” } }, “mysql_server_static_options”:{ “innodb_api_enable_mdl”:{ “价值”:“0”, “元数据”:{ “时间戳”:1.519921573e + 15, “用户”:“root”, “主持人”:“localhost” } }, “log_slave_updates”:{ “价值”:“1”, “元数据”:{ “时间戳”:1.519921582e + 15, “用户”:“root”, “主持人”:“localhost” } } } } }
启动时,服务器会
mysqld-auto.cnf
在所有其他选项文件之后
处理该
文件(请参见
第4.2.2.2节“使用选项文件”
)。
服务器处理文件内容如下:
如果
persisted_globals_load
禁用
了
系统变量,则服务器将忽略该
mysqld-auto.cnf
文件。
SET
PERSIST_ONLY
此
"mysql_server_static_options"
部分中
仅
显示
持久使用的只读变量
。
此部分中存在的所有变量都附加到命令行,并使用其他命令行选项进行处理。
所有剩余的持久变量都是通过
SET
GLOBAL
稍后在服务器开始侦听客户端连接之前
执行等效的
语句
来设置的
。
因此,这些设置直到启动过程的后期才会生效,这可能不适用于某些系统变量。
最好设置这些变量
my.cnf
而不是in
mysqld-auto.cnf
。
mysqld-auto.cnf
文件
管理
应留给服务器。
文件的操作应仅使用
SET
和
RESET
PERSIST
语句
执行
,而不是手动执行:
删除文件会导致下次服务器启动时丢失所有持久设置。 (如果您的目的是在没有这些设置的情况下重新配置服务器,则允许这样做。)要删除文件中的所有设置而不删除文件本身,请使用以下语句:
重置持有人;
手动更改文件可能会导致服务器启动时出现解析错误。
在这种情况下,服务器报告错误并退出。
如果出现此问题,请在
persisted_globals_load
禁用系统变量或使用该
--no-defaults
选项的
情况下启动服务器
。
或者,删除该
mysqld-auto.cnf
文件。
但是,如前所述,删除此文件会导致丢失所有持久设置。
SET
PERSIST
并将
SET
PERSIST_ONLY
全局系统变量保持为
mysqld-auto.cnf
数据目录中
的
选项文件(请参见
第13.7.5.1节“变量赋值的SET语法”
)。
但是,并非所有系统变量都可以保留,或者只能在某些限制条件下保留。
以下是系统变量可能无法容忍或持久限制的一些原因:
会话系统变量无法持久化。 在服务器启动时无法设置会话变量,因此没有理由坚持它们。
全局系统变量可能涉及敏感数据,因此只能由可直接访问服务器主机的用户设置。
全局系统变量可能是只读的(即,仅由服务器设置)。 在这种情况下,无论是在服务器启动时还是在运行时,都无法由用户设置。
全局系统变量可能仅供内部使用。
在任何情况下都不能保留不可容许的系统变量。
从MySQL 8.0.14开始,持久限制的系统变量可以持久化
SET
PERSIST_ONLY
,但仅限于满足以下条件的用户:
该
persist_only_admin_x509_subject
系统变量设置为SSL证书X.509主题值。
用户使用加密连接连接到服务器,并提供具有指定主题值的SSL证书。
用户具有足够的权限
SET
PERSIST_ONLY
(请参见
第5.1.9.1节“系统变量权限”
)。
例如,它
protocol_version
是只读的并且仅由服务器设置,因此在任何情况下都不能保留。
另一方面,
bind_address
是持久限制的,因此可以由满足前述条件的用户设置。
以下系统变量是不可分辨的。 此列表可能会随着持续发展而变化。
audit_log_current_session audit_log_filter_id character_set_system core_file have_statement_timeout have_symlink 主机名 innodb_version large_files_support large_page_size 执照 locked_in_memory log_bin log_bin_basename log_bin_index lower_case_file_system ndb_version ndb_version_string persist_only_admin_x509_subject persisted_globals_load PROTOCOL_VERSION relay_log_basename relay_log_index server_uuid skip_external_locking system_time_zone version_comment version_compile_machine version_compile_os version_compile_zlib
持久限制的系统变量是只读的,可以在命令行或选项文件中设置,而不是
persist_only_admin_x509_subject
和
persisted_globals_load
。
此列表可能会随着持续发展而变化。
audit_log_file audit_log_format auto_generate_certs BASEDIR bind_address caching_sha2_password_auto_generate_rsa_keys caching_sha2_password_private_key_path caching_sha2_password_public_key_path character_sets_dir daemon_memcached_engine_lib_name daemon_memcached_engine_lib_path daemon_memcached_option DATADIR default_authentication_plugin ft_stopword_file init_file innodb_buffer_pool_load_at_startup innodb_data_file_path中 innodb_data_home_dir innodb_dedicated_server innodb_directories innodb_force_load_corrupted innodb_log_group_home_dir innodb_page_size innodb_read_only innodb_temp_data_file_path innodb_temp_tablespaces_dir innodb_undo_directory innodb_undo_tablespaces keyring_encrypted_file_data keyring_encrypted_file_password lc_messages_dir 的log_error mecab_rc_file named_pipe pid_file PLUGIN_DIR 港口 relay_log relay_log_info_file secure_file_priv sha256_password_auto_generate_rsa_keys sha256_password_private_key_path sha256_password_public_key_path shared_memory shared_memory_base_name skip_networking slave_load_tmpdir 插座 ssl_ca ssl_capath ssl_cert ssl_crl ssl_crlpath ssl_key TMPDIR version_tokens_session_number
要配置服务器以启用持久限制的系统变量,请使用以下过程:
确保将MySQL配置为支持加密连接。 请参见 第6.3.1节“配置MySQL以使用加密连接” 。
指定SSL证书X.509主题值,表示持久限制系统变量的持久性,并生成具有该主题的证书。 请参见 第6.3.3节“创建SSL和RSA证书和密钥” 。
启动服务器并将其
persist_only_admin_x509_subject
设置为指定的主题值。
例如,将这些行放在服务器
my.cnf
文件中:
的[mysqld]
persist_only_admin_x509_subject =“ subject-value
”
Subject值的格式与用于的格式相同
CREATE
USER ...
REQUIRE SUBJECT
。
请参见
第13.7.1.3节“创建用户语法”
。
您必须直接在MySQL服务器主机上执行此步骤,因为
persist_only_admin_x509_subject
它本身无法在运行时保留。
重启服务器。
将具有指定Subject值的SSL证书分发给允许持久限制系统变量的用户。
假设这
myclient-cert.pem
是可以持久保留受限制的系统变量的客户端使用的SSL证书。
使用
openssl
命令
显示证书内容
:
外壳> openssl x509 -text -in myclient-cert.pem
证书:
数据:
版本:3(0x2)
序列号:2(0x2)
签名算法:md5WithRSAEncryption
发行人:C = US,ST = IL,L =芝加哥,O = MyOrg,OU = CA,CN = MyCN
合法性
不是之前:格林尼治标准时间10月18日17:03:03 2018 GMT
不是之后:格林尼治标准时间10月15日17:03:03 2028
主题:C = US,ST = IL,L =芝加哥,O = MyOrg,OU =客户,CN = MyCN
...
该 OpenSSL的 输出显示证书主题值是:
C = US,ST = IL,L =芝加哥,O = MyOrg,OU =客户,CN = MyCN
要指定MySQL的Subject,请使用以下格式:
/ C = US / ST = IL / L =芝加哥/ O = MYORG / OU =客户端/ CN = MYCN
my.cnf
使用Subject值
配置服务器
文件:
的[mysqld] persist_only_admin_x509_subject = “/ C = US / ST = IL / L =芝加哥/ O = MYORG / OU =客户端/ CN = MYCN”
重新启动服务器,以使新配置生效。
将SSL证书(以及任何其他关联的SSL文件)分发给相应的用户。 然后,这样的用户使用证书和建立加密连接所需的任何其他SSL选项连接到服务器。
要使用X.509,客户端必须指定
要连接的选项
--ssl-key
和
--ssl-cert
选项。
建议但不要求
--ssl-ca
也指定,以便验证服务器提供的公共证书。
例如:
外壳> mysql --ssl-key=myclient-key.pem --ssl-cert=myclient-cert.pem --ssl-ca=mycacert.pem
假设用户有足够的权限使用
SET
PERSIST_ONLY
,可以持久化受限制的系统变量,如下所示:
MySQL的> SET PERSIST_ONLY socket = '/tmp/mysql.sock';
查询正常,0行受影响(0.00秒)
如果服务器未配置为启用持久性受限制的系统变量,或者用户不满足该功能所需的条件,则会发生错误:
MySQL的> SET PERSIST_ONLY socket = '/tmp/mysql.sock';
错误1238(HY000):变量'socket'是非持久只读变量
结构化变量在两个方面与常规系统变量不同:
它的值是一个结构,其中的组件指定被认为密切相关的服务器参数。
可能存在给定类型的结构化变量的若干实例。 每个名称都有不同的名称,并指向服务器维护的不同资源。
MySQL支持一种结构化变量类型,它指定控制密钥缓存操作的参数。 密钥缓存结构变量具有以下组件:
本节介绍引用结构化变量的语法。 密钥缓存变量用于语法示例,但有关密钥缓存如何操作的具体详细信息,请参见 第8.10.2节“MyISAM密钥缓存” 。
要引用结构化变量实例的组件,可以使用
instance_name.component_name
格式
的复合名称
。
例子:
hot_cache.key_buffer_size hot_cache.key_cache_block_size cold_cache.key_cache_block_size
对于每个结构化系统变量,
default
始终预定义
名称为的实例
。
如果引用没有任何实例名称的结构化变量的组件,
default
则使用
该
实例。
因此,
default.key_buffer_size
与
key_buffer_size
这两个指代相同的系统变量。
结构化变量实例和组件遵循以下命名规则:
对于给定类型的结构化变量,每个实例必须具有
在
该类型的变量中
唯一的名称
。
但是,实例名称
在
结构化变量类型中
不必是唯一的
。
例如,每个结构化变量都有一个名为的实例
default
,因此
default
在变量类型中不是唯一的。
每个结构化变量类型的组件名称在所有系统变量名称中必须是唯一的。 如果不是这样(也就是说,如果两种不同类型的结构化变量可以共享组件成员名称),则不清楚哪个默认结构化变量用于引用不受实例名称限定的成员名称。
如果结构化变量实例名称不合法作为不带引号的标识符,请使用反引号将其称为带引号的标识符。
例如,
hot-cache
不合法,但是
`hot-cache`
。
global
,,
session
和
local
不是合法的实例名称。
这避免了与符号的冲突,例如
引用非结构化系统变量。
@@GLOBAL.
var_name
目前,前两个规则不可能被违反,因为唯一的结构化变量类型是密钥缓存的类型。 如果将来创建其他类型的结构化变量,这些规则将具有更大的意义。
除了一个例外,您可以在可能出现简单变量名的任何上下文中使用复合名称来引用结构化变量组件。 例如,您可以使用命令行选项为结构化变量赋值:
外壳> mysqld --hot_cache.key_buffer_size=64K
在选项文件中,使用以下语法:
的[mysqld] hot_cache.key_buffer_size = 64K
如果使用此选项启动服务器,
hot_cache
除了默认密钥缓存(默认大小为8MB)之外
,它还会创建一个
大小为64KB的密钥缓存。
假设您按如下方式启动服务器:
外壳>mysqld --key_buffer_size=256K \
--extra_cache.key_buffer_size=128K \
--extra_cache.key_cache_block_size=2048
在这种情况下,服务器将默认密钥缓存的大小设置为256KB。
(您也可以编写
--default.key_buffer_size=256K
。)此外,服务器还会创建一个名为
extra_cache
128KB
的第二个密钥缓存
,缓存表索引块的块缓冲区大小设置为2048字节。
以下示例使用三个不同的密钥缓存启动服务器,这些密钥缓存的大小为3:1:1:
外壳>mysqld --key_buffer_size=6M \
--hot_cache.key_buffer_size=2M \
--cold_cache.key_buffer_size=2M
也可以在运行时设置和检索结构化变量值。
例如,要设置名为
hot_cache
10MB
的密钥缓存
,请使用以下任一语句:
mysql>SET GLOBAL hot_cache.key_buffer_size = 10*1024*1024;
mysql>SET @@GLOBAL.hot_cache.key_buffer_size = 10*1024*1024;
要检索缓存大小,请执行以下操作:
MySQL的> SELECT @@GLOBAL.hot_cache.key_buffer_size;
但是,以下声明不起作用。
该变量不会被解释为复合名称,而是作为
LIKE
模式匹配操作
的简单字符串
:
MySQL的> SHOW GLOBAL VARIABLES LIKE 'hot_cache.key_buffer_size';
这是能够在任何可能出现简单变量名称的地方使用结构化变量名称的例外。
MySQL服务器维护许多状态变量,提供有关其操作的信息。
您可以使用该
SHOW [GLOBAL | SESSION]
STATUS
语句
查看这些变量及其值
(请参见
第13.7.6.35节“SHOW STATUS语法”
)。
可选
GLOBAL
关键字聚合所有连接上
SESSION
的值
,并
显示当前连接的值。
MySQL的> SHOW GLOBAL STATUS;
+ ----------------------------------- + ------------ +
| Variable_name | 价值|
+ ----------------------------------- + ------------ +
| Aborted_clients | 0 |
| Aborted_connects | 0 |
| Bytes_received | 155372598 |
| Bytes_sent | 1176560426 |
...
| 连接| 30023 |
| Created_tmp_disk_tables | 0 |
| Created_tmp_files | 3 |
| Created_tmp_tables | 2 |
...
| Threads_created | 217 |
| Threads_running | 88 |
| 正常运行时间| 1389872 |
+ ----------------------------------- + ------------ +
FLUSH
STATUS
语句
将许多状态变量重置为0
。
本节提供每个状态变量的说明。 有关状态变量摘要,请参见 第5.1.6节“服务器状态变量参考” 。
状态变量具有以下含义。
由于客户端在没有正确关闭连接的情况下死亡而中止的连接数。 请参见 第B.4.2.10节“通信错误和中止的连接” 。
连接到MySQL服务器的失败尝试次数。 请参见 第B.4.2.10节“通信错误和中止的连接” 。
有关其他与连接相关的信息,请检查
状态变量和
表。
Connection_errors_
xxx
host_cache
使用临时二进制日志高速缓存但超过了值的事务数,
binlog_cache_size
并使用临时文件来存储事务中的语句。
导致二进制日志事务高速缓存写入磁盘的非事务性语句的数量在
Binlog_stmt_cache_disk_use
状态变量中
单独跟踪
。
缓存的权限对象的数量。 每个对象都是用户及其活动角色的权限组合。
使用二进制日志高速缓存的事务数。
使用二进制日志语句高速缓存但超过了值
binlog_stmt_cache_size
并使用临时文件来存储这些语句
的非事务处理语句的数量
。
使用二进制日志语句缓存的非事务性语句的数量。
从所有客户端接收的字节数。
发送到所有客户端的字节数。
Caching_sha2_password_rsa_public_key
由所使用的公钥
caching_sha2_password
RSA的密钥对基于密码交换身份验证插件。
仅当服务器成功初始化由
系统变量
caching_sha2_password_private_key_path
和
caching_sha2_password_public_key_path
系统变量
命名的文件中的私钥和公钥时,该值才为非空
。
值
Caching_sha2_password_rsa_public_key
来自后一个文件。
该
声明计数器变量指示次,每次数量
语句已被执行。
每种类型的语句都有一个状态变量。
例如,
和
计数
和
分别发言。
和
相似但申请
和
使用多表语法语句。
Com_
xxx
xxx
Com_delete
Com_update
DELETE
UPDATE
Com_delete_multi
Com_update_multi
DELETE
UPDATE
本节开头的讨论指出了如何将这些语句计数状态变量与其他此类变量相关联。
即使预处理语句参数未知或执行期间发生错误,
所有
变量也会增加。
换句话说,它们的值对应于发出的请求数,而不是成功完成的请求数。
Com_stmt_
xxx
该
状态变量如下:
Com_stmt_
xxx
Com_stmt_prepare
Com_stmt_execute
Com_stmt_fetch
Com_stmt_send_long_data
Com_stmt_reset
Com_stmt_close
这些变量代表预处理语句命令。
它们的名称是指
网络层中使用
的
命令集。
换句话说,只要执行准备好的语句API调用(例如
mysql_stmt_prepare()
,
mysql_stmt_execute()
等),它们的值就会增加
。
然而
,
并且
也增加
,
或
分别。
此外,旧的声明计数器变量的值
,
以及
增加对
,
和
COM_
xxx
Com_stmt_prepare
Com_stmt_execute
Com_stmt_close
PREPARE
EXECUTE
DEALLOCATE PREPARE
Com_prepare_sql
Com_execute_sql
Com_dealloc_sql
PREPARE
EXECUTE
DEALLOCATE PREPARE
声明。
Com_stmt_fetch
表示从游标获取时发出的网络往返总数。
Com_stmt_reprepare
表示服务器自动重新生成语句的次数,例如,在元数据更改为语句引用的表或视图之后。
重新设计操作
Com_stmt_reprepare
也会
增加
Com_stmt_prepare
。
Com_explain_other
表示
EXPLAIN
FOR
CONNECTION
执行
的
语句
数
。
请参见
第8.8.4节“获取命名连接的执行计划信息”
。
Com_change_repl_filter
表示
CHANGE
REPLICATION FILTER
执行
的
语句
数
。
客户端连接是否在客户端/服务器协议中使用压缩。
这些变量提供有关客户端连接过程中发生的错误的信息。 它们仅为全局,表示从所有主机的连接聚合的错误计数。 这些变量跟踪主机缓存未考虑的错误(参见 第8.12.4.2节“DNS查找优化和主机缓存” ),例如与TCP连接无关的错误,在连接过程的早期发生(甚至在此之前)已知IP地址,或者不是特定于任何特定IP地址(例如内存不足的情况)。
accept()
在侦听端口上
调用期间发生的错误数
。
由于服务器内部错误导致连接数被拒绝,例如无法启动新线程或内存不足。
Connection_errors_max_connections
由于
max_connections
达到
服务器
限制
,连接数被拒绝
。
Connection_errors_peer_address
搜索连接客户端IP地址时发生的错误数。
呼叫期间
select()
或
poll()
侦听端口上
发生的错误数
。
(此操作失败并不一定意味着客户端连接被拒绝。)
libwrap
图书馆
拒绝的连接数
。
MySQL服务器的连接尝试次数(成功与否)。
执行语句时服务器创建的内部磁盘临时表的数量。
如果最初将内部临时表创建为内存中的表但变得太大,则MySQL会自动将其转换为磁盘上的表。
内存临时表的最大大小是
tmp_table_size
和
max_heap_table_size
值
的最小值
。
如果
Created_tmp_disk_tables
很大,您可能需要增加
tmp_table_size
或者
max_heap_table_size
值以减少内存中的内部临时表将转换为磁盘表的可能性。
您可以将创建的内部磁盘上临时表的数量与通过比较
Created_tmp_disk_tables
和
Created_tmp_tables
变量
的值创建的内部临时表的总数进行比较
。
另请参见 第8.4.4节“MySQL中的内部临时表使用” 。
mysqld 创建了 多少个临时文件 。
执行语句时服务器创建的内部临时表的数量。
您可以将创建的内部磁盘上临时表的数量与通过比较
Created_tmp_disk_tables
和
Created_tmp_tables
变量
的值创建的内部临时表的总数进行比较
。
另请参见 第8.4.4节“MySQL中的内部临时表使用” 。
每次调用
SHOW
STATUS
语句都使用内部临时表并递增全局
Created_tmp_tables
值。
ssl_ca
SSL服务器用于新连接的上下文中的
活动
值。
ssl_ca
如果系统变量已被更改但
ALTER INSTANCE
RELOAD TLS
之后未执行以从上下文相关的系统变量值重新配置SSL上下文并更新相应的状态变量,则
此上下文值可能与当前
系统变量值
不同。
(值的这种潜在差异适用于每对相关的上下文相关系统和状态变量。请参阅
加密连接的服务器端运行时配置
。)
这个变量是在MySQL 8.0.16中添加的。
ssl_capath
SSL服务器用于新连接的上下文中的
活动
值。
有关此状态变量与其相应系统变量之间关系的说明,请参阅
Current_tls_ca
。
这个变量是在MySQL 8.0.16中添加的。
ssl_cert
SSL服务器用于新连接的上下文中的
活动
值。
有关此状态变量与其相应系统变量之间关系的说明,请参阅
Current_tls_ca
。
这个变量是在MySQL 8.0.16中添加的。
ssl_cipher
SSL服务器用于新连接的上下文中的
活动
值。
有关此状态变量与其相应系统变量之间关系的说明,请参阅
Current_tls_ca
。
这个变量是在MySQL 8.0.16中添加的。
tls_ciphersuites
SSL服务器用于新连接的上下文中的
活动
值。
有关此状态变量与其相应系统变量之间关系的说明,请参阅
Current_tls_ca
。
这个变量是在MySQL 8.0.16中添加的。
ssl_crl
SSL服务器用于新连接的上下文中的
活动
值。
有关此状态变量与其相应系统变量之间关系的说明,请参阅
Current_tls_ca
。
这个变量是在MySQL 8.0.16中添加的。
ssl_crlpath
SSL服务器用于新连接的上下文中的
活动
值。
有关此状态变量与其相应系统变量之间关系的说明,请参阅
Current_tls_ca
。
这个变量是在MySQL 8.0.16中添加的。
ssl_key
SSL服务器用于新连接的上下文中的
活动
值。
有关此状态变量与其相应系统变量之间关系的说明,请参阅
Current_tls_ca
。
这个变量是在MySQL 8.0.16中添加的。
tls_version
SSL服务器用于新连接的上下文中的
活动
值。
有关此状态变量与其相应系统变量之间关系的说明,请参阅
Current_tls_ca
。
这个变量是在MySQL 8.0.16中添加的。
不推荐使用此状态变量(因为
DELAYED
不支持插入),并且将在以后的版本中删除。
不推荐使用此状态变量(因为
DELAYED
不支持插入),并且将在以后的版本中删除。
不推荐使用此状态变量(因为
DELAYED
不支持插入),并且将在以后的版本中删除。
最近分配给
dragnet.log_error_filter_rules
系统变量的结果,如果没有发生这样的分配,则为空。
这个变量是在MySQL 8.0.12中添加的。
服务器刷新表的次数,无论是因为用户执行了
FLUSH TABLES
语句还是由于内部服务器操作。
它也通过接收
COM_REFRESH
数据包而
递增
。
这与之相反
Com_flush
,它表示
FLUSH
已执行
了多少
语句,是否
FLUSH
TABLES
,
FLUSH LOGS
等等。
group_replication_primary_member
当组以单主模式运行时,显示主要成员的UUID。 如果该组在多主模式下运行,则显示空字符串。
该
group_replication_primary_member
状态变量已被弃用,并计划在未来的版本中被删除。
内部
COMMIT
报表
的数量
。
从表中删除行的次数。
服务器为每个对其
external_lock()
函数的
调用递增此变量,该
函数通常发生在对表实例的访问的开始和结束时。
存储引擎之间可能存在差异。
例如,可以使用此变量来发现访问分区表的语句在锁定发生之前修剪了多少分区:检查该语句的计数器增加了多少,减去2(对表本身进行2次调用),然后除以2得到锁定的分区数。
服务器使用存储引擎自己的多范围读取实现进行表访问的次数。
两阶段提交操作的准备阶段的计数器。
读取索引中第一个条目的次数。
如果此值很高,则表明服务器正在执行大量完整索引扫描(例如
SELECT col1 FROM
foo
,假设
col1
已编制索引)。
基于密钥读取行的请求数。 如果此值很高,则表明您的表已针对查询正确编制索引,这是一个很好的指示。
读取索引中最后一个键的请求数。
使用时
ORDER BY
,服务器将发出第一个密钥请求,然后发出几个下一个密钥请求,而
ORDER BY DESC
服务器将发出最后一个密钥请求,然后发出几个先前密钥请求。
按键顺序读取下一行的请求数。 如果要查询具有范围约束的索引列,或者正在执行索引扫描,则此值会增加。
按键顺序读取上一行的请求数。
这种读取方法主要用于优化
ORDER BY
... DESC
。
基于固定位置读取行的请求数。 如果您要执行大量需要对结果进行排序的查询,则此值很高。 您可能有很多查询要求MySQL扫描整个表,或者您有不正确使用密钥的连接。
读取数据文件中下一行的请求数。 如果您正在进行大量的表扫描,则此值很高。 通常,这表明您的表没有正确编制索引,或者您的查询未编写以利用您拥有的索引。
存储引擎执行回滚操作的请求数。
存储引擎放置保存点的请求数。
存储引擎回滚到保存点的请求数。
更新表中行的请求数。
在表中插入行的请求数。
Innodb_available_undo_logs
已在MySQL 8.0.2中删除。
可以使用检索每个表空间的可用回滚段的数量
SHOW VARIABLES LIKE
'innodb_rollback_segments';
Innodb_buffer_pool_dump_status
记录
缓冲池中
保存
的
页面
的操作的进度
,由设置
或
触发
。
InnoDB
innodb_buffer_pool_dump_at_shutdown
innodb_buffer_pool_dump_now
有关相关信息和示例,请参见 第15.8.3.7节“保存和恢复缓冲池状态” 。
Innodb_buffer_pool_load_status
操作进度,
热身
的
InnoDB
缓冲池
由一组阅读
页面
对应一个较早的时间点,通过设置触发
innodb_buffer_pool_load_at_startup
或
innodb_buffer_pool_load_now
。
如果操作引入了太多开销,您可以通过设置取消它
innodb_buffer_pool_load_abort
。
有关相关信息和示例,请参见 第15.8.3.7节“保存和恢复缓冲池状态” 。
包含数据
的
InnoDB
缓冲池中
的总字节数
。
该数字包括
脏
页面和干净页面。
对于更精确的内存使用计算
Innodb_buffer_pool_pages_data
,当
压缩
表导致缓冲池保存不同大小的页面时。
包含数据
的
缓冲池中
的
页数
。
该数字包括
脏
页面和干净页面。
使用
压缩表时
,报告的
值可能大于
(Bug#59550)。
InnoDB
Innodb_buffer_pool_pages_data
Innodb_buffer_pool_pages_total
Innodb_buffer_pool_bytes_dirty
缓冲池中
脏页
中
保存的总当前字节数
。
对于更精确的内存使用计算
,当
压缩
表导致缓冲池保存不同大小的页面时。
InnoDB
Innodb_buffer_pool_pages_dirty
Innodb_buffer_pool_pages_latched
缓冲池中
已锁存
页面
的
InnoDB
数量
。
这些是当前正在读取或写入的页面,或者
由于某些其他原因
而无法
刷新
或删除的页面。
计算此变量的成本很高,因此仅在
UNIV_DEBUG
系统在服务器构建时定义
时才可用
。
数
页
的
InnoDB
缓冲池
,因为它们已经被分配给管理开销,如都在忙着
锁定行
或
适应性的散列索引
。
该值也可以计算为
Innodb_buffer_pool_pages_total
-
Innodb_buffer_pool_pages_free
-
Innodb_buffer_pool_pages_data
。
使用
压缩表时
,
Innodb_buffer_pool_pages_misc
可能会报告越界值(Bug#59550)。
Innodb_buffer_pool_pages_total
InnoDB
缓冲池
的总大小
,以
页为单位
。
使用
压缩表时
,报告的
Innodb_buffer_pool_pages_data
值可能大于
Innodb_buffer_pool_pages_total
(Bug#59550)
Innodb_buffer_pool_read_ahead_rnd
启动
的
“
随机
”
预读
数量
InnoDB
。
当查询以随机顺序扫描表的大部分时,会发生这种情况。
Innodb_buffer_pool_read_requests
逻辑读取请求的数量。
InnoDB
从
缓冲池
无法满足
的逻辑读取数
,必须直接从磁盘读取。
Innodb_buffer_pool_resize_status
动态
调整
InnoDB
缓冲池
大小的操作的状态,通过
动态设置
innodb_buffer_pool_size
参数
触发
。
该
innodb_buffer_pool_size
参数是动态的,允许您在不重新启动服务器的情况下调整缓冲池的大小。
有关
相关信息,
请参阅
在线配置InnoDB缓冲池大小
。
通常,对
InnoDB
缓冲池的
写入
发生在后台。
当
InnoDB
需要读取或创建
页面
并且没有可用的干净页面时,首先
InnoDB
刷新一些
脏页
并等待该操作完成。
此计数器计算这些等待的实例。
如果
innodb_buffer_pool_size
设置正确,则此值应该很小。
Innodb_buffer_pool_write_requests
写入
InnoDB
缓冲池的次数
。
fsync()
到目前为止
的
操作
次数
。
fsync()
呼叫
频率
受
innodb_flush_method
配置选项
设置的影响
。
当前的待处理
fsync()
操作数。
fsync()
呼叫
频率
受
innodb_flush_method
配置选项
设置的影响
。
当前挂起读取的数量。
当前挂起写入的数量。
自服务器启动以来读取的数据量(以字节为单位)。
数据读取总数(OS文件读取)。
数据写入总数。
到目前为止写入的数据量,以字节为单位。
数 页 已写入 双写缓冲 。 请参见 第15.11.1节“InnoDB磁盘I / O” 。
已执行的双写操作数。 请参见 第15.11.1节“InnoDB磁盘I / O” 。
指示服务器是否使用 原子指令 构建 。
InnoDB
重做日志
文件
的物理写入次数
。
InnoDB
当前保持打开
的文件数
。
fsync()
对
InnoDB
重做日志
文件执行
的
写入
次数
。
InnoDB
重做日志
文件
的挂起写入次数
。
InnoDB
页面大小(默认为16KB)。
许多值都以页数计算;
页面大小使它们可以轻松转换为字节。
InnoDB
表
操作创建的页数
。
InnoDB
通过对
InnoDB
表
的操作
从
缓冲池
读取的页数
。
InnoDB
表上
操作写入的页数
。
表上
操作当前正在等待
的
行锁
数
InnoDB
。
总的时间花在获取
行锁
的
InnoDB
表,以毫秒为单位。
的平均时间获取
行锁
的
InnoDB
表,以毫秒为单位。
最大时间获取
行锁
的
InnoDB
表,以毫秒为单位。
InnoDB
表上
操作
必须等待
行锁的次数
。
从
InnoDB
表中
删除的行数
。
插入
InnoDB
表中
的行数
。
从
InnoDB
表中
读取的行数
。
InnoDB
表中
更新的行数
。
Innodb_truncated_status_writes
SHOW ENGINE
INNODB STATUS
截断语句
输出的次数
。
MyISAM
密钥缓存中已更改但尚未刷新到磁盘
的密钥块数
。
MyISAM
密钥缓存
中未使用的块数
。
您可以使用此值来确定正在使用的密钥缓存量。
看到的讨论
key_buffer_size
在
第5.1.8节,“服务器系统变量”
。
MyISAM
密钥缓存
中已使用块的数量
。
此值是一个高水位标记,表示一次使用过的最大块数。
从
MyISAM
密钥缓存中
读取密钥块的请求数
。
从磁盘到
MyISAM
密钥缓存
的密钥块的物理读取次数
。
如果
Key_reads
很大,那么你的
key_buffer_size
价值可能太小了。
高速缓存未命中率可以计算为
Key_reads
/
Key_read_requests
。
将密钥块写入
MyISAM
密钥缓存
的请求数
。
密钥块从
MyISAM
密钥缓存到磁盘
的物理写入次数
。
查询优化器计算的最后编译查询的总成本。
这对于比较同一查询的不同查询计划的成本很有用。
默认值0表示尚未编译任何查询。
默认值为0.
Last_query_cost
具有会话范围。
在MySQL 8.0.16及更高版本中,此变量显示具有多个查询块的查询的成本,对每个查询块的成本估算求和,估计执行不可高速缓存的子查询的次数,以及将这些查询块的成本乘以子查询执行次数。
(Bug#92766,Bug#28786951)在MySQL 8.0.16之前,
Last_query_cost
只能对简单的
“
平面
”
查询
进行精确计算
,但对于包含子查询或查询的复杂查询则不能
UNION
。
(对于后者,该值设置为0.)
查询优化器在先前查询的执行计划构造中进行的迭代次数。
Last_query_cost
有会话范围。
尝试连接到锁定的用户帐户的次数。 有关帐户锁定和解锁的信息,请参见 第6.2.19节“帐户锁定” 。
SELECT
超出执行超时
的
语句
数
。
SELECT
设置非零执行超时
的
语句
数
。
这包括包含非零
MAX_EXECUTION_TIME
优化器提示的语句,以及不包含此类提示但在
max_execution_time
系统变量
指示的超时为非零时执行的语句
。
SELECT
尝试设置执行超时
的
语句
数
失败。
自服务器启动以来同时使用的最大连接数。
时间在其
Max_used_connections
达到其当前值。
不推荐使用此状态变量(因为
DELAYED
不支持插入),并且将在以后的版本中删除。
MeCab全文解析器插件当前使用的字符集。 有关相关信息,请参见 第12.9.9节“MeCab全文分析器插件” 。
Ongoing_anonymous_transaction_count
显示已标记为匿名的正在进行的事务的数量。 这可用于确保没有其他事务等待处理。
Ongoing_anonymous_gtid_violating_transaction_count
此状态变量仅在调试版本中可用。
显示正在使用
gtid_next=ANONYMOUS
且违反GTID一致性
的正在进行的事务的数量
。
Ongoing_automatic_gtid_violating_transaction_count
此状态变量仅在调试版本中可用。
显示正在使用
gtid_next=AUTOMATIC
且违反GTID一致性
的正在进行的事务的数量
。
打开的文件数。 此计数包括服务器打开的常规文件。 它不包括其他类型的文件,如套接字或管道。 此外,计数不包括存储引擎使用其自己的内部功能打开的文件,而不是要求服务器级别这样做。
打开的流数(主要用于日志记录)。
缓存表定义的数量。
打开的表的数量。
已打开的文件数
my_open()
(
mysys
库函数)。
不使用此功能打开文件的服务器部分不会增加计数。
已缓存的表定义数。
已打开的表的数量。
如果
Opened_tables
很大,你的
table_open_cache
价值可能太小了。
Performance_schema_
xxx
性能模式状态变量在 第26.16节“性能模式状态变量” 中列出 。 这些变量提供有关由于内存限制而无法加载或创建的检测的信息。
当前准备好的报表数量。
(最大语句数由
max_prepared_stmt_count
系统变量
给出
。)
MySQL 8.0.3中删除了此状态变量。
MySQL 8.0.3中删除了此状态变量。
MySQL 8.0.3中删除了此状态变量。
MySQL 8.0.3中删除了此状态变量。
MySQL 8.0.3中删除了此状态变量。
MySQL 8.0.3中删除了此状态变量。
MySQL 8.0.3中删除了此状态变量。
MySQL 8.0.3中删除了此状态变量。
服务器执行的语句数。
与
Questions
变量
不同,此变量包括在存储程序中执行的语句
。
它不计数
COM_PING
或
COM_STATISTICS
命令。
本节开头的讨论说明了如何将此语句计数状态变量与其他此类变量相关联。
服务器执行的语句数。
这仅包括客户端发送到服务器的语句,而不包括存储程序中执行的语句,与
Queries
变量
不同
。
这个变量不计
COM_PING
,
COM_STATISTICS
,
COM_STMT_PREPARE
,
COM_STMT_CLOSE
,或
COM_STMT_RESET
命令。
本节开头的讨论说明了如何将此语句计数状态变量与其他此类变量相关联。
半同步从属的数量。
仅当安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_net_avg_wait_time
主机等待从机回复的平均时间(以微秒为单位)。
此变量始终
0
是不推荐使用的,并且将在以后的版本中删除。
仅当安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_net_wait_time
主机等待从机回复的总时间(以微秒为单位)。
此变量始终
0
是不推荐使用的,并且将在以后的版本中删除。
仅当安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_net_waits
主人等待奴隶回复的总次数。
仅当安装了主端半同步复制插件时,此变量才可用。
主服务器关闭半同步复制的次数。
仅当安装了主端半同步复制插件时,此变量才可用。
从站未成功确认的提交数。
仅当安装了主端半同步复制插件时,此变量才可用。
半同步复制当前是否在主服务器上运行。
该值
ON
是否已启用插件并且已发生提交确认。
这是
OFF
如果未启用该插件或主已经回落到异步复制因提交确认超时。
仅当安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_timefunc_failures
调用时间函数时主服务器失败的次数,例如
gettimeofday()
。
仅当安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_tx_avg_wait_time
主人等待每笔交易的平均时间(以微秒为单位)。
仅当安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_tx_wait_time
主等待事务的总时间(以微秒为单位)。
仅当安装了主端半同步复制插件时,此变量才可用。
主服务器等待事务的总次数。
仅当安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_wait_pos_backtraverse
主人等待二进制坐标低于之前等待事件的事件的总次数。 当事务开始等待回复的顺序与其二进制日志事件的写入顺序不同时,就会发生这种情况。
仅当安装了主端半同步复制插件时,此变量才可用。
Rpl_semi_sync_master_wait_sessions
当前等待奴隶回复的会话数。
仅当安装了主端半同步复制插件时,此变量才可用。
从站成功确认的提交数。
仅当安装了主端半同步复制插件时,此变量才可用。
半同步复制当前是否在从站上运行。
这是
ON
因为插件已启用且从属I / O线程正在运行,
OFF
否则。
仅当安装了从属端半同步复制插件时,此变量才可用。
如果使用OpenSSL编译MySQL,则此变量可用(请参见
第6.3.4节“SSL库依赖功能”
)。
它的值是
sha256_password
身份验证插件用于基于RSA密钥对的密码交换的公钥。
仅当服务器成功初始化由
系统变量
sha256_password_private_key_path
和
sha256_password_public_key_path
系统变量
命名的文件中的私钥和公钥时,该值才为非空
。
值
Rsa_public_key
来自后一个文件。
有关信息
sha256_password
,请参见
第6.4.1.2节“SHA-256可插拔认证”
。
Secondary_engine_execution_count
供将来使用。 这个变量是在MySQL 8.0.13中添加的。
执行表扫描的连接数,因为它们不使用索引。 如果此值不为0,则应仔细检查表的索引。
在参考表上使用范围搜索的连接数。
在第一个表上使用范围的连接数。 即使该值非常大,这通常也不是关键问题。
没有键的连接数,用于检查每行后的密钥用法。 如果不是0,则应仔细检查表的索引。
完成第一个表的完整扫描的连接数。
此变量已过时,已在MySQL 8.0.1中删除。
而是使用
表
的
HEARTBEAT_INTERVAL
列
replication_connection_configuration
。
此变量已过时,已在MySQL 8.0.1中删除。
而是使用
表
的
LAST_HEARTBEAT_TIMESTAMP
列
replication_connection_status
。
从属SQL线程当前打开的临时表的数量。 如果该值大于零,则关闭从站是不安全的; 请参见 第17.4.1.30节“复制和临时表” 。 此变量报告 所有 复制通道 的打开临时表的总数 。
此变量已过时,已在MySQL 8.0.1中删除。
而是使用
表
的
COUNT_RECEIVED_HEARTBEATS
列
replication_connection_status
。
此变量已过时,已在MySQL 8.0.1中删除。
而是使用
表
的
COUNT_TRANSACTIONS_RETRIES
列
replication_applier_status
。
Slave_rows_last_search_algorithm_used
此从属服务器最近使用的搜索算法,用于查找基于行的复制的行。 结果显示从属设备是否使用索引,表扫描或散列作为在任何通道上执行的最后一个事务的搜索算法。
使用的方法取决于
slave_rows_search_algorithms
系统变量
的设置
以及相关表上可用的键。
此变量仅适用于MySQL的调试版本。
此变量已过时,已在MySQL 8.0.1中删除。
而是使用
和
表
的
SERVICE_STATE
列
。
replication_connection_status
replication_applier_status
slow_launch_time
创建
时间超过
几秒
的线程数
。
超过
long_query_time
秒数
的查询数
。
无论是否启用慢查询日志,此计数器都会递增。
有关该日志的信息,请参见
第5.4.5节“慢查询日志”
。
排序算法必须执行的合并传递的数量。
如果此值很大,则应考虑增加
sort_buffer_size
系统变量
的值
。
使用范围完成的排序数。
已排序的行数。
通过扫描表格完成的排序数量。
建立连接所需的协商数量。
已接受的SSL连接数。
回调缓存命中数。
当前加密密码(对于未加密的连接为空)。
可能的SSL密码列表(非SSL连接为空)。 如果MySQL支持TLSv1.3,则该值包括可能的TLSv1.3密码套件。 请参见 第6.3.6节“加密连接协议和密码” 。
启用SSL的主服务器的SSL连接尝试次数。
建立与启用SSL的主服务器的连接所需的协商数。
SSL上下文验证深度(链中测试的证书数量)。
SSL上下文验证模式。
默认SSL超时。
与服务器成功建立SSL连接的数量。
成功建立到启用SSL的主站的从站连接数。
SSL证书有效的最后日期。 要检查SSL证书过期信息,请使用以下语句:
MySQL的> SHOW STATUS LIKE 'Ssl_server_not%';
+ ----------------------- + ------------------------- - +
| Variable_name | 价值|
+ ----------------------- + ------------------------- - +
| Ssl_server_not_after | 4月28日14:16:39 2025 GMT |
| Ssl_server_not_before | 2015年5月1日14:16:39 GMT |
+ ----------------------- + ------------------------- - +
SSL证书有效的第一个日期。
SSL会话高速缓存命中数。
SSL会话缓存未命中数。
SSL会话缓存模式。
SSL会话缓存溢出的数量。
SSL会话高速缓存大小。
SSL会话缓存超时的数量。
从缓存重用了多少个SSL连接。
Ssl_used_session_cache_entries
使用了多少个SSL会话缓存条目。
复制SSL连接的验证深度。
服务器用于使用SSL的连接的验证模式。
该值是一个位掩码;
位在
openssl/ssl.h
头文件
中定义
:
#define SSL_VERIFY_NONE 0x00 #define SSL_VERIFY_PEER 0x01 #define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 #define SSL_VERIFY_CLIENT_ONCE 0x04
SSL_VERIFY_PEER
表示服务器要求提供客户端证书。
如果客户端提供一个,则服务器执行验证并仅在验证成功时继续。
SSL_VERIFY_CLIENT_ONCE
表示仅在初始握手中完成对客户端证书的请求。
SSL协议版本的连接(例如,TLSv1)。 如果连接未加密,则该值为空。
可以立即授予表锁请求的次数。
无法立即授予表锁定请求并需要等待的次数。 如果这很高并且您遇到性能问题,则应首先优化查询,然后拆分表或使用复制。
打开表的命中数缓存查找次数。
打开表缓存查找的未命中数。
打开表缓存的溢出次数。
这是在打开或关闭表之后,缓存实例具有未使用的条目且实例的大小大于
table_open_cache
/的次数
table_open_cache_instances
。
对于
mysqld
在用作恢复内部XA事务的事务协调器时
使用的日志的内存映射实现
,此变量指示自服务器启动以来用于日志的最大页数。
如果产品
Tc_log_max_pages_used
和
Tc_log_page_size
总是比日志大小显著少,尺寸大于必需的并且可以减小。
(大小由。设定
--log-tc-size
选项。
此变量未使用:基于二进制日志的恢复不需要,并且除非能够进行两阶段提交且支持XA事务的存储引擎数大于1,否则不使用内存映射恢复日志方法。
(
InnoDB
是唯一适用的引擎。)
用于XA恢复日志的内存映射实现的页面大小。
使用确定默认值
getpagesize()
。
由于与描述相同的原因,此变量未使用
Tc_log_max_pages_used
。
对于恢复日志的内存映射实现,每次服务器无法提交事务并且必须等待日志中的空闲页面时,此变量会递增。
如果此值很大,您可能希望增加日志大小(使用该
--log-tc-size
选项)。
对于基于二进制日志的恢复,每次无法关闭二进制日志时,此变量会递增,因为正在进行两阶段提交。
(关闭操作将一直等到所有此类事务完成。)
线程缓存中的线程数。
当前打开的连接数。
为处理连接而创建的线程数。
如果
Threads_created
很大,您可能想要增加
thread_cache_size
价值。
高速缓存未命中率可以计算为
Threads_created
/
Connections
。
未休眠的线程数。
服务器已启动的秒数。
自最近
FLUSH
STATUS
声明
以来的秒数
。
MySQL服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于
sql_mode
系统变量
的值
。
DBA可以设置全局SQL模式以匹配站点服务器操作要求,并且每个应用程序可以将其会话SQL模式设置为其自己的要求。
模式会影响MySQL支持的SQL语法以及它执行的数据验证检查。 这使得在不同环境中使用MySQL以及将MySQL与其他数据库服务器一起使用变得更加容易。
有关MySQL中服务器SQL模式的 常见问题的 答案,请参见 第A.3节“MySQL 8.0 FAQ:服务器SQL模式” 。
使用
InnoDB
表时,还要考虑
innodb_strict_mode
系统变量。
它可以对
InnoDB
表
进行额外的错误检查
。
在MySQL 8.0的默认SQL模式包括以下模式:
ONLY_FULL_GROUP_BY
,
STRICT_TRANS_TABLES
,
NO_ZERO_IN_DATE
,
NO_ZERO_DATE
,
ERROR_FOR_DIVISION_BY_ZERO
,和
NO_ENGINE_SUBSTITUTION
。
要在服务器启动时设置SQL模式,请
在命令行上或
在
(Unix操作系统)或
(Windows)
等选项文件中
使用该
选项
。
是逗号分隔的不同模式的列表。
要显式清除SQL模式,请
在命令行或
选项文件
中将其设置为空字符串
。
--sql-mode="
modes
"sql-mode="
modes
"my.cnf
my.ini
modes
--sql-mode=""
sql-mode=""
MySQL安装程序可以在安装过程中配置SQL模式。
如果SQL模式与默认模式或您期望的模式不同,请检查服务器在启动时读取的选项文件中的设置。
要在运行时更改SQL模式,请
sql_mode
使用以下
SET
语句
设置全局或会话
系统变量
:
SET GLOBAL sql_mode ='modes
'; SET SESSION sql_mode ='modes
';
设置
GLOBAL
变量需要
SYSTEM_VARIABLES_ADMIN
或
SUPER
特权,并影响从那时起连接的所有客户端的操作。
设置
SESSION
变量仅影响当前客户端。
每个客户端都可以随时更改其会话
sql_mode
值。
要确定当前的全局或会话
sql_mode
设置,请选择其值:
SELECT @@ GLOBAL.sql_mode; SELECT @@ SESSION.sql_mode;
SQL模式和用户定义的分区。 在创建数据并将数据插入分区表后更改服务器SQL模式可能会导致此类表的行为发生重大更改,并可能导致数据丢失或损坏。 强烈建议您在创建使用用户定义分区的表后永远不要更改SQL模式。
复制分区表时,主服务器和从服务器上的不同SQL模式也会导致问题。 为获得最佳结果,应始终在主服务器和从服务器上使用相同的服务器SQL模式。
有关更多信息,请参见 第23.6节“分区的限制和限制” 。
最重要的
sql_mode
价值可能是这些:
此模式更改语法和行为以更符合标准SQL。 它是 本节末尾列出 的特殊 组合模式 之一。
如果无法将值插入事务表中,则中止该语句。 对于非事务性表,如果值出现在单行语句或多行语句的第一行中,则中止该语句。 更多细节将在本节后面给出。
使MySQL的行为类似于 “ 传统的 ” SQL数据库系统。 在 向列中插入不正确的值时 ,此模式的简单描述是 “ 给出错误而不是警告 ” 。 它是 本节末尾列出 的特殊 组合模式 之一。
随着
TRADITIONAL
模式允许,
INSERT
或者
UPDATE
只要发生错误中止。
如果您使用的是非事务性存储引擎,则可能不是您想要的,因为在错误之前进行的数据更改可能无法回滚,从而导致
“
部分完成
”
更新。
当本手册涉及
“
严格模式
”时
,表示具有一个或两个
STRICT_TRANS_TABLES
或
STRICT_ALL_TABLES
启用
的模式
。
以下列表描述了所有支持的SQL模式:
不要对日期进行全面检查。
仅检查月份是否在1到12的范围内,并且日期在1到31的范围内。这对于在三个不同字段中获取年,月和日并准确存储用户的Web应用程序非常有用。插入,没有日期验证。
此模式适用于
DATE
和
DATETIME
列。
它不应用
TIMESTAMP
列,它始终需要有效日期。
与
ALLOW_INVALID_DATES
启用,服务器需要月份和日期值是合法的,而不是仅仅在范围为1〜12和1〜31,分别。
禁用严格模式后,将生成无效日期,例如
'2004-04-31'
转换为
'0000-00-00'
和警告。
启用严格模式后,无效日期会生成错误。
要允许此类日期,请启用
ALLOW_INVALID_DATES
。
治疗
"
作为标识符引号字符(如
`
引号字符),而不是作为一个字符串引号字符。
您仍然可以使用
`
此模式启用引用标识符。
与
ANSI_QUOTES
启用,则不能使用双引号,因为它们被解释为标识符引用文字字符串。
该
ERROR_FOR_DIVISION_BY_ZERO
模式影响除零处理,包括
。
对于数据更改操作(
,
),其效果还取决于是否启用了严格的SQL模式。
MOD(
N
,0)INSERT
UPDATE
如果未启用此模式,则除以零并不
NULL
产生警告。
如果启用此模式,则除以零
NULL
并生成警告。
如果启用此模式和严格模式,除非
IGNORE
同时给出
,除以零会产生错误
。
对于
INSERT IGNORE
和
UPDATE IGNORE
,除以零插入
NULL
并产生警告。
因为
SELECT
,除以零回报
NULL
。
启用
ERROR_FOR_DIVISION_BY_ZERO
原因的警告要制造为好,而不管是否启用了严格模式。
ERROR_FOR_DIVISION_BY_ZERO
已弃用。
ERROR_FOR_DIVISION_BY_ZERO
不是严格模式的一部分,但应与严格模式一起使用,默认情况下启用。
如果
ERROR_FOR_DIVISION_BY_ZERO
启用但未启用严格模式,
则会发出警告,
反之亦然。
因为
ERROR_FOR_DIVISION_BY_ZERO
已弃用,它将在未来的MySQL版本中作为单独的模式名称删除,其效果包含在严格SQL模式的效果中。
NOT
运算符
的优先级
是这样的表达式,如
NOT a
BETWEEN b AND c
解析为
NOT (a
BETWEEN b AND c)
。
在某些旧版本的MySQL中,表达式被解析为
(NOT a) BETWEEN b AND
c
。
通过启用
HIGH_NOT_PRECEDENCE
SQL模式
可以获得旧的高优先级行为
。
mysql>SET sql_mode = '';
mysql>SELECT NOT 1 BETWEEN -5 AND 5;
- > 0 mysql>SET sql_mode = 'HIGH_NOT_PRECEDENCE';
mysql>SELECT NOT 1 BETWEEN -5 AND 5;
- > 1
允许函数名称和
(
字符
之间的空格
。
这会导致内置函数名称被视为保留字。
因此,必须引用与函数名称相同的标识符,如
第9.2节“架构对象名称”中所述
。
例如,因为有一个
COUNT()
函数,
count
在以下语句中
使用
作为表名会导致错误:
MySQL的> CREATE TABLE count (i INT);
错误1064(42000):您的SQL语法有错误
应引用表名:
MySQL的> CREATE TABLE `count` (i INT);
查询正常,0行受影响(0.00秒)
在
IGNORE_SPACE
SQL模式适用于内置函数,而不是用户定义的函数或存储功能。
无论是否
IGNORE_SPACE
启用
,始终允许在UDF或存储的函数名后面有空格
。
有关进一步的讨论
IGNORE_SPACE
,请参见
第9.2.4节“函数名称解析和解决方案”
。
NO_AUTO_VALUE_ON_ZERO
影响
AUTO_INCREMENT
列的
处理
。
通常,通过插入
NULL
或
插入列来生成列的下一个序列号
0
。
NO_AUTO_VALUE_ON_ZERO
抑制此行为,
0
以便仅
NULL
生成下一个序列号。
如果
0
已存储在表的
AUTO_INCREMENT
列中,
则此模式非常有用
。
(
0
顺便说一下,
存储
不是推荐的做法。)例如,如果您使用
mysqldump
转储表
然后重新加载它,MySQL通常会在遇到
0
值
时生成新的序列号
,从而生成一个内容与表中的内容不同的表那被倾倒了。
NO_AUTO_VALUE_ON_ZERO
在重新加载转储文件之前
启用
可以解决此问题。
出于这个原因,
mysqldump
在其输出中自动包含一个启用的语句
NO_AUTO_VALUE_ON_ZERO
。
禁止使用反斜杠字符(
\
)作为字符串和标识符中的转义字符。
启用此模式后,反斜杠就像其他任何一个普通字符一样。
创建表时,请忽略all
INDEX
DIRECTORY
和
DATA DIRECTORY
指令。
此选项在从属复制服务器上很有用。
在诸如
CREATE
TABLE
或
ALTER
TABLE
指定禁用或未编译的存储引擎之
类的语句时控制默认存储引擎的自动替换
。
默认情况下,
NO_ENGINE_SUBSTITUTION
已启用。
由于存储引擎可以在运行时插入,因此不可用的引擎也会以相同的方式处理:
随着
NO_ENGINE_SUBSTITUTION
禁止,
CREATE
TABLE
默认引擎使用,如果需要的引擎不可用时发出警告。
因为
ALTER
TABLE
,会发出警告并且不会更改表格。
与
NO_ENGINE_SUBSTITUTION
启用,则会出现错误,并且不会创建或修改的表,如果所需的引擎不可用。
UNSIGNED
默认情况下,
整数值之间的减法(其中一个是类型
)会产生无符号结果。
如果结果否则为负,则会导致错误:
MySQL的>SET sql_mode = '';
查询正常,0行受影响(0.00秒) mysql> ERROR 1690(22003):BIGINT UNSIGNED值超出范围'(强制转换(0为无符号) - 1)'SELECT CAST(0 AS UNSIGNED) - 1;
如果
NO_UNSIGNED_SUBTRACTION
启用
了
SQL模式,则结果为负:
mysql>SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql>SELECT CAST(0 AS UNSIGNED) - 1;
+ ------------------------- + | CAST(0 AS UNSIGNED) - 1 | + ------------------------- + | -1 | + ------------------------- +
如果使用此类操作的结果更新
UNSIGNED
整数列,则结果将剪切为列类型的最大值,或者如果
NO_UNSIGNED_SUBTRACTION
启用
则剪切为0
。
启用严格的SQL模式后,会发生错误并且列保持不变。
当
NO_UNSIGNED_SUBTRACTION
启用时,减法结果是签订了,
即使任何操作数是无符号
。
例如,比较列的类型
c2
在表
t1
与该列的
c2
表
t2
:
mysql>SET sql_mode='';
mysql>CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
mysql>CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
mysql>DESCRIBE t1;
+ ------- + --------------------- + ------ + ----- + ------ --- + ------- + | 领域| 输入| 空| 钥匙| 默认| 额外的| + ------- + --------------------- + ------ + ----- + ------ --- + ------- + | c2 | bigint(21)unsigned | 没有| | 0 | | + ------- + --------------------- + ------ + ----- + ------ --- + ------- + mysql>SET sql_mode='NO_UNSIGNED_SUBTRACTION';
mysql>CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
mysql>DESCRIBE t2;
+ ------- + ------------ + ------ + ------ + --------- + ----- - + | 领域| 输入| 空| 钥匙| 默认| 额外的| + ------- + ------------ + ------ + ------ + --------- + ----- - + | c2 | bigint(21)| 没有| | 0 | | + ------- + ------------ + ------ + ------ + --------- + ----- - +
这意味着
BIGINT UNSIGNED
在所有上下文中都不是100%可用的。
请参见
第12.10节“强制转换函数和运算符”
。
该
NO_ZERO_DATE
模式会影响服务器是否允许
'0000-00-00'
作为有效日期。
它的效果还取决于是否启用了严格的SQL模式。
如果未启用此模式,
'0000-00-00'
则允许并且插入不会产生警告。
如果启用此模式,
'0000-00-00'
则允许并且插入产生警告。
如果启用此模式和严格模式,
'0000-00-00'
则不允许插入产生错误,除非
IGNORE
同时给出。
对于
INSERT IGNORE
和
UPDATE
IGNORE
,
'0000-00-00'
允许和插入产生警告。
NO_ZERO_DATE
已弃用。
NO_ZERO_DATE
不是严格模式的一部分,但应与严格模式一起使用,默认情况下启用。
如果
NO_ZERO_DATE
启用但未启用严格模式,
则会发出警告,
反之亦然。
因为
NO_ZERO_DATE
已弃用,它将在未来的MySQL版本中作为单独的模式名称删除,其效果包含在严格SQL模式的效果中。
该
NO_ZERO_IN_DATE
模式会影响服务器是否允许年份部分为非零但月份或日期部分为0的日期。(此模式会影响日期,例如
'2010-00-01'
或
'2010-01-00'
,但不会
'0000-00-00'
。要控制服务器是否允许
'0000-00-00'
,请使用
NO_ZERO_DATE
模式。)效果的
NO_ZERO_IN_DATE
还取决于是否启用严格的SQL模式。
如果未启用此模式,则允许零件的日期,并且插入不会产生警告。
如果启用此模式,则插入零件的日期
'0000-00-00'
并生成警告。
如果启用此模式和严格模式,则不允许零件的日期,并且插入会产生错误,除非
IGNORE
同时给出。
对于
INSERT IGNORE
和
UPDATE IGNORE
,插入零件的日期
'0000-00-00'
并生成警告。
NO_ZERO_IN_DATE
已弃用。
NO_ZERO_IN_DATE
不是严格模式的一部分,但应与严格模式一起使用,默认情况下启用。
如果
NO_ZERO_IN_DATE
启用但未启用严格模式,
则会发出警告,
反之亦然。
因为
NO_ZERO_IN_DATE
已弃用,它将在未来的MySQL版本中作为单独的模式名称删除,其效果包含在严格SQL模式的效果中。
拒绝选择列表,
HAVING
条件或
ORDER
BY
列表引用非聚合列的
查询,这些
列既不在
GROUP BY
子句中
命名,
也不在功能上依赖于(唯一确定的)
GROUP BY
列。
标准SQL的MySQL扩展允许
HAVING
子句中的
引用
到选择列表中的别名表达式。
HAVING
无论是否
ONLY_FULL_GROUP_BY
启用,
该
子句都可以引用别名
。
有关其他讨论和示例,请参见 第12.20.3节“GROUP BY的MySQL处理” 。
默认情况下,
CHAR
在检索时
从
列值
中修剪尾随空格
。
如果
PAD_CHAR_TO_FULL_LENGTH
启用,则不会进行修剪,并且检索的
CHAR
值将填充到其全长。
此模式不适
VARCHAR
用于在检索时保留尾随空格的列。
从MySQL 8.0.13开始,
PAD_CHAR_TO_FULL_LENGTH
不推荐使用。
它将在未来的MySQL版本中删除。
MySQL的>CREATE TABLE t1 (c1 CHAR(10));
查询OK,0行受影响(0.37秒) MySQL的>INSERT INTO t1 (c1) VALUES('xy');
查询OK,1行受影响(0.01秒) MySQL的>SET sql_mode = '';
查询正常,0行受影响(0.00秒) MySQL的>SELECT c1, CHAR_LENGTH(c1) FROM t1;
+ ------ + ----------------- + | c1 | CHAR_LENGTH(c1)| + ------ + ----------------- + | xy | 2 | + ------ + ----------------- + 1排(0.00秒) MySQL的>SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
查询正常,0行受影响(0.00秒) MySQL的>SELECT c1, CHAR_LENGTH(c1) FROM t1;
+ ------------ + ----------------- + | c1 | CHAR_LENGTH(c1)| + ------------ + ----------------- + | xy | 10 | + ------------ + ----------------- + 1排(0.00秒)
为所有存储引擎启用严格SQL模式。 无效的数据值被拒绝。 有关详细信息,请参阅 严格SQL模式 。
为事务存储引擎启用严格的SQL模式,并在可能的情况下为非事务性存储引擎启用。 有关详细信息,请参阅 严格SQL模式 。
控制是否舍入或插入发生时截断
TIME
,
DATE
或
TIMESTAMP
与小数部分秒值转换成具有相同的类型,但更少的小数位的列。
默认行为是使用舍入。
如果启用此模式,则会发生截断。
以下序列的陈述说明了不同之处:
CREATE TABLE t(id INT,tval TIME(1)); SET sql_mode =''; INSERT INTO t(id,tval)VALUES(1,1.55); SET sql_mode ='TIME_TRUNCATE_FRACTIONAL'; INSERT INTO t(id,tval)VALUES(2,1.55);
生成的表内容如下所示,其中第一个值已经过舍入而第二个值被截断:
MySQL的> SELECT id, tval FROM t ORDER BY id;
+ ------ + ------------ +
| id | tval |
+ ------ + ------------ +
| 1 | 00:00:01.6 |
| 2 | 00:00:01.5 |
+ ------ + ------------ +
另请参见 第11.3.5节“时间值中的小数秒” 。
提供以下特殊模式作为前一列表中模式值组合的简写。
相当于
REAL_AS_FLOAT
,
PIPES_AS_CONCAT
,
ANSI_QUOTES
,
IGNORE_SPACE
,和
ONLY_FULL_GROUP_BY
。
ANSI
模式还会导致服务器为查询返回错误,在该查询中,
S
外部引用
的set函数
无法在已解析外部引用的外部查询中聚合。
这是一个查询:
S
(outer_ref
)
SELECT * FROM t1 WHERE t1.a IN(SELECT MAX(t1.b)FROM t2 WHERE ...);
这里,
MAX(t1.b)
不能在外部查询中聚合,因为它出现在该
WHERE
查询
的
子句中。
在这种情况下,标准SQL需要出错。
如果
ANSI
未启用模式,则服务器
将以与其解释相同的方式
处理
此类查询
。
S
(outer_ref
)S
(const
)
请参见 第1.8节“MySQL标准符合性” 。
TRADITIONAL
相当于
STRICT_TRANS_TABLES
,
STRICT_ALL_TABLES
,
NO_ZERO_IN_DATE
,
NO_ZERO_DATE
,
ERROR_FOR_DIVISION_BY_ZERO
,和
NO_ENGINE_SUBSTITUTION
。
严格模式控制MySQL如何处理数据更改语句(如
INSERT
或)中的
无效或缺失值
UPDATE
。
由于多种原因,值可能无效。
例如,列可能具有错误的数据类型,或者可能超出范围。
当要插入的新行不包含
其定义中
NULL
没有显式
DEFAULT
子句
的非
列
的值时,缺少值
。
(对于
NULL
列,
NULL
如果缺少值
,
则插入。)严格模式也会影响DDL语句,例如
CREATE
TABLE
。
如果严格模式不起作用,MySQL会为无效值或缺失值插入调整值并产生警告(请参见
第13.7.6.40节“显示警告语法”
)。
在严格模式下,您可以使用
INSERT IGNORE
或
生成此行为
UPDATE
IGNORE
。
对于
SELECT
不更改数据的
语句
,无效值会在严格模式下生成警告,而不是错误。
严格模式会在尝试创建超过最大密钥长度的密钥时产生错误。 如果未启用严格模式,则会导致警告并将密钥截断为最大密钥长度。
严格模式不会影响是否检查外键约束。
foreign_key_checks
可以用于此。
(请参见
第5.1.8节“服务器系统变量”
。)
如果其中一个
STRICT_ALL_TABLES
或
STRICT_TRANS_TABLES
已启用,
则严格的SQL模式有效
,尽管这些模式的效果有所不同:
对于事务表,当
启用
STRICT_ALL_TABLES
或
STRICT_TRANS_TABLES
启用
时,数据更改语句中的值无效或缺失时会发生错误
。
该声明被中止并回滚。
对于非事务性表,如果在要插入或更新的第一行中出现错误值,则对于任一模式的行为都是相同的:语句被中止并且表保持不变。 如果语句插入或修改多行,并且在第二行或更高行中出现错误值,则结果取决于启用的严格模式:
对于
STRICT_ALL_TABLES
,MySQL返回错误并忽略其余行。
但是,由于已插入或更新了较早的行,因此结果是部分更新。
要避免这种情况,请使用单行语句,可以在不更改表的情况下中止。
对于
STRICT_TRANS_TABLES
,MySQL将无效值转换为列的最接近的有效值,并插入调整后的值。
如果缺少值,MySQL将插入列数据类型的隐式默认值。
在任何一种情况下,MySQL都会生成警告而不是错误,并继续处理该语句。
第11.7节“数据类型默认值”
中描述了隐式
默认值
。
严格模式会影响日期中除以零,零日期和零的处理,如下所示:
严格模式影响除零处理,包括
:
MOD(
N
,0)
如果未启用严格模式,则除以零插入
NULL
并不产生警告。
如果启用了严格模式,除非
IGNORE
同时给出
,除以零会产生错误
。
对于
INSERT IGNORE
和
UPDATE IGNORE
,除以零插入
NULL
并产生警告。
因为
SELECT
,除以零回报
NULL
。
启用严格模式也会产生警告。
严格模式会影响服务器是否允许
'0000-00-00'
作为有效日期:
如果未启用严格模式,
'0000-00-00'
则允许并且插入不产生警告。
如果启用了严格模式,
'0000-00-00'
则不允许插入产生错误,除非
IGNORE
同时给出。
对于
INSERT IGNORE
和
UPDATE
IGNORE
,
'0000-00-00'
允许和插入产生警告。
严格模式会影响服务器是否允许年份部分为非零但日期或日期部分为0的日期(日期为
'2010-00-01'
或等
'2010-01-00'
):
如果未启用严格模式,则允许零件的日期,并且插入不会产生警告。
如果启用了严格模式,则不允许零件的日期,并且插入会产生错误,除非
IGNORE
也给出
了错误
。
对于
INSERT IGNORE
和
UPDATE
IGNORE
,插入零件的日期
'0000-00-00'
(被视为有效
IGNORE
)并产生警告。
有关严格模式的更多信息
IGNORE
,请参阅
IGNORE关键字和严格SQL模式的比较
。
严格模式由零,零日期,并在日期零与结合影响分裂的处理
ERROR_FOR_DIVISION_BY_ZERO
,
NO_ZERO_DATE
和
NO_ZERO_IN_DATE
模式。
本节比较
IGNORE
关键字的
语句执行
(将错误降级为警告)和严格的SQL模式(将警告升级为错误)的影响。
它描述了它们影响的语句以及它们适用的错误。
下表显示了默认情况下产生错误与警告时语句行为的摘要比较。
默认情况下产生错误的示例是将a插入
NULL
到
NOT
NULL
列中。
默认情况下产生警告的示例是将错误数据类型的值插入到列中(例如将字符串
'abc'
插入整数列)。
运作模式 | 当Statement Default为Error时 | 当Statement Default为Warning时 |
---|---|---|
没有
IGNORE
或严格的SQL模式
|
错误 | 警告 |
同
IGNORE
|
警告 |
警告(与没有
IGNORE
或严格的SQL模式相同)
|
使用严格的SQL模式 |
错误(与没有
IGNORE
或严格的SQL模式相同)
|
错误 |
用
IGNORE
和严格的SQL模式
|
警告 | 警告 |
从表中得出的一个结论是,当
IGNORE
关键字和严格的SQL模式都有效时,
IGNORE
优先。
这意味着,虽然
IGNORE
严格的SQL模式可以被认为对错误处理有相反的影响,但它们在一起使用时不会取消。
MySQL中的几个语句支持可选
IGNORE
关键字。
此关键字会导致服务器降级某些类型的错误并生成警告。
对于多行语句,
IGNORE
会导致语句跳到下一行而不是中止。
例如,如果表
t
具有主键列
i
,则尝试将相同值
i
插入多行通常会产生重复键错误:
MySQL的> INSERT INTO t (i) VALUES(1),(1);
ERROR 1062(23000):键'PRIMARY'重复输入'1'
使用时
IGNORE
,仍未插入包含重复键的行,但会发出警告而不是错误:
MySQL的>INSERT IGNORE INTO t (i) VALUES(1),(1);
查询正常,1行受影响,1警告(0.01秒) 记录:2个重复:1个警告:1 MySQL的>SHOW WARNINGS;
+ --------- + ------ + -------------------------------- ------- + | 等级| 代码| 消息| + --------- + ------ + -------------------------------- ------- + | 警告| 1062 | 键'PRIMARY'|的重复条目'1' + --------- + ------ + -------------------------------- ------- + 1排(0.00秒)
这些语句支持
IGNORE
关键字:
CREATE
TABLE
... SELECT
:
IGNORE
不适用于
语句的部分
CREATE
TABLE
或
SELECT
部分,而是插入到由表生成的行的表中
SELECT
。
复制唯一键值上现有行的行将被丢弃。
DELETE
:
IGNORE
导致MySQL在删除行的过程中忽略错误。
INSERT
:使用
IGNORE
,复制唯一键值上现有行的行将被丢弃。
设置为可能导致数据转换错误的值的行将设置为最接近的有效值。
UPDATE
:使用
IGNORE
,不会更新在唯一键值上发生重复键冲突的行。
更新为导致数据转换错误的值的行将更新为最接近的有效值。
该
IGNORE
关键字适用于以下错误:
ER_BAD_NULL_ERROR
ER_DUP_ENTRY
ER_DUP_ENTRY_WITH_KEY_NAME
ER_DUP_KEY
ER_NO_PARTITION_FOR_GIVEN_VALUE
ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT
ER_NO_REFERENCED_ROW_2
ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET
ER_ROW_IS_REFERENCED_2
ER_SUBQUERY_NO_1_ROW
ER_VIEW_CHECK_FAILED
MySQL服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于
sql_mode
系统变量
的值
。
在
“
严格
”
SQL模式下,服务器会将某些警告升级为错误。
例如,在非严格SQL模式下,将字符串
'abc'
插入整数列会导致将值转换为0并发出警告:
MySQL的>SET sql_mode = '';
查询正常,0行受影响(0.00秒) MySQL的>INSERT INTO t (i) VALUES('abc');
查询正常,1行受影响,1警告(0.01秒) MySQL的>SHOW WARNINGS;
+ --------- + ------ + -------------------------------- ------------------------ + | 等级| 代码| 消息| + --------- + ------ + -------------------------------- ------------------------ + | 警告| 1366 | 不正确的整数值:第1行|列'i'的'abc' + --------- + ------ + -------------------------------- ------------------------ + 1排(0.00秒)
在严格的SQL模式下,拒绝无效值并显示错误:
MySQL的>SET sql_mode = 'STRICT_ALL_TABLES';
查询正常,0行受影响(0.00秒) MySQL的>INSERT INTO t (i) VALUES('abc');
ERROR 1366(HY000):不正确的整数值:第1行的列'i'为'abc'
有关
sql_mode
系统变量
可能设置的更多信息
,请参见
第5.1.11节“服务器SQL模式”
。
严格的SQL模式适用于某些值可能超出范围或者在表中插入或删除无效行的条件下的以下语句:
在存储的程序中,如果在严格模式生效时定义了程序,则列出的类型的各个语句将以严格的SQL模式执行。
严格的SQL模式适用于以下错误,表示输入值无效或缺失的一类错误。
如果值具有错误的列数据类型或可能超出范围,则该值无效。
如果要插入的新行不包含
其定义中
NOT
NULL
没有显式
DEFAULT
子句
的
列
的值,则缺少值
。
ER_BAD_NULL_ERROR
ER_CUT_VALUE_GROUP_CONCAT
ER_DATA_TOO_LONG
ER_DATETIME_FUNCTION_OVERFLOW
ER_DIVISION_BY_ZERO
ER_INVALID_ARGUMENT_FOR_LOGARITHM
ER_NO_DEFAULT_FOR_FIELD
ER_NO_DEFAULT_FOR_VIEW_FIELD
ER_TOO_LONG_KEY
ER_TRUNCATED_WRONG_VALUE
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
ER_WARN_DATA_OUT_OF_RANGE
ER_WARN_NULL_TO_NOTNULL
ER_WARN_TOO_FEW_RECORDS
ER_WRONG_ARGUMENTS
ER_WRONG_VALUE_FOR_TYPE
WARN_DATA_TRUNCATED
MySQL中对IPv6的支持包括以下功能:
MySQL Server可以接受来自通过IPv6连接的客户端的TCP / IP连接。 例如,此命令通过IPv6连接到本地主机上的MySQL服务器:
外壳> mysql -h ::1
要使用此功能,必须满足两件事:
您的系统必须配置为支持IPv6。 请参见 第5.1.12.1节“验证IPv6的系统支持” 。
除IPv4连接外,默认的MySQL服务器配置还允许IPv6连接。
要更改默认配置,请在
bind_address
系统变量设置为适当值
的情况下启动服务器
。
请参见
第5.1.8节“服务器系统变量”
。
MySQL帐户名允许使用IPv6地址,以使DBA能够为通过IPv6连接到服务器的客户端指定权限。
请参见
第6.2.4节“指定帐户名”
。
IPv6地址可以在帐户名在这样的语句中指定
CREATE
USER
,
GRANT
和
REVOKE
。
例如:
mysql>CREATE USER 'bill'@'::1' IDENTIFIED BY 'secret';
mysql>GRANT SELECT ON mydb.* TO 'bill'@'::1';
IPv6功能支持字符串和内部格式IPv6地址格式之间的转换,并检查值是否代表有效的IPv6地址。
例如,
INET6_ATON()
以及
INET6_NTOA()
类似于
INET_ATON()
和
INET_NTOA()
,但除了IPv4地址处理IPv6地址。
请参见
第12.24节“其他功能”
。
从MySQL 8.0.14开始,组复制组成员可以使用IPv6地址进行组内通信。 组可以包含使用IPv6的成员和使用IPv4的成员的混合。 请参见 第18.4.6节“支持IPv6以及混合IPv6和IPv4组” 。
以下部分描述了如何设置MySQL以便客户端可以通过IPv6连接到服务器。
在MySQL Server可以接受IPv6连接之前,服务器主机上的操作系统必须支持IPv6。 作为确定是否为真的简单测试,请尝试以下命令:
外壳> ping6 ::1
来自:: 1的16个字节,icmp_seq = 0 hlim = 64时间= 0.171 ms
来自:: 1的16个字节,icmp_seq = 1个hlim = 64个时间= 0.077毫秒
...
要生成系统网络接口的描述,请调用 ifconfig -a 并在输出中查找IPv6地址。
如果主机不支持IPv6,请参阅系统文档以获取有关启用它的说明。 您可能只需重新配置现有网络接口即可添加IPv6地址。 或者可能需要进行更广泛的更改,例如在启用IPv6选项的情况下重建内核。
这些链接可能有助于在各种平台上设置IPv6:
MySQL服务器侦听一个或多个网络套接字以进行TCP / IP连接。 每个套接字绑定到一个地址,但地址可以映射到多个网络接口。
bind_address
在服务器启动时
设置
系统变量以指定服务器实例接受的TCP / IP连接。
从MySQL 8.0.13开始,您可以为此选项指定多个值,包括IPv6地址,IPv4地址和解析为IPv6或IPv4地址的主机名的任意组合。
或者,您可以指定允许侦听多个网络接口的通配符地址格式之一。
值*(默认值或值
::
)允许所有服务器主机IPv4和IPv6接口上的IPv4和IPv6连接。
欲了解更多信息,请参阅
bind_address
在描述
第5.1.8节,“服务器系统变量”
。
以下过程说明如何配置MySQL以允许使用
::1
本地主机地址
连接到本地服务器的客户端进行IPv6连接
。
此处给出的说明假定您的系统支持IPv6。
使用适当的
bind_address
设置
启动MySQL服务器
以允许它接受IPv6连接。
例如,将以下行放在服务器选项文件中并重新启动服务器:
的[mysqld] bind_address = *
将*(或
::
)
指定
为
bind_address
允许所有服务器主机IPv4和IPv6接口上的IPv4和IPv6连接
的值
。
如果要将服务器绑定到特定的地址列表,可以通过为逗号分隔的值列表为MySQL 8.0.13执行此操作
bind_address
。
此示例指定IPv4和IPv6的本地主机地址:
的[mysqld] bind_address = 127.0.0.1,:: 1
欲了解更多信息,请参阅
bind_address
在描述
第5.1.8节,“服务器系统变量”
。
作为管理员,连接到服务器并为将从
::1
本地IPv6主机地址
连接的本地用户创建帐户
:
MySQL的> CREATE USER 'ipv6user'@'::1' IDENTIFIED BY 'ipv6pass';
有关帐户名中IPv6地址的允许语法,请参见
第6.2.4节“指定帐户名”
。
除了该
CREATE
USER
语句之外,您还可以发出
GRANT
为帐户提供特定权限的语句,但这对于此过程中的其余步骤不是必需的。
使用新帐户 调用 mysql 客户端连接到服务器:
外壳> mysql -h ::1 -u ipv6user -pipv6pass
尝试一些显示连接信息的简单语句:
MySQL的>STATUS
... 连接::: 1通过TCP / IP ... MySQL的>SELECT CURRENT_USER(), @@bind_address;
+ ---------------- + ---------------- + | CURRENT_USER()| @@ bind_address | + ---------------- + ---------------- + | ipv6user @ :: 1 | :: | + ---------------- + ---------------- +
以下过程说明如何配置MySQL以允许远程客户端进行IPv6连接。 它与本地客户端的上述过程类似,但服务器和客户端主机是不同的,并且每个主机都有自己的非本地IPv6地址。 该示例使用以下地址:
服务器主机:2001:db8:0:f101 :: 1 客户端主机:2001:db8:0:f101 :: 2
这些地址是从 IANA 推荐的非可路由地址范围中选择的, 用于文档目的,并且足以在本地网络上进行测试。 要接受来自本地网络外部客户端的IPv6连接,服务器主机必须具有公共地址。 如果您的网络提供商为您分配了IPv6地址,则可以使用该地址。 否则,另一种获取地址的方法是使用IPv6代理; 请参见 第5.1.12.5节“从代理获取IPv6地址” 。
使用适当的
bind_address
设置
启动MySQL服务器
以允许它接受IPv6连接。
例如,将以下行放在服务器选项文件中并重新启动服务器:
的[mysqld] bind_address = *
将*(或
::
)
指定
为
bind_address
允许所有服务器主机IPv4和IPv6接口上的IPv4和IPv6连接
的值
。
如果要将服务器绑定到特定的地址列表,可以通过为逗号分隔的值列表为MySQL 8.0.13执行此操作
bind_address
。
此示例指定IPv4地址以及所需的服务器主机IPv6地址:
的[mysqld] bind_address = 198.51.100.20,2001:db8:0:f101 :: 1
欲了解更多信息,请参阅
bind_address
在描述
第5.1.8节,“服务器系统变量”
。
在服务器主机(
2001:db8:0:f101::1
)上,为将从客户端主机(
2001:db8:0:f101::2
)
连接的用户创建一个帐户
:
MySQL的> CREATE USER 'remoteipv6user'@'2001:db8:0:f101::2' IDENTIFIED BY 'remoteipv6pass';
在客户端host(
2001:db8:0:f101::2
)上,
使用新帐户
调用
mysql
客户端连接到服务器:
外壳> mysql -h 2001:db8:0:f101::1 -u remoteipv6user -premoteipv6pass
尝试一些显示连接信息的简单语句:
MySQL的>STATUS
... 连接:2001:db8:0:f101 :: 1通过TCP / IP ... MySQL的>SELECT CURRENT_USER(), @@bind_address;
+ ----------------------------------- + ------------- --- + | CURRENT_USER()| @@ bind_address | + ----------------------------------- + ------------- --- + | remoteipv6user @ 2001:db8:0:f101 :: 2 | :: | + ----------------------------------- + ------------- --- +
如果您没有允许系统通过本地网络外的IPv6进行通信的公共IPv6地址,则可以从IPv6代理获取一个。 在 维基百科的IPv6隧道代理页 列出了几个经纪人和他们的功能,如是否提供静态地址和所支持的路由协议。
配置服务器主机以使用代理提供的IPv6地址后,使用适当的
bind_address
设置
启动MySQL服务器
以允许服务器接受IPv6连接。
您可以指定*(或
::
)作为
bind_address
值,或将服务器绑定到代理提供的特定IPv6地址。
欲了解更多信息,请参阅
bind_address
在描述
第5.1.8节,“服务器系统变量”
。
请注意,如果代理分配动态地址,则下次连接到代理时,为系统提供的地址可能会更改。 如果是这样,您创建的任何名称原始地址的帐户将变为无效。 要绑定到特定地址但避免此地址更改问题,您可以与代理安排静态IPv6地址。
以下示例显示如何将Freenet6用作 Gentoo Linux上 的代理和 gogoc IPv6客户端软件包。
通过访问此URL并注册,在Freenet6上创建一个帐户:
http://gogonet.gogo6.com
创建帐户后,转到此URL,登录并为IPv6代理创建用户ID和密码:
http://gogonet.gogo6.com/page/freenet6-registration
作为
root
,安装
gogoc
:
外壳> emerge gogoc
编辑
/etc/gogoc/gogoc.conf
以设置
userid
和
password
值。
例如:
用户ID = gogouser 的passwd = gogopass
启动 gogoc :
外壳> /etc/init.d/gogoc start
要 在 每次系统引导时 启动 gogoc ,请执行以下命令:
外壳> rc-update add gogoc default
使用 ping6 尝试ping主机:
外壳> ping6 ipv6.google.com
要查看您的IPv6地址:
外壳> ifconfig tun
本节介绍MySQL维护的时区设置,如何加载命名时间支持所需的系统表,如何保持当前时区更改以及如何启用闰秒支持。
有关复制设置中时区设置的信息,请参见 第17.4.1节“复制功能和问题” 。
MySQL Server维护多个时区设置:
系统时区。
当服务器启动时,它会尝试自动确定主机的时区,并使用它来设置
system_time_zone
系统变量。
此后该值不会改变。
要在启动时显式指定MySQL Server的系统时区,请在启动
mysqld
TZ
之前
设置
环境变量
。
如果使用
mysqld_safe
启动服务器
,则其
选项提供了另一种设置系统时区的方法。
允许值
和
系统相关。
请参阅操作系统文档以了解可接受的值。
--timezone
TZ
--timezone
服务器当前时区。
全局
time_zone
系统变量指示服务器当前运行的时区。初始
time_zone
值为
'SYSTEM'
,表示服务器时区与系统时区相同。
如果设置为
SYSTEM
,则每个需要时区计算的MySQL函数调用都会调用系统库来确定当前系统时区。
此调用可能受全局互斥锁保护,从而导致争用。
可以在启动时使用
--default-time-zone
命令行上的选项
显式指定初始全局服务器时区值,也可以
在选项文件中使用以下行:
default-time-zone =' timezone
'
如果您具有
SYSTEM_VARIABLES_ADMIN
或
SUPER
权限,则可以使用以下语句在运行时设置全局服务器时区值:
SET GLOBAL time_zone = timezone
;
每个会话时区。
连接的每个客户端都有自己的会话时区设置,由会话
time_zone
变量
给定
。
最初,会话变量从全局变量中获取其值
time_zone
,但客户端可以使用以下语句更改自己的时区:
SET time_zone = timezone
;
会话时区设置会影响区域敏感的时间值的显示和存储。
这包括由诸如
NOW()
or之类
的函数显示的值
CURTIME()
,以及存储在
TIMESTAMP
列
中和从
列
中检索的值
。
TIMESTAMP
列的
值
从会话时区转换为UTC以进行存储,并从UTC转换为会话时区以进行检索。
会话时区设置不影响由功能显示的值,如
UTC_TIMESTAMP()
在或值
DATE
,
TIME
或
DATETIME
列。
这些数据类型中的值也不是以UTC格式存储的;
时区仅在从
TIMESTAMP
值
转换时适用于它们
。
如果你想区域特定算术
DATE
,
TIME
或
DATETIME
值,将其转换为UTC,执行算术,然后再转换回。
可以像这样检索当前的全局和会话时区值:
SELECT @@ GLOBAL.time_zone,@ @ SESSION.time_zone;
timezone
值可以以多种格式给出,其中没有一种格式区分大小写:
作为值
'SYSTEM'
,表示服务器时区与系统时区相同。
作为指示与UTC的偏移的字符串,例如
'+10:00'
或
'-6:00'
。
作为命名的时区,例如
'Europe/Helsinki'
,
'US/Eastern'
或
'MET'
。
仅当
mysql
已创建并填充数据库中
的时区信息表时,才能使用命名时区
。
mysql
系统模式中存在
若干表
来存储时区信息(请参见
第5.3节“mysql系统模式”
)。
MySQL安装过程会创建时区表,但不会加载它们。
要手动执行此操作,请使用以下说明。
加载时区信息不一定是一次性操作,因为信息偶尔会改变。 发生此类更改时,使用旧规则的应用程序会过时,您可能会发现有必要重新加载时区表以使MySQL服务器使用的信息保持最新状态。 请参阅 随时区变化保持最新状态 。
如果您的系统有自己的
zoneinfo
数据库(描述时区的文件集),请使用
mysql_tzinfo_to_sql
程序加载时区表。
此类系统的示例是Linux,macOS,FreeBSD和Solaris。
这些文件的一个可能位置是
/usr/share/zoneinfo
目录。
如果您的系统没有zoneinfo数据库,则可以使用可下载的软件包,如本节后面所述。
要从命令行加载时区表,请将zoneinfo目录路径名传递给 mysql_tzinfo_to_sql 并将输出发送到 mysql 程序。 例如:
mysql_tzinfo_to_sql / usr / share / zoneinfo | mysql -u root -p mysql
此处显示
的
mysql
命令假定您使用诸如
root
具有修改
mysql
系统架构中的
表的权限
的帐户连接到服务器
。
根据需要调整连接参数。
mysql_tzinfo_to_sql 读取系统的时区文件并从中生成SQL语句。 mysql 处理这些语句以加载时区表。
mysql_tzinfo_to_sql 也可用于加载单个时区文件或生成闰秒信息:
要加载
tz_file
与时区名称对应
的单个时区文件
,
请
像这样
tz_name
调用
mysql_tzinfo_to_sql
:
mysql_tzinfo_to_sql | mysql -u root -p mysqltz_file
tz_name
使用此方法,您必须执行单独的命令来为服务器需要了解的每个命名区域加载时区文件。
如果您的时区必须考虑闰秒,请初始化闰秒信息,例如,
tz_file
时区文件的名称:
mysql_tzinfo_to_sql --leap tz_file
| mysql -u root -p mysql
运行 mysql_tzinfo_to_sql后 ,重新启动服务器,使其不再继续使用任何以前缓存的时区数据。
如果您的系统没有zoneinfo数据库(例如,Windows),则可以使用包含可在MySQL Developer Zone下载的SQL语句的包:
https://dev.mysql.com/downloads/timezones.html
难道 不 ,如果你的系统有一个数据库时区信息使用一个可下载的时区包。 请改用 mysql_tzinfo_to_sql 实用程序。 否则,您可能会导致MySQL与系统上其他应用程序之间的日期时间处理有所不同。
要使用已下载的SQL语句时区包,请将其解压缩,然后将解压缩的文件内容加载到时区表中:
mysql -u root -p mysql < file_name
然后重启服务器。
千万
不能
使用包含一个可下载的时区包
MyISAM
桌。
这适用于较旧的MySQL版本。
MySQL现在
InnoDB
用于时区表。
试图用
MyISAM
表
替换它们
会导致问题。
当时区规则更改时,使用旧规则的应用程序将过时。 要保持最新状态,必须确保系统使用当前时区信息。 对于MySQL,在保持最新状态时需要考虑多个因素:
如果时区设置为,则操作系统时间会影响MySQL服务器使用的值
SYSTEM
。
确保您的操作系统使用最新的时区信息。
对于大多数操作系统,最新的更新或Service Pack会为您的系统准备时间更改。
检查操作系统供应商的网站,以获取解决时间更改的更新。
如果
/etc/localtime
使用与
mysqld
启动
时有效的规则不同的版本
替换系统的
时区文件
,请重新启动
mysqld
以使其使用更新的规则。
否则,
mysqld
可能不会注意到系统何时更改其时间。
如果在MySQL中使用命名时区,请确保
mysql
数据库中
的时区表
是最新的:
如果您的系统有自己的zoneinfo数据库,则每当更新zoneinfo数据库时重新加载MySQL时区表。
对于没有自己的zoneinfo数据库的系统,请检查MySQL Developer Zone以获取更新。 当有新的更新可用时,请下载并使用它来替换当前时区表的内容。
有关这两种方法的说明,请参阅 填充时区表 。 mysqld 缓存它查找的时区信息,因此在更新时区表后,重新启动 mysqld 以确保它不会继续提供过时的时区数据。
如果您不确定命名时区是否可用,或者作为服务器的时区设置使用,还是由设置自己时区的客户端使用,请检查您的时区表是否为空。 以下查询确定包含时区名称的表是否包含任何行:
MySQL的> SELECT COUNT(*) FROM mysql.time_zone_name;
+ ---------- +
| COUNT(*)|
+ ---------- +
| 0 |
+ ---------- +
计数为零表示该表为空。 在这种情况下,当前没有应用程序使用命名时区,您无需更新表(除非您要启用命名时区支持)。 计数大于零表示该表不为空,并且其内容可用于命名时区支持。 在这种情况下,请务必重新加载时区表,以便使用命名时区的应用程序将获得正确的查询结果。
要检查您的MySQL安装是否已正确更新以更改夏令时规则,请使用如下所示的测试。 该示例使用的值适用于3月11日凌晨2点在美国发生的2007 DST 1小时更改
该测试使用此查询:
选择 CONVERT_TZ('2007-03-11 2:00:00','US / Eastern','US / Central')AS time1, CONVERT_TZ('2007-03-11 3:00:00','US / Eastern','US / Central')AS time2;
两个时间值表示发生DST更改的时间,并且使用指定时区要求使用时区表。 期望的结果是两个查询都返回相同的结果(输入时间,转换为'US / Central'时区中的等效值)。
在更新时区表之前,您会看到不正确的结果,如下所示:
+ --------------------- + --------------------- + | time1 | time2 | + --------------------- + --------------------- + | 2007-03-11 01:00:00 | 2007-03-11 02:00:00 | + --------------------- + --------------------- +
更新表后,您应该看到正确的结果:
+ --------------------- + --------------------- + | time1 | time2 | + --------------------- + --------------------- + | 2007-03-11 01:00:00 | 2007-03-11 01:00:00 | + --------------------- + --------------------- +
将返回带有时间部分的闰秒值
:59:59
。
这意味着诸如
NOW()
可以在闰秒期间连续两或三秒返回相同值
的函数
。
具有时间部分结束
:59:60
或被
:59:61
认为无效的
文字时间值仍然是正确的
。
如果需要
TIMESTAMP
在闰秒之前
搜索
一秒的值,则如果使用与
'YYYY-MM-DD hh:mm:ss'
值
的比较,则可能获得异常结果
。
以下示例演示了这一点。
它将会话时区更改为UTC,因此内部
TIMESTAMP
值(以UTC为单位)和显示值(已应用时区校正)
之间没有差异
。
MySQL的>CREATE TABLE t1 (
a INT,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (ts)
);
查询OK,0行受影响(0.01秒) mysql>-- change to UTC
mysql>SET time_zone = '+00:00';
查询正常,0行受影响(0.00秒) mysql>-- Simulate NOW() = '2008-12-31 23:59:59'
mysql>SET timestamp = 1230767999;
查询正常,0行受影响(0.00秒) MySQL的>INSERT INTO t1 (a) VALUES (1);
查询正常,1行受影响(0.00秒) mysql>-- Simulate NOW() = '2008-12-31 23:59:60'
mysql>SET timestamp = 1230768000;
查询正常,0行受影响(0.00秒) MySQL的>INSERT INTO t1 (a) VALUES (2);
查询正常,1行受影响(0.00秒) mysql>-- values differ internally but display the same
mysql>SELECT a, ts, UNIX_TIMESTAMP(ts) FROM t1;
+ ------ + --------------------- + -------------------- + | a | ts | UNIX_TIMESTAMP(ts)| + ------ + --------------------- + -------------------- + | 1 | 2008-12-31 23:59:59 | 1230767999 | | 2 | 2008-12-31 23:59:59 | 1230768000 | + ------ + --------------------- + -------------------- + 2行(0.00秒) mysql>-- only the non-leap value matches
mysql>SELECT * FROM t1 WHERE ts = '2008-12-31 23:59:59';
+ ------ + --------------------- + | a | ts | + ------ + --------------------- + | 1 | 2008-12-31 23:59:59 | + ------ + --------------------- + 1排(0.00秒) mysql>-- the leap value with seconds=60 is invalid
mysql>SELECT * FROM t1 WHERE ts = '2008-12-31 23:59:60';
空集,2个警告(0.00秒)
要解决此问题,您可以使用基于实际存储在列中的UTC值进行比较,该值应用了闰秒校正:
mysql>-- selecting using UNIX_TIMESTAMP value return leap value
mysql>SELECT * FROM t1 WHERE UNIX_TIMESTAMP(ts) = 1230768000;
+ ------ + --------------------- + | a | ts | + ------ + --------------------- + | 2 | 2008-12-31 23:59:59 | + ------ + --------------------- + 1排(0.00秒)
MySQL Server支持
HELP
从MySQL Reference Manual返回信息
的
语句(参见
第13.8.3节“HELP语法”
)。
此信息存储在
mysql
模式
中的多个表中
(请参见
第5.3节“mysql系统模式”
)。
正确操作
HELP
语句需要初始化这些帮助表。
对于在Unix上使用二进制或源代码分发的MySQL的新安装,在初始化数据目录时会发生帮助表内容初始化(请参见 第2.10.1节“初始化数据目录” )。 对于Linux上的RPM分发或Windows上的二进制分发,内容初始化是作为MySQL安装过程的一部分进行的。
对于使用二进制分发的MySQL升级,自MySQL 8.0.16起,服务器会自动升级帮助表内容。
在MySQL 8.0.16之前,内容不会自动升级,但您可以手动升级。
fill_help_tables.sql
在
share
或
share/mysql
目录中
找到该
文件
。
将位置更改到该目录并使用
mysql
客户端
处理该文件,
如下所示:
mysql -u root -p mysql <fill_help_tables.sql
此处显示的命令假定您使用诸如
root
具有修改
mysql
架构中的
表的权限
的帐户连接到服务器
。
根据需要调整连接参数。
在MySQL 8.0.16之前,如果您正在使用Git和MySQL开发源代码树,源代码树只包含一个
“
存根
”
版本
fill_help_tables.sql
。
要获取非存根副本,请使用源或二进制分发中的副本。
每个MySQL系列都有自己的系列专用参考手册,因此帮助表内容也是系列特定的。 这对复制有影响,因为帮助表内容应与MySQL系列匹配。 如果将MySQL 8.0帮助内容加载到MySQL 8.0主服务器中,则将该内容从不同的MySQL系列复制到从属服务器并且该内容不适合是没有意义的。 因此,在复制方案中升级单个服务器时,应使用前面给出的说明升级每个服务器的帮助表。 (仅对于低于8.0.16的版本的复制服务器,才需要手动帮助内容升级。如前面的说明中所述,
MySQL服务器实现了几个会话状态跟踪器。 客户端可以使这些跟踪器能够接收其会话状态变化的通知。
跟踪器机制的一个用途是为MySQL连接器和客户端应用程序提供一种方法,以确定是否有任何会话上下文可用于允许从一个服务器到另一个服务器的会话迁移。 (要在负载平衡环境中更改会话,有必要在决定是否可以进行切换时检测是否存在会话状态。)
跟踪器机制的另一个用途是允许应用程序知道何时可以将事务从一个会话移动到另一个会话。 事务状态跟踪启用此功能,这对于可能希望将事务从繁忙服务器移动到负载较少的应用程序的应用程序非常有用。 例如,管理客户端连接池的负载平衡连接器可以在池中的可用会话之间移动事务。
但是,不能在任意时间进行会话切换。 如果会话处于已完成读取或写入的事务的中间,则切换到其他会话意味着原始会话上的事务回滚。 仅当事务尚未在其中执行任何读取或写入时,才必须执行会话切换。
可以合理地切换交易的示例:
除了知道事务状态之外,了解事务特征是有用的,以便在事务被移动到不同会话时使用相同的特征。 以下特征与此相关:
只读 读写 隔离级别 一致的快照
为了支持前面的会话切换活动,可以通知这些类型的客户机会话状态信息:
客户端会话状态的这些属性的更改:
默认架构(数据库)。
系统变量的特定于会话的值。
用户定义的变量。
临时表。
准备好的陈述。
所述
session_track_state_change
系统变量控制此追踪。
对默认架构名称的更改。
所述
session_track_schema
系统变量控制此追踪。
更改系统变量的会话值。
所述
session_track_system_variables
系统变量控制此追踪。
可用的GTID。
所述
session_track_gtids
系统变量控制此追踪。
有关交易状态和特征的信息。
所述
session_track_transaction_info
系统变量控制此追踪。
有关跟踪器相关系统变量的说明,请参见 第5.1.8节“服务器系统变量” 。 这些系统变量允许控制发生哪些更改通知,但不提供访问通知信息的方法。 通知发生在MySQL客户端/服务器协议中,其中包括OK数据包中的跟踪器信息,以便可以检测到会话状态更改。 为了使客户端应用程序能够从服务器返回的OK数据包中提取状态更改信息,MySQL C API提供了一对功能:
mysql_session_track_get_first()
获取从服务器接收的状态更改信息的第一部分。
请参见
第28.7.7.69节“mysql_session_track_get_first()”
。
mysql_session_track_get_next()
获取从服务器接收的任何剩余状态更改信息。
成功调用后
mysql_session_track_get_first()
,只要返回成功,就会重复调用此函数。
请参见
第28.7.7.70节“mysql_session_track_get_next()”
。
该
mysqltest
程序有
disable_session_track_info
和
enable_session_track_info
控制是否会跟踪通知命令发生。
您可以使用这些命令从命令行查看SQL语句生成的通知。
假设一个文件
testscript
包含以下
mysqltest
脚本:
DROP TABLE IF EXISTS test.t1; CREATE TABLE test.t1(i INT,f FLOAT); --enable_session_track_info SET @@ SESSION.session_track_schema = ON; SET @@ SESSION.session_track_system_variables ='*'; SET @@ SESSION.session_track_state_change = ON; USE information_schema; SET NAMES'utf8mb4'; SET @@ SESSION.session_track_transaction_info ='CHARACTERISTICS'; 设置交易隔离级别可串行化; SET TRANSACTION READ WRITE; 开始交易; 选择1; INSERT INTO test.t1()VALUES(); INSERT INTO test.t1()VALUES(1,RAND()); 承诺;
按如下所示运行脚本以查看启用的跟踪器提供的信息。
有关
mysqltest
为各种跟踪器
Tracker:
显示
的
信息
的说明
,请参见
第28.7.7.69节“mysql_session_track_get_first()”
。
外壳> mysqltest < testscript
DROP TABLE IF EXISTS test.t1;
CREATE TABLE test.t1(i INT,f FLOAT);
SET @@ SESSION.session_track_schema = ON;
SET @@ SESSION.session_track_system_variables ='*';
- 跟踪器:SESSION_TRACK_SYSTEM_VARIABLES
- session_track_system_variables
- *
SET @@ SESSION.session_track_state_change = ON;
- 跟踪器:SESSION_TRACK_SYSTEM_VARIABLES
- session_track_state_change
- 上
USE information_schema;
- 追踪器:SESSION_TRACK_SCHEMA
- information_schema
- 跟踪器:SESSION_TRACK_STATE_CHANGE
- 1
SET NAMES'utf8mb4';
- 跟踪器:SESSION_TRACK_SYSTEM_VARIABLES
- character_set_client
- utf8mb4
- character_set_connection
- utf8mb4
- character_set_results
- utf8mb4
- 跟踪器:SESSION_TRACK_STATE_CHANGE
- 1
SET @@ SESSION.session_track_transaction_info ='CHARACTERISTICS';
- 跟踪器:SESSION_TRACK_SYSTEM_VARIABLES
- session_track_transaction_info
- 特点
- 跟踪器:SESSION_TRACK_STATE_CHANGE
- 1
- 追踪器:SESSION_TRACK_TRANSACTION_CHARACTERISTICS
-
- 跟踪器:SESSION_TRACK_TRANSACTION_STATE
- ________
设置交易隔离级别可串行化;
- 追踪器:SESSION_TRACK_TRANSACTION_CHARACTERISTICS
- 设置交易隔离级别可串行;
SET TRANSACTION READ WRITE;
- 追踪器:SESSION_TRACK_TRANSACTION_CHARACTERISTICS
- 设置交易隔离级别可串行; SET TRANSACTION READ WRITE;
开始交易;
- 追踪器:SESSION_TRACK_TRANSACTION_CHARACTERISTICS
- 设置交易隔离级别可串行; START TRANSACTION READ WRITE;
- 跟踪器:SESSION_TRACK_TRANSACTION_STATE
- T_______
选择1;
1
1
- 跟踪器:SESSION_TRACK_TRANSACTION_STATE
- T_____S_
INSERT INTO test.t1()VALUES();
- 跟踪器:SESSION_TRACK_TRANSACTION_STATE
- T___W_S_
INSERT INTO test.t1()VALUES(1,RAND());
- 跟踪器:SESSION_TRACK_TRANSACTION_STATE
- T___WsS_
承诺;
- 追踪器:SESSION_TRACK_TRANSACTION_CHARACTERISTICS
-
- 跟踪器:SESSION_TRACK_TRANSACTION_STATE
- ________
好
在该
START
TRANSACTION
语句
之前
,
SET
TRANSACTION
执行
两个
语句,为下一个事务设置隔离级别和访问模式特征。
该
SESSION_TRACK_TRANSACTION_CHARACTERISTICS
值表示已设置的下一个事务值。
在
COMMIT
结束事务
的
语句
之后
,该
SESSION_TRACK_TRANSACTION_CHARACTERISTICS
值报告为空。
这表示已重置事务开始之前设置的下一个事务特征,并且会话缺省值适用。
要跟踪对这些会话默认值的更改,请跟踪
transaction_isolation
和
transaction_read_only
系统变量
的会话值
。
在Unix上,信号可以发送到进程。 mysqld 响应发送给它的信号,如下所示:
SIGTERM
导致服务器关闭。
SIGHUP
使服务器重新加载授权表并刷新表,日志,线程缓存和主机缓存。
这些行为就像
FLUSH
声明的
各种形式
。
服务器还会将状态报告写入具有以下格式的错误日志:
状态信息: 当前目录:/ var / mysql / data / 运行线程:0堆栈大小:196608 目前的锁: 关键缓存: 默认 Buffer_size:8388600 Block_size:1024 Division_limit:100 Age_limit:300 使用的块:0 没有脸红:0 w_requests:0 写道:0 r_requests:0 读:0 处理程序状态 read_key:0 read_next:0 read_rnd 0 read_first:1 写:0 删除0 更新:0 表状态: 打开的桌子:5 打开表:0 打开文件:7 开放流:0 报警状态: 活动警报:1 Max使用的警报:2 下次闹钟时间:67
服务器关闭过程如下:
关闭过程已启动。
这可以通过几种方式发生。
例如,具有该
SHUTDOWN
权限
的用户
可以执行
mysqladmin shutdown
命令。
mysqladmin
可以在MySQL支持的任何平台上使用。
其他特定于操作系统的关闭启动方法也是可能的:服务器在接收到
SIGTERM
信号
时会在Unix上关闭
。
在Windows上作为服务运行的服务器在服务管理器告知时关闭。
如有必要,服务器会创建一个关闭线程。
根据启动关闭的方式,服务器可能会创建一个线程来处理关闭过程。
如果客户端请求关闭,则会创建关闭线程。
如果关闭是接收
SIGTERM
信号
的结果
,则信号线程可能自己处理关闭,或者它可能会创建一个单独的线程来执行此操作。
如果服务器尝试创建关闭线程而不能(例如,如果内存耗尽),则会发出错误日志中显示的诊断消息:
错误:无法创建线程来终止服务器
服务器停止接受新连接。
为了防止在关闭期间启动新活动,服务器通过关闭它通常侦听连接的网络接口的处理程序来停止接受新的客户端连接:TCP / IP端口,Unix套接字文件,Windows命名管道和Windows上的共享内存。
服务器终止当前活动。
对于与客户端连接关联的每个线程,服务器断开与客户端的连接并将线程标记为已终止。
线程在注意到它们如此标记时会死亡。
空闲连接的线程快速死亡。
当前处理语句的线程会定期检查其状态,并且需要更长的时间才能完成。
有关线程终止的其他信息,请参见
第13.7.7.4节“KILL语法”
,特别是
有关
表的已
终止
REPAIR
TABLE
或
OPTIMIZE
TABLE
操作
的说明
MyISAM
。
对于具有打开事务的线程,将回滚事务。
如果一个线程正在更新非事务表,操作如多行
UPDATE
或
INSERT
可以离席了部分更新,因为操作可以完成前终止。
如果服务器是主复制服务器,则它会将与当前连接的从属关联的线程视为其他客户端线程。 也就是说,每个都标记为已杀死,并在下次检查其状态时退出。
如果服务器是从属复制服务器,则在将客户端线程标记为已终止之前,它会停止I / O和SQL线程(如果它们处于活动状态)。
允许SQL线程完成其当前语句(以避免导致复制问题),然后停止。
如果此时SQL线程处于事务中间,则服务器将等待,直到当前复制事件组(如果有)已完成执行,或者直到用户发出
KILL QUERY
或
KILL
CONNECTION
声明
为止
。
另请参见
第13.4.2.7节“STOP SLAVE语法”
。
由于无法回滚非事务性语句,因此为了保证崩溃安全复制,只应使用事务性表。
要确保从站的崩溃安全性,必须在
--relay-log-recovery
启用时
运行从站
。
另请参见 第17.2.4节“复制中继和状态日志” 。
服务器关闭或关闭存储引擎。
在此阶段,服务器刷新表缓存并关闭所有打开的表。
每个存储引擎都会执行其管理的表所需的任何操作。
InnoDB
将其缓冲池刷新到磁盘(除非
innodb_fast_shutdown
是2),将当前LSN写入表空间,并终止其自己的内部线程。
MyISAM
刷新表的任何挂起索引写入。
服务器退出。
为了向管理进程提供信息,服务器返回以下列表中描述的退出代码之一。 括号中的短语表示systemd响应代码所采取的操作,对于使用systemd管理服务器的平台。
0 =成功终止(未完成重启)
1 =终止失败(未完成重启)
2 =终止失败(重启完成)
由MySQL服务器管理的信息存储在称为数据目录的目录下。 以下列表简要介绍了数据目录中常见的项目,以及其他信息的交叉引用:
数据目录子目录。 数据目录的每个子目录都是数据库目录,对应于服务器管理的数据库。 所有MySQL安装都有一些标准数据库:
该
mysql
目录对应于
mysql
系统架构,其中包含MySQL服务器运行时所需的信息。
该数据库包含数据字典表和系统表。
请参见
第5.3节“mysql系统架构”
。
该
performance_schema
目录对应于Performance Schema,它提供用于在运行时检查服务器内部执行的信息。
请参见
第26章,
MySQL性能架构
。
该
sys
目录对应于
sys
模式,该模式提供了一组对象,以帮助更轻松地解释性能模式信息。
请参见
第27章,
MySQL sys Schema
。
该
ndbinfo
目录对应于
ndbinfo
存储特定于NDB Cluster的信息
的
数据库(仅适用于为包含NDB Cluster而构建的安装)。
请参见
第22.5.10节“ndbinfo:NDB集群信息数据库”
。
其他子目录对应于用户或应用程序创建的数据库。
INFORMATION_SCHEMA
是一个标准的数据库,但它的实现没有使用相应的数据库目录。
由服务器写入的日志文件。 请参见 第5.4节“MySQL服务器日志” 。
InnoDB
表空间和日志文件。
请参见
第15章,
InnoDB存储引擎
。
默认/自动生成的SSL和RSA证书和密钥文件。 请参见 第6.3.3节“创建SSL和RSA证书和密钥” 。
服务器进程标识文件(在服务器运行时)。
mysqld-auto.cnf
存储持久性全局系统变量设置
的
文件。
请参见
第13.7.5.1节“变量赋值的SET语法”
。
通过重新配置服务器,可以在其他位置重新定位上述列表中的某些项目。
此外,该
--datadir
选项还可以更改数据目录本身的位置。
对于给定的MySQL安装,请检查服务器配置以确定是否已移动项目。
该
mysql
模式是系统架构。
它包含存储MySQL服务器运行时所需信息的表。
广泛的分类是
mysql
模式包含存储数据库对象元数据的数据字典表,以及用于其他操作目的的系统表。
以下讨论进一步将系统表集细分为较小的类别。
本节的其余部分将列出每个类别中的表,并提供其他信息的交叉引用。
InnoDB
除非另有说明,否则
数据字典表和系统表使用
存储引擎。
mysql
系统表和数据字典表驻留在
MySQL数据目录
中指定的单个
InnoDB
表空间文件
mysql.ibd
中。
以前,这些表是在
mysql
数据库目录
中的各个表空间文件中创建的
。
可以为
mysql
系统模式表空间
启用静态数据加密
。
有关更多信息,请参见
第15.6.3.9节“InnoDB静态数据加密”
。
这些表包含数据字典,其中包含有关数据库对象的元数据。 有关其他信息,请参阅 第14章, MySQL数据字典 。
数据字典是MySQL 8.0中的新增功能。 与以前的MySQL版本相比,支持数据字典的服务器需要一些一般的操作差异。 有关详细信息,请参见 第14.7节“数据字典使用差异” 。 此外,对于从MySQL 5.7升级到MySQL 8.0,升级过程与以前的MySQL版本略有不同,并要求您通过检查特定的先决条件来验证安装的升级准备情况。 有关更多信息,请参见 第2.11节“升级MySQL” ,特别是 第2.11.5节“准备升级安装” 。
catalogs
:目录信息。
character_sets
:有关可用字符集的信息。
check_constraints
:有关
CHECK
在表上定义的约束的
信息
。
请参见
第13.1.20.7节“检查约束”
。
collations
:有关每个字符集的排序规则的信息。
column_statistics
:列值的直方图统计信息。
请参见
第8.9.6节“优化程序统计信息”
。
column_type_elements
:有关列使用的类型的信息。
columns
:有关表中列的信息。
dd_properties
:标识数据字典属性的表,例如其版本。
服务器使用它来确定是否必须将数据字典升级到较新版本。
events
:有关事件计划程序事件的信息。
请参见
第24.4节“使用事件调度程序”
。
除非使用该
--skip-grant-tables
选项
启动,否则服务器会在其启动过程中加载此表中列出的事件
。
foreign_keys
,
foreign_key_column_usage
:有关外键的信息。
index_column_usage
:有关索引使用的列的信息。
index_partitions
:有关索引使用的分区的信息。
index_stats
:用于存储
ANALYZE
TABLE
执行
时生成的动态索引统计信息
。
indexes
:有关表索引的信息。
innodb_ddl_log
:存储DDL日志以进行崩溃安全的DDL操作。
parameter_type_elements
:有关存储过程和函数参数的信息,以及有关存储函数的返回值的信息。
parameters
:有关存储过程和函数的信息。
请参见
第24.2节“使用存储的例程”
。
resource_groups
:有关资源组的信息。
请参见
第8.12.5节“资源组”
routines
:有关存储过程和函数的信息。
请参见
第24.2节“使用存储的例程”
。
schemata
:有关schemata的信息。
在MySQL中,模式是数据库,因此该表提供有关数据库的信息。
st_spatial_reference_systems
:有关空间数据的可用空间参考系统的信息。
table_partition_values
:有关表分区使用的值的信息。
table_partitions
:有关表使用的分区的信息。
table_stats
:有关
ANALYZE
TABLE
执行
时生成的动态表统计信息的信息
。
tables
:有关数据库中表的信息。
tablespace_files
:有关表空间使用的文件的信息。
tablespaces
:有关活动表空间的信息。
triggers
:有关触发器的信息。
view_routine_usage
:有关视图与它们使用的存储函数之间的依赖关系的信息。
view_table_usage
:用于跟踪视图及其基础表之间的依赖关系。
数据字典表是不可见的。
它们无法读取
SELECT
,不会出现在输出中
SHOW
TABLES
,未列在
INFORMATION_SCHEMA.TABLES
表中,等等。
但是,在大多数情况下
INFORMATION_SCHEMA
,可以查询
相应的
表。
从概念上讲,它
INFORMATION_SCHEMA
提供了一个MySQL公开数据字典元数据的视图。
例如,您无法
mysql.schemata
直接
从
表中进行
选择
:
MySQL的> SELECT * FROM mysql.schemata;
错误3554(HY000):拒绝访问数据字典表'mysql.schemata'。
而是从相应的
INFORMATION_SCHEMA
表中
选择该信息
:
MySQL的> SELECT * FROM INFORMATION_SCHEMA.SCHEMATA\G
*************************** 1。排******************** *******
CATALOG_NAME:def
SCHEMA_NAME:mysql
DEFAULT_CHARACTER_SET_NAME:utf8mb4
DEFAULT_COLLATION_NAME:utf8mb4_0900_ai_ci
SQL_PATH:NULL
DEFAULT_ENCRYPTION:没有
*************************** 2.排******************** *******
CATALOG_NAME:def
SCHEMA_NAME:information_schema
DEFAULT_CHARACTER_SET_NAME:utf8
DEFAULT_COLLATION_NAME:utf8_general_ci
SQL_PATH:NULL
DEFAULT_ENCRYPTION:没有
...
没有
INFORMATION_SCHEMA
完全对应的表
mysql.indexes
,但
INFORMATION_SCHEMA.STATISTICS
包含大量相同的信息。
到目前为止,还没有
INFORMATION_SCHEMA
说完全对应表
mysql.foreign_keys
,
mysql.foreign_key_column_usage
。
获取外键信息的标准SQL方法是使用
INFORMATION_SCHEMA
REFERENTIAL_CONSTRAINTS
和
KEY_COLUMN_USAGE
表;
这些表现在实现为在意见
foreign_keys
,
foreign_key_column_usage
和其它数据字典的表。
MySQL 8.0之前的一些系统表已被数据字典表替换,并且不再出现在
mysql
系统模式中:
该
events
数据字典表取代了
event
从MySQL 8.0之前的表。
该
parameters
和
routines
数据字典表一起取代的
proc
从MySQL 8.0前表。
这些系统表包含有关用户帐户及其拥有的权限的授权信息。 有关这些表的结构,内容和用途的其他信息,请参见 第6.2.3节“授权表” 。
从MySQL 8.0开始,授权表是
InnoDB
(事务性)表。
以前,这些是
MyISAM
(非交易)表格。
授权表存储引擎的更改是MySQL 8.0随附的更改与帐户管理语句(如
CREATE
USER
和)
的行为的基础
GRANT
。
以前,为多个用户命名的帐户管理语句可能会对某些用户成功,而对其他用户则失败。
这些语句现在是事务性的,并且对所有命名用户都成功或回滚,如果发生任何错误则无效。
如果MySQL从旧版本升级但授权表尚未升级
MyISAM
到
InnoDB
,则服务器将它们视为只读,并且帐户管理语句会产生错误。
有关升级说明,请参见
第2.11节“升级MySQL”
。
user
:用户帐户,全局权限和其他非特权列。
global_grants
:为用户分配动态全局特权;
请参阅
静态与动态权限
。
db
:数据库级权限。
tables_priv
:表级权限。
columns_priv
:列级权限。
procs_priv
:存储过程和功能权限。
proxies_priv
:代理用户权限。
default_roles
:此表列出了在用户连接并进行身份验证或执行后要激活的默认角色
SET
ROLE
DEFAULT
。
role_edges
:此表列出了角色子图的边。
给定的
user
表行可能指的是用户帐户或角色。
服务器可以通过查询
role_edges
表来获得有关身份验证ID之间关系的信息
,从而区分行是代表用户帐户,角色还是两者
。
password_history
:有关密码更改的信息。
这些系统表包含有关存储的程序,组件,用户定义的函数和服务器端插件的信息:
component
:服务器组件的注册表。
此表中列出的任何组件都由加载程序服务在服务器启动过程中安装。
请参见
第5.5节“MySQL服务器组件”
。
func
:有关用户定义函数(UDF)的信息。
请参见
第29.4节“向MySQL添加新函数”
。
服务器在启动过程中加载此表中列出的UDF,除非使用该
--skip-grant-tables
选项
启动
。
plugin
:有关服务器端插件的信息。
请参见
第5.6.1节“安装和卸载插件”
和
第29.2节“MySQL插件API”
。
服务器在启动过程中加载此表中列出的插件,除非使用该
--skip-grant-tables
选项
启动
。
服务器使用这些系统表来支持复制:
gtid_executed
:用于存储GTID值的表。
请参阅
mysql.gtid_executed表
。
ndb_binlog_index
:NDB群集复制的二进制日志信息。
仅当服务器是使用
NDBCLUSTER
支持
构建的时,才会创建此表
。
请参见
第22.6.4节“NDB集群复制架构和表”
。
slave_master_info
,
slave_relay_log_info
,
slave_worker_info
:用于存储从服务器上复制信息。
请参见
第17.2.4节“复制中继和状态日志”
。
刚刚列出的所有表都使用
InnoDB
存储引擎。
这些系统表供优化器使用:
innodb_index_stats
,
innodb_table_stats
:用于
InnoDB
持久优化器统计信息。
请参见
第15.8.10.1节“配置持久优化器统计信息参数”
。
server_cost
,
engine_cost
:优化程序成本模型使用包含有关查询执行期间发生的操作的成本估算信息的表。
server_cost
包含一般服务器操作的优化程序成本估算。
engine_cost
包含特定存储引擎特定操作的估计值。
请参见
第8.9.5节“优化器成本模型”
。
其他系统表不符合前面的类别:
audit_log_filter
,
audit_log_user
:如果安装了MySQL Enterprise Audit,这些表提供了审计日志过滤器定义和用户帐户的持久存储。
请参见
第6.4.5.8.1节“审计日志表”
。
firewall_users
,
firewall_whitelist
:如果安装了MySQL Enterprise Firewall,这些表为防火墙使用的信息提供持久存储。
请参见
第6.4.7节“MySQL Enterprise Firewall”
。
servers
:由
FEDERATED
存储引擎使用。
请参见
第16.8.2.2节“使用CREATE SERVER创建FEDERATED表”
。
innodb_dynamic_metadata
:由
InnoDB
存储引擎用于存储快速更改的表元数据,例如自动递增计数器值和索引树损坏标志。
替换驻留在
InnoDB
系统表空间中
的数据字典缓冲区表
。
MySQL Server有几个日志可以帮助您找出正在进行的活动。
日志类型 | 写入日志的信息 |
---|---|
错误日志 | 启动,运行或停止 mysqld时 遇到的问题 |
一般查询日志 | 建立客户端连接和从客户端收到的语句 |
二进制日志 | 更改数据的语句(也用于复制) |
中继日志 | 从复制主服务器收到的数据更改 |
慢查询日志 |
long_query_time
执行
时间超过
几秒的
查询
|
DDL日志(元数据日志) | DDL语句执行的元数据操作 |
默认情况下,除Windows上的错误日志外,不启用任何日志。 (DDL日志始终在需要时创建,并且没有用户可配置的选项;请参见 第5.4.6节“DDL日志” 。)以下特定于日志的部分提供有关启用日志记录的服务器选项的信息。
默认情况下,服务器会为数据目录中的所有已启用日志写入文件。
您可以通过刷新日志来强制服务器关闭并重新打开日志文件(或在某些情况下切换到新的日志文件)。
发出
FLUSH LOGS
声明
时会发生日志刷新
;
用
或
参数
执行
mysqladmin
;
或
使用
或
选项
执行
mysqldump
。
请参见
第13.7.7.3节“FLUSH语法”
,
第4.5.2节“
mysqladmin
- 管理MySQL服务器的客户端”
和
第4.5.4节“
mysqldump
- 数据库备份程序”
flush-logs
refresh
--flush-logs
--master-data
。
此外,当二进制日志的大小达到
max_binlog_size
系统变量
的值时,将刷新二进制日志
。
您可以在运行时控制常规查询和减慢查询日志。 您可以启用或禁用日志记录,也可以更改日志文件名。 您可以告诉服务器编写常规查询和慢速查询条目以记录表,日志文件或两者。 有关详细信息,请参见 第5.4.1节“选择常规查询日志和慢查询日志输出目标” , 第5.4.3节“常规查询日志” 和 第5.4.5节“慢查询日志” 。
中继日志仅用于从属复制服务器,用于保存主服务器上的数据更改,该服务器也必须在从属服务器上进行。 有关中继日志内容和配置的讨论,请参见 第17.2.4.1节“从中继日志” 。
有关日志维护操作(如旧日志文件到期)的信息,请参见 第5.4.7节“服务器日志维护” 。
有关保持日志安全的信息,请参见 第6.1.2.3节“密码和日志记录” 。
如果启用了这些日志,MySQL Server可以灵活地控制写入常规查询日志和慢查询日志的输出目标。
日志条目的可能目标是日志文件或
系统数据库中
的
general_log
和
slow_log
表
mysql
。
可以选择文件输出,表格输出或两者。
所述
log_output
系统变量指定日志输出目的地。
设置此变量本身不会启用日志;
必须单独启用它们。
如果
log_output
在启动时未指定,则默认日志记录目标为
FILE
。
如果
log_output
在启动时指定,则其值是列表中选择的一个或多个逗号分隔的单词
TABLE
(
从
日志到表),
FILE
(记录到文件)或
NONE
(不记录到表或文件)。
NONE
,如果存在,则优先于任何其他说明符。
该
general_log
系统变量控制记录到一般查询日志选定的日志目的地。
如果在服务器启动时指定,
general_log
则使用可选参数1或0来启用或禁用日志。
要指定文件记录的默认值以外的文件名,请设置
general_log_file
变量。
同样,
slow_query_log
变量控制记录到所选目标的慢查询日志,并且设置
slow_query_log_file
指定文件记录的文件名。
如果启用了任一日志,则服务器将打开相应的日志文件并将启动消息写入其中。
但是,除非,否则不会进一步将查询记录到文件中
FILE
选择了日志目标。
例子:
要将常规查询日志条目写入日志表和日志文件,请使用
--log_output=TABLE,FILE
以选择两个日志目标并
--general_log
启用常规查询日志。
要仅将常规和慢查询日志条目写入日志表,请使用
--log_output=TABLE
选择表作为日志目标,
--general_log
并
--slow_query_log
启用这两个日志。
要将慢查询日志条目仅写入日志文件,请使用
--log_output=FILE
选择文件作为日志目标并
--slow_query_log
启用慢查询日志。
在这种情况下,由于默认日志目标是
FILE
,您可以省略该
log_output
设置。
与日志表和文件关联的系统变量使运行时控制日志记录:
该
log_output
变量表示当前的日志记录目标。
可以在运行时修改它以更改目标。
在
general_log
与
slow_query_log
变量指示一般查询日志和慢查询日志是否已启用(
ON
)或禁用(
OFF
)。
您可以在运行时设置这些变量以控制是否启用日志。
在
general_log_file
与
slow_query_log_file
变量指示一般查询日志和慢查询日志文件的名称。
您可以在服务器启动时或在运行时设置这些变量以更改日志文件的名称。
要禁用或启用当前会话的常规查询日志记录,请将会话
sql_log_off
变量
设置
为
ON
或
OFF
。
(这假定已启用常规查询日志本身。)
使用表进行日志输出具有以下优点:
日志条目具有标准格式。 要显示日志表的当前结构,请使用以下语句:
SHOW CREATE TABLE mysql.general_log; SHOW CREATE TABLE mysql.slow_log;
可以通过SQL语句访问日志内容。 这使得可以使用仅选择满足特定条件的那些日志条目的查询。 例如,要选择与特定客户端关联的日志内容(这对于从该客户端识别有问题的查询很有用),使用日志表比使用日志文件更容易。
可以通过任何可以连接到服务器并发出查询的客户端远程访问日志(如果客户端具有相应的日志表权限)。 无需登录服务器主机并直接访问文件系统。
日志表实现具有以下特征:
通常,日志表的主要目的是为用户提供一个接口,以观察服务器的运行时执行,而不是干扰其运行时执行。
CREATE
TABLE
,,
ALTER
TABLE
和
DROP
TABLE
是日志表上的有效操作。
对于
ALTER
TABLE
和
DROP
TABLE
,日志表不能使用,必须禁用,如后所述。
默认情况下,日志表使用
CSV
以逗号分隔值格式写入数据
的
存储引擎。
对于有权访问
.CSV
包含日志表数据的文件的
用户,可以
将文件轻松导入其他程序,例如可以处理CSV输入的电子表格。
可以更改日志表以使用
MyISAM
存储引擎。
您不能用于
ALTER
TABLE
更改正在使用的日志表。
必须先禁用日志。
除
日志表
之外没有其他引擎
CSV
或
MyISAM
合法的
引擎
。
日志表和
“
打开的文件太多
”
错误。
如果选择
TABLE
作为日志目标并且日志表使用
CSV
存储引擎,您可能会发现在运行时重复禁用和启用常规查询日志或慢速查询日志
.CSV
会导致
文件的许多打开
文件描述符,从而可能导致
“
打开文件太多
”
错误。
要解决此问题,请执行
FLUSH
TABLES
或确保值
open_files_limit
大于值
table_open_cache_instances
。
要禁用日志记录以便可以更改(或删除)日志表,可以使用以下策略。
该示例使用通用查询日志;
慢查询日志的过程类似,但使用
slow_log
表和
slow_query_log
系统变量。
SET @old_log_state = @@ GLOBAL.general_log; SET GLOBAL general_log ='OFF'; ALTER TABLE mysql.general_log ENGINE = MyISAM; SET GLOBAL general_log = @old_log_state;
TRUNCATE
TABLE
是对日志表的有效操作。
它可用于使日志条目到期。
RENAME
TABLE
是对日志表的有效操作。
您可以使用以下策略以原子方式重命名日志表(例如,执行日志轮换):
使用mysql; DROP TABLE IF EXISTS general_log2; CREATE TABLE general_log2 LIKE general_log; RENAME TABLE general_log TO general_log_backup,general_log2 TO general_log;
CHECK TABLE
是对日志表的有效操作。
LOCK
TABLES
不能在日志表上使用。
FLUSH TABLES WITH
READ LOCK
并且
read_only
系统变量
的状态
对日志表没有影响。
服务器始终可以写入日志表。
写入日志表的条目不会写入二进制日志,因此不会复制到从属服务器。
要刷新日志表或日志文件
,请分别
使用
FLUSH TABLES
或
FLUSH LOGS
。
不允许对日志表进行分区。
一个 mysqldump的 转储包括报表中重新创建这些表,以便它们不会重新加载转储文件后失踪。 不转储日志表内容。
本节讨论如何配置MySQL服务器以将诊断消息记录到错误日志中。 有关选择错误消息字符集或语言的信息,请参见 第10.6节“错误消息字符集” 或 第10.11节“设置错误消息语言” 。
错误日志包含 mysqld 启动和关闭时间 的记录 。 它还包含诊断消息,例如在服务器启动和关闭期间以及服务器运行时发生的错误,警告和注释。 例如,如果 mysqld 注意到需要自动检查或修复表,它会将消息写入错误日志。
在某些操作系统上,如果 mysqld 异常退出 ,则错误日志包含堆栈跟踪 。 跟踪可用于确定 mysqld 退出的位置。 请参见 第29.5节“调试和移植MySQL” 。
如果用于启动
mysqld
,
mysqld_safe
可能会将消息写入错误日志。
例如,当
mysqld_safe
注意到
mysqld
出现
异常
时
,它会重新启动
mysqld
并将
mysqld
restarted
消息
写入
错误日志。
以下部分讨论配置错误日志记录的各个方面。
在MySQL 8.0中,错误记录使用 第5.5节“MySQL服务器组件”中 描述的MySQL组件体系结构 。 错误日志子系统由执行日志事件过滤和写入的组件以及配置哪些组件以实现所需日志记录结果的系统变量组成。
本节讨论如何选择错误日志记录的组件。 有关日志过滤器的特定说明,请参见 第5.4.2.3节“错误日志过滤类型” 。 有关JSON和系统日志编写器的特定说明,请参见 第5.4.2.6节“以JSON格式记录错误” 和 第5.4.2.7节“记录到系统日志中的错误” 。 有关所有可用日志组件的其他详细信息,请参见 第5.5.3节“错误日志组件” 。
基于组件的错误记录提供以下功能:
可以通过过滤器组件过滤日志事件,以影响可用于写入的信息。
日志事件由接收器(编写器)组件输出。 可以启用多个接收器组件,以将错误日志输出写入多个目标。
内置过滤器和写入器组件组合在一起以实现默认的错误日志格式。
可加载的编写器支持以JSON格式登录。
可加载的写入程序允许记录到系统日志。
系统变量控制要启用的日志组件以及每个组件的运行方式。
的
log_error_services
哪个日志组件系统变量控制以启用错误日志记录。
变量可以包含具有0,1或许多元素的列表。
在后一种情况下,元素可以用分号或(从MySQL 8.0.12开始)逗号分隔,可选地后跟空格。
给定的设置不能同时使用分号和逗号分隔符。
组件顺序很重要,因为服务器按列出的顺序执行组件。
默认情况下,
log_error_services
具有此值:
MySQL的> SELECT @@GLOBAL.log_error_services;
+ ---------------------------------------- +
| @@ GLOBAL.log_error_services |
+ ---------------------------------------- +
| log_filter_internal; log_sink_internal |
+ ---------------------------------------- +
该值表示日志事件首先通过内置过滤器组件
log_filter_internal
,然后通过内置日志编写器组件
log_sink_internal
。
过滤器修改后面在名称中命名的组件所看到的日志事件
log_error_services
。
接收器是日志事件的目标。
通常,接收器将日志事件处理为具有特定格式的日志消息,并将这些消息写入其关联的输出,例如文件或系统日志。
分配
log_error_services
不包含编写器组件的值不会导致从该点写入日志输出。
值中的最后一个组件
log_error_services
应该是writer。
如果最终组件是过滤器,则该组件无效,因为过滤的事件不会发送到任何编写器。
组合
log_filter_internal
并
log_sink_internal
实现默认的错误日志过滤和输出行为。
这些组件的操作受其他服务器选项和系统变量的影响:
输出目标由
--log-error
选项(以及Windows,
--pid-file
和
--console
)确定。
这些确定是将错误消息写入控制台还是文件,如果是文件,则确定错误日志文件名。
请参见
第5.4.2.2节“默认错误日志目标配置”
。
该
log_error_verbosity
和
log_error_suppression_list
系统变量影响哪些类型的日志事件
log_filter_internal
许可证或者抑制。
请参见
第5.4.2.4节“基于优先级的错误日志过滤(log_filter_internal)”
。
要更改用于错误日志记录的日志组件集,请根据需要加载组件并修改该
log_error_services
值。
添加或删除日志组件受以下限制:
要启用日志组件,首先使用它
INSTALL
COMPONENT
(除非它是内置或已加载),然后在
log_error_services
值中
列出组件
。
对于
log_error_services
值中
允许的组件
,必须知道它。
如果组件是内置的,或者它是可加载的并且已使用加载,则该组件是已知的
INSTALL
COMPONENT
。
尝试在服务器启动时命名未知组件会导致
log_error_services
设置为其默认值。
尝试在运行时命名未知组件会产生错误,并且
log_error_services
值保持不变。
要禁用日志组件,请将其从
log_error_services
值中
删除
。
然后,如果组件是可加载的并且您还想卸载它,请使用
UNINSTALL
COMPONENT
。
尝试用于
UNINSTALL
COMPONENT
卸载仍在
log_error_services
值中
命名的可加载组件会
产生错误。
例如,要使用系统日志writer(
log_sink_syseventlog
)而不是默认的writer(
log_sink_internal
),首先加载writer组件,然后修改
log_error_services
值:
INSTALL COMPONENT'file:// component_log_sink_syseventlog'; SET GLOBAL log_error_services ='log_filter_internal; log_sink_syseventlog“;
用于加载日志组件的URN
INSTALL
COMPONENT
是前缀为的组件名称
file://component_
。
例如,对于
log_sink_syseventlog
组件,相应的URN是
file://component_log_sink_syseventlog
。
可以配置多个日志写入器,从而可以将输出发送到多个目标。
要启用系统日志编写器(而不是代替)默认编写器,请设置如下所示的
log_error_services
值:
SET GLOBAL log_error_services ='log_filter_internal; log_sink_internal; log_sink_syseventlog“;
要恢复为仅使用默认编写器并卸载系统日志编写器,请执行以下语句:
SET GLOBAL log_error_services ='log_filter_internal; log_sink_internal; UNINSTALL COMPONENT'file:// component_log_sink_syseventlog';
要配置要在每个服务器启动时启用的日志组件,请使用以下过程:
如果组件是可加载的,请在运行时使用加载它
INSTALL
COMPONENT
。
加载组件会将其注册到
mysql.component
系统表中,以便服务器自动加载它以用于后续启动。
log_error_services
在启动时
设置
值以包括组件名称。
在服务器
my.cnf
文件中
设置值
,或者使用
SET
PERSIST
,它设置正在运行的MySQL实例的值,并保存用于后续服务器重启的值;
请参见
第13.7.5.1节“变量赋值的SET语法”
。
设置的值在
my.cnf
下次重新启动时生效。
使用的值设置
SET
PERSIST
立即生效,并用于后续重新启动。
假设您要为每个服务器启动配置
log_sink_json
除了内置日志过滤器和编写器(
log_filter_internal
,
log_sink_internal
)
之外还
使用JSON日志writer(
)。
首先加载JSON编写器(如果未加载):
INSTALL COMPONENT'file:// component_log_sink_json';
然后设置
log_error_services
为在服务器启动时生效。
您可以将其设置为
my.cnf
:
的[mysqld] log_error_services ='log_filter_internal; log_sink_internal; log_sink_json”
或者您可以使用
SET
PERSIST
以下
方式设置
:
SET PERSIST log_error_services ='log_filter_internal; log_sink_internal; log_sink_json“;
命名的组件的顺序
log_error_services
是重要的,特别是关于过滤器和写入器的相对顺序。
考虑这个
log_error_services
值:
log_filter_internal; log_sink_1; log_sink_2
在这种情况下,日志事件传递给内置过滤器,然后传递给第一个编写器,然后传递给第二个编写器。 两个编写者都会收到过滤后的日志事件。
将其与此
log_error_services
值
进行比较
:
log_sink_1; log_filter_internal; log_sink_2
在这种情况下,日志事件传递给第一个编写器,然后传递给内置过滤器,然后传递给第二个编写器。 第一位作家收到未经过滤的事件。 第二个作者接收过滤事件。 如果希望一个日志包含所有日志事件的消息,并且另一个日志仅包含针对日志事件子集的消息,则可以按此方式配置错误日志记录。
本节讨论哪些服务器选项配置默认错误日志目标,可以是控制台或命名文件。 它还指示哪些日志写入程序组件将其自己的输出目标基于默认目标。
在本讨论中,
“
控制台
”
表示
stderr
标准错误输出。
这是您的终端或控制台窗口,除非标准错误输出已重定向到其他目标。
对于Windows和Unix系统,服务器解释确定默认错误日志目标的选项略有不同。 请务必使用适合您平台的信息配置目标:
在服务器解释默认错误日志目标选项后,它会设置
log_error
系统变量以指示默认目标,这会影响多个日志写程序组件写入错误消息的位置。
请参见
默认错误日志目标如何影响日志写入程序
。
在Windows上,
mysqld的
使用
--log-error
,
--pid-file
和
--console
选项来确定默认的错误日志目的地是否是控制台或文件,并且,如果一个文件,文件名:
如果
--console
给定,则默认目标是控制台。
(
--console
优先于
--log-error
两者都给出,以下项目
--log-error
不适用。)
如果
--log-error
未给出,或者在未命名文件的情况下给出,则默认目标是
数据目录
host_name
.err--pid-file
中指定
的文件
,除非
指定了
该
选项。
在这种情况下,文件名是PID文件基本名称,
.err
在数据目录中
带有后缀
。
如果
--log-error
命名文件,则默认目标是该文件(
.err
如果名称没有后缀,则添加后缀),位于数据目录下,除非给出绝对路径名以指定其他位置。
如果默认错误日志目标是控制台,则服务器将
log_error
系统变量设置为
stderr
。
否则,默认目标是文件,服务器设置
log_error
为文件名。
在Unix和类Unix系统上,
mysqld
使用该
--log-error
选项来确定默认错误日志目标是控制台还是文件,如果是文件,则确定文件名:
如果
--log-error
未给出,则默认目标是控制台。
如果
--log-error
在没有命名文件的情况下给出,则默认目标是
在数据目录中
命名的文件
。
host_name
.err
如果
--log-error
命名文件,则默认目标是该文件(
.err
如果名称没有后缀,则添加后缀),位于数据目录下,除非给出绝对路径名以指定其他位置。
如果
--log-error
在选项文件中给定的
[mysqld]
,
[server]
或
[mysqld_safe]
部分,
mysqld_safe的
查找和使用的选项,并将其传递到
mysqld的
。
Yum或APT软件包安装通常
使用服务器配置文件中
/var/log
的选项
配置错误日志文件位置
log-error=/var/log/mysqld.log
。
从选项中删除文件名会导致
使用数据目录中
的
文件。
host_name
.err
如果默认错误日志目标是控制台,则服务器将
log_error
系统变量设置为
stderr
。
否则,默认目标是文件,服务器设置
log_error
为文件名。
在服务器解释错误日志目标配置选项后,它会设置
log_error
系统变量以指示默认错误日志目标。
日志编写器组件可以将自己的输出目标基于
log_error
值,或者独立地确定其目标
log_error
如果
log_error
是
stderr
,则默认错误日志目标是控制台,并且将其输出目标基于默认目标的日志编写器也写入控制台:
log_sink_internal
,
log_sink_json
,
log_sink_test
:这些作家写到控制台。
即使对于诸如
log_sink_json
可以多次启用的
编写者也是如此
;
所有实例都写入控制台。
log_sink_syseventlog
:无论
log_error
值
如何,此writer都会写入系统日志
。
如果
log_error
不是
stderr
,则默认错误日志目标是文件并
log_error
指示文件名。
将其输出目标基于默认目标库输出文件的日志编写器命名为该文件名。
(作者可能使用该名称,或者可能使用其中的一些变体。)假设该
log_error
值
file_name
。
然后日志编写者使用如下名称:
log_sink_internal
,
log_sink_test
:这些作家写信给
file_name
。
log_sink_json
:此
log_error_services
编写器的
连续实例在
值中写入名为
file_name
plus的
文件,
加上编号
后缀:
,
等等。
.
NN
.jsonfile_name
.00.jsonfile_name
.01.json
log_sink_syseventlog
:无论
log_error
值
如何,此writer都会写入系统日志
。
错误日志配置通常包括一个日志过滤器组件和一个或多个日志写入器组件。 对于错误日志过滤,MySQL提供了多种组件选择:
log_filter_internal
:此筛选器组件根据日志事件优先级和错误代码
log_error_verbosity
以及
log_error_suppression_list
系统变量
提供错误日志筛选
。
log_filter_internal
内置并默认启用。
请参见
第5.4.2.4节“基于优先级的错误日志过滤(log_filter_internal)”
。
log_filter_dragnet
:此筛选器组件结合
dragnet.log_error_filter_rules
系统变量
提供基于用户提供的规则的错误日志筛选
。
请参见
第5.4.2.5节“基于规则的错误日志过滤(log_filter_dragnet)”
。
的
log_filter_internal
日志过滤器组件实现基于误差事件优先级和错误码日志过滤的简单形式。
要影响
log_filter_internal
允许或禁止用于错误日志的错误,警告和信息事件的方式,请设置
log_error_verbosity
和
log_error_suppression_list
系统变量。
log_filter_internal
内置并默认启用。
如果此过滤器已禁用
log_error_verbosity
且
log_error_suppression_list
无效,则必须使用其他过滤器服务对过滤进行建模(例如,使用时使用单个过滤器规则
log_filter_dragnet
)。
有关过滤器配置的信息,请参见
第5.4.2.1节“错误日志组件配置”
。
用于错误日志事件具有的优先级
ERROR
,
WARNING
或
INFORMATION
。
在
log_error_verbosity
此基础上的优先级系统变量控制冗长,以允许用于写入日志消息,如图所示,在下表中。
允许的消息优先级 | log_error_verbosity值 |
---|---|
ERROR |
1 |
ERROR
,
WARNING
|
2 |
ERROR
,
WARNING
,
INFORMATION
|
3 |
如果
log_error_verbosity
为2或更大,则服务器会记录有关基于语句的日志记录不安全的语句的消息。
如果值为3,则服务器会记录新连接尝试的已中止连接和访问被拒绝错误。
请参见
第B.4.2.10节“通信错误和中止的连接”
。
如果使用复制,
log_error_verbosity
建议
使用
值2或更大,以获取有关正在发生的情况的更多信息,例如有关网络故障和重新连接的消息。
如果
log_error_verbosity
从属服务器上为2或更大,则从属服务器将消息打印到错误日志以提供有关其状态的信息,例如二进制日志和中继日志坐标开始工作,何时切换到另一个中继日志,何时它在断开连接后重新连接,依此类推。
还有一个优先事项
SYSTEM
。
无论
log_error_verbosity
值
如何,都会将有关非错误情况的系统消息打印到错误日志中
。
这些消息包括启动和关闭消息,以及对设置的一些重大更改。
在MySQL错误日志中,系统消息标记为 “ 系统 ” 。 其他日志编写器可能会也可能不遵循相同的约定,并且在生成的日志中,系统消息可能会被分配用于信息优先级的标签,例如 “ Note ” 或 “ Information ” 。 如果根据消息标记应用任何其他过滤或重定向进行日志记录,则系统消息不会覆盖您的过滤器,但会以与其他消息相同的方式处理。
该
log_error_suppression_list
系统变量适用于用于错误日志事件,并指定时,他们用的优先级进行打压的事件
WARNING
或
INFORMATION
。
例如,如果特定类型的警告
在错误日志中
被认为是不合需要的
“
噪声
”
,因为它经常发生但不感兴趣,则可以抑制它。
该
log_error_suppression_list
值可以是无抑制的空字符串,或者是指示要抑制的错误代码的一个或多个逗号分隔值的列表。
错误代码可以用符号或数字形式指定。
可以使用或不使用
MY-
前缀
指定数字代码
。
数字部分中的前导零并不重要。
允许的代码格式示例:
ER_SERVER_SHUTDOWN_COMPLETE MY-000031 000031 MY-31 31
对于可读性和可移植性,符号值优于数值。
虽然要抑制的代码可以用符号或数字形式表示,但每个代码的数值必须在允许的范围内:
1到999:服务器和客户端使用的全局错误代码。
10000及更高:用于写入错误日志的服务器错误代码(不发送给客户端)。
此外,MySQL指定的每个错误代码实际上都必须使用。
尝试指定不在允许范围内或允许范围内但MySQL未使用的代码会产生错误,并且
log_error_suppression_list
值保持不变。
有关错误代码范围以及每个范围内定义的错误符号和数字的信息,请参阅 附录B, 错误,错误代码和常见问题 。
服务器可以为不同优先级的给定错误代码生成消息,因此抑制与列出的错误代码相关联的消息
log_error_suppression_list
取决于其优先级。
假设变量的值为
'ER_PARSER_TRACE,MY-010001,10002'
。
然后
log_error_suppression_list
有这些影响:
如果以优先级为
WARNING
或
生成,则会抑制这些代码的消息
INFORMATION
。
生成的优先级为
ERROR
或
SYSTEM
未被抑制的消息。
log_error_verbosity
结合
的效果
log_error_suppression_list
。
考虑使用这些设置启动的服务器:
的[mysqld] log_error_verbosity = 2#仅错误和警告消息 log_error_suppression_list = 'ER_PARSER_TRACE,MY-010001,10002'
在这种情况下,
log_error_verbosity
允许以邮件
ERROR
或
WARNING
优先级,并丢弃报文
INFORMATION
优先级。
在未被
log_error_suppression_list
丢弃的
消息中,
丢弃具有
WARNING
优先级的
消息
和任何指定的错误代码。
log_error_verbosity
示例中显示
的
值2也是其默认值,因此默认情况下,此变量对
INFORMATION
消息的影响如下所述,没有显式设置。
log_error_verbosity
如果要
优先
log_error_suppression_list
影响邮件,
则
必须设置
为3
INFORMATION
。
考虑使用此设置启动的服务器:
的[mysqld] log_error_verbosity =仅1#错误消息
在这种情况下,
log_error_verbosity
允许具有
ERROR
优先级的消息并丢弃具有
WARNING
或
INFORMATION
优先级的
消息
。
设置
log_error_suppression_list
将无效,因为它可能抑制的所有错误代码已由于
log_error_verbosity
设置
而被丢弃
。
的
log_filter_dragnet
日志过滤器组件能够基于用户定义的规则日志过滤。
要定义适用的规则,请设置
dragnet.log_error_filter_rules
系统变量。
要启用
log_filter_dragnet
过滤器,首先加载过滤器组件,然后修改该
log_error_services
值。
以下示例
log_filter_dragnet
与内置日志编写器结合使用:
INSTALL COMPONENT'file:// component_log_filter_dragnet'; SET GLOBAL log_error_services ='log_filter_dragnet; log_sink_internal“;
要设置
log_error_services
为在服务器启动时生效,请使用
第5.4.2.1节“错误日志组件配置”中的说明
。
这些说明也适用于其他错误记录系统变量。
随着
log_filter_dragnet
启动,通过设置定义它的过滤规则
dragnet.log_error_filter_rules
系统变量。
规则集由零个或多个规则组成,其中每个规则是
IF
由句点(
.
)字符
终止
的
语句
。
如果变量值为空(零规则),则不进行过滤。
示例1.此规则集删除信息事件,对于其他事件,删除
source_line
字段:
SET GLOBAL dragnet.log_error_filter_rules = '如果prio> =信息然后下降。如果EXISTS source_line那么取消设置source_line。';
效果类似于过滤器执行的
log_sink_internal
过滤设置
log_error_verbosity=2
。
示例2:此规则将信息事件限制为每60秒不超过一个:
SET GLOBAL dragnet.log_error_filter_rules = '如果prio> =信息那么油门1/60。';
根据需要设置过滤配置后,请考虑
dragnet.log_error_filter_rules
使用
SET
PERSIST
而不是
SET
GLOBAL
使设置在服务器重新启动时保持不变。
或者,将设置添加到服务器选项文件。
要停止使用过滤语言,请先从错误日志记录组件集中删除它。 通常这意味着使用不同的过滤器组件而不是过滤器组件。 例如:
SET GLOBAL log_error_services ='log_filter_internal; log_sink_internal“;
同样,请考虑使用using
SET
PERSIST
而不是
SET
GLOBAL
使设置在服务器重新启动时保持不变。
然后卸载过滤器
log_filter_dragnet
组件:
UNINSTALL COMPONENT'file:// component_log_filter_dragnet';
以下部分
log_filter_dragnet
更详细地
描述了
操作的
各个方面
:
以下语法定义了
log_filter_dragnet
过滤规则
的语言
。
每个规则都是一个
IF
以句点(
.
)字符
结尾
的
语句
。
该语言不区分大小写。
rule
: 如果condition
那么action
[ELSEIFcondition
那么action
] ...... [ELSEaction
] 。condition
:{ | [NOT] EXISTS | {AND | 要么}field
comparator
value
field
condition
condition
}action
:{ 下降 | 油门{count
|count
/window_size
} | 设置field
[:= | =]value
| 未设置[field
] }field
:{core_field
|optional_field
|user_defined_field
}core_field
:{ 时间 | 味精 | PRIO | 标签 | err_code | err_symbol | 的sql_state | 子系统 }optional_field
:{ OS_errno | OS_errmsg | 用户 | 主办 | 线 | query_id | 源文件 | source_line | 功能 }user_defined_field
:sequence of characters in [a-zA-Z0-9_] class
comparator
:{== | != | <> | > = | => | <= | = <| <| >}value
:{string_literal
|integer_literal
|float_literal
|error_symbol
|priority
}count
::integer_literal
window_size
integer_literal
string_literal
:sequence of characters quoted as '...' or "..."
integer_literal
:sequence of characters in [0-9] class
float_literal
:integer_literal
[。integer_literal
]error_symbol
:valid MySQL error symbol such as ER_ACCESS_DENIED_ERROR or ER_STARTUP
priority
:{ 错误 | 警告 | 信息 }
简单条件将字段与值或测试字段存在进行比较。
要构建更复杂的条件,请使用
AND
和
OR
运算符。
两个运算符具有相同的优先级,并从左到右进行求值。
要转义字符串中的字符,请在其前面加上反斜杠(
\
)。
反斜杠需要包含反斜杠本身或字符串引用字符,其他字符可选。
为方便起见,
log_filter_dragnet
支持用于与某些字段进行比较的符号名称。
在适用的情况下,符号值优于数值,以提高可读性和便携性。
事件优先级值1,2,和3可被指定为
ERROR
,
WARNING
,和
INFORMATION
。
优先级符号仅在与
prio
字段
比较时才被识别
。
这些比较是等效的:
如果prio ==信息然后...... 如果prio == 3那么......
错误代码可以用数字形式指定,也可以指定为相应的错误符号。
例如,
ER_STARTUP
是错误的符号名称
1408
,因此这些比较是等效的:
如果err_code == ER_STARTUP那么...... 如果err_code == 1408然后......
仅在与
err_code
字段和用户定义字段
进行比较时才能识别错误符号
。
要查找与给定错误代码编号对应的错误符号,请使用以下方法之一:
在 第B.3.1节“服务器错误消息参考”中 检查服务器错误列表 。
使用 perror 命令,该命令在给定错误编号参数时显示有关错误的信息,包括其符号。
假设带有错误编号的规则集如下所示:
如果err_code == 10927或者err_code == 10914那么下降。 如果err_code == 1131那么下降。
使用 perror ,确定错误符号:
外壳> perror 10927 10914 1131
MySQL错误代码MY-010927(ER_ACCESS_DENIED_FOR_USER_ACCOUNT_LOCKED):
用户'%-.48s'@'%-.64s'拒绝访问。帐户被锁定。
MySQL错误代码MY-010914(ER_ABORTING_USER_CONNECTION):
中止连接%u到db:'% - 。192s'用户:'% - 。48s'主机:
'% - .64s'(% - .64s)。
MySQL错误代码MY-001131(ER_PASSWORD_ANONYMOUS_USER):
您使用MySQL作为匿名用户和匿名用户
不允许更改密码
将错误符号替换为数字,规则集变为:
IF err_code == ER_ACCESS_DENIED_FOR_USER_ACCOUNT_LOCKED 或者err_code == ER_ABORTING_USER_CONNECTION然后下降。 IF err_code == ER_PASSWORD_ANONYMOUS_USER然后掉线。
可以将符号名称指定为带引号的字符串,以便与字符串字段进行比较,但在这种情况下,名称是没有特殊含义的字符串,并且
log_filter_dragnet
不会将它们解析为相应的数字值。
此外,错别字可能未被检测到,而
SET
对于尝试使用服务器未知的未加引号的符号会
立即引发错误
。
log_filter_dragnet
在过滤规则中支持这些操作:
drop
:删除当前日志事件(不要记录它)。
throttle
:应用速率限制以减少与特定条件匹配的事件的日志详细程度。
所述参数指示的速率,在形式
count
或
count
/
window_size
。
该
count
值指示每个时间窗口记录的允许事件数。
该
window_size
值是以秒为单位的时间窗口;
如果省略,则默认窗口为60秒。
两个值都必须是整数文字。
此规则将插件关闭消息限制为每60秒5个:
IF err_code == ER_PLUGIN_SHUTTING_DOWN_PLUGIN那么油门5。
此规则将错误和警告限制为每小时1000次,信息消息每小时100次:
IF prio <= INFORMATION THEN油门1000/3600 ELSE油门100/3600。
set
:为字段分配值(如果字段尚未存在,则使字段存在)。
在后续规则中,
EXISTS
针对字段名称的测试为真,并且可以通过比较条件测试新值。
unset
:丢弃一个字段。
在后续规则中,
EXISTS
针对字段名称的测试是错误的,并且字段与任何值的比较都是错误的。
在条件仅引用一个字段名称的特殊情况下,后面的字段名称
unset
是可选的,并
unset
丢弃命名字段。
这些规则是等效的:
如果myfield == 2那么未设置myfield。 如果myfield == 2那么未设置。
log_filter_dragnet
支持规则中的核心,可选和用户定义字段:
为错误事件自动设置核心字段。 但是,它在事件中的存在不能得到保证,因为核心字段(如任何类型的字段)可能会被过滤规则取消设置。 如果是这样,那么将在规则集中的后续规则以及在过滤器之后执行的组件(例如日志编写器)中找不到该字段。
通常不存在可选字段,但某些事件类型可能存在。 如果存在,可选字段会根据需要提供其他事件信息。
用户定义的字段是名称尚未定义为核心或可选字段的任何字段。
在使用
set
操作
创建之前,用户定义的字段不存在
。
如前面的描述所暗示的,任何给定的字段可以不存在,或者因为它首先不存在,或者被过滤规则丢弃。 对于日志编写者,字段缺失的影响是特定于编写者的。 例如,编写器可能会从日志消息中省略该字段,指示该字段缺失或替换默认值。 如有疑问,请使用过滤规则取消设置字段,然后检查日志编写器对其执行的操作。
这些字段是核心字段:
time
事件时间戳。
msg
事件消息字符串。
prio
事件优先级,用于指示错误,警告或注释/信息事件。
该字段对应于严重性
syslog
。
在比较中,可以将每个优先级指定为符号优先级名称或整数文字。
优先级符号仅在与
prio
字段
比较时才被识别
。
这些比较是等效的:
如果prio ==信息然后...... 如果prio == 3那么......
下表显示了允许的优先级。
事件类型 | 优先符号 | 数字优先级 |
---|---|---|
错误事件 | ERROR |
1 |
警告事件 | WARNING |
2 |
注释/信息事件 | INFORMATION |
3 |
还有一个优先级
SYSTEM
,但系统消息无法过滤,并始终写入错误日志。
通常,消息优先级确定如下:
情况或事件是否可行?
是的:情况或事件是否可以忽略?
是的:优先级是
WARNING
。
不:优先权是
ERROR
。
否:情况或事件是强制性的吗?
是的:优先级是
SYSTEM
。
不:优先权是
INFORMATION
。
优先级值遵循较高优先级具有较低值的原则,反之亦然。
对于最严重的事件(错误),优先级值从1开始,对于优先级降低的事件,优先级值增加。
例如,要丢弃优先级低于警告的事件,请测试高于以下值的优先级值
WARNING
:
如果prio>警告然后下降。
以下示例显示了
log_filter_dragnet
实现类似于
过滤器
log_error_verbosity
允许的
每个
值
的效果
的
规则
log_filter_internal
:
仅错误(
log_error_verbosity=1
):
如果prio>错误然后下降。
错误和警告(
log_error_verbosity=2
):
如果prio>警告然后下降。
错误,警告和注释(
log_error_verbosity=3
):
如果prio>信息然后下降。
实际上可以省略此规则,因为没有
prio
大于的值
INFORMATION
,所以实际上它不会丢失任何内容。
err_code
数字事件错误代码。
在比较中,要测试的值可以指定为符号错误名称或整数文字。
仅在与
err_code
字段和用户定义字段
进行比较时才能识别错误符号
。
这些比较是等效的:
如果err_code == ER_ACCESS_DENIED_ERROR那么...... 如果err_code == 1045然后......
err_symbol
事件错误符号,作为字符串(例如
'ER_DUP_KEY'
)。
err_symbol
值更多用于标识日志输出中的特定行,而不是用于过滤器规则比较,因为
log_filter_dragnet
不会将指定为字符串的比较值解析为等效的数字错误代码。
SQL_state
事件SQLSTATE值,作为字符串(例如
'23000'
)。
subsystem
事件发生的子系统。
可能的值是
InnoDB
(
InnoDB
存储引擎),
Repl
(复制子系统),
Server
(否则)。
可选字段分为以下几类:
有关错误的其他信息,例如操作系统发出的错误或错误标签:
OS_errno
操作系统错误号。
OS_errmsg
操作系统错误消息。
label
与
prio
值
对应的标签
,作为字符串。
过滤规则可以更改支持自定义标签的日志编写器的标签。
label
值更多用于标识日志输出中的特定行,而不是用于过滤器规则比较,因为
log_filter_dragnet
不会将指定为字符串的比较值解析为等效的数字优先级。
识别发生事件的客户端:
user
客户端用户。
host
客户端主机。
thread
线程ID。
query_id
查询ID。
调试信息:
source_file
发生事件的源文件。
文件名应省略任何前导路径。
例如,要测试
sql/gis/distance.cc
文件,请按以下方式编写比较:
如果source_file ==“distance.cc”那么......
source_line
发生事件的源文件中的行。
function
事件发生的功能。
component
发生事件的组件或插件。
本节介绍如何使用内置过滤器
log_filter_internal
和JSON编写
器配置错误日志记录
log_sink_json
,以使其立即生效以及后续服务器启动。
有关配置错误日志记录的一般信息,请参见
第5.4.2.1节“错误日志组件配置”
。
要启用JSON编写器,首先加载writer组件,然后修改
log_error_services
值:
INSTALL COMPONENT'file:// component_log_sink_json'; SET GLOBAL log_error_services ='log_filter_internal; log_sink_json“;
要设置
log_error_services
为在服务器启动时生效,请使用
第5.4.2.1节“错误日志组件配置”中的说明
。
这些说明也适用于其他错误记录系统变量。
允许
log_sink_json
在
log_error_services
值中
多次
命名
。
例如,要使用一个实例编写未筛选的事件并使用另一个实例编写筛选的事件,您可以这样设置
log_error_services
:
SET GLOBAL log_error_services ='log_sink_json; log_filter_internal; log_sink_json“;
JSON日志编写器根据
log_error
系统变量
给出的默认错误日志目标确定其输出目标
。
如果
log_error
命名文件,则JSON
编写器将
输出文件命名为该文件名,加上编号
后缀,
从00开始。例如,如果
是
,
则
值
中的
连续
命名
实例
将
写入
,
等等。
.
NN
.jsonNN
log_error
file_name
log_sink_json
log_error_services
file_name
.00.jsonfile_name
.01.json
如果
log_error
是
stderr
,则JSON编写器写入控制台。
如果
log_json_writer
在
log_error_services
值中
多次命名
,它们都会写入控制台,这可能没用。
mysqld
可以
将错误日志写入系统日志(Windows
syslog
上
的事件日志,以及
Unix和类Unix系统上)。
本节介绍如何使用内置过滤器
log_filter_internal
和系统日志写入
器配置错误日志记录
log_sink_syseventlog
,以便立即生效并为后续服务器启动生效。
有关配置错误日志记录的一般信息,请参见
第5.4.2.1节“错误日志组件配置”
。
要启用系统日志编写器,首先加载writer组件,然后修改
log_error_services
值:
INSTALL COMPONENT'file:// component_log_sink_syseventlog'; SET GLOBAL log_error_services ='log_filter_internal; log_sink_syseventlog“;
要设置
log_error_services
为在服务器启动时生效,请使用
第5.4.2.1节“错误日志组件配置”中的说明
。
这些说明也适用于其他错误记录系统变量。
对于MySQL 8.0配置,必须明确启用错误日志记录到系统日志。 这与MySQL 5.7及更早版本不同,默认情况下,在Windows上启用了错误记录到系统日志,并且在所有平台上都不需要加载组件。
记录到系统日志时出错可能需要额外的系统配置。 请参阅所用平台的系统日志文档。
在Windows上,写入应用程序日志中的事件日志的错误消息具有以下特征:
标记为
Error
,
Warning
和
Note
写入事件日志的
条目
,但不是诸如来自各个存储引擎的信息语句之类的消息。
事件日志条目具有
MySQL
(或者
如果
定义为
)的源。
MySQL-
tag
syseventlog.tag
tag
在Unix和类Unix系统上,记录到系统日志使用
syslog
。
以下系统变量会影响
syslog
消息:
syseventlog.facility
:
syslog
消息
的默认工具
是
daemon
。
设置此变量以指定其他工具。
syseventlog.include_pid
:是否在每行
syslog
输出中
包含服务器进程ID
。
syseventlog.tag
:此变量定义要添加到
消息中
的服务器标识符(
mysqld
)
的标记
syslog
。
如果已定义,则标记将附加到带有前导连字符的标识符。
在此之前的MySQL 8.0.13,使用
log_syslog_facility
,
log_syslog_include_pid
和
log_syslog_tag
系统变量,而不是
变量。
syseventlog.
xxx
MySQL使用自定义标签
“
System
”
来获取有关非错误情况的重要系统消息,例如启动,关闭以及对设置的一些重大更改。
在不支持自定义标签的日志中,包括Windows
syslog
上
的事件日志,以及
Unix和类Unix系统,系统消息将分配用于信息优先级的标签。
但是,即使MySQL
log_error_verbosity
设置通常排除信息级别的消息
,这些消息也会打印到日志中
。
当日志编写器必须
以这种方式
回退到
“
信息
”
而不是
“
系统
”
的标签
,并且日志事件在MySQL服务器之外进一步处理(例如,通过
syslog
配置
过滤或转发
),这些事件可能默认情况下,辅助应用程序将其处理为
“
信息
”
优先级而不是
“
系统
”
优先级。
每个错误日志接收器(编写器)组件都具有用于将消息写入其目标的特征输出格式,但其他因素可能会影响消息的内容:
日志编写者可用的信息。 如果在执行writer组件之前执行的日志过滤器组件删除了日志事件属性,则该属性不可用于写入。 有关日志过滤的信息,请参见 第5.4.2.3节“错误日志过滤的类型” 。
系统变量可能会影响日志编写器。 请参阅 影响错误日志格式的系统变量 。
对于所有日志编写器,错误日志消息中包含的ID是 mysqld中 负责编写消息 的线程的ID 。 这表示服务器的哪个部分生成了消息,并且与通用查询日志和慢查询日志消息(包括连接线程ID)一致。
此日志编写器生成传统的错误日志输出。 它使用以下格式写入消息:
timestamp
thread_id
[priority
] [err_code
] [subsystem
]message
的
[
和
]
方括号字符是在消息格式文本字符。
它们不表示字段是可选的。
这些
和
字段在MySQL 8.0中添加。
旧服务器生成的日志中将丢失它们。
日志解析器可以将这些字段视为消息文本的一部分,这些字段仅出现在服务器写入的日志中,足以包含它们。
解析器必须将
指标
的
一部分
视为字符串值。
[
err_code
][
subsystem
]err_code
[
err_code
]
例子:
2018-03-22T12:35:47.538083Z 0 [注意] [MY-012487] [InnoDB] InnoDB:DDL日志恢复:开始 2018-03-22T12:35:47.550565Z 0 [警告] [MY-010068] [服务器] CA证书/var/mysql/sslinfo/cacert.pem是自签名的。 2018-03-22T12:35:47.669397Z 4 [注意] [MY-010051] [服务器]事件调度程序:调度程序线程以id 4启动 2018-03-22T12:35:47.550939Z 0 [注意] [MY-010253] [服务器] IPv6可用。
JSON格式的日志编写器将消息生成为包含键值对的JSON对象。 例如:
{“prio”:3,“err_code”:10051,“子系统”:“服务器”, “source_file”:“event_scheduler.cc”,“function”:“run”, “msg”:“事件调度程序:调度程序线程以id 4开头”, “时间”:“2018-03-22T12:35:47.669397Z”,“线程”:4, “err_symbol”:“ER_SCHEDULER_STARTED”,“SQL_state”:“HY000”, “label”:“注意”}
服务器在处理启动选项之前生成一些错误日志消息,因此在它知道错误日志设置(例如
log_error_verbosity
和
log_timestamps
值)以及要使用哪些日志组件之前。
服务器处理在启动过程早期生成的错误日志消息,如下所示:
在MySQL 8.0.14之前,服务器生成具有默认时间戳,格式和详细级别的消息,并缓冲它们。 处理启动选项并且已知错误日志配置后,服务器会刷新缓冲的消息。 由于这些早期消息使用默认日志配置,因此它们可能与启动选项指定的不同。 此外,早期消息不会刷新到默认日志以外的日志编写器。 例如,登录到JSON编写器不包括这些早期消息,因为它们不是JSON格式。
从MySQL 8.0.14开始,服务器缓冲日志事件而不是格式化日志消息。 这使得它可以在知道设置后追溯将配置设置应用于这些事件,结果是刷新的消息使用配置的设置,而不是默认设置。 此外,消息将刷新到所有已配置的编写器,而不仅仅是默认编写器。
如果在知道日志配置并且服务器必须退出之前发生致命错误,则服务器不会丢失。 如果在处理启动选项之前没有发生致命错误但启动过慢,则服务器会使用日志记录默认值定期格式化和刷新缓冲的消息,以免显示无响应。 尽管这些行为与8.0.14之前的行为类似,但使用默认值时,它们最好在发生异常情况时丢失消息。
该
log_timestamps
系统变量控制时间戳的写入错误日志消息(以及一般查询日志和慢查询日志文件)的时区。
允许的值是
UTC
(默认值)和
SYSTEM
(本地系统时区)。
如果使用
FLUSH
ERROR LOGS
,
FLUSH LOGS
或
mysqladmin flush-logs
刷新错误日志
,
服务器将关闭并重新打开它正在写入的任何错误日志文件。
要重命名错误日志文件,请在刷新之前手动执行此操作。
刷新日志然后打开一个包含原始文件名的新文件。
例如,假设日志文件名为
,要重命名文件并创建新文件,请使用以下命令:
host_name
.err
mvhost_name
.errhost_name
.err-old mysqladmin flush-logs mvhost_name
.err-oldbackup-directory
在Windows上,使用 重命名 而不是 mv 。
如果服务器无法写入错误日志文件的位置,则日志刷新操作将无法创建新的日志文件。
例如,在Linux上,服务器可能会将错误日志写入
/var/log/mysqld.log
文件,其中
/var/log
目录
root
由
mysqld
拥有
且不可写
。
有关处理此案例的信息,请参见
第5.4.7节“服务器日志维护”
。
如果服务器未写入命名的错误日志文件,则刷新错误日志时不会发生错误日志文件重命名。
通用查询日志是 mysqld 正在执行的操作 的一般记录 。 当客户端连接或断开连接时,服务器会将信息写入此日志,并记录从客户端收到的每个SQL语句。 当您怀疑客户端中存在错误并想要确切知道客户端发送给 mysqld的内容 时,通用查询日志非常有用 。
显示客户端连接时的每一行还包括
指示用于建立连接的协议。
是
(没有SSL建立的TCP / IP连接),
(使用SSL建立TCP / IP连接),
(Unix套接字文件连接),
(Windows命名管道连接)或
(Windows共享内存连接)之一。
using
connection_type
connection_type
TCP/IP
SSL/TLS
Socket
Named Pipe
Shared Memory
mysqld 按照接收它们的顺序将语句写入查询日志,这可能与它们的执行顺序不同。 此日志记录顺序与二进制日志的日志顺序形成对比,二进制日志的语句在执行后但在释放任何锁之前写入。 此外,查询日志可能包含仅选择数据的语句,而这些语句永远不会写入二进制日志。
在复制主服务器上使用基于语句的二进制日志记录时,其从属接收的语句将写入每个从属服务器的查询日志中。 如果客户端使用 mysqlbinlog 实用程序 读取事件 并将它们传递给 服务器,则会将语句写入主服务器的查询日志 。
然而,使用基于行的二进制日志记录时,更新的行更改,而不是SQL语句,因此当这些语句不会被写到查询日志发送
binlog_format
的
ROW
。
MIXED
根据所使用的语句,
当此变量设置为时,也可能不会将给定更新写入查询日志
。
有关更多
信息,
请参见
第17.2.1.1节“基于语句和基于行的复制的优点和缺点”
。
默认情况下,禁用常规查询日志。
要明确指定初始常规查询日志状态,请使用
--general_log[={0|1}]
。
如果没有参数或参数为1,则
--general_log
启用日志。
如果参数为0,则此选项会禁用日志。
要指定日志文件名,请使用
。
要指定日志目标,请使用
系统变量(如
第5.4.1节“选择常规查询日志和慢查询日志输出目标”中所述
)。
--general_log_file=
file_name
log_output
如果指定
TABLE
日志目标,请参阅
日志表和
“
打开的文件太多
”
错误
。
如果没有为常规查询日志文件指定名称,则默认名称为
。
服务器在数据目录中创建文件,除非给出绝对路径名来指定不同的目录。
host_name
.log
要在运行时禁用或启用常规查询日志或更改日志文件名,请使用全局
变量
general_log
和
general_log_file
系统变量。
设置
general_log
为0(或
OFF
)以禁用日志或设置为1(或
ON
)以启用它。
设置
general_log_file
为指定日志文件的名称。
如果日志文件已打开,则会关闭该文件并打开新文件。
启用常规查询日志后,服务器会将输出写入
log_output
系统变量
指定的任何目标
。
如果启用日志,则服务器将打开日志文件并将启动消息写入其中。
但是,除非
FILE
选择
了
日志目标,
否则不会进一步将查询记录到文件中
。
如果目标是
NONE
,则即使启用了常规日志,服务器也不会写入任何查询。
如果日志目标值不包含,则设置日志文件名对日志记录没有影响
FILE
。
服务器重新启动和日志刷新不会导致生成新的常规查询日志文件(尽管刷新关闭并重新打开它)。 要重命名文件并创建一个新文件,请使用以下命令:
shell> shell> shell>mv
host_name
.loghost_name
-old.logmysqladmin flush-logs
mv
host_name
-old.logbackup-directory
在Windows上,使用 重命名 而不是 mv 。
您还可以通过禁用日志在运行时重命名常规查询日志文件:
SET GLOBAL general_log ='OFF';
禁用日志后,从外部重命名日志文件(例如,从命令行重命名)。 然后再次启用日志:
SET GLOBAL general_log ='ON';
此方法适用于任何平台,不需要重新启动服务器。
要禁用或启用当前会话的常规查询日志记录,请将会话
sql_log_off
变量
设置
为
ON
或
OFF
。
(这假定已启用常规查询日志本身。)
写入通用查询日志的语句中的密码将由服务器重写,而不是以纯文本形式发生。
通过使用该
--log-raw
选项
启动服务器,可以为通用查询日志禁止密码重写
。
此选项可用于诊断目的,以查看服务器收到的语句的确切文本,但出于安全原因,建议不要将其用于生产用途。
另请参见
第6.1.2.3节“密码和日志记录”
。
密码重写的含义是无法解析的语句(例如,由于语法错误)不会写入通用查询日志,因为无法知道它们是无密码的。
需要记录所有语句(包括有错误的语句)的用例应使用该
--log-raw
选项,请记住这也会绕过密码重写。
只有在需要纯文本密码时才会进行密码重写。 对于具有期望密码哈希值的语法的语句,不会发生重写。 如果为此类语法错误地提供了纯文本密码,则会将密码记录为给定,而不进行重写。
所述
log_timestamps
系统变量控制在写入到通用查询日志文件消息的时间戳的时区(以及慢查询日志文件和错误日志)。
它不会影响一般查询日志的时区和写入日志表的慢查询日志消息,但可以使用
CONVERT_TZ()
或通过设置会话
time_zone
系统变量
将从这些表中检索的行从本地系统时区转换为任何所需的时区
。
二进制日志包含
描述数据库更改的
“
事件
”
,例如表创建操作或对表数据的更改。
DELETE
除非使用基于行的日志记录,否则
它还包含可能已进行更改的语句(例如,
不匹配任何行的
语句)的事件
。
二进制日志还包含有关每个语句获取更新数据的时间长度的信息。
二进制日志有两个重要目的:
对于复制,主复制服务器上的二进制日志提供要发送到从属服务器的数据更改的记录。 主服务器将其二进制日志中包含的事件发送到其从属服务器,这些服务器执行这些事件以对主服务器上的数据进行相同的更改。 请参见 第17.2节“复制实现” 。
某些数据恢复操作需要使用二进制日志。 还原备份后,将重新执行备份后记录的二进制日志中的事件。 这些事件使数据库从备份点更新。 请参见 第7.5节“使用二进制日志进行时间点(增量)恢复” 。
二进制日志不用于诸如
SELECT
或
SHOW
不修改数据的
语句
。
要记录所有语句(例如,标识问题查询),请使用常规查询日志。
请参见
第5.4.3节“常规查询日志”
。
运行启用了二进制日志记录的服务器会使性能稍慢。 但是,二进制日志使您能够设置复制和还原操作的好处通常会超过此次要性能下降。
二进制日志可以抵御意外停止。 仅记录或回读完整的事件或事务。
写入二进制日志的语句中的密码由服务器重写,不会以纯文本形式出现。 另请参见 第6.1.2.3节“密码和日志记录” 。
从MySQL 8.0.14开始,可以加密二进制日志文件和中继日志文件,有助于保护这些文件及其中包含的潜在敏感数据不被外部攻击者滥用,以及操作系统用户未经授权查看存储。
通过将
binlog_encryption
系统变量
设置为,可以在MySQL服务器上启用加密
ON
。
有关更多信息,请参见
第17.3.10节“加密二进制日志文件和中继日志文件”
。
以下讨论描述了影响二进制日志记录操作的一些服务器选项和变量。 有关完整列表,请参见 第17.1.6.4节“二进制日志记录选项和变量” 。
默认情况下启用二进制日志记录(
log_bin
系统变量设置为ON)。
例外情况是,如果使用
mysqld
通过使用
--initialize
or
--initialize-insecure
选项
手动初始化数据目录
,则默认情况下禁用二进制日志记录,但可以通过指定
--log-bin
选项
启用
。
要禁用二进制日志记录,可以
在启动时
指定
--skip-log-bin
或
--disable-log-bin
选项。
如果指定了这些选项中的任何一个并且
--log-bin
也指定
了这些选项
,则稍后指定的选项优先。
在
--log-slave-updates
和
--slave-preserve-commit-order
选项需要二进制日志。
如果禁用二进制日志记录,请省略这些选项,或指定
--skip-log-slave-updates
和
--skip-slave-preserve-commit-order
。
MySQL时,默认情况下禁用这些选项
--skip-log-bin
或
--disable-log-bin
指定的。
如果指定
--log-slave-updates
或
--slave-preserve-commit-order
连同
--skip-log-bin
或者
--disable-log-bin
,发出警告或错误信息。
该
选项用于指定二进制日志文件的基本名称。
如果您不提供该
选项,MySQL将使用
二进制日志文件的默认基本名称。
为了与早期版本兼容,如果提供的
选项没有字符串或空字符串,则基本名称默认为
使用主机名称。
建议您指定基本名称,以便在主机名更改时,您可以轻松地继续使用相同的二进制日志文件名(请参见
第B.4.7节“MySQL中的已知问题”
)。
如果在日志名称中提供扩展名(例如,
),则会以静默方式删除并忽略该扩展名。
--log-bin[=
base_name
]--log-bin
binlog
--log-bin
host_name
-bin--log-bin=
base_name.extension
mysqld
将数字扩展名附加到二进制日志基本名称以生成二进制日志文件名。
每次服务器创建新日志文件时,该数字都会增加,从而创建一系列有序的文件。
每次启动或刷新日志时,服务器都会在系列中创建一个新文件。
服务器还会在当前日志大小达到后自动创建新的二进制日志文件
max_binlog_size
。
二进制日志文件可能会比
max_binlog_size
使用大型事务时
更大,
因为事务是以一个部分写入文件,而不是在文件之间分割。
为了跟踪已使用的二进制日志文件,
mysqld
还创建了一个二进制日志索引文件,其中包含二进制日志文件的名称。
默认情况下,它具有与二进制日志文件相同的基本名称,并带有扩展名
'.index'
。
您可以使用该
选项
更改二进制日志索引文件的名称
。
在
mysqld
运行时,
您不应手动编辑此文件
;
这样做会让
mysqld
感到困惑
。
--log-bin-index[=
file_name
]
术语 “ 二进制日志文件 ” 通常表示包含数据库事件的单个编号文件。 术语 “ 二进制日志 ” 共同表示编号的二进制日志文件集加上索引文件。
二进制日志文件和二进制日志索引文件的默认位置是数据目录。
您可以使用该
--log-bin
选项指定备用位置,方法是在基本名称中添加前导绝对路径名以指定其他目录。
当服务器从二进制日志索引文件中读取条目时,该文件跟踪已使用的二进制日志文件,它会检查条目是否包含相对路径。
如果是,则路径的相对部分将替换为使用的设置的绝对路径
--log-bin
选项。
二进制日志索引文件中记录的绝对路径保持不变;
在这种情况下,必须手动编辑索引文件以启用新路径。
二进制日志文件基本名称和任何指定的路径都可用作
log_bin_basename
系统变量。
在MySQL 5.7中,必须在启用二进制日志记录时指定服务器ID,否则服务器将无法启动。
在MySQL 8.0中,
server_id
系统变量默认设置为1。
启用二进制日志记录时,可以使用此缺省ID启动服务器,但如果未使用该
--server-id
选项
明确指定服务器标识,则会发出信息性消息
。
对于复制拓扑中使用的服务器,必须为每个服务器指定唯一的非零服务器ID。
具有足以设置受限会话系统变量的权限的客户端(请参见
第5.1.9.1节“系统变量权限”
)可以使用
SET
sql_log_bin=OFF
语句
禁用其自己的语句的二进制日志记录
。
默认情况下,服务器记录事件的长度以及事件本身,并使用它来验证事件是否正确写入。
您还可以通过设置
binlog_checksum
系统变量
使服务器为事件编写校验和
。
从二进制日志中读回时,主服务器默认使用事件长度,但如果可用,则可以通过启用
master_verify_checksum
系统变量
来使用校验和
。
从I / O线程还验证从主站接收的事件。
通过启用
slave_sql_verify_checksum
系统变量
从中继日志读取时,可以使从属SQL线程使用校验和(如果可用)
。
二进制日志中记录的事件格式取决于二进制日志记录格式。 支持三种格式类型:基于行的日志记录,基于语句的日志记录和基于混合的日志记录。 使用的二进制日志记录格式取决于MySQL版本。 有关日志记录格式的一般说明,请参见 第5.4.4.1节“二进制日志格式” 。 有关二进制日志格式的详细信息,请参阅 MySQL内部:二进制日志 。
服务器以
--binlog-do-db
与执行和
--binlog-ignore-db
选项相同的方式
评估
--replicate-do-db
和
--replicate-ignore-db
选项。
有关如何完成此操作的信息,请参见
第17.2.5.1节“数据库级复制和二进制日志记录选项的评估”
。
--log-slave-updates
默认情况下启用设置启动
复制从属服务器
,这意味着
从属服务器
会将从复制主服务器接收的任何数据修改写入其自己的二进制日志。
必须启用二进制日志才能使此设置
生效
(请参见
第17.1.6.3节“复制从属选项和变量”
)。
此设置使从站可以充当链式复制中其他从站的主站。
您可以使用该
RESET
MASTER
语句或其子集
删除所有二进制日志文件
PURGE
BINARY LOGS
。
请参见
第13.7.7.6节“RESET语法”
和
第13.4.1.1节“PURGE BINARY LOGS语法”
。
如果您正在使用复制,则在确定没有从属设备仍需要使用它们之前,不应删除主服务器上的旧二进制日志文件。
例如,如果您的奴隶从未跑过三天以上,那么您每天可以
在主服务器上
执行
mysqladmin flush-logs
,然后删除任何超过三天的日志。
您可以手动删除文件,但最好使用
PURGE
BINARY
LOGS
,它也可以安全地为您更新二进制日志索引文件(可以使用日期参数)。
请参见
第13.4.1.1节“PURGE BINARY LOGS语法”
。
您可以使用 mysqlbinlog 实用程序 显示二进制日志文件的内容 。 当您想要在日志中重新处理语句以进行恢复操作时,这非常有用。 例如,您可以从二进制日志更新MySQL服务器,如下所示:
外壳> mysqlbinlog log_file
| mysql -h server_name
mysqlbinlog 也可用于显示复制从属中继日志文件内容,因为它们使用与二进制日志文件相同的格式编写。 有关 mysqlbinlog 实用程序及其使用方法的 更多信息 ,请参见 第4.6.8节“ mysqlbinlog - 处理二进制日志文件的实用程序” 。 有关二进制日志和恢复操作的更多信息,请参见 第7.5节“使用二进制日志进行时间点(增量)恢复” 。
在语句或事务完成之后但在释放任何锁定或完成任何提交之前立即执行二进制日志记录。 这可确保以提交顺序记录日志。
非事务性表的更新在执行后立即存储在二进制日志中。
在未提交的事务中,所有
更改事务表(如
表
)的
更新(
UPDATE
,
DELETE
或
INSERT
)都将
InnoDB
被缓存,直到
COMMIT
服务器收到语句
为止
。
此时,
mysqld
在
COMMIT
执行
之前将整个事务写入二进制日志
。
无法回滚对非事务表的修改。
如果回滚的事务包括对非事务表的修改,则会
ROLLBACK
在末尾
使用
语句
记录整个事务
,以确保复制对这些表的修改。
当一个处理事务的线程启动时,它会
binlog_cache_size
为buffer语句
分配一个缓冲区
。
如果语句大于此值,则线程会打开一个临时文件来存储事务。
线程结束时删除临时文件。
所述
Binlog_cache_use
状态变量表明,用这种缓冲液(和可能的一个临时文件),用于存储语句事务的数目。
该
Binlog_cache_disk_use
状态变量显示许多这些交易实际上是如何不得不使用临时文件。
这两个变量可用于调整
binlog_cache_size
到足够大的值,避免使用临时文件。
所述
max_binlog_cache_size
系统变量(默认4GB,这也是最大)可被用来限制用于高速缓存的多语句事务的总大小。
如果事务大于这么多字节,它就会失败并回滚。
最小值为4096。
如果使用二进制日志和基于行的日志记录,则并发插入将转换为
CREATE ...
SELECT
或
INSERT
...
SELECT
语句的
正常插入
。
这样做是为了确保您可以通过在备份操作期间应用日志来重新创建表的精确副本。
如果使用基于语句的日志记录,则会将原始语句写入日志。
二进制日志格式具有一些已知的限制,可能会影响从备份中恢复。 请参见 第17.4.1节“复制功能和问题” 。
存储程序的二进制日志记录按 第24.7节“存储程序二进制日志记录”中所述完成 。
请注意,由于复制的增强,MySQL 8.0与以前版本的MySQL的二进制日志格式不同。 请参见 第17.4.2节“MySQL版本之间的复制兼容性” 。
如果服务器无法写入二进制日志,刷新二进制日志文件或将二进制日志同步到磁盘,则复制主服务器上的二进制日志可能会变得不一致,并且复制从服务器可能会失去与主服务器的同步。
所述
binlog_error_action
系统变量控制,如果这种类型的误差与二进制日志遇到所采取的行动。
默认设置,
ABORT_SERVER
使服务器暂停二进制日志记录并关闭。
此时,您可以识别并更正错误原因。
重新启动时,恢复将按照意外服务器暂停的情况继续进行(请参见
第17.3.2节“处理意外停止复制从站”
)。
该设置
IGNORE_ERROR
提供与旧版MySQL的向后兼容性。
使用此设置,服务器继续正在进行的事务并记录错误,然后暂停二进制日志记录,但继续执行更新。
此时,您可以识别并更正错误原因。
要恢复二进制日志记录
log_bin
必须再次启用,这需要重新启动服务器。
如果您需要向后兼容性,则仅使用此选项,并且二进制日志在此MySQL服务器实例上不是必需的。
例如,您可以仅将二进制日志用于服务器的间歇性审计或调试,而不是将其用于从服务器进行复制或依赖它进行时间点还原操作。
默认情况下,二进制日志在每次write(
sync_binlog=1
)
时都会同步到磁盘
。
如果
sync_binlog
未启用,并且操作系统或计算机(不仅是MySQL服务器)崩溃,则二进制日志的最后一个语句可能会丢失。
要防止这种情况,请
sync_binlog
在每个
N
提交组
之后
启用
系统变量以将二进制日志同步到磁盘
。
请参见
第5.1.8节“服务器系统变量”
。
最安全的值
sync_binlog
是1(默认值),但这也是最慢的。
在早期的MySQL版本中,如果发生崩溃,表内容和二进制日志内容之间可能存在不一致,即使
sync_binlog
设置为1.例如,如果您使用
InnoDB
表并且MySQL服务器处理
COMMIT
语句,则会编写许多准备按顺序对二进制日志进行事务处理,同步二进制日志,然后将事务提交到
InnoDB
。
如果服务器在这两个操作之间崩溃,则事务将
InnoDB
在重新启动时
回滚
但仍存在于二进制日志中。
通过
InnoDB
在XA事务中
启用
对两阶段提交的支持,
在先前版本中解决了此类问题
。
在5.8.0及更高版本中
InnoDB
始终启用对XA事务中的两阶段提交的支持。
InnoDB
支持XA事务中的两阶段提交可确保二进制日志和
InnoDB
数据文件同步。
但是,MySQL服务器还应配置为
InnoDB
在提交事务之前将
二进制日志和
日志
同步
到磁盘。
该
InnoDB
日志由缺省同步,并
sync_binlog=1
保证了二进制日志是同步的。
InnoDB
在XA事务
中隐式
支持两阶段提交
的效果
sync_binlog=1
是在崩溃后重启,在执行事务回滚之后,MySQL服务器扫描最新的二进制日志文件以收集事务
xid
值并计算最后的有效位置。二进制日志文件。
然后MySQL服务器告诉
InnoDB
完成任何已成功写入二进制日志的已准备事务,并将二进制日志截断到最后一个有效位置。
这可确保二进制日志反映
InnoDB
表
的确切数据
,因此从站与主站保持同步,因为它不会收到已回滚的语句。
如果MySQL服务器在崩溃恢复时发现二进制日志比它应该更短,那么它至少缺少一个成功提交的
InnoDB
事务。
如果
sync_binlog=1
磁盘/文件系统在请求(有些没有)时执行实际同步,则
不会发生这种情况
,因此服务器会输出错误消息
。
在这种情况下,此二进制日志不正确,应从主数据的新快照重新启动复制。
The
binary log
file_name
is shorter than
its expected size
在解析二进制日志时,以下系统变量的会话值将写入二进制日志并由复制从站承担:
服务器使用多种日志记录格式在二进制日志中记录信息:
MySQL中的复制功能最初基于从主设备到从设备的SQL语句传播。
这称为
基于语句的日志记录
。
您可以通过启动服务器来使用此格式
--binlog-format=STATEMENT
。
在
基于行的日志记录
(默认)中,主服务器将事件写入二进制日志,以指示各个表行的影响方式。
您可以通过启动它来使服务器使用基于行的日志记录
--binlog-format=ROW
。
第三种选择也是可用的:
混合日志记录
。
对于混合日志记录,默认情况下使用基于语句的日志记录,但在某些情况下,日志记录模式会自动切换到基于行的日志,如下所述。
您可以通过
使用该选项
启动
mysqld
,
使MySQL显式使用混合日志记录
--binlog-format=MIXED
。
日志格式也可以由正在使用的存储引擎设置或限制。 这有助于消除在使用不同存储引擎的主设备和从设备之间复制某些语句时出现的问题。
使用基于语句的复制,可能存在复制非确定性语句的问题。 在确定给定语句是否对基于语句的复制是安全的时,MySQL确定它是否可以保证可以使用基于语句的日志记录来复制语句。 如果MySQL无法做出此保证,则会将该语句标记为可能不可靠并发出警告, Statement可能无法安全登录语句格式 。
您可以通过使用MySQL的基于行的复制来避免这些问题。
您可以通过启动MySQL服务器来显式选择二进制日志记录格式
。
支持的值
是:
--binlog-format=
type
type
STATEMENT
导致日志记录基于语句。
ROW
导致日志记录基于行。
这是默认值。
MIXED
导致日志记录使用混合格式。
日志格式也可以在运行时切换,但请注意,在许多情况下您无法执行此操作,如本节后面所述。
设置
binlog_format
系统变量
的全局值,
以指定在更改后连接的客户端的格式:
mysql>SET GLOBAL binlog_format = 'STATEMENT';
mysql>SET GLOBAL binlog_format = 'ROW';
mysql>SET GLOBAL binlog_format = 'MIXED';
单个客户端可以通过设置以下会话值来控制其自己语句的日志记录格式
binlog_format
:
mysql>SET SESSION binlog_format = 'STATEMENT';
mysql>SET SESSION binlog_format = 'ROW';
mysql>SET SESSION binlog_format = 'MIXED';
更改全局
binlog_format
值需要足以设置全局系统变量的权限。
更改会话
binlog_format
值需要足以设置受限会话系统变量的权限。
请参见
第5.1.9.1节“系统变量权限”
。
客户端可能希望基于每个会话设置二进制日志记录有几个原因:
对数据库进行许多小更改的会话可能希望使用基于行的日志记录。
执行与
WHERE
子句
中的许多行匹配的更新的会话
可能希望使用基于语句的日志记录,因为记录一些语句比许多行更有效。
某些语句在主服务器上需要大量执行时间,但只会导致修改几行。 因此,使用基于行的日志记录复制它们可能是有益的。
在运行时无法切换复制格式时有例外:
无法从存储的函数或触发器中更改复制格式。
如果
NDB
启用
了
存储引擎。
如果会话具有打开的临时表,则无法更改会话(
SET
@@SESSION.binlog_format
)
的复制格式
。
如果任何复制通道具有打开的临时表,则无法全局(
SET
@@GLOBAL.binlog_format
或
SET
@@PERSIST.binlog_format
)
更改复制格式
。
如果当前正在运行任何复制通道应用程序线程,则无法全局(
SET @@GLOBAL.binlog_format
或
SET @@PERSIST.binlog_format
)
更改复制格式
。
尝试在任何这些情况下切换复制格式(或尝试设置当前复制格式)都会导致错误。
但是,您可以随时使用
PERSIST_ONLY
(
SET @@PERSIST_ONLY.binlog_format
)更改复制格式,因为此操作不会修改运行时全局系统变量值,并且只有在服务器重新启动后才会生效。
当存在任何临时表时,不建议在运行时切换复制格式,因为仅在使用基于语句的复制时记录临时表,而使用基于行的复制和混合复制时,不记录它们。
在复制过程中切换复制格式也会导致问题。
每个MySQL服务器都可以设置自己的,只有自己的二进制日志格式(无论
binlog_format
是使用全局范围还是会话范围设置)。
这意味着更改复制主服务器上的日志记录格式不会导致从服务器更改其日志记录格式以匹配。
使用
STATEMENT
模式时,
binlog_format
不复制系统变量。
使用
MIXED
或
ROW
记录模式时,它会被复制但被从设备忽略。
复制从站无法将以
ROW
日志记录格式
接收的二进制日志条目
转换为
STATEMENT
格式,以便在其自己的二进制日志中使用。
因此,
如果主设备
必须使用
ROW
或
MIXED
格式化
从设备
。
将主服务器上的二进制日志记录格式更改
STATEMENT
为
ROW
或
MIXED
正在向具有
STATEMENT
格式
的从服务器进行
复制时,可能会导致复制失败,并显示错误,例如
执行行事件错误:'无法执行语句:无法写入二进制日志,因为语句在行中格式和BINLOG_FORMAT =语句。'
将从站上的二进制日志记录格式更改为
STATEMENT
主机仍在使用
MIXED
或
格式化时的
ROW
格式也会导致相同类型的复制失败。
要安全地更改格式,必须停止复制并确保在主服务器和从服务器上进行相同的更改。
如果使用
InnoDB
表并且事务隔离级别为
READ
COMMITTED
或
READ
UNCOMMITTED
,则只能使用基于行的日志记录。
这是
可能的
更改日志格式
STATEMENT
,但在运行时这样做会导致非常迅速地错误,因为
InnoDB
不能再进行插入。
将二进制日志格式设置为
ROW
,使用基于行的
格式将
许多更改写入二进制日志。
但是,某些更改仍使用基于语句的格式。
实例包括所有DDL(数据定义语言)语句,例如
CREATE
TABLE
,
ALTER
TABLE
,或
DROP
TABLE
。
使用基于行的二进制日志记录时,
binlog_row_event_max_size
系统变量及其相应的启动选项
--binlog-row-event-max-size
会对行事件的最大大小设置软限制。
默认值为8192字节,该值只能在服务器启动时更改。
如果可能,存储在二进制日志中的行将分组为大小不超过此设置值的事件。
如果无法拆分事件,则可以超出最大大小。
该
--binlog-row-event-max-size
选项适用于能够进行基于行复制的服务器。
行以块的大小存储在二进制日志中,块大小以字节为单位,不超过此选项的值。
该值必须是256的倍数。默认值为8192。
当使用 基于语句的日志记录 进行复制时,如果语句的设计方式使得数据修改是 不确定的 , 则主服务器和从服务器上的数据可能会不同 ; 也就是说,它留给了查询优化器的意愿。 通常,即使在复制之外,这也不是一种好的做法。 有关此问题的详细说明,请参见 第B.4.7节“MySQL中的已知问题” 。
有关复制从站保留的日志的信息,请参见 第17.2.4节“复制中继和状态日志” 。
以
MIXED
日志记录格式
运行时
,服务器会在以下条件下自动从基于语句的日志记录切换到基于行的日志记录:
当一个函数包含
UUID()
。
当
AUTO_INCREMENT
更新
一个或多个具有
列的
表
并调用触发器或存储函数时。
像所有其他不安全的语句一样,这会产生警告
binlog_format =
STATEMENT
。
有关更多信息,请参见 第17.4.1.1节“复制和AUTO_INCREMENT” 。
当视图主体需要基于行的复制时,创建视图的语句也会使用它。
例如,当创建视图的语句使用该
UUID()
函数
时,会发生这种情况
。
当涉及到对UDF的调用时。
当
FOUND_ROWS()
或
ROW_COUNT()
使用。
(Bug#12092,Bug#30244)
何时
USER()
,
CURRENT_USER()
或
CURRENT_USER
使用。
(Bug#28086)
当涉及的表之一是
mysql
数据库中
的日志表时
。
使用该
LOAD_FILE()
功能时。
(Bug#39701)
当语句引用一个或多个系统变量时。 (缺陷号31168)
例外。 以下系统变量与会话范围(仅限)一起使用时,不会导致日志记录格式切换:
有关确定系统变量范围的信息,请参见 第5.1.9节“使用系统变量” 。
有关复制如何处理的信息
sql_mode
,请参见
第17.4.1.38节“复制和变量”
。
在早期版本中,当使用混合二进制日志记录格式时,如果按行记录语句并且执行该语句的会话具有任何临时表,则所有后续语句都被视为不安全并以基于行的格式记录,直到所有临时表为止该会话使用的内容被删除了。 从MySQL 8.0开始,对临时表的操作不会以混合二进制日志记录格式记录,并且会话中临时表的存在不会影响用于每个语句的日志记录模式。
如果尝试使用应使用基于行的日志记录编写的基于语句的日志记录来执行语句,则会生成警告。
警告显示在客户端(在输出中
SHOW
WARNINGS
)和
mysqld
错误日志中。
SHOW
WARNINGS
每次执行此类语句时都会
向
表中
添加警告
。
但是,只有为每个客户端会话生成警告的第一个语句才会写入错误日志,以防止泛滥日志。
除了上述决策之外,各个引擎还可以确定更新表中信息时使用的日志记录格式。 单个引擎的日志记录功能可以定义如下:
如果引擎支持基于行的日志记录,则称该引擎具有 行日志记录功能 。
如果引擎支持基于语句的日志记录,则称该引擎具有 语句记录功能 。
给定的存储引擎可以支持其中一种或两种记录格式。 下表列出了每个引擎支持的格式。
存储引擎 | 行记录支持 | 语句记录支持 |
---|---|---|
ARCHIVE |
是 | 是 |
BLACKHOLE |
是 | 是 |
CSV |
是 | 是 |
EXAMPLE |
是 | 没有 |
FEDERATED |
是 | 是 |
HEAP |
是 | 是 |
InnoDB |
是 |
当事务隔离级别为
REPEATABLE
READ
或时为
SERIALIZABLE
;
不,否则。
|
MyISAM |
是 | 是 |
MERGE |
是 | 是 |
NDB |
是 | 没有 |
是否一个语句是要记录与要使用的根据(安全,不安全,或二进制注入)语句的类型,二进制日志记录格式(确定的记录模式
STATEMENT
,
ROW
或
MIXED
),并且存储发动机的记录功能(声明能力,行能力,两者或两者都没有)。
(二进制注入是指记录必须使用
ROW
格式
记录的更改
。)
可以在有或没有警告的情况下记录声明; 未记录失败的语句,但会在日志中生成错误。 这显示在以下决策表中。 Type , binlog_format , SLC 和 RLC 列概述了条件, Error / Warning 和 Logged as columns表示相应的操作。 SLC 代表 “ 语句记录功能 ” , RLC 代表 “ 行记录功能 ” 。
类型 | binlog_format |
SLC | RLC | 错误/警告 | 记录为 |
---|---|---|---|---|---|
* | * |
没有 | 没有 | 错误:无法执行语句 :二进制日志记录是不可能的,因为至少涉及一个既无行也无法使用语句的引擎。 | - |
安全 | STATEMENT |
是 | 没有 | - | STATEMENT |
安全 | MIXED |
是 | 没有 | - | STATEMENT |
安全 | ROW |
是 | 没有 |
错误:无法执行语句
:二进制日志记录是不可能的,因为
BINLOG_FORMAT = ROW
至少有一个表使用不能进行基于行的日志记录的存储引擎。
|
- |
不安全 | STATEMENT |
是 | 没有 |
警告:以语句格式记录的不安全语句
,因为
BINLOG_FORMAT =
STATEMENT
|
STATEMENT |
不安全 | MIXED |
是 | 没有 |
错误:无法执行语句
:当存储引擎仅限于基于语句的日志记录时,无法进行不安全语句的二进制日志记录,即使
BINLOG_FORMAT = MIXED
。
|
- |
不安全 | ROW |
是 | 没有 |
错误:无法执行语句
:二进制日志记录是不可能的,因为
BINLOG_FORMAT = ROW
至少有一个表使用不能进行基于行的日志记录的存储引擎。
|
- |
行注入 | STATEMENT |
是 | 没有 | 错误:无法执行行注入 :无法进行二进制日志记录,因为至少有一个表使用的存储引擎无法进行基于行的日志记录。 | - |
行注入 | MIXED |
是 | 没有 | 错误:无法执行行注入 :无法进行二进制日志记录,因为至少有一个表使用的存储引擎无法进行基于行的日志记录。 | - |
行注入 | ROW |
是 | 没有 | 错误:无法执行行注入 :无法进行二进制日志记录,因为至少有一个表使用的存储引擎无法进行基于行的日志记录。 | - |
安全 | STATEMENT |
没有 | 是 |
错误:无法执行语句
:二进制日志记录是不可能的,因为
BINLOG_FORMAT =
STATEMENT
至少有一个表使用不能进行基于语句的日志记录的存储引擎。
|
- |
安全 | MIXED |
没有 | 是 | - | ROW |
安全 | ROW |
没有 | 是 | - | ROW |
不安全 | STATEMENT |
没有 | 是 |
错误:无法执行语句
:二进制日志记录是不可能的,因为
BINLOG_FORMAT =
STATEMENT
至少有一个表使用不能进行基于语句的日志记录的存储引擎。
|
- |
不安全 | MIXED |
没有 | 是 | - | ROW |
不安全 | ROW |
没有 | 是 | - | ROW |
行注入 | STATEMENT |
没有 | 是 |
错误:无法执行行注入
:从那时起无法进行二进制日志记录
BINLOG_FORMAT =
STATEMENT
。
|
- |
行注入 | MIXED |
没有 | 是 | - | ROW |
行注入 | ROW |
没有 | 是 | - | ROW |
安全 | STATEMENT |
是 | 是 | - | STATEMENT |
安全 | MIXED |
是 | 是 | - | STATEMENT |
安全 | ROW |
是 | 是 | - | ROW |
不安全 | STATEMENT |
是 | 是 |
警告:
自
发布语句格式为binlog的不安全语句
BINLOG_FORMAT =
STATEMENT
。
|
STATEMENT |
不安全 | MIXED |
是 | 是 | - | ROW |
不安全 | ROW |
是 | 是 | - | ROW |
行注入 | STATEMENT |
是 | 是 |
错误:无法执行行注入
:无法进行二进制日志记录,因为
BINLOG_FORMAT =
STATEMENT
。
|
- |
行注入 | MIXED |
是 | 是 | - | ROW |
行注入 | ROW |
是 | 是 | - | ROW |
当确定产生警告时,会生成标准的MySQL警告(并且可以使用
SHOW
WARNINGS
)。
该信息也写入
mysqld
错误日志。
每个客户端连接的每个错误实例只记录一个错误,以防止泛滥日志。
日志消息包括尝试的SQL语句。
如果从属服务器
log_error_verbosity
设置为显示警告,则
从属服务器
将消息打印到错误日志以提供有关其状态的信息,例如二进制日志和中继日志坐标开始其作业,何时切换到另一个中继日志,何时它在断开连接后重新连接,对基于语句的日志记录不安全的语句,等等。
mysql
可以直接(例如,使用
INSERT
或
DELETE
)或间接(例如,使用
GRANT
或
CREATE
USER
)
修改数据库
中的授权表的内容
。
mysql
使用以下规则
将影响
数据库表的
语句
写入二进制日志:
mysql
根据
binlog_format
系统变量
的设置记录直接
更改
数据库表中
数据的数据操作语句
。
这涉及到语句,如
INSERT
,
UPDATE
,
DELETE
,
REPLACE
,
DO
,
LOAD
DATA
,
SELECT
,和
TRUNCATE
TABLE
。
mysql
无论值是什么,间接
更改
数据库的语句都会记录为语句
binlog_format
。
这涉及语句,例如
GRANT
,
REVOKE
,
SET
PASSWORD
,
RENAME
USER
,
CREATE
(所有形式的除外
CREATE
TABLE
... SELECT
),
ALTER
(
所有形式的),和
DROP
(各种形式)。
CREATE
TABLE ...
SELECT
是数据定义和数据操作的组合。
该
CREATE
TABLE
部分是利用语句格式记录,且
SELECT
部分是根据的值记录
binlog_format
。
慢查询日志由
long_query_time
执行
时间超过
几秒
的SQL语句组成,
并且至少
min_examined_row_limit
需要检查行。
慢查询日志可用于查找需要很长时间才能执行的查询,因此是优化的候选者。
但是,检查长慢的查询日志可能是一项耗时的任务。
为了简化这一过程,您可以使用
mysqldumpslow
命令处理慢速查询日志文件并汇总其内容。
请参见
第4.6.9节“
mysqldumpslow
- 汇总慢速查询日志文件”
。
获取初始锁定的时间不计入执行时间。 mysqld 在执行完后以及释放所有锁之后向慢查询日志写入一个语句,因此日志顺序可能与执行顺序不同。
最小值和默认值分别
long_query_time
为0和10。
该值可以指定为微秒的分辨率。
默认情况下,不记录管理语句,也不记录不使用索引进行查找的查询。
可以使用
log_slow_admin_statements
和
更改此行为
log_queries_not_using_indexes
,如稍后所述。
默认情况下,禁用慢查询日志。
要明确指定初始慢查询日志状态,请使用
--slow_query_log[={0|1}]
。
如果没有参数或参数为1,则
--slow_query_log
启用日志。
如果参数为0,则此选项会禁用日志。
要指定日志文件名,请使用
。
要指定日志目标,请使用
系统变量(如
第5.4.1节“选择常规查询日志和慢查询日志输出目标”中所述
)。
--slow_query_log_file=
file_name
log_output
如果指定
TABLE
日志目标,请参阅
日志表和
“
打开的文件太多
”
错误
。
如果没有为慢查询日志文件指定名称,则默认名称为
。
服务器在数据目录中创建文件,除非给出绝对路径名来指定不同的目录。
host_name
-slow.log
要在运行时禁用或启用慢查询日志或更改日志文件名,请使用全局
变量
slow_query_log
和
slow_query_log_file
系统变量。
设置
slow_query_log
为0表示禁用日志,或设置为1表示启用日志。
设置
slow_query_log_file
为指定日志文件的名称。
如果日志文件已打开,则会关闭该文件并打开新文件。
如果使用该
--log-short-format
选项
,服务器会将较少的信息写入慢查询日志
。
要在慢查询日志中包含慢速管理语句,请启用
log_slow_admin_statements
系统变量。
行政陈述包括
ALTER
TABLE
,
ANALYZE
TABLE
,
CHECK
TABLE
,
CREATE
INDEX
,
DROP
INDEX
,
OPTIMIZE
TABLE
,和
REPAIR
TABLE
。
要在写入慢查询日志的语句中包含不使用索引进行行查找的查询,请启用
log_queries_not_using_indexes
系统变量。
(即使启用了该变量,服务器也不会记录由于表少于两行而无法从索引中获益的查询。)
当记录不使用索引的查询时,慢查询日志可能会快速增长。
可以通过设置
log_throttle_queries_not_using_indexes
系统变量
对这些查询设置速率限制
。
默认情况下,此变量为0,表示没有限制。
正值会对不使用索引的查询的日志记录施加每分钟限制。
第一个这样的查询打开一个60秒的窗口,服务器在该窗口内将查询记录到给定的限制,然后禁止其他查询。
如果窗口结束时存在被抑制的查询,则服务器会记录一个摘要,该摘要指示有多少查询以及在其中花费的总时间。
当服务器记录下一个不使用索引的查询时,下一个60秒窗口开始。
服务器按以下顺序使用控制参数来确定是否将查询写入慢查询日志:
查询必须不是管理语句,或者
log_slow_admin_statements
必须启用。
查询必须至少花费
long_query_time
几秒钟,或者
log_queries_not_using_indexes
必须启用,并且查询不使用行查找的索引。
查询必须至少检查过
min_examined_row_limit
行。
不得根据
log_throttle_queries_not_using_indexes
设置
禁止查询
。
所述
log_timestamps
系统变量控制在写入慢查询日志文件消息的时间戳的时区(以及到一般查询日志文件和错误日志)。
它不会影响一般查询日志的时区和写入日志表的慢查询日志消息,但可以使用
CONVERT_TZ()
或通过设置会话
time_zone
系统变量
将从这些表中检索的行从本地系统时区转换为任何所需的时区
。
默认情况下,复制从属服务器不会将复制查询写入慢速查询日志。
要更改此设置,请启用
log_slow_slave_statements
系统变量。
启用慢查询日志时,服务器将输出写入
log_output
系统变量
指定的任何目标
。
如果启用日志,则服务器将打开日志文件并将启动消息写入其中。
但是,除非
FILE
选择
了
日志目标,
否则不会进一步将查询记录到文件中
。
如果目标是
NONE
,则即使启用了慢查询日志,服务器也不会写入任何查询。
如果
FILE
未选择作为输出目标,
则设置日志文件名对日志记录没有影响
。
如果启用慢查询日志并将
FILE
其选为输出目标,则写入日志的每个语句前面都有一个以
#
字符
开头
并且包含这些字段的行(所有字段都在一行中):
Query_time:
duration
语句执行时间(以秒为单位)。
Lock_time:
duration
在几秒钟内获得锁定的时间。
Rows_sent:
N
发送到客户端的行数。
Rows_examined:
优化程序检查的行数。
启用
log_slow_extra
系统变量(从MySQL 8.0.14开始提供)会导致服务器将以下额外字段写入
FILE
输出以及刚刚列出的那些(
TABLE
输出不受影响)。
某些字段描述引用状态变量名称。
有关更多信息,请参阅状态变量描述。
但是,在慢查询日志中,计数器是每个语句值,而不是每个会话的累计值。
Thread_id:
ID
语句线程标识符。
Errno:
error_number
语句错误号,如果没有错误,则返回0。
Killed:
N
如果语句终止,则错误号指示原因,如果语句正常终止,则返回0。
Bytes_received:
N
Bytes_received
声明
的
值。
Bytes_sent:
N
Bytes_sent
声明
的
值。
Read_first:
N
Handler_read_first
声明
的
值。
Read_last:
N
Handler_read_last
声明
的
值。
Read_key:
N
Handler_read_key
声明
的
值。
Read_next:
N
Handler_read_next
声明
的
值。
Read_prev:
N
Handler_read_prev
声明
的
值。
Read_rnd:
N
Handler_read_rnd
声明
的
值。
Read_rnd_next:
N
Handler_read_rnd_next
声明
的
值。
Sort_merge_passes:
N
Sort_merge_passes
声明
的
值。
Sort_range_count:
N
Sort_range
声明
的
值。
Sort_rows:
N
Sort_rows
声明
的
值。
Sort_scan_count:
N
Sort_scan
声明
的
值。
Created_tmp_disk_tables:
N
Created_tmp_disk_tables
声明
的
值。
Created_tmp_tables:
N
Created_tmp_tables
声明
的
值。
Start:
timestamp
语句执行开始时间。
End:
timestamp
语句执行结束时间。
给定的慢查询日志文件可能包含通过启用添加和不添加额外字段的行的混合
log_slow_extra
。
日志文件分析器可以通过字段计数确定行是否包含其他字段。
写入慢查询日志文件的每个语句前面都有一个
SET
包含时间戳
的
语句。
从MySQL 8.0.14开始,时间戳指示慢速语句何时开始执行。
在8.0.14之前,时间戳指示何时记录慢速语句(在语句完成执行后发生)。
写入慢查询日志的语句中的密码将由服务器重写,而不是以纯文本形式发生。 请参见 第6.1.2.3节“密码和日志记录” 。
DDL日志或元数据日志记录由数据定义语句(如
DROP
TABLE
和)
生成的元数据操作
ALTER
TABLE
。
MySQL使用此日志从元数据操作中发生的崩溃中恢复。
当执行该语句
DROP TABLE t1,
t2
,我们需要确保两个
t1
和
t2
被丢弃,并且每个表下降是完整的。
这种类型的SQL语句的另一个例子是
ALTER
TABLE t3 DROP PARTITION p2
,我们必须确保完全删除分区,并从表的分区列表中删除它的定义
t3
。
诸如刚才描述的元数据操作的记录被写入
ddl_log.log
MySQL数据目录中的文件。
这是一个二进制文件;
它不是人类可读的,您不应尝试以任何方式修改其内容。
ddl_log.log
在记录元数据语句实际需要之前不会创建,并且在成功启动
mysqld后
删除
。
因此,该文件可能不存在于以完全正常方式运行的MySQL服务器上。
目前,
ddl_log.log
最多可容纳1048573个条目,相当于4 GB的大小。
超过此限制后,必须重命名或删除该文件,然后才能执行任何其他DDL语句。
这是我们正在努力解决的已知问题(Bug#83708)。
没有与此文件关联的用户可配置服务器选项或变量。
如 第5.4节“MySQL服务器日志”中所述 ,MySQL服务器可以创建几个不同的日志文件,以帮助您查看正在进行的活动。 但是,您必须定期清理这些文件,以确保日志不占用太多磁盘空间。
在启用日志记录的情况下使用MySQL时,您可能需要不时备份和删除旧的日志文件,并告诉MySQL开始记录到新文件。 请参见 第7.2节“数据库备份方法” 。
在Linux(Red Hat)安装上,您可以使用此
mysql-log-rotate
脚本。
如果您从RPM分发版安装了MySQL,则应该已自动安装此脚本。
如果您使用二进制日志进行复制,请小心使用此脚本。
在确定所有从属程序已处理其内容之前,不应删除二进制日志。
在其他系统上,您必须自己安装一个简短的脚本,从 cron (或其等价物)开始处理日志文件。
在服务器的二进制日志到期期限后,将自动删除二进制日志文件。
可以在启动时以及刷新二进制日志时删除文件。
默认的二进制日志有效期为30天。
您可以使用
binlog_expire_logs_seconds
系统变量
指定备用到期期限
。
如果使用复制,则应指定一个有效期,该有效期不低于从属服务器可能滞后于主服务器的最长时间。
要按需删除二进制日志,请使用该
PURGE
BINARY LOGS
语句(请参见
第13.4.1.1节“PURGE BINARY LOGS语法”
)。
您可以通过刷新日志强制MySQL开始使用新的日志文件。
发出
FLUSH LOGS
语句或执行
mysqladmin flush-logs
,
mysqladmin refresh
,
mysqldump --flush-logs
或
mysqldump --master-data
命令
时会发生
日志
刷新
。
请参见
第13.7.7.3节“FLUSH语法”
,
第4.5.2节“
mysqladmin
- 管理MySQL服务器的客户端”
和
第4.5.4节“
mysqldump
- 数据库备份程序”
。
此外,当二进制日志的大小达到
max_binlog_size
系统变量
的值时,将刷新二进制日志
。
FLUSH LOGS
支持可选修饰符以启用选择性刷新单个日志(例如,
FLUSH BINARY LOGS
)。
日志刷新操作执行以下操作:
如果启用了常规查询日志记录或慢速查询日志文件,则服务器将关闭并重新打开常规查询日志文件或慢速查询日志文件。
如果启用了二进制日志记录,则服务器将关闭当前的二进制日志文件并打开包含下一个序列号的新日志文件。
如果服务器启动时带有将
--log-error
错误日志写入文件的选项,则服务器将关闭并重新打开日志文件。
刷新日志时,服务器会创建新的二进制日志文件。
但是,它只是关闭并重新打开常规和慢速查询日志文件。
要在Unix上创建新文件,请在刷新之前重命名当前日志文件。
在刷新时,服务器使用原始名称打开新的日志文件。
例如,如果通用和慢查询日志文件被命名为
mysql.log
和
mysql-slow.log
,你可以使用一系列这样的命令:
shell> shell> shell> shell>cd
mysql-data-directory
mv mysql.log mysql.old
mv mysql-slow.log mysql-slow.old
mysqladmin flush-logs
在Windows上,使用 重命名 而不是 mv 。
此时,您可以备份
mysql.old
并
mysql-slow.old
从磁盘中删除它们。
可以使用类似的策略备份错误日志文件(如果有)。
您可以通过禁用日志在运行时重命名常规查询日志或慢查询日志:
SET GLOBAL general_log ='OFF'; SET GLOBAL slow_query_log ='OFF';
禁用日志后,在外部重命名日志文件(例如,从命令行重命名)。 然后再次启用日志:
SET GLOBAL general_log ='ON'; SET GLOBAL slow_query_log ='ON';
此方法适用于任何平台,不需要重新启动服务器。
要使服务器在外部重命名文件后重新创建给定的日志文件,服务器必须可以写入文件位置。
情况可能并非总是如此。
例如,在Linux上,服务器可能会因为写错误日志
/var/log/mysqld.log
,其中
/var/log
所拥有
root
,而不是由写
的mysqld
。
在这种情况下,日志刷新操作将无法创建新的日志文件。
要处理这种情况,您必须在重命名原始日志文件后使用正确的ownerhiop手动创建新的日志文件。
例如,执行以下命令
root
:
shell>mv /var/log/mysqld.log /var/log/mysqld.log.old
shell>install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log
MySQL Server包括一个基于组件的基础架构,用于扩展服务器功能。 组件提供服务器和其他组件可用的服务。 (关于服务使用,服务器是一个组件,与其他组件相同。)组件仅通过它们提供的服务相互交互。
MySQL发行版包括几个实现服务器扩展的组件:
用于配置错误记录的组件。 请参见 第5.4.2节“错误日志” 和 第5.5.3节“错误日志组件” 。
用于检查密码的组件。 请参见 第6.4.3节“密码验证组件” 。
一种组件,使应用程序可以将自己的消息事件添加到审核日志中。 请参见 第6.4.6节“审计消息组件” 。
服务器组件实现的系统和状态变量在安装组件时公开,其名称以特定于组件的前缀开头。
例如,
log_filter_dragnet
错误日志过滤器组件实现了一个名为的系统变量
log_error_filter_rules
,其全名是
dragnet.log_error_filter_rules
。
要引用此变量,请使用全名。
以下部分描述了如何安装和卸载组件,以及如何在运行时确定安装了哪些组件并获取有关它们的信息。
有关组件内部实现的信息,请参阅 https://dev.mysql.com/doc/index-other.html上 提供的MySQL Server Doxygen文档 。 例如,如果您打算编写自己的组件,则此信息对于了解组件的工作方式非常重要。
必须先将服务器组件加载到服务器中,然后才能使用它们。 MySQL支持在运行时加载组件。
在
INSTALL
COMPONENT
与
UNINSTALL COMPONENT
SQL语句使组件装卸。
例如:
INSTALL COMPONENT'file:// component_validate_password'; UNINSTALL COMPONENT'file:// component_validate_password';
加载器服务处理组件加载和卸载,还列出
作为注册表
component
的
mysql
系统数据库
表中的已
加载组件
。
组件操作的SQL语句会影响服务器操作和
mysql.component
系统表,如下所示:
INSTALL
COMPONENT
将组件加载到服务器中。
组件立即变为活动状态。
加载程序服务还在
mysql.component
系统表中
注册已加载的组件
。
对于后续服务器重新启动,加载程序服务会加载
mysql.component
启动序列期间
列出的所有组件
。
即使使用该
--skip-grant-tables
选项
启动服务器,也会发生这种情况
。
UNINSTALL
COMPONENT
停用组件并从服务器卸载它们。
加载程序服务还会从
mysql.component
系统表中
取消注册组件,
以便在启动过程中不再加载它们以便后续服务器重新启动。
与
INSTALL
PLUGIN
服务器插件
的相应
语句
相比
INSTALL
COMPONENT
,组件语句提供了显着的优势,即不需要知道用于命名组件的任何特定于平台的文件名后缀。
这意味着
INSTALL
COMPONENT
可以跨平台统一执行
给定
语句。
系统数据库中
的
component
表
mysql
包含有关当前加载的组件的信息,并显示已注册的组件
INSTALL
COMPONENT
。
要查看已安装的组件,请使用以下语句:
SELECT * FROM mysql.component;
本节介绍各个错误日志组件的特征。 有关配置错误日志记录的一般信息,请参见 第5.4.2节“错误日志” 。
日志组件可以是过滤器或接收器:
过滤器处理日志事件,添加,删除或修改事件字段,或完全删除事件。
生成的事件将传递给
log_error_services
系统变量值中
指定的下一个日志组件
。
接收器是日志事件的目标(编写器)。 通常,接收器将日志事件处理为具有特定格式的日志消息,并将这些消息写入其关联的输出,例如文件或系统日志。
服务器
log_error_services
按照命名顺序
执行过滤器和接收器
。
因此,最右边的部分应该是一个接收器。
如果最右边的组件是过滤器,则它对事件所做的任何更改都不会影响输出。
以下部分描述了按组件类型分组的各个日志组件:
组件描述包括以下类型的信息:
组件名称和预期用途。
组件是内置还是必须加载。
对于可加载组件,描述指定用于使用
INSTALL
COMPONENT
和
UNINSTALL COMPONENT
语句
加载和卸载组件的URN
。
是否可以在
log_error_services
值中
多次列出组件
。
对于接收器组件,组件写入输出的目标。
错误日志筛选器组件实现错误日志事件的筛选:
如果未启用过滤器组件,则不会进行过滤。
任何已启用的筛选器组件仅影响
log_error_services
值
后面列出的组件的日志事件
。
特别是,对于
log_error_services
早于任何过滤
器组件列出的任何日志接收
器组件,不会发生日志事件过滤。
目的:根据日志事件优先级和错误代码
log_error_verbosity
以及
log_error_suppression_list
系统变量
实现过滤
。
请参见
第5.4.2.4节“基于优先级的错误日志过滤(log_filter_internal)”
。
URN:此组件内置,无需
INSTALL
COMPONENT
在使用前
加载
。
允许多种用途:不。
如果
log_filter_internal
被禁用,
log_error_verbosity
并且
log_error_suppression_list
没有任何效果。
目的:根据
dragnet.log_error_filter_rules
系统变量设置
定义的规则实施过滤
。
请参见
第5.4.2.5节“基于规则的错误日志过滤(log_filter_dragnet)”
。
瓮:
file://component_log_filter_dragnet
允许多种用途:不。
错误日志接收器组件是实现错误日志输出的写入器。 如果未启用接收器组件,则不会发生日志输出。
某些接收器组件描述是指默认的错误日志目标。
这是控制台或文件,由
log_error
系统变量
的故障指示
,如
第5.4.2.2节“默认错误日志目标配置”中所述确定
。
目的:实现传统的错误日志消息输出格式。
URN:此组件内置,无需
INSTALL
COMPONENT
在使用前
加载
。
允许多种用途:不。
输出目标:写入默认错误日志目标。
目的:实现JSON格式的错误记录。 请参见 第5.4.2.6节“以JSON格式记录错误” 。
瓮:
file://component_log_sink_json
允许多种用途:是的。
输出目标:JSON日志写程序根据
log_error
系统变量
给出的默认错误日志目标确定其输出目标
:
如果
log_error
命名文件,则JSON
编写器将
输出文件命名为该文件名,加上编号
后缀,
从00开始。例如,如果
是
,
则
值
中的
连续
命名
实例
将
写入
,
等等。
.
NN
.jsonNN
log_error
file_name
log_sink_json
log_error_services
file_name
.00.jsonfile_name
.01.json
如果
log_error
是
stderr
,则JSON编写器写入控制台。
如果
log_json_writer
在
log_error_services
值中
多次命名
,它们都会写入控制台,这可能没用。
目的:实现错误记录到系统日志。
这是Windows
syslog
上
的事件日志,以及
Unix和类Unix系统上
的事件日志
。
请参见
第5.4.2.7节“记录到系统日志的错误”
。
瓮:
file://component_log_sink_syseventlog
允许多种用途:不。
输出目标:写入系统日志。 不使用默认错误日志目标。
目的:用于编写测试用例的内部用途。 不适合生产使用。
瓮:
file://component_log_sink_test
允许多种用途:是的。
输出目标:写入默认错误日志目标。
MySQL支持一个插件API,可以创建服务器组件。
插件可以在服务器启动时加载,也可以在运行时加载和卸载,而无需重新启动服务器。
此接口支持的组件包括但不限于存储引擎,
INFORMATION_SCHEMA
表,全文解析器插件和服务器扩展。
MySQL发行版包括几个实现服务器扩展的插件:
用于验证客户端连接到MySQL服务器的尝试的插件。 插件可用于多种身份验证协议。 请参见 第6.2.17节“可插入验证” 。
一种连接控制插件,使管理员能够在一定数量的连续失败客户端连接尝试后引入增加的延迟。 请参见 第6.4.2节“连接控制插件” 。
密码验证插件实现密码强度策略并评估潜在密码的强度。 请参见 第6.4.3节“密码验证组件” 。
半同步复制插件实现了复制功能的接口,只要至少有一个从服务器响应每个事务,该接口就允许主服务器继续运行。 请参见 第17.3.11节“半同步复制” 。
通过组复制,您可以跨一组MySQL服务器实例创建高度可用的分布式MySQL服务,其中包含数据一致性,冲突检测和解决方案以及内置的组成员资格服务。 请参见 第18章, 组复制 。
MySQL企业版包括一个线程池插件,它通过有效管理大量客户端连接的语句执行线程来管理连接线程以提高服务器性能。 请参见 第5.6.3节“MySQL Enterprise Thread Pool” 。
MySQL Enterprise Edition包含一个用于监视和记录连接和查询活动的审计插件。 请参见 第6.4.5节“MySQL Enterprise Audit” 。
MySQL企业版包括一个防火墙插件,它实现了一个应用程序级防火墙,使数据库管理员能够根据与已接受语句模式的白名单进行匹配来允许或拒绝SQL语句执行。 请参见 第6.4.7节“MySQL Enterprise Firewall” 。
查询重写插件检查MySQL服务器接收的语句,并可能在服务器执行它们之前重写它们。 请参见 第5.6.4节“重写器查询重写插件” 和 第5.6.5节“ddl_rewriter插件” 。
版本标记可以围绕服务器令牌创建和同步,应用程序可以使用它来防止访问不正确或过时的数据。
Version Tokens基于一个插件库,它实现了一个
version_tokens
插件和一组用户定义的函数。
请参见
第5.6.6节“版本标记”
。
密钥环插件为敏感信息提供安全存储。 请参见 第6.4.4节“MySQL密钥环” 。
X Plugin扩展了MySQL Server,可以作为文档存储。 运行X插件使MySQL服务器能够使用X协议与客户端进行通信,该协议旨在将MySQL的ACID兼容存储功能公开为文档存储。 请参见 第20.5节“X插件” 。
测试框架插件测试服务器服务。 有关这些插件的信息,请参阅MySQL服务器Doxygen文档的插件测试插件服务部分,可从 https://dev.mysql.com/doc/index-other.html获取 。
以下部分描述了如何安装和卸载插件,以及如何在运行时确定安装了哪些插件并获取有关它们的信息。 有关编写插件的信息,请参见 第29.2节“MySQL插件API” 。
必须先将服务器插件加载到服务器中,然后才能使用它们。 MySQL支持在服务器启动和运行时加载插件。 还可以在启动时控制加载的插件的激活状态,并在运行时卸载它们。
在加载插件时,可以从
INFORMATION_SCHEMA.PLUGINS
表和
SHOW
PLUGINS
语句中
获取有关它的信息
。
请参见
第5.6.2节“获取服务器插件信息”
。
在使用服务器插件之前,必须使用以下方法之一安装它。
在说明中,
plugin_name
表示插件的名称,例如
innodb
,
csv
或
validate_password
。
内置插件:
服务器自动知道内置插件。
通常,服务器在启动时启用插件。
某些内置插件允许使用该
选项
进行更改
。
--
plugin_name
[=activation_state
]
在
mysql.plugin
系统表中
注册的插件
:
系统数据库中
的
plugin
表
mysql
用作插件的注册表(除了内置插件,不需要注册)。
启动时,服务器会加载表中列出的每个插件。
通常,对于从
mysql.plugin
表中
加载的插件
,服务器也会启用插件。
可以使用该
选项
更改此设置
。
--
plugin_name
[=activation_state
]
如果使用该
--skip-grant-tables
选项
启动服务器
,则不会查询该
mysql.plugin
表,也不会加载其中列出的插件。
使用命令行选项命名的插件:
位于插件库文件中的插件可以在与服务器启动时加载
--plugin-load
,
--plugin-load-add
或
--early-plugin-load
选项。
通常,对于启动时加载的插件,服务器也会启用插件。
可以使用该
选项
更改此设置
。
--
plugin_name
[=activation_state
]
在服务器启动序列期间初始化内置插件和存储引擎后
,
--plugin-load
和
--plugin-load-add
选项加载插件。
该
--early-plugin-load
选项用于加载在内置插件和存储引擎初始化之前必须可用的插件。
每个插件加载选项的值是以分号分隔的
值
和
值
列表
。
每个
都是要加载的插件的名称,并且
是包含插件代码的库文件的名称。
如果插件库的名称没有任何前面的插件名称,则服务器会加载库中的所有插件。
服务器在
系统变量
指定的目录中查找插件库文件
。
name
=
plugin_library
plugin_library
name
plugin_library
plugin_dir
插件加载选项不会在
mysql.plugin
表中
注册任何插件
。
对于后续的重新启动,服务器再次加载插件只有当
--plugin-load
,
--plugin-load-add
或
--early-plugin-load
再次给出。
也就是说,该选项会生成一次性插件安装操作,该操作将持续用于单个服务器调用。
--plugin-load
,
--plugin-load-add
并且
--early-plugin-load
即使在
--skip-grant-tables
给出
时
也
启用加载插件
(这导致服务器忽略该
mysql.plugin
表)。
--plugin-load
,
--plugin-load-add
并且
--early-plugin-load
还允许在启动时加载无法在运行时加载的插件。
该
--plugin-load-add
选项补充了该
--plugin-load
选项:
每个实例
--plugin-load
重置要在启动时加载的插件集,而
--plugin-load-add
将插件或插件添加到要加载的插件集中,而不重置当前集。
因此,如果
--plugin-load
指定了
多个实例,
则只有最后一个
实例
生效。
有多个实例
--plugin-load-add
,所有
实例
都生效。
参数格式与for相同
--plugin-load
,但
--plugin-load-add
可以使用
多个实例
来避免将一大组插件指定为单个长笨重的
--plugin-load
参数。
--plugin-load-add
可以在没有的情况下给出
--plugin-load
,但
--plugin-load-add
之前出现的
任何实例
--plugin-load
都没有效果,因为
--plugin-load
重置了要加载的插件集。
例如,这些选项:
--plugin-load = x --plugin-load-add = y
等同于此选项:
--plugin负载= “X; Y”
但这些选择:
--plugin-load-add = y --plugin-load = x
等同于此选项:
--plugin负荷= X
随
INSTALL
PLUGIN
声明
安装的插件
:
可以在运行时使用该
INSTALL
PLUGIN
语句
加载位于插件库文件中的插件
。
该语句还在
mysql.plugin
表中
注册插件,
以使服务器在后续重新启动时加载它。
因此,
INSTALL
PLUGIN
需要
表
的
INSERT
权限
mysql.plugin
。
插件库文件基本名称取决于您的平台。
对于Windows
.so
,
常见的后缀适用
于Unix和类Unix系统
.dll
。
示例:该
--plugin-load
选项在服务器启动时安装插件。
要安装以命名
myplugin
的插件库文件命名的插件
somepluglib.so
,请在
my.cnf
文件中
使用以下行
:
的[mysqld] 插件负载=为myplugin = somepluglib.so
在这种情况下,插件未注册
mysql.plugin
。
不使用该
--plugin-load
选项
重新启动服务器
会导致启动时不加载插件。
或者,该
INSTALL
PLUGIN
语句使服务器在运行时从库文件加载插件代码:
INSTALL PLUGIN myplugin SONAME'omepluglib.so';
INSTALL
PLUGIN
还会导致
“
永久
”
插件注册:
mysql.plugin
表中
列出了插件,
以确保服务器在后续重新启动时加载它。
许多插件可以在服务器启动时或运行时加载。
但是,如果插件的设计必须在服务器启动期间加载和初始化,则尝试在运行时加载它会
INSTALL
PLUGIN
产生错误:
MySQL的> INSTALL PLUGIN myplugin SONAME 'somepluglib.so';
ERROR 1721(HY000):插件'myplugin'被标记为不动态
安装。您必须停止服务器才能安装它。
在这种情况下,你必须使用
--plugin-load
,
--plugin-load-add
或
--early-plugin-load
。
如果插件名为两者使用
--plugin-load
,
--plugin-load-add
或
--early-plugin-load
选项(如较早的结果
INSTALL
PLUGIN
在声明)
mysql.plugin
表,服务器启动,但这些消息写入错误日志:
[ERROR]功能'plugin_name
'已存在 [警告]无法加载名为'plugin_name
'的插件 与soname'plugin_object_file
'。
如果服务器在启动时知道插件(例如,因为插件是使用
--plugin-load
选项
命名
或在
mysql.plugin
表中
注册的
),则服务器默认加载并启用插件。
这是可能使用,以控制激活状态对于这样的插件
启动选项,其中
是插件的影响名称,如
,
,或
。
与其他选项一样,破折号和下划线在选项名称中可以互换。
此外,激活状态值不区分大小写。
例如,
并且
是等价的。
--
plugin_name
[=activation_state
]plugin_name
innodb
csv
validate_password
--my_plugin=ON
--my-plugin=on
--
plugin_name
=OFF
告诉服务器禁用插件。
对于某些内置插件,这可能是不可能的,例如
mysql_native_password
。
--
plugin_name
[=ON]
告诉服务器启用插件。
(将选项指定为
没有值具有相同的效果。)如果插件无法初始化,则服务器在禁用插件的情况下运行。
--
plugin_name
--
plugin_name
=FORCE
告诉服务器启用插件,但如果插件初始化失败,则服务器无法启动。 换句话说,此选项会强制服务器在启用插件的情况下运行,或者根本不启用。
--
plugin_name
=FORCE_PLUS_PERMANENT
喜欢
FORCE
,但另外防止插件在运行时被卸载。
如果用户尝试这样做
UNINSTALL PLUGIN
,则会发生错误。
插件激活状态
LOAD_OPTION
在
INFORMATION_SCHEMA.PLUGINS
表
的
列
中可见
。
假设
CSV
,
BLACKHOLE
以及
ARCHIVE
都内置可插拔存储引擎以及您希望服务器在启动时加载它们,受以下条件:服务器被允许运行,如果
CSV
初始化失败,必须要求
BLACKHOLE
初始化成功,并应禁用
ARCHIVE
。
要实现这一点,请在选项文件中使用以下行:
的[mysqld] CSV = ON 黑洞= FORCE 存档= OFF
该
选项的格式是一个同义词
。
在
和
选项格式是同义词
。
--enable-
plugin_name
--
plugin_name
=ON--disable-
plugin_name
--skip-
plugin_name
--
plugin_name
=OFF
如果插件被禁用,无论是显式使用
OFF
还是隐式,因为它已启用
ON
但无法初始化,需要插件的服务器操作的各个方面都将更改。
例如,如果插件实现了存储引擎,则存储引擎的现有表变得不可访问,并且尝试为存储引擎创建新表会导致使用默认存储引擎的表,除非
NO_ENGINE_SUBSTITUTION
启用SQL模式以导致错误相反。
禁用插件可能需要调整其他选项。
例如,如果使用
--skip-innodb
禁用
启动服务器,则启动时
可能需要省略
InnoDB
其他
选项。
此外,因为
是默认存储引擎,除非您指定另一个可用的存储引擎,否则它将无法启动
。
你还必须设置
。
innodb_
xxx
InnoDB
--default_storage_engine
--default_tmp_storage_engine
在运行时,该
UNINSTALL
PLUGIN
语句禁用和卸载服务器已知的插件。
该语句卸载插件并将其从
mysql.plugin
系统表中
删除
(如果已在其中注册)。
因此,
UNINSTALL
PLUGIN
statement需要
表
的
DELETE
特权
mysql.plugin
。
由于插件不再在表中注册,服务器不会自动加载插件以便后续重新启动。
UNINSTALL
PLUGIN
无论是在运行时加载
INSTALL
PLUGIN
还是在启动时使用插件加载选项
加载插件都可以卸载插件
,具体取决于以下条件:
它无法卸载内置于服务器的插件。
这些可以标识为
NULL
输出中
的库名称为
INFORMATION_SCHEMA.PLUGINS
或者
SHOW
PLUGINS
。
它无法卸载服务器启动时使用的
插件,这会阻止插件在运行时卸载。
这些可以从
表格
的
列中
识别出来
。
--
plugin_name
=FORCE_PLUS_PERMANENTLOAD_OPTION
INFORMATION_SCHEMA.PLUGINS
要卸载当前在服务器启动时使用插件加载选项加载的插件,请使用此过程。
从
my.cnf
文件中
删除与插件相关的所有选项
。
重启服务器。
插件通常在启动时或
INSTALL
PLUGIN
在运行时
使用插件加载选项安装
,但不能同时安装。
但是,
my.cnf
如果在某些时候
INSTALL
PLUGIN
也使用
了,则从
文件中
删除插件的
选项可能不足以卸载它
。
如果插件仍然出现在
INFORMATION_SCHEMA.PLUGINS
或
的输出中
SHOW
PLUGINS
,请使用
UNINSTALL PLUGIN
从
mysql.plugin
表中
删除它
。
然后再次重启服务器。
有几种方法可以确定服务器中安装了哪些插件:
该
INFORMATION_SCHEMA.PLUGINS
表包含每个已加载插件的行。
任何具有
PLUGIN_LIBRARY
值的
NULL
内置都是无法卸载的。
MySQL的> SELECT * FROM INFORMATION_SCHEMA.PLUGINS\G
*************************** 1。排******************** *******
PLUGIN_NAME:binlog
PLUGIN_VERSION:1.0
PLUGIN_STATUS:有效
PLUGIN_TYPE:存储引擎
PLUGIN_TYPE_VERSION:50158.0
PLUGIN_LIBRARY:NULL
PLUGIN_LIBRARY_VERSION:NULL
PLUGIN_AUTHOR:MySQL AB
PLUGIN_DESCRIPTION:这是一个伪存储引擎,用于表示事务中的binlog
PLUGIN_LICENSE:GPL
LOAD_OPTION:FORCE
...
*************************** 10.排******************** *******
PLUGIN_NAME:InnoDB
PLUGIN_VERSION:1.0
PLUGIN_STATUS:有效
PLUGIN_TYPE:存储引擎
PLUGIN_TYPE_VERSION:50158.0
PLUGIN_LIBRARY:ha_innodb_plugin.so
PLUGIN_LIBRARY_VERSION:1.0
PLUGIN_AUTHOR:Innobase Oy
PLUGIN_DESCRIPTION:支持事务,行级锁定,
和外键
PLUGIN_LICENSE:GPL
LOAD_OPTION:ON
...
该
SHOW
PLUGINS
语句为每个加载的插件显示一行。
任何具有
Library
值的
NULL
内置都是无法卸载的。
MySQL的> SHOW PLUGINS\G
*************************** 1。排******************** *******
名称:binlog
状态:ACTIVE
类型:存储引擎
库:NULL
许可证:GPL
...
*************************** 10.排******************** *******
名称:InnoDB
状态:ACTIVE
类型:存储引擎
图书馆:ha_innodb_plugin.so
许可证:GPL
...
该
mysql.plugin
表显示了已注册的插件
INSTALL
PLUGIN
。
该表仅包含插件名称和库文件名,因此它不提供与
PLUGINS
表或
SHOW
PLUGINS
语句
一样多的信息
。
MySQL Enterprise Thread Pool是MySQL Enterprise Edition中的扩展,是企业产品。 要了解有关商业产品的更多信息, 请访问https://www.mysql.com/products/ 。
MySQL企业版包括MySQL Enterprise Thread Pool,使用服务器插件实现。 MySQL Server中的默认线程处理模型使用每个客户端连接一个线程执行语句。 随着越来越多的客户端连接到服务器并执行语句,整体性能会下降。 线程池插件提供了另一种线程处理模型,旨在减少开销并提高性能。 该插件实现了一个线程池,通过有效地管理大量客户端连接的语句执行线程来提高服务器性能。
线程池解决了每个连接使用一个线程的模型的几个问题:
太多的线程堆栈使CPU缓存在高度并行的执行工作负载中几乎无用。 线程池促进线程堆栈重用以最小化CPU缓存占用空间。
由于太多线程并行执行,因此上下文切换开销很高。 这也给操作系统调度程序带来了挑战性的任务。 线程池控制活动线程的数量,以使MySQL服务器内的并行性保持在它可以处理的水平,并且适用于正在执行MySQL的服务器主机。
并行执行的事务太多会增加资源争用。
在
InnoDB
,这增加了持有中央互斥锁所花费的时间。
线程池控制事务何时开始,以确保并行执行的次数不会太多。
第A.14节“MySQL 8.0常见问题解答:MySQL企业线程池”
线程池功能包括以下组件:
插件库文件实现了线程池代码的插件以及几个提供有关线程池操作的信息的相关监视表:
从MySQL 8.0.14开始,监控表是性能模式表; 请参见 第26.12.15节“性能架构线程池表” 。
在MySQL 8.0.14之前,监控表是
INFORMATION_SCHEMA
表格;
请参见
第25.40节“INFORMATION_SCHEMA线程池表”
。
这些
INFORMATION_SCHEMA
表现已弃用,将在未来的MySQL版本中删除。
应用程序应从旧表转换到新表。
例如,如果应用程序使用此查询:
SELECT * FROM INFORMATION_SCHEMA.TP_THREAD_STATE;
应用程序应该使用此查询:
SELECT * FROM performance_schema.tp_thread_state;
如果未加载所有监控表,则部分或全部MySQL Enterprise Monitor线程池图将为空。
有关线程池如何工作的详细说明,请参见 第5.6.3.3节“线程池操作” 。
几个系统变量与线程池相关。
该
thread_handling
系统变量的值,
loaded-dynamically
当服务器成功加载线程池插件。
其他相关变量由线程池插件实现; 除非启用它们,否则它们不可用:
thread_pool_algorithm
:用于调度的并发算法。
thread_pool_high_priority_connection
:如何为会话安排语句执行。
thread_pool_prio_kickup_timer
:线程池将等待从低优先级队列执行的语句移动到高优先级队列之前多长时间。
thread_pool_max_unused_threads
:允许多少个睡眠线程。
thread_pool_size
:线程池中的线程组数。
这是控制线程池性能的最重要参数。
thread_pool_stall_limit
:执行语句之前的时间被认为是停滞的。
如果插件实现的任何变量在启动时设置为非法值,则插件初始化失败并且插件无法加载。
有关设置线程池参数的信息,请参见 第5.6.3.4节“线程池调整” 。
性能模式具有公开线程池信息的工具,可用于调查操作性能。 要识别它们,请使用以下查询:
SELECT * FROM performance_schema.setup_instruments 在哪里名称'%thread_pool%';
有关更多信息,请参见 第26章, MySQL性能架构 。
本节介绍如何安装MySQL Enterprise Thread Pool。 有关安装插件的一般信息,请参见 第5.6.1节“安装和卸载插件” 。
要使服务器可以使用,插件库文件必须位于MySQL插件目录(
plugin_dir
系统变量
指定的目录
)中。
如有必要,通过设置
plugin_dir
服务器启动时
的值来配置插件目录位置
。
插件库文件基本名称是
thread_pool
。
文件名后缀因平台
.so
而异
(例如,
对于Unix和类Unix系统,
.dll
对于Windows)。
在MySQL 8.0.14及更高版本中,线程池监视表是与线程池插件一起加载和卸载的性能模式表。
INFORMATION_SCHEMA
表
的
版本已弃用但仍可用;
它们是按照
MySQL 8.0.14之前的线程池安装中
的说明
安装的
。
要启用线程池功能,请通过使用该
--plugin-load-add
选项
启动服务器来加载插件
。
为此,请将这些行放在服务器
my.cnf
文件中(
.so
根据需要
调整
平台
的
后缀):
的[mysqld] 插件的负载加= thread_pool.so
要验证插件安装,请检查
INFORMATION_SCHEMA.PLUGINS
表或使用该
SHOW
PLUGINS
语句(请参见
第5.6.2节“获取服务器插件信息”
)。
例如:
MySQL的>SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'thread%';
+ ----------------------- + -------- + | PLUGIN_NAME | PLUGIN_STATUS | + ----------------------- + -------- + | thread_pool | ACTIVE | + ----------------------- + -------- +
要验证性能模式监视表是否可用,请检查该
INFORMATION_SCHEMA.TABLES
表或使用该
SHOW
TABLES
语句。
例如:
MySQL的>SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'performance_schema'
AND TABLE_NAME LIKE 'tp%';
+ ----------------------- + | TABLE_NAME | + ----------------------- + | tp_thread_group_state | | tp_thread_group_stats | | tp_thread_state | + ----------------------- +
如果服务器成功加载线程池插件,则将
thread_handling
系统变量设置为
loaded-dynamically
。
如果插件无法初始化,请检查服务器错误日志以获取诊断消息。
在MySQL 8.0.14之前,线程池监视表是与线程池插件分开的插件,可以单独安装。
要启用线程池功能,请通过使用该
--plugin-load-add
选项
启动服务器来加载要使用的插件
。
例如,如果仅命名插件库文件,则服务器会加载它包含的所有插件(即线程池插件和所有
INFORMATION_SCHEMA
表)。
为此,请将这些行放在服务器
my.cnf
文件中(
.so
根据需要
调整
平台
的
后缀):
的[mysqld] 插件的负载加= thread_pool.so
这相当于通过单独命名它们来加载所有线程池插件:
的[mysqld] 插件的负载加= thread_pool = thread_pool.so 插件的负载加= tp_thread_state = thread_pool.so 插件的负载加= tp_thread_group_state = thread_pool.so 插件的负载加= tp_thread_group_stats = thread_pool.so
如果需要,您可以从库文件加载单个插件。
要加载线程池插件而不是
INFORMATION_SCHEMA
表,请使用如下选项:
的[mysqld] 插件的负载加= thread_pool = thread_pool.so
要加载线程池插件而只加载
表,请使用以下选项:
TP_THREAD_STATE
INFORMATION_SCHEMA
的[mysqld] 插件的负载加= thread_pool = thread_pool.so 插件的负载加= tp_thread_state = thread_pool.so
要验证插件安装,请检查
INFORMATION_SCHEMA.PLUGINS
表或使用该
SHOW
PLUGINS
语句(请参见
第5.6.2节“获取服务器插件信息”
)。
例如:
MySQL的>SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'thread%' OR PLUGIN_NAME LIKE 'tp%';
+ ----------------------- + -------- + | PLUGIN_NAME | PLUGIN_STATUS | + ----------------------- + -------- + | thread_pool | ACTIVE | | TP_THREAD_STATE | ACTIVE | | TP_THREAD_GROUP_STATE | ACTIVE | | TP_THREAD_GROUP_STATS | ACTIVE | + ----------------------- + -------- +
如果服务器成功加载线程池插件,则将
thread_handling
系统变量设置为
loaded-dynamically
。
如果插件无法初始化,请检查服务器错误日志以获取诊断消息。
线程池由许多线程组组成,每个线程组管理一组客户端连接。 在建立连接时,线程池以循环方式将它们分配给线程组。
可以使用
thread_pool_size
系统变量
配置线程组的数量
。
默认的组数为16.有关设置此变量的指导,请参见
第5.6.3.4节“线程池调整”
。
每组的最大线程数为4096(在内部使用一个线程的某些系统上为4095)。
线程池将连接和线程分开,因此连接与执行从这些连接接收的语句的线程之间没有固定的关系。 这与默认线程处理模型不同,后者将一个线程与一个连接相关联,以便线程执行连接中的所有语句。
线程池尝试在任何时候确保每个组中最多执行一个线程,但有时允许更多线程暂时执行以获得最佳性能。 该算法以下列方式工作:
每个线程组都有一个侦听器线程,用于侦听分配给该组的连接的传入语句。 当一个语句到达时,线程组要么立即开始执行它,要么将它排队等待以后执行:
如果语句是唯一接收的语句并且没有语句排队或当前正在执行,则立即执行。
如果语句无法立即开始执行,则会发生排队。
如果立即执行,则由侦听器线程执行。 (这意味着组中的线程暂时没有正在侦听。)如果语句快速完成,则执行线程将返回侦听语句。 否则,线程池会认为语句已停止,并将另一个线程作为侦听器线程启动(必要时创建它)。 为了确保没有线程组被停滞的语句阻塞,线程池有一个后台线程,它定期监视线程组状态。
通过使用侦听线程来执行可以立即开始的语句,如果语句快速完成,则无需创建其他线程。 这确保了在并发线程数较少的情况下可以最有效地执行。
当线程池插件启动时,它会为每个组(侦听器线程)和后台线程创建一个线程。 必要时会创建其他线程来执行语句。
thread_pool_stall_limit
系统变量
的值
确定
前一项
中
“
快速完成
”
的含义
。
线程被视为停顿之前的默认时间是60ms,但可以设置为最多6s。
此参数可配置为使您能够获得适合服务器工作负载的平衡。
短等待值允许线程更快地启动。
短值也可以更好地避免死锁情况。
长等待值对于包含长时间运行语句的工作负载很有用,以避免在当前执行时发出太多新语句。
线程池侧重于限制并发短期运行语句的数量。 在执行语句到达停顿时间之前,它会阻止其他语句开始执行。 如果语句执行超过停顿时间,则允许继续但不再阻止其他语句启动。 通过这种方式,线程池尝试确保在每个线程组中始终存在多个短运行语句,尽管可能存在多个长时间运行的语句。 让长时间运行的语句阻止其他语句执行是不可取的,因为对可能需要的等待量没有限制。 例如,
如果语句遇到磁盘I / O操作或用户级别锁定(行锁定或表锁定),则会阻止该语句。 该块将导致线程组变为未使用,因此存在对线程池的回调,以确保线程池可以立即启动该组中的新线程以执行另一个语句。 当被阻塞的线程返回时,线程池允许它立即重启。
有两个队列,一个是高优先级队列,另一个是低优先级队列。
事务中的第一个语句转到低优先级队列。
如果事务正在进行(其语句已开始执行),则事务的任何后续语句将转到高优先级队列,否则转到低优先级队列。
通过启用
thread_pool_high_priority_connection
系统变量
可以影响队列分配
,这会导致会话的所有排队语句进入高优先级队列。
非事务性存储引擎或事务引擎(如果
autocommit
启用)的语句被视为低优先级语句,因为在这种情况下,每个语句都是一个事务。
因此,给定
表
InnoDB
和
语句的混合语句
,
除非
启用
,
否则
MyISAM
线程池优先于
InnoDB
那些
语句
池
。
随着
启用时,所有的语句将低优先级。
MyISAM
autocommit
autocommit
当线程组选择要执行的排队语句时,它首先查找高优先级队列,然后查找低优先级队列。 如果找到一个语句,它将从队列中删除并开始执行。
如果语句在低优先级队列中停留的时间过长,则线程池将移至高优先级队列。
thread_pool_prio_kickup_timer
系统变量
的值
控制移动前的时间。
对于每个线程组,每10ms或每秒100个最多一个语句将从低优先级队列移动到高优先级队列。
线程池重用最活跃的线程以更好地使用CPU缓存。 这是一个小的调整,对性能有很大影响。
当线程从用户连接执行语句时,Performance Schema检测会将线程活动记录到用户连接。 否则,Performance Schema会将活动记录到线程池。
以下是线程组可能有多个线程开始执行语句的条件示例:
一个线程开始执行一个语句,但运行时间足以被视为停顿。 即使第一个线程仍在执行,线程组也允许另一个线程开始执行另一个语句。
一个线程开始执行语句,然后被阻塞并将其报告回线程池。 线程组允许另一个线程开始执行另一个语句。
一个线程开始执行一个语句,被阻塞,但没有报告它被阻止,因为该块不会出现在已经使用线程池回调检测的代码中。 在这种情况下,线程组的线程仍然在运行。 如果块持续的时间足以使语句被视为停顿,则该组允许另一个线程开始执行另一个语句。
线程池旨在通过越来越多的连接进行扩展。 它还旨在避免因限制活动执行语句的数量而引起的死锁。 重要的是,不报告回线程池的线程不会阻止其他语句执行,从而导致线程池变为死锁。 此类陈述的示例如下:
长期运行的声明。 这些将导致仅由少数语句使用的所有资源,并且它们可以阻止所有其他人访问服务器。
二进制日志转储线程,读取二进制日志并将其发送到从属。 这是一种长时间运行的 “ 语句 ” ,它运行很长时间,不应该阻止其他语句执行。
在行锁定,表锁定,睡眠或任何其他阻止活动上阻止的语句尚未由MySQL服务器或存储引擎报告回线程池。
在每种情况下,为了防止死锁,当语句未快速完成时,语句将被移动到已停止的类别,以便线程组可以允许另一个语句开始执行。 使用此设计,当线程执行或被阻塞一段延长的时间时,线程池会将线程移动到停滞的类别,并且对于语句执行的其余部分,它不会阻止其他语句执行。
可能出现的最大线程数是
max_connections
和
的总和
thread_pool_size
。
这可能发生在所有连接都处于执行模式并且每个组创建额外线程以侦听更多语句的情况下。
这不一定是经常发生的状态,但理论上是可行的。
本节提供有关设置线程池系统变量以获得最佳性能的指南,使用诸如每秒事务数之类的度量来衡量。
thread_pool_size
是控制线程池性能的最重要参数。
它只能在服务器启动时设置。
我们测试线程池的经验表明如下:
如果是主存储引擎
InnoDB
,则最佳
thread_pool_size
设置可能在16到36之间,最常见的最佳值倾向于从24到36.我们还没有看到任何设置已超过36的最佳设置。是小于16的值是最佳的特殊情况。
对于DBT2和Sysbench等工作负载,最佳值
InnoDB
似乎通常在36左右。对于非常写入密集型的工作负载,最佳设置有时可能会更低。
如果是主存储引擎
MyISAM
,则
thread_pool_size
设置应该相当低。
我们倾向于从4到8的值获得最佳性能。较高的值往往会对性能产生轻微负面影响但不会产生显着影响。
另一个系统变量
thread_pool_stall_limit
对于处理被阻塞和长时间运行的语句非常重要。
如果所有阻止MySQL服务器的调用都被报告给线程池,它将始终知道何时阻止执行线程。
但是,这可能并非总是如此。
例如,块可能出现在尚未使用线程池回调进行检测的代码中。
对于这种情况,线程池必须能够识别看似被阻止的线程。
这是通过超时完成的,超时可以使用
thread_pool_stall_limit
系统变量
调整其长度
。
此参数可确保服务器不会被完全阻止。
的价值
thread_pool_stall_limit
上限为6秒,以防止服务器死锁的风险。
thread_pool_stall_limit
还使线程池能够处理长时间运行的语句。
如果允许长时间运行的语句阻止线程组,则分配给该组的所有其他连接将被阻止,并且在长时间运行的语句完成之前无法开始执行。
在最坏的情况下,这可能需要数小时甚至数天。
thread_pool_stall_limit
应该选择
值,
使得执行时间长于其值的语句被认为是停滞不前的。
停滞的语句会产生大量的额外开销,因为它们涉及额外的上下文切换,在某些情况下还需要额外的线程创建。
另一方面,将
thread_pool_stall_limit
参数
设置
得太高意味着长时间运行的语句将阻止许多短时间运行的语句超过必要的时间。
短等待值允许线程更快地启动。
短值也可以更好地避免死锁情况。
长等待值对于包含长时间运行语句的工作负载很有用,以避免在当前执行时发出太多新语句。
假设服务器执行工作负载,即使服务器加载,99.9%的语句在100ms内完成,其余语句在100ms到2小时之间相当均匀地传播。
在这种情况下,设置
thread_pool_stall_limit
为10(意味着100毫秒)是有意义的。
对于主要执行非常简单的语句的服务器,默认值为60ms是可以的。
thread_pool_stall_limit
可以在运行时更改
该
参数,以使您能够获得适合服务器工作负载的平衡。
假设
tp_thread_group_stats
表已启用,您可以使用以下查询来确定已停止的已执行语句的分数:
SELECT SUM(STALLED_QUERIES_EXECUTED)/ SUM(QUERIES_EXECUTED) FROM performance_schema.tp_thread_group_stats;
这个数字应该尽可能低。
为了减少语句停滞的可能性,增加语句的值
thread_pool_stall_limit
。
当一个语句到达时,它在实际开始执行之前可以延迟的最长时间是多少? 假设以下条件适用:
在低优先级队列中排队有200个语句。
在高优先级队列中排队有10个语句。
thread_pool_prio_kickup_timer
设置为10000(10秒)。
thread_pool_stall_limit
设置为100(1秒)。
在最坏的情况下,10个高优先级语句代表10个持续执行很长时间的事务。 因此,在最坏的情况下,没有语句将被移动到高优先级队列,因为它总是已经包含等待执行的语句。 10秒后,新语句有资格移动到高优先级队列。 但是,在可以移动它之前,它之前的所有语句也必须移动。 这可能需要另外2秒,因为每秒最多100个语句被移动到高优先级队列。 现在,当语句到达高优先级队列时,可能会有许多长时间运行的语句。 在最坏的情况下, 在从高优先级队列中检索下一个语句之前,每个语句都会停止运行并且每个语句需要1秒钟。 因此,在这种情况下,新语句开始执行需要222秒。
此示例显示了应用程序的最坏情况。 如何处理它取决于应用程序。 如果应用程序对响应时间有很高的要求,那么它很可能会将用户本身限制在更高的级别。 否则,它可以使用线程池配置参数来设置某种最大等待时间。
MySQL支持查询重写插件,可以在服务器执行之前检查并可能修改服务器接收的SQL语句。 请参阅 查询重写插件 。
MySQL发行版包括一个名为postparse query rewrite的插件,
Rewriter
以及用于安装插件及其相关组件的脚本。
这些组件协同工作以提供语句重写功能:
一个名为
Rewriter
examns语句的
服务器端插件
,可以根据重写规则的内存缓存重写它们。
这些陈述可能会被重写:
独立语句和准备好的语句可以重写。 视图定义或存储程序中发生的语句不会被重写。
该
Rewriter
插件使用名为
query_rewrite
包含
名为
的表
的数据库
rewrite_rules
。
该表为插件用于决定是否重写语句的规则提供持久存储。
用户通过修改此表中存储的规则集与插件进行通信。
该插件通过设置
message
表行列
与用户进行通信
。
该
query_rewrite
数据库包含一个名为的存储过程
flush_rewrite_rules()
,用于将rules表的内容加载到插件中。
存储过程
load_rewrite_rules()
使用
名为的用户定义函数
flush_rewrite_rules()
。
该
Rewriter
插件公开了系统变量,这些变量支持提供运行时操作信息的插件配置和状态变量。
以下部分描述了如何安装和使用
Rewriter
插件,并提供其相关组件的参考信息。
如果已安装,
Rewriter
即使禁用
,
插件也会产生一些开销。
为避免此开销,请不要安装插件,除非您打算使用它。
要安装或卸载
Rewriter
查询重写插件,请选择位于
share
MySQL安装目录中
的相应脚本
:
install_rewriter.sql
:选择此脚本以安装
Rewriter
插件及其关联的组件。
uninstall_rewriter.sql
:选择此脚本以卸载
Rewriter
插件及其关联的组件。
运行所选脚本如下:
shell>mysql -u root -p < install_rewriter.sql
输入密码:(enter root password here)
此处的示例使用
install_rewriter.sql
安装脚本。
uninstall_rewriter.sql
如果要卸载插件,请
替换
。
运行安装脚本应该安装并启用该插件。 要验证这一点,请连接到服务器并执行以下语句:
MySQL的> SHOW GLOBAL VARIABLES LIKE 'rewriter_enabled';
+ ------------------ + ------- +
| Variable_name | 价值|
+ ------------------ + ------- +
| rewriter_enabled | ON |
+ ------------------ + ------- +
有关使用说明,请参见 第5.6.4.2节“使用重写器查询重写插件” 。 有关参考信息,请参见 第5.6.4.3节“重写器查询重写插件参考” 。
要启用或禁用插件,请启用或禁用
rewriter_enabled
系统变量。
默认情况下,
Rewriter
插件在安装时会启用(请参见
第5.6.4.1节“安装或卸载重写器查询重写插件”
)。
要显式设置初始插件状态,可以在服务器启动时设置变量。
例如,要在选项文件中启用插件,请使用以下行:
的[mysqld] rewriter_enabled = ON
也可以在运行时启用或禁用插件:
SET GLOBAL rewriter_enabled = ON; SET GLOBAL rewriter_enabled = OFF;
假设
Rewriter
插件已启用,它会检查并可能修改服务器接收的每个可重写语句。
该插件根据重写规则的内存缓存来确定是否重写语句,这些重写规则是从
数据库中
的
rewrite_rules
表中
加载
的
query_rewrite
。
这些陈述可能会被重写:
独立语句和准备好的语句可以重写。 视图定义或存储程序中发生的语句不会被重写。
要为
Rewriter
插件
添加规则
,请向
rewrite_rules
表中
添加行
,然后调用
flush_rewrite_rules()
存储过程以将表中的规则加载到插件中。
以下示例创建一个简单规则来匹配选择单个文字值的语句:
INSERT INTO query_rewrite.rewrite_rules(模式,替换) VALUES('SELECT?','SELECT?+ 1');
生成的表内容如下所示:
MySQL的> SELECT * FROM query_rewrite.rewrite_rules\G
*************************** 1。排******************** *******
id:1
模式:SELECT?
pattern_database:NULL
替换:SELECT?+ 1
启用:是
消息:NULL
pattern_digest:NULL
normalized_pattern:NULL
该规则指定模式模板,指示
SELECT
要匹配的语句,以及指示如何重写匹配语句的替换模板。
但是,将规则添加到
rewrite_rules
表中不足以使
Rewriter
插件使用该规则。
您必须调用
flush_rewrite_rules()
以将表内容加载到插件内存缓存中:
MySQL的> CALL query_rewrite.flush_rewrite_rules();
如果您的重写规则似乎无法正常工作,请确保通过调用重新加载规则表
flush_rewrite_rules()
。
当插件从规则表中读取每个规则时,它会根据模式和摘要哈希值计算规范化(语句摘要)表单,并使用它们来更新
normalized_pattern
和
pattern_digest
列:
MySQL的> SELECT * FROM query_rewrite.rewrite_rules\G
*************************** 1。排******************** *******
id:1
模式:SELECT?
pattern_database:NULL
替换:SELECT?+ 1
启用:是
消息:NULL
pattern_digest:d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae
normalized_pattern:选择?
有关语句摘要,规范化语句和摘要哈希值的信息,请参见 第26.10节“性能模式语句摘要和采样” 。
如果由于某些错误而无法加载规则,则调用
flush_rewrite_rules()
会产生错误:
MySQL的> CALL query_rewrite.flush_rewrite_rules();
ERROR 1644(45000):加载某些规则失败。
发生这种情况时,插件会将错误消息写入
message
规则行的列以传达问题。
检查
rewrite_rules
表中是否有非
NULL
message
列值的
行,
以查看存在的问题。
模式使用与预准备语句相同的语法(请参见
第13.5.1节“PREPARE语法”
)。
在模式模板中,
?
字符充当与数据值匹配的参数标记。
参数标记只能用于应出现数据值的位置,而不能用于SQL关键字,标识符等。
该
?
字符不应引号括起来。
与模式一样,替换可以包含
?
字符。
对于与模式模板匹配的语句,插件会重写它,
?
使用模式中相应标记匹配的数据值
替换替换中的
参数标记。
结果是一个完整的语句字符串。
插件要求服务器解析它,并将结果作为重写语句的表示返回给服务器。
添加并加载规则后,根据语句是否与规则模式匹配,检查是否发生重写:
MySQL的>SELECT PI();
+ ---------- + | PI()| + ---------- + | 3.141593 | + ---------- + 1排(0.01秒) MySQL的>SELECT 10;
+ -------- + | 10 + 1 | + -------- + | 11 | + -------- + 1排,1警告(0.00秒)
第一个
SELECT
语句
没有重写
,但第二个语句
没有重写
。
第二个语句说明当
Rewriter
插件重写语句时,它会产生一条警告消息。
要查看消息,请使用
SHOW
WARNINGS
:
MySQL的> SHOW WARNINGS\G
*************************** 1。排******************** *******
等级:注意
代码:1105
消息:查询'SELECT 10'被查询重写插件重写为'SELECT 10 + 1'
不需要将语句重写为相同类型的语句。
以下示例加载一条
DELETE
将
UPDATE
语句
重写
为
语句
的规则
:
INSERT INTO query_rewrite.rewrite_rules(模式,替换) VALUES('从db1.t1删除WHERE col =?', 'UPDATE db1.t1 SET col = NULL WHERE col =?'); CALL query_rewrite.flush_rewrite_rules();
要启用或禁用现有规则,请修改其
enabled
列并将表重新加载到插件中。
要禁用规则1:
UPDATE query_rewrite.rewrite_rules SET enabled ='NO'WHERE id = 1; CALL query_rewrite.flush_rewrite_rules();
这使您可以在不从表中删除规则的情况下停用规则。
要重新启用规则1:
UPDATE query_rewrite.rewrite_rules SET enabled ='YES'WHERE id = 1; CALL query_rewrite.flush_rewrite_rules();
该
rewrite_rules
表包含一
pattern_database
列,
Rewriter
用于匹配未使用数据库名称限定的表名:
如果相应的数据库和表名相同,则语句中的限定表名与模式中的限定名匹配。
仅当默认数据库
pattern_database
与表名相同且
语句名相同时,语句中的非限定表名才会匹配模式中的非限定名称
。
假设一个名为
appdb.users
的列具有一个
名为
的列
id
,并且应用程序应该使用这些表单之一的查询从表中选择行,其中第二个只有
appdb
在默认数据库时
才能使用
:
SELECT * FROM users WHERE appdb.id =id_value
; SELECT * FROM users WHERE id =id_value
;
还假设该
id
列被重命名为
user_id
(可能必须修改该表以添加另一种类型的ID,并且有必要更具体地指示该
id
列表示
的ID类型
)。
更改意味着应用程序必须引用
user_id
而不是
id
在
WHERE
子句中
引用
。
但是,如果有旧的应用程序无法编写以更改
SELECT
它们生成
的
查询,则它们将无法正常工作。
该
Rewriter
插件可以解决这个问题。
要匹配和重写语句,无论它们是否限定表名,请添加以下两个规则并重新加载规则表:
INSERT INTO query_rewrite.rewrite_rules (图案,替换)VALUES( 'SELECT * FROM appdb.users WHERE id =?', 'SELECT * FROM appdb.users WHERE user_id =?' ); INSERT INTO query_rewrite.rewrite_rules (pattern,replacement,pattern_database)VALUES( 'SELECT * FROM users WHERE id =?', 'SELECT * FROM users WHERE user_id =?', 'appdb' ); CALL query_rewrite.flush_rewrite_rules();
Rewriter
使用第一个规则来匹配使用限定表名的语句。
它使用第二个匹配使用非限定名称的语句,但仅限于默认数据库
appdb
(值为
pattern_database
)。
该
Rewriter
插件使用语句摘要和摘要哈希值来分阶段匹配传入语句和重写规则。
的
max_digest_length
系统变量决定用于计算语句摘要缓冲区的大小。
较大的值可以计算区分较长语句的摘要。
较小的值使用较少的内存,但会增加较长语句与相同摘要值冲突的可能性。
该插件将每个语句与重写规则匹配如下:
计算语句摘要哈希值并将其与规则摘要哈希值进行比较。 这可能会出现误报,但可作为快速拒绝测试。
如果语句摘要哈希值与任何模式摘要哈希值匹配,则将语句的规范化(语句摘要)形式与匹配规则模式的规范化形式相匹配。
如果规范化语句与规则匹配,则比较语句和模式中的文字值。
一个
?
在模式字符匹配在声明中的任何文字值。
如果语句准备语句,
?
则模式
?
中的语句
也匹配
。
否则,相应的文字必须相同。
如果多个规则与一个语句匹配,那么插件用来重写语句的是不确定的。
如果模式包含的标记多于替换,则插件会丢弃多余的数据值。
如果模式包含的标记少于替换,则表示错误。
插件在加载规则表时注意到这一点,将错误消息写入
message
规则行的列以传达问题,并将
Rewriter_reload_error
状态变量设置为
ON
。
准备好的语句在分析时(即准备好时)重写,而不是在以后执行时重写。
准备好的语句与非准备语句的不同之处在于它们可能包含
?
字符作为参数标记。
要匹配预
?
准备语句中的
Rewriter
模式
,
模式必须包含
?
在同一位置。
假设重写规则具有以下模式:
SELECT?,3
下表显示了几个预准备
SELECT
语句以及规则模式是否与它们匹配。
准备好的声明 | 模式是否匹配声明 |
---|---|
PREPARE s AS 'SELECT 3, 3' |
是 |
PREPARE s AS 'SELECT ?, 3' |
是 |
PREPARE s AS 'SELECT 3, ?' |
没有 |
PREPARE s AS 'SELECT ?, ?' |
没有 |
该
Rewriter
插件通过几个状态变量提供有关其操作的信息:
MySQL的> SHOW GLOBAL STATUS LIKE 'Rewriter%';
+ ----------------------------------- + ------- +
| Variable_name | 价值|
+ ----------------------------------- + ------- +
| Rewriter_number_loaded_rules | 1 |
| Rewriter_number_reloads | 5 |
| Rewriter_number_rewritten_queries | 1 |
| Rewriter_reload_error | ON |
+ ----------------------------------- + ------- +
有关这些变量的描述,请参见 第5.6.4.3.4节“重写器查询重写插件状态变量” 。
通过调用
flush_rewrite_rules()
存储过程
加载规则表时
,如果某个规则发生错误,则该
CALL
语句会产生错误,并且该插件会将
Rewriter_reload_error
状态变量设置为
ON
:
MySQL的>CALL query_rewrite.flush_rewrite_rules();
ERROR 1644(45000):加载某些规则失败。 MySQL的>SHOW GLOBAL STATUS LIKE 'Rewriter_reload_error';
+ ----------------------- + ------- + | Variable_name | 价值| + ----------------------- + ------- + | Rewriter_reload_error | ON | + ----------------------- + ------- +
在这种情况下,请检查
rewrite_rules
表中是否包含非
NULL
message
列值的
行,
以查看存在哪些问题。
当
rewrite_rules
表加载到
Rewriter
插件中时,插件使用
character_set_client
系统变量
的当前全局值来解释语句
。
如果
character_set_client
随后更改
全局
值,则必须重新加载规则表。
客户端的会话
character_set_client
值
必须
与加载规则表时的全局值相同,否则规则匹配将不适用于该客户端。
以下讨论用作对与
Rewriter
查询重写插件
相关联的这些组件的引用
:
数据库中
的
Rewriter
规则表
query_rewrite
Rewriter
程序和功能
Rewriter
系统和状态变量
数据库中
的
rewrite_rules
表
query_rewrite
为
Rewriter
插件用于决定是否重写语句
的规则提供持久存储
。
用户通过修改此表中存储的规则集与插件进行通信。
该插件通过设置表的
message
列
来向用户传达信息
。
规则表由
flush_rewrite_rules
存储过程
加载到插件中
。
除非在最近的表修改之后调用该过程,否则表内容不一定对应于插件正在使用的规则集。
该
rewrite_rules
表包含以下列:
id
规则ID。 此列是表主键。 您可以使用该ID唯一标识任何规则。
pattern
指示规则匹配的语句模式的模板。
使用
?
表示匹配的数据值是参数标记。
pattern_database
数据库用于匹配语句中的非限定表名。
如果相应的数据库和表名相同,则语句中的限定表名与模式中的限定名匹配。
仅当默认数据库
pattern_database
与表名相同且
语句名相同时,语句中的非限定表名才会匹配模式中的非限定名称
。
replacement
指示如何重写与
pattern
列值
匹配的语句的模板
。
使用
?
表示匹配的数据值是参数标记。
在重写的语句中,插件
使用与相应标记匹配的数据值
替换
?
参数标记
。
replacement
pattern
enabled
规则是否已启用。
加载操作(通过调用
flush_rewrite_rules()
存储过程执行)
Rewriter
仅在此列
加载
时才
将表中的规则加载到
内存高速缓存中
YES
。
此列可以在不删除规则的情况下停用规则:将列设置为除
YES
表
之外的值
,然后将表重新加载到插件中。
message
该插件使用此列与用户进行通信。
如果将规则表加载到内存中时没有发生错误,则插件会将
message
列
设置
为
NULL
。
非
NULL
值表示错误,列内容是错误消息。
在这些情况下可能会发生错误:
模式或替换是一个产生语法错误的错误SQL语句。
替换包含
?
比模式
更多的
参数标记。
如果发生加载错误,插件还会将
Rewriter_reload_error
状态变量设置为
ON
。
pattern_digest
此列用于调试和诊断。 如果在将规则表加载到内存中时该列存在,则插件会使用模式摘要更新它。 如果您尝试确定某些语句无法重写的原因,则此列可能很有用。
normalized_pattern
此列用于调试和诊断。 如果在将规则表加载到内存中时该列存在,则插件会使用模式的规范化形式对其进行更新。 如果您尝试确定某些语句无法重写的原因,则此列可能很有用。
Rewriter
插件操作使用存储过程将规则表加载到其内存缓存中,以及辅助用户定义函数(UDF)。
在正常操作下,用户仅调用存储过程。
UDF旨在由存储过程调用,而不是由用户直接调用。
flush_rewrite_rules()
此存储过程使用
load_rewrite_rules()
UDF将
rewrite_rules
表
的内容加载
到
Rewriter
内存高速缓存中。
呼唤
flush_rewrite_rules()
意味着
COMMIT
。
修改规则表后,调用此过程以使插件从新表内容更新其缓存。
如果发生任何错误,插件会
message
为表中的相应规则行
设置
列,并将
Rewriter_reload_error
状态变量设置为
ON
。
此UDF是
flush_rewrite_rules()
存储过程
使用的辅助例程
。
该
Rewriter
查询重写插件支持以下系统变量。
只有安装了插件,这些变量才可用(请参见
第5.6.4.1节“安装或卸载重写器查询重写插件”
)。
属性 | 值 |
---|---|
系统变量 | rewriter_enabled |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
是否
Rewriter
启用
了
查询重写插件。
属性 | 值 |
---|---|
系统变量 | rewriter_verbose |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
供内部使用。
该
Rewriter
查询重写插件支持以下状态变量。
只有安装了插件,这些变量才可用(请参见
第5.6.4.1节“安装或卸载重写器查询重写插件”
)。
成功从
rewrite_rules
表中
加载
到内存中以供
Rewriter
插件
使用
的重写插件重写规则的数量
。
的次数的
rewrite_rules
表已经被加载到由所使用的内存中缓存
Rewriter
插件。
Rewriter_number_rewritten_queries
Rewriter
查询重写插件自加载以来
重写的
查询
数
。
是否在最近将
rewrite_rules
表加载到
Rewriter
插件
使用的内存高速缓存中
时发生错误
。
如果值为
OFF
,则不会发生错误。
如果值为,则
ON
发生错误;
检查
表
的
message
列
rewriter_rules
是否有错误消息。
MySQL 8.0.16及更高版本包含一个
ddl_rewriter
插件,用于
CREATE
TABLE
在解析和执行服务器之前
修改
服务器接收的语句。
插件删除
ENCRYPTION
,
DATA DIRECTORY
和
INDEX
DIRECTORY
子句,从从加密的数据库创建的SQL转储文件中恢复表或将其表存储在数据目录之外时,这可能会有所帮助。
例如,插件可以将这样的转储文件恢复到未加密的实例中或者在数据目录外的路径不可访问的环境中。
在使用
ddl_rewriter
插件
之前
,请按照
第5.6.5.1节“安装或卸载ddl_rewriter”中
提供的说明进行
安装
。
ddl_rewriter
在解析之前检查服务器接收的SQL语句,根据这些条件重写它们:
ddl_rewriter
仅考虑
CREATE
TABLE
语句,并且仅当它们是在输入行的开头或准备语句文本的开头出现的独立语句时。
ddl_rewriter
不考虑
CREATE
TABLE
存储的程序定义中的语句。
语句可以扩展到多行。
在考虑重写的语句中,重写以下子句的实例,并将每个实例替换为单个空格:
ENCRYPTION
DATA DIRECTORY
(在表和分区级别)
INDEX DIRECTORY
(在表和分区级别)
重写不依赖于字母。
如果
ddl_rewriter
重写一个语句,它会生成一个警告:
MySQL的>CREATE TABLE t (i INT) DATA DIRECTORY '/var/mysql/data';
查询正常,0行受影响,1警告(0.03秒) MySQL的>SHOW WARNINGS\G
*************************** 1。排******************** ******* 等级:注意 代码:1105 消息:查询'CREATE TABLE t(i INT)DATA DIRECTORY'/ var / mysql / data'' 通过查询重写插件重写为'CREATE TABLE t(i INT)' 1排(0.00秒)
如果启用了常规查询日志或二进制日志,则服务器会在重写之后写入它们出现的语句
ddl_rewriter
。
安装后,
ddl_rewriter
公开Performance Schema
memory/rewriter/ddl_rewriter
工具以跟踪插件内存使用情况。
请参见
第26.12.16.10节“内存汇总表”
本节介绍如何安装或卸载
ddl_rewriter
插件。
有关安装插件的一般信息,请参见
第5.6.1节“安装和卸载插件”
。
如果已安装,
ddl_rewriter
即使禁用
,
插件也会涉及一些最小的开销。
要避免此开销,请
ddl_rewriter
仅在您打算使用它的期间
安装
。
主要用例是修改从转储文件恢复的语句,因此典型的使用模式是:1)安装插件; 2)恢复转储文件或文件; 3)卸载插件。
要使服务器可以使用,插件库文件必须位于MySQL插件目录(
plugin_dir
系统变量
指定的目录
)中。
如有必要,通过设置
plugin_dir
服务器启动时
的值来配置插件目录位置
。
插件库文件基本名称是
ddl_rewriter
。
文件名后缀因平台
.so
而异
(例如,
对于Unix和类Unix系统,
.dll
对于Windows)。
要安装
ddl_rewriter
插件,请使用该
INSTALL
PLUGIN
语句(
.so
根据需要
调整
平台
的
后缀):
INSTALL PLUGIN ddl_rewriter SONAME'ddl_rewriter.so';
要验证插件安装,请检查
INFORMATION_SCHEMA.PLUGINS
表或使用该
SHOW
PLUGINS
语句(请参见
第5.6.2节“获取服务器插件信息”
)。
例如:
MySQL的>SELECT PLUGIN_NAME, PLUGIN_STATUS, PLUGIN_TYPE
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'ddl%';
+ -------------- + --------------- + ------------- + | PLUGIN_NAME | PLUGIN_STATUS | PLUGIN_TYPE | + -------------- + --------------- + ------------- + | ddl_rewriter | ACTIVE | 审核| + -------------- + --------------- + ------------- +
如前面的结果所示,
ddl_rewriter
实现为审计插件。
如果插件无法初始化,请检查服务器错误日志以获取诊断消息。
如上所述安装后,将
ddl_rewriter
一直安装,直到卸载为止。
要删除它,请使用
UNINSTALL
PLUGIN
:
UNINSTALL PLUGIN ddl_rewriter;
如果
ddl_rewriter
已安装,则可以使用
--ddl-rewriter
后续服务器启动选项来控制
ddl_rewriter
插件激活。
例如,要防止在运行时启用插件,请使用此选项:
的[mysqld] DDL-重写= OFF
本节介绍控制
ddl_rewriter
插件
操作的命令选项
。
如果在启动时指定的值不正确,则
ddl_rewriter
插件可能无法正确初始化,并且服务器无法加载它。
要控制
ddl_rewriter
插件的
激活
,请使用此选项:
属性 | 值 |
---|---|
命令行格式 | --ddl-rewriter[=value] |
介绍 | 8.0.16 |
类型 | 列举 |
默认值 | ON |
有效值 |
|
此选项控制服务器
ddl_rewriter
在启动时
加载
插件的方式。
仅当插件先前已注册
INSTALL
PLUGIN
或已加载
--plugin-load
或时,
它才可
用
--plugin-load-add
。
请参见
第5.6.5.1节“安装或卸载ddl_rewriter”
。
选项值应该是可用于插件加载选项的选项之一,如
第5.6.1节“安装和卸载插件”中所述
。
例如,
--ddl-rewriter=OFF
在服务器启动时禁用插件。
MySQL包括Version Tokens,这是一种能够围绕服务器令牌创建和同步的功能,应用程序可以使用它来防止访问不正确或过时的数据。
Version Tokens接口具有以下特征:
版本令牌是由作为键或标识符的名称加上值组成的对。
版本令牌可以锁定。 应用程序可以使用令牌锁向其他协作应用程序指示令牌正在使用中且不应修改。
每个服务器建立版本标记列表(例如,指定服务器分配或操作状态)。 此外,与服务器通信的应用程序可以注册其自己的令牌列表,这些令牌列表指示它需要服务器所在的状态。应用程序发送到不处于所需状态的服务器的SQL语句会产生错误。 这是应用程序的一个信号,它应该在所需的状态下寻找不同的服务器来接收SQL语句。
以下部分描述了版本标记的组件,讨论了如何安装和使用它,并提供了其组件的参考信息。
版本标记基于实现这些组件的插件库:
名为的服务器端插件
version_tokens
保存与服务器关联的版本令牌列表,并订阅语句执行事件的通知。
该
version_tokens
插件使用
审计插件API
来监视来自客户端的传入语句,并将每个客户端的特定于会话的版本令牌列表与服务器版本令牌列表进行匹配。
如果匹配,则插件允许语句通过,服务器继续处理它。
否则,插件会向客户端返回错误,并且语句失败。
一组用户定义函数(UDF)提供了一个SQL级API,用于操作和检查插件维护的服务器版本令牌列表。
该
VERSION_TOKEN_ADMIN
或
SUPER
权限才能调用任何版本令牌的UDF。
当
version_tokens
插件加载时,它定义了
VERSION_TOKEN_ADMIN
动态特权。
可以将此权限授予UDF的用户。
系统变量使客户端能够指定注册所需服务器状态的版本令牌列表。 如果客户端发送语句时服务器具有不同的状态,则客户端会收到错误。
如果安装,版本标记涉及一些开销。 为避免此开销,请不要安装它,除非您打算使用它。
本节介绍如何安装或卸载Version Tokens,它在包含插件和用户定义函数(UDF)的插件库文件中实现。 有关安装或卸载插件和UDF的一般信息,请参见 第5.6.1节“安装和卸载插件” 和 第5.7.1节“安装和卸载用户定义的函数” 。
要使服务器可以使用,插件库文件必须位于MySQL插件目录(
plugin_dir
系统变量
指定的目录
)中。
如有必要,通过设置
plugin_dir
服务器启动时
的值来配置插件目录位置
。
插件库文件基本名称是
version_tokens
。
文件名后缀因平台
.so
而异
(例如,
对于Unix和类Unix系统,
.dll
对于Windows)。
要安装Version Tokens插件和UDF,请使用
INSTALL
PLUGIN
和
CREATE
FUNCTION
语句(
.so
根据需要
调整
平台
的
后缀):
INSTALL PLUGIN version_tokens SONAME'version_token.so'; CREATE FUNCTION version_tokens_set RETURNS STRING SONAME'version_token.so'; CREATE FUNCTION version_tokens_show RETURNS STRING SONAME'version_token.so'; CREATE FUNCTION version_tokens_edit RETURNS STRING SONAME'version_token.so'; CREATE FUNCTION version_tokens_delete返回STRING SONAME'version_token.so'; CREATE FUNCTION version_tokens_lock_shared RETURNS INT SONAME'version_token.so'; CREATE FUNCTION version_tokens_lock_exclusive返回INT SONAME'version_token.so'; CREATE FUNCTION version_tokens_unlock RETURNS INT SONAME'version_token.so';
您必须安装UDF来管理服务器的版本令牌列表,但您还必须安装插件,因为没有它,UDF将无法正常工作。
如果在主复制服务器上使用插件和UDF,请将它们安装在所有从属服务器上,以避免复制问题。
如上所述安装后,插件和UDF将保持安装状态,直到卸载为止。
要删除它们,请使用
UNINSTALL
PLUGIN
和
DROP
FUNCTION
语句:
UNINSTALL PLUGIN version_tokens; DROP FUNCTION version_tokens_set; DROP FUNCTION version_tokens_show; DROP FUNCTION version_tokens_edit; DROP FUNCTION version_tokens_delete; DROP FUNCTION version_tokens_lock_shared; DROP FUNCTION version_tokens_lock_exclusive; DROP FUNCTION version_tokens_unlock;
在使用版本标记之前,请按照 第5.6.6.2节“安装或卸载版本标记”中 提供的说明进行 安装 。
版本标记可能有用的方案是访问MySQL服务器集合但需要通过监视它们并根据负载变化调整服务器分配来管理它们以实现负载平衡的系统。 这样的系统包括以下组件:
要管理的MySQL服务器的集合。
管理或管理应用程序,与服务器通信并将它们组织到高可用性组中。 组服务于不同目的,每个组内的服务器可能具有不同的分配。 某个组内服务器的分配可以随时更改。
访问服务器以检索和更新数据的客户端应用程序,根据分配给它们的目的选择服务器。 例如,客户端不应将更新发送到只读服务器。
版本标记允许根据分配管理服务器访问,而无需客户端反复查询服务器有关其分配的信息:
管理应用程序执行服务器分配并在每个服务器上建立版本令牌以反映其分配。 应用程序缓存此信息以向其提供中央访问点。
如果管理应用程序在某些时候需要更改服务器分配(例如,将其从允许写入更改为只读),则会更改服务器的版本令牌列表并更新其缓存。
为了提高性能,客户端应用程序从管理应用程序获取缓存信息,使他们能够避免必须检索有关每个语句的服务器分配的信息。 根据它将发出的语句类型(例如,读取与写入),客户端选择适当的服务器并连接到它。
此外,客户端向服务器发送其自己的客户端特定版本令牌,以注册其对服务器所需的分配。 对于客户端发送到服务器的每个语句,服务器将其自己的令牌列表与客户端令牌列表进行比较。 如果服务器令牌列表包含具有相同值的客户端令牌列表中存在的所有令牌,则匹配并且服务器执行该语句。
另一方面,管理应用程序可能已更改服务器分配及其版本令牌列表。 在这种情况下,新的服务器分配现在可能与客户端要求不兼容。 服务器和客户端令牌列表之间出现令牌不匹配,服务器返回错误以回复该语句。 这表明客户端从管理应用程序缓存中刷新其版本令牌信息,并选择要与之通信的新服务器。
用于检测版本令牌错误和选择新服务器的客户端逻辑可以以不同方式实现:
客户端可以处理所有版本令牌注册,不匹配检测和连接切换本身。
这些操作的逻辑可以在管理客户端和MySQL服务器之间的连接的连接器中实现。 这样的连接器可能会处理不匹配错误检测和语句重发本身,或者它可能会将错误传递给应用程序并将其留给应用程序重新发送语句。
以下示例以更具体的形式说明了前面的讨论。
当版本标记在给定服务器上初始化时,服务器的版本标记列表为空。
令牌列表维护是通过调用用户定义的函数(UDF)来执行的。
该
VERSION_TOKEN_ADMIN
或
SUPER
权限才能调用任何版本令牌的UDF,所以令牌列表修改预期由具有相应权限的管理或行政程序来完成。
假设管理应用程序与客户端查询的一组服务器进行通信,以访问员工和产品数据库(
分别
命名
emp
和
prod
分配)。
允许所有服务器处理数据检索语句,但只允许其中一些服务器进行数据库更新。
为了在特定于数据库的基础上处理此问题,管理应用程序在每个服务器上建立版本令牌列表。
在给定服务器的令牌列表中,令牌名称表示数据库名称和令牌值是
read
或者
write
取决于数据库是否必须以只读方式使用或者是否可以进行读取和写入。
客户端应用程序通过设置系统变量来注册需要服务器匹配的版本令牌列表。 变量设置在特定于客户端的基础上进行,因此不同的客户端可以注册不同的要求。 默认情况下,客户端令牌列表为空,与任何服务器令牌列表匹配。 当客户端将其令牌列表设置为非空值时,匹配可能成功或失败,具体取决于服务器版本令牌列表。
要为服务器定义版本令牌列表,管理应用程序将调用
version_tokens_set()
UDF。
(还有用于修改和显示令牌列表的UDF,稍后将对此进行描述。)例如,应用程序可能会将这些语句发送到三个服务器组:
服务器1:
MySQL的> SELECT version_tokens_set('emp=read;prod=read');
+ ------------------------------------------ +
| version_tokens_set('emp = read; prod = read')|
+ ------------------------------------------ +
| 2个版本的令牌集。|
+ ------------------------------------------ +
服务器2:
MySQL的> SELECT version_tokens_set('emp=write;prod=read');
+ ------------------------------------------- +
| version_tokens_set('emp = write; prod = read')|
+ ------------------------------------------- +
| 2个版本的令牌集。|
+ ------------------------------------------- +
服务器3:
MySQL的> SELECT version_tokens_set('emp=read;prod=write');
+ ------------------------------------------- +
| version_tokens_set('emp = read; prod = write')|
+ ------------------------------------------- +
| 2个版本的令牌集。|
+ ------------------------------------------- +
每种情况下的令牌列表都指定为以分号分隔的
对
列表
。
生成的令牌列表值会导致这些服务器分配:
name
=value
任何服务器都接受任一数据库的读取
只有服务器2接受
emp
数据库的
更新
。
只有服务器3接受
prod
数据库的
更新
。
除了为每个服务器分配版本令牌列表外,管理应用程序还维护一个反映服务器分配的缓存。
在与服务器通信之前,客户端应用程序与管理应用程序联系并检索有关服务器分配的信息。
然后,客户端根据这些分配选择服务器。
假设客户端想要对
emp
数据库
执行读取和写入
操作。
根据前面的分配,只有服务器2符合条件。
客户端连接到服务器2并通过设置其
version_tokens_session
系统变量来
注册其服务器要求
:
MySQL的> SET @@SESSION.version_tokens_session = 'emp=write';
对于客户端发送到服务器2的后续语句,服务器将其自己的版本令牌列表与客户端列表进行比较以检查它们是否匹配。 如果是这样,语句正常执行:
MySQL的>UPDATE emp.employee SET salary = salary * 1.1 WHERE id = 4981;
查询正常,1行受影响(0.07秒) 匹配的行数:1已更改:1警告:0 MySQL的>SELECT last_name, first_name FROM emp.employee WHERE id = 4981;
+ ----------- ------------ + + | last_name | first_name | + ----------- ------------ + + | 史密斯| 安倍| + ----------- ------------ + + 1排(0.01秒)
服务器和客户端版本令牌列表之间的差异可以通过两种方式发生:
值中的标记名称
version_tokens_session
不存在于服务器标记列表中。
在这种情况下,
ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND
会发生错误。
值中的标记值
version_tokens_session
与服务器标记列表中相应标记
的
值不同。
在这种情况下,
ER_VTOKEN_PLUGIN_TOKEN_MISMATCH
会发生错误。
只要服务器2的分配没有改变,客户端就会继续使用它进行读写。
但是假设管理应用程序想要更改服务器分配,以便
emp
必须将数据库的
写入
发送到服务器1而不是服务器2.为此,它用于
version_tokens_edit()
修改
emp
两个服务器上的令牌值(并更新其服务器的缓存)分配):
服务器1:
MySQL的> SELECT version_tokens_edit('emp=write');
+ ---------------------------------- +
| version_tokens_edit('emp = write')|
+ ---------------------------------- +
| 1版本令牌已更新。|
+ ---------------------------------- +
服务器2:
MySQL的> SELECT version_tokens_edit('emp=read');
+ --------------------------------- +
| version_tokens_edit('emp = read')|
+ --------------------------------- +
| 1版本令牌已更新。|
+ --------------------------------- +
version_tokens_edit()
修改服务器令牌列表中的命名令牌,并保持其他令牌不变。
客户端下次向服务器2发送语句时,其自己的令牌列表不再与服务器令牌列表匹配,并发生错误:
MySQL的> UPDATE emp.employee SET salary = salary * 1.1 WHERE id = 4982;
ERROR 3136(42000):emp的版本令牌不匹配。正确读取值
在这种情况下,客户端应联系管理应用程序以获取有关服务器分配的更新信息,选择新服务器,并将失败的语句发送到新服务器。
每个客户端必须通过仅根据它向给定服务器注册的令牌列表发送语句来与版本令牌合作。
例如,如果客户端注册了令牌列表
'emp=read'
,则版本令牌中没有任何内容可以阻止客户端为
emp
数据库
发送更新
。
客户本身必须避免这样做。
对于从客户端收到的每个语句,服务器隐式使用锁定,如下所示:
为客户端令牌列表中指定的每个令牌(即,在
version_tokens_session
值中)
获取共享锁
执行服务器和客户端令牌列表之间的比较
根据比较结果执行语句或产生错误
释放锁
服务器使用共享锁,以便可以在不阻塞的情况下进行多个会话的比较,同时防止在操作服务器令牌列表中的相同名称的令牌之前尝试获取排他锁的任何会话更改令牌。
上面的示例仅使用Version Tokens插件库中包含的一些用户定义,但还有其他一些。 一组UDF允许操作和检查服务器的版本令牌列表。 另一组UDF允许锁定和解锁版本令牌。
这些UDF允许创建,更改,删除和检查服务器的版本令牌列表:
version_tokens_set()
完全替换当前列表并分配新列表。
参数是以分号分隔的
对
列表
。
name
=value
version_tokens_edit()
允许对当前列表进行部分修改。
它可以添加新标记或更改现有标记的值。
参数是以分号分隔的
对
列表
。
name
=value
version_tokens_delete()
从当前列表中删除令牌。
参数是以分号分隔的标记名称列表。
version_tokens_show()
显示当前令牌列表。
它不需要争论。
如果成功,每个函数都返回一个二进制字符串,指示发生了什么操作。 以下示例建立服务器令牌列表,通过添加新令牌来修改它,删除一些令牌,并显示生成的令牌列表:
MySQL的>SELECT version_tokens_set('tok1=a;tok2=b');
+ ------------------------------- + | version_tokens_set('tok1 = a; tok2 = b')| + ------------------------------- + | 2个版本的令牌集。| + ------------------------------- + MySQL的>SELECT version_tokens_edit('tok3=c');
+ ------------------------------- + | version_tokens_edit('tok3 = c')| + ------------------------------- + | 1版本令牌已更新。| + ------------------------------- + MySQL的>SELECT version_tokens_delete('tok2;tok1');
+ ------------------------------------ + | version_tokens_delete('tok2; tok1')| + ------------------------------------ + | 删除了2个版本的令牌。| + ------------------------------------ + MySQL的>SELECT version_tokens_show();
+ ----------------------- + | version_tokens_show()| + ----------------------- + | tok3 = C; | + ----------------------- +
如果令牌列表格式错误,则会出现警告:
MySQL的>SELECT version_tokens_set('tok1=a; =c');
+ ---------------------------------- + | version_tokens_set('tok1 = a; = c')| + ---------------------------------- + | 1个版本的令牌集。| + ---------------------------------- + 1排,1警告(0.00秒) MySQL的>SHOW WARNINGS\G
*************************** 1。排******************** ******* 等级:警告 代码:42000 消息:遇到无效的版本令牌对。提供的清单 只是部分更新。 1排(0.00秒)
如前所述,版本令牌是使用以分号分隔的
对
列表定义的
。
考虑这个调用
:
name
=value
version_tokens_set()
MySQL的> SELECT version_tokens_set('tok1=b;;; tok2= a = b ; tok1 = 1\'2 3"4')
+ ------------------------------------------------- -------------- +
| version_tokens_set('tok1 = b ;;; tok2 = a = b; tok1 = 1 \'2 3“4')|
+ ------------------------------------------------- -------------- +
| 3个版本的令牌集。|
+ ------------------------------------------------- -------------- +
版本标记将参数解释如下:
忽略名称和值周围的空格。
允许名称和值内的空格。
(对于
version_tokens_delete()
,它采用没有值的名称列表,忽略名称周围的空格。)
没有引用机制。
令牌顺序并不重要,除非令牌列表包含给定令牌名称的多个实例,最后一个值优先于先前的值。
根据这些规则,前面的
version_tokens_set()
调用会产生一个带有两个标记的标记列表:
tok1
具有值
1'2 3"4
,并
tok2
具有值
a = b
。
要验证这一点,请致电
version_tokens_show()
:
MySQL的> SELECT version_tokens_show();
+ -------------------------- +
| version_tokens_show()|
+ -------------------------- +
| tok2 = a = b; tok1 = 1'2 3“4; |
+ -------------------------- +
如果令牌列表包含两个令牌,为什么
version_tokens_set()
返回值
3 version tokens set
?
之所以发生这种情况是因为原始令牌列表包含两个定义
tok1
,第二个定义替换了第一个定义。
Version Tokens令牌操作UDF将这些约束放在令牌名称和值上:
令牌名称不能包含
=
或
;
字符,最大长度为64个字符。
令牌值不能包含
;
字符。
值的长度受
max_allowed_packet
系统变量
值的约束
。
版本标记将标记名称和值视为二进制字符串,因此比较区分大小写。
版本标记还包括一组UDF,可以锁定和解锁令牌:
version_tokens_lock_exclusive()
获取独占版本令牌锁。
它采用一个或多个锁名称和超时值的列表。
version_tokens_lock_shared()
获取共享版本令牌锁。
它采用一个或多个锁名称和超时值的列表。
version_tokens_unlock()
发布版本令牌锁(独占和共享)。
它不需要争论。
每个锁定函数返回非零表示成功。 否则,会发生错误:
MySQL的>SELECT version_tokens_lock_shared('lock1', 'lock2', 0);
+ ------------------------------------------------- + | version_tokens_lock_shared('lock1','lock2',0)| + ------------------------------------------------- + | 1 | + ------------------------------------------------- + MySQL的>SELECT version_tokens_lock_shared(NULL, 0);
错误3131(42000):错误的锁定服务锁名称'(null)'。
使用版本代币锁定功能进行锁定是建议性的; 申请必须同意合作。
可以锁定不存在的令牌名称。 这不会创建令牌。
版本标记锁定函数基于
第29.3.1节“锁定服务”中
描述
的锁定服务
,因此对于共享锁和排它锁具有相同的语义。
(版本标记使用服务器内置的锁定服务例程,而不是锁定服务UDF接口,因此不需要安装那些UDF来使用版本标记。)版本标记获取的锁使用锁定服务命名空间
version_token_locks
。
可以使用性能模式监视锁定服务锁,因此对于版本标记锁也是如此。
有关详细信息,请参见
第29.3.1.2.3节“锁定服务监视”
。
对于版本标记锁定函数,标记名称参数完全按指定使用。
不会忽略周围的空格,
=
并且
;
允许使用字符。
这是因为Version Tokens只是将要锁定的令牌名称传递给锁定服务。
以下讨论作为对这些版本标记组件的引用:
Version Tokens插件库包含多个用户定义的函数。
一组UDF允许操作和检查服务器的版本令牌列表。
另一组UDF允许锁定和解锁版本令牌。
该
VERSION_TOKEN_ADMIN
或
SUPER
权限才能调用任何版本令牌UDF。
以下UDF允许创建,更改,删除和检查服务器的版本令牌列表。
解释
name_list
和
token_list
参数(包括空格处理)的发生如
第5.6.6.3节“使用版本标记”中所述
,其中提供了有关指定标记的语法的详细信息,以及其他示例。
version_tokens_delete(
name_list
)
使用
name_list
参数
从服务器的版本标记列表中删除标记,
并返回指示操作结果的二进制字符串。
name_list
是一个以分号分隔的要删除的版本标记名称列表。
MySQL的> SELECT version_tokens_delete('tok1;tok3');
+ ------------------------------------ +
| version_tokens_delete('tok1; tok3')|
+ ------------------------------------ +
| 删除了2个版本的令牌。|
+ ------------------------------------ +
参数
NULL
被视为空字符串,对令牌列表没有影响。
version_tokens_delete()
删除其参数中指定的标记(如果存在)。
(删除不存在的令牌不是错误。)要完全清除令牌列表而不知道列表中有哪些令牌,请传递
NULL
或不包含令牌的字符串
version_tokens_set()
:
MySQL的>SELECT version_tokens_set(NULL);
+ ------------------------------ + | version_tokens_set(NULL)| + ------------------------------ + | 版本令牌列表已清除。| + ------------------------------ + MySQL的>SELECT version_tokens_set('');
+ ------------------------------ + | version_tokens_set('')| + ------------------------------ + | 版本令牌列表已清除。| + ------------------------------ +
version_tokens_edit(
token_list
)
使用
token_list
参数
修改服务器的版本令牌列表,
并返回指示操作结果的二进制字符串。
token_list
是一个以分号分隔的
对
列表,
指定要定义的每个标记的名称及其值。
如果存在令牌,则使用给定值更新其值。
如果令牌不存在,则使用给定值创建令牌。
如果参数是
或不包含标记的字符串,则标记列表保持不变。
name
=value
NULL
MySQL的>SELECT version_tokens_set('tok1=value1;tok2=value2');
+ ----------------------------------------------- + | version_tokens_set('tok1 = value1; tok2 = value2')| + ----------------------------------------------- + | 2个版本的令牌集。| + ----------------------------------------------- + MySQL的>SELECT version_tokens_edit('tok2=new_value2;tok3=new_value3');
+ ------------------------------------------------- ------- + | version_tokens_edit('tok2 = new_value2; tok3 = new_value3')| + ------------------------------------------------- ------- + | 2版本令牌已更新。| + ------------------------------------------------- ------- +
version_tokens_set(
token_list
)
使用
token_list
参数中
定义的标记替换服务器的版本标记列表,
并返回指示操作结果的二进制字符串。
token_list
是一个以分号分隔的
对
列表,
指定要定义的每个标记的名称及其值。
如果参数是
或不包含标记的字符串,则清除标记列表。
name
=value
NULL
MySQL的> SELECT version_tokens_set('tok1=value1;tok2=value2');
+ ----------------------------------------------- +
| version_tokens_set('tok1 = value1; tok2 = value2')|
+ ----------------------------------------------- +
| 2个版本的令牌集。|
+ ----------------------------------------------- +
将服务器的版本标记列表作为包含以分号分隔的
对
列表的二进制字符串返回
。
name
=value
MySQL的> SELECT version_tokens_show();
+ -------------------------- +
| version_tokens_show()|
+ -------------------------- +
| tok2 =值2; tok1 =值1; |
+ -------------------------- +
以下UDF允许锁定和解锁版本标记:
version_tokens_lock_exclusive(
token_name
[,
token_name
] ...,
timeout
)
获取一个或多个版本令牌的排他锁,由名称指定为字符串,如果未在给定超时值内获取锁,则超时错误。
MySQL的> SELECT version_tokens_lock_exclusive('lock1', 'lock2', 10);
+ ------------------------------------------------- ---- +
| version_tokens_lock_exclusive('lock1','lock2',10)|
+ ------------------------------------------------- ---- +
| 1 |
+ ------------------------------------------------- ---- +
version_tokens_lock_shared(
token_name
[,
token_name
] ...,
timeout
)
获取一个或多个版本令牌上的共享锁,由名称指定为字符串,如果未在给定超时值内获取锁,则超时错误。
MySQL的> SELECT version_tokens_lock_shared('lock1', 'lock2', 10);
+ ------------------------------------------------- - +
| version_tokens_lock_shared('lock1','lock2',10)|
+ ------------------------------------------------- - +
| 1 |
+ ------------------------------------------------- - +
使用
version_tokens_lock_exclusive()
和
释放在当前会话中获取的所有锁
version_tokens_lock_shared()
。
MySQL的> SELECT version_tokens_unlock();
+ ------------------------- +
| version_tokens_unlock()|
+ ------------------------- +
| 1 |
+ ------------------------- +
锁定功能具有以下特征:
返回值非零表示成功。 否则,会发生错误。
令牌名称是字符串。
与操作服务器令牌列表的UDF的参数处理相反,不会忽略围绕令牌名称参数的空格,
=
并且
;
允许使用字符。
可以锁定不存在的令牌名称。 这不会创建令牌。
超时值是非负整数,表示在超时错误之前等待获取锁的时间(以秒为单位)。 如果超时为0,则没有等待,如果无法立即获取锁,则该函数会产生错误。
版本标记锁定功能基于 第29.3.1节“锁定服务”中 描述 的锁定服务 。
版本标记支持以下系统变量。 除非安装了Version Tokens插件,否则这些变量不可用(请参见 第5.6.6.2节“安装或卸载版本标记” )。
系统变量:
属性 | 值 |
---|---|
命令行格式 | --version-tokens-session=value |
系统变量 | version_tokens_session |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
默认值 | NULL |
此变量的会话值指定客户端版本令牌列表,并指示客户端会话需要服务器版本令牌列表具有的令牌。
如果
version_tokens_session
变量是
NULL
(默认值)或具有空值,则任何服务器版本令牌列表都匹配。
(实际上,空值会禁用匹配要求。)
如果
version_tokens_session
变量具有非空值,则其值与服务器版本标记列表之间的任何不匹配都会导致会话发送到服务器的任何语句出错。
在这些条件下发生不匹配:
值中的标记名称
version_tokens_session
不存在于服务器标记列表中。
在这种情况下,
ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND
会发生错误。
值中的标记值
version_tokens_session
与服务器标记列表中相应标记
的
值不同。
在这种情况下,
ER_VTOKEN_PLUGIN_TOKEN_MISMATCH
会发生错误。
服务器版本令牌列表包含未在
version_tokens_session
值中
命名的令牌并不是不匹配
。
假设管理应用程序已按如下方式设置服务器令牌列表:
MySQL的> SELECT version_tokens_set('tok1=a;tok2=b;tok3=c');
+ -------------------------------------------- +
| version_tokens_set('tok1 = a; tok2 = b; tok3 = c')|
+ -------------------------------------------- +
| 3个版本的令牌集。|
+ -------------------------------------------- +
客户端通过设置其
version_tokens_session
值
来注册需要服务器匹配的令牌
。
然后,对于客户端发送的每个后续语句,服务器会根据客户端
version_tokens_session
值
检查其令牌列表,
如果不匹配则会产生错误:
mysql>SET @@SESSION.version_tokens_session = 'tok1=a;tok2=b';
mysql>SELECT 1;
+ --- + | 1 | + --- + | 1 | + --- + mysql>SET @@SESSION.version_tokens_session = 'tok1=b';
mysql>SELECT 1;
ERROR 3136(42000):tok1的版本令牌不匹配。正确的价值a
第一个
SELECT
成功,因为客户端令牌
tok1
并且
tok2
存在于服务器令牌列表中,并且每个令牌在服务器列表中具有相同的值。
第二个
SELECT
失败,因为尽管
tok1
存在于服务器令牌列表中,但它具有与客户端指定的值不同的值。
此时,客户端发送的任何语句都会失败,除非服务器令牌列表发生更改,使其再次匹配。 假设管理应用程序更改服务器令牌列表,如下所示:
MySQL的>SELECT version_tokens_edit('tok1=b');
+ ------------------------------- + | version_tokens_edit('tok1 = b')| + ------------------------------- + | 1版本令牌已更新。| + ------------------------------- + MySQL的>SELECT version_tokens_show();
+ ----------------------- + | version_tokens_show()| + ----------------------- + | tok3 = C; tok1 = B; tok2 = B; | + ----------------------- +
现在,客户端
version_tokens_session
值与服务器令牌列表匹配,客户端可以再次成功执行语句:
MySQL的> SELECT 1;
+ --- +
| 1 |
+ --- +
| 1 |
+ --- +
属性 | 值 |
---|---|
命令行格式 | --version-tokens-session-number=# |
系统变量 | version_tokens_session_number |
范围 | 全球,会议 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
此变量供内部使用。
MySQL Server支持创建用户定义的函数(UDF)并将其加载到服务器中以扩展服务器功能。 可以使用UDF全部或部分实现服务器功能。 此外,您可以编写自己的UDF。
以下部分描述如何安装和卸载UDF,以及如何在运行时确定安装了哪些UDF并获取有关它们的信息。 有关编写UDF的信息,请参见 第29.4节“向MySQL添加新函数” 。
必须先将用户定义的函数(UDF)加载到服务器中,然后才能使用它们。 MySQL支持在运行时加载UDF。
要加载UDF,请使用该
CREATE
FUNCTION
语句。
例如:
创造功能的metaphon 返回STRING SONAME'udf_example.so';
UDF文件基名取决于您的平台。
对于Windows
.so
,
常见的后缀适用
于Unix和类Unix系统
.dll
。
加载UDF时,可从Performance Schema
user_defined_functions
表中
获取有关它的信息
。
请参见
第5.7.2节“获取用户定义的功能信息”
。
该语句还在
mysql.func
系统表中
注册UDF,
以使服务器在后续重新启动时加载它。
因此,
CREATE
FUNCTION
需要
数据库
的
INSERT
权限
mysql
。
要删除UDF,请使用该
DROP
FUNCTION
语句。
例如:
DROP FUNCTION metaphon;
CREATE
FUNCTION
卸载UDF并将其从
mysql.func
系统表中
删除
。
因此,
DROP
FUNCTION
statement需要
数据库
的
DELETE
特权
mysql
。
由于UDF不再在表中注册,服务器不会自动加载UDF以便后续重新启动。
您无法用于
CREATE
FUNCTION
重新安装以前安装的功能。
要重新安装某个功能,请先将其删除
DROP
FUNCTION
,然后重新安装
CREATE
FUNCTION
。
您需要执行此操作,例如,如果升级到提供该函数的更新实现的新版本的MySQL,或者您重新编译已编写的函数的新版本。
否则,服务器继续使用旧版本。
如果使用该
--skip-grant-tables
选项
启动服务器
,则它不会查询该
mysql.func
表,也不会加载其中列出的UDF。
Performance Schema
user_defined_functions
表包含有关当前加载的用户定义函数的信息:
SELECT * FROM performance_schema.user_defined_functions;
有关更多信息,请参见 第26.12.17.6节“user_defined_functions表” 。
在某些情况下,您可能希望在一台计算机上运行多个MySQL实例。 您可能希望测试新的MySQL版本,同时保持现有的生产设置不受干扰。 或者您可能希望让不同的用户访问 他们自己管理的 不同 mysqld 服务器。 (例如,您可能是一个希望为不同客户提供独立MySQL安装的Internet服务提供商。)
每个实例可以使用不同的MySQL服务器二进制文件,或者对多个实例使用相同的二进制文件,或者两种方法的任意组合。 例如,您可以从MySQL 5.7运行服务器,从MySQL 8.0运行服务器,以查看不同版本如何处理给定的工作负载。 或者,您可以运行当前生产版本的多个实例,每个实例管理一组不同的数据库。
无论您是否使用不同的服务器二进制文件,您运行的每个实例都必须配置多个操作参数的唯一值。
这消除了实例之间冲突的可能性。
可以在命令行,选项文件或设置环境变量中设置参数。
请参见
第4.2.2节“指定程序选项”
。
要查看给定实例使用的值,请连接到它并执行
SHOW
VARIABLES
语句。
MySQL实例管理的主要资源是数据目录。
每个实例都应使用不同的数据目录,其位置使用该
选项
指定
。
有关使用自己的数据目录配置每个实例的方法,以及有关未执行此操作的危险的警告,请参见
第5.8.1节“设置多个数据目录”
。
--datadir=
dir_name
除了使用不同的数据目录之外,其他几个选项必须为每个服务器实例具有不同的值:
--port
控制TCP / IP连接的端口号。
或者,如果主机具有多个网络地址,则可以设置
bind_address
系统变量以使每个服务器侦听不同的地址。
--socket={
file_name
|pipe_name
}
--socket
控制Unix上的Unix套接字文件路径或Windows上的命名管道名称。
在Windows上,必须仅为配置为允许命名管道连接的那些服务器指定不同的管道名称。
--shared-memory-base-name=
name
此选项仅在Windows上使用。 它指定Windows服务器使用的共享内存名称,以允许客户端使用共享内存进行连接。 必须仅为配置为允许共享内存连接的服务器指定不同的共享内存名称。
此选项指示服务器在其中写入其进程ID的文件的路径名。
如果使用以下日志文件选项,则每个服务器的值必须不同:
有关日志文件选项的进一步讨论,请参见 第5.4节“MySQL服务器日志” 。
要获得更好的性能,可以为每个服务器指定不同的以下选项,以在多个物理磁盘之间分配负载:
拥有不同的临时目录还可以更容易地确定哪个MySQL服务器创建了任何给定的临时文件。
如果在不同位置安装了多个MySQL,则可以使用该
选项
为每个安装指定基本目录
。
这会导致每个实例自动使用不同的数据目录,日志文件和PID文件,因为每个参数的默认值都相对于基本目录。
在这种情况下,您需要指定的唯一其他选项是
和
选项。
假设您使用
文件二进制分发
安装不同版本的MySQL
。
它们安装在不同的位置,因此您可以使用命令
bin / mysqld_safe
在其相应的基目录下
为每个安装启动服务器
。
mysqld_safe的
--basedir=
dir_name
--socket
--port
tar
确定
--basedir
传递给
mysqld
的正确
选项
,并且只需要指定
mysqld_safe
的
--socket
和
--port
选项
。
如以下各节所述,可以通过指定适当的命令选项或设置环境变量来启动其他服务器。
但是,如果需要更长期地运行多个服务器,则使用选项文件为每个服务器指定必须唯一的选项值会更方便。
该
--defaults-file
选项对此有用。
计算机上的每个MySQL实例都应该有自己的数据目录。
使用
选项
指定位置
。
--datadir=
dir_name
为新实例设置数据目录有不同的方法:
创建一个新的数据目录。
复制现有数据目录。
以下讨论提供了有关每种方法的更多细节。
通常,您不应该有两台服务器更新同一数据库中的数据。 如果您的操作系统不支持无故障系统锁定,这可能会导致令人不快的意外。 如果(尽管出现此警告)您使用相同的数据目录运行多个服务器并且已启用日志记录,则必须使用相应的选项指定每个服务器唯一的日志文件名。 否则,服务器会尝试登录到相同的文件。
即使遵守上述预防措施,这种设置仅适用于
MyISAM
和
MERGE
表,而不适用于任何其他存储引擎。
此外,在服务器之间共享数据目录的警告始终适用于NFS环境。
允许多个MySQL服务器通过NFS访问公共数据目录是一个
非常糟糕的主意
。
主要问题是NFS是速度瓶颈。
它不适用于此类用途。
NFS的另一个风险是您必须设计一种方法来确保两台或多台服务器不会相互干扰。
通常NFS文件锁定由。处理
lockd
守护进程,但目前没有平台可以在任何情况下100%可靠地执行锁定。
使用此方法,数据目录将处于与首次安装MySQL时相同的状态。 它将具有默认的MySQL帐户集,并且没有用户数据。
在Unix上,初始化数据目录。 请参见 第2.10节“安装后设置和测试” 。
在Windows上,数据目录包含在MySQL发行版中:
Windows的MySQL Zip归档文件包含一个未修改的数据目录。
您可以将此类分发包解压缩到临时位置,然后将其复制
data
到您正在设置新实例的位置。
Windows MSI软件包安装程序创建并设置已安装服务器将使用的数据目录,但还会创建一个
在安装目录下
命名
的原始
“
模板
”
数据
data
目录。
使用MSI包执行安装后,可以复制模板数据目录以设置其他MySQL实例。
使用此方法,数据目录中存在的任何MySQL帐户或用户数据都将转移到新数据目录。
使用数据目录停止现有的MySQL实例。 这必须是干净关闭,以便实例将任何挂起的更改刷新到磁盘。
将数据目录复制到新数据目录所在的位置。
复制
现有实例使用
的
my.cnf
或
my.ini
选项文件。
这是新实例的基础。
修改新选项文件,以便引用原始数据目录的任何路径名引用新数据目录。 此外,修改每个实例必须唯一的任何其他选项,例如TCP / IP端口号和日志文件。 有关每个实例必须唯一的参数列表,请参见 第5.8节“在一台计算机上运行多个MySQL实例” 。
启动新实例,告诉它使用新选项文件。
您可以在Windows上运行多个服务器,方法是从命令行手动启动它们,每个服务器都有适当的操作参数,或者将多个服务器作为Windows服务安装并以这种方式运行。 有关从命令行或作为服务运行MySQL的一般说明,请参见 第2.3节“在Microsoft Windows上安装MySQL” 。 以下各节介绍如何为每个服务器必须唯一的选项(例如数据目录)启动具有不同值的每个服务器。 第5.8节“在一台机器上运行多个MySQL实例” 中列出了这些选项 。
第2.3.5.6节“从Windows命令行启动MySQL”中
介绍了从命令行手动启动单个MySQL服务器的过程
。
要以这种方式启动多个服务器,可以在命令行或选项文件中指定相应的选项。
将选项放在选项文件中更方便,但有必要确保每个服务器都有自己的选项集。
为此,请为每个服务器创建一个选项文件,并
--defaults-file
在运行时
通过
选项
告诉服务器文件名
。
假设您要
在端口3307上
运行
mysqld的
一个实例,
其数据目录为
C:\mydata1
,而另一个实例在端口3308上运行,数据目录为
C:\mydata2
。
使用此程序:
确保每个数据目录都存在,包括其自己的
mysql
包含授权表
的
数据库
副本
。
创建两个选项文件。
例如,创建一个名为的文件
C:\my-opts1.cnf
,如下所示:
的[mysqld] datadir = C:/ mydata1 port = 3307
创建一个名为的第二个文件
C:\my-opts2.cnf
,如下所示:
的[mysqld] datadir = C:/ mydata2 port = 3308
使用该
--defaults-file
选项可以使用自己的选项文件启动每个服务器:
C:\>C:\mysql\bin\mysqld --defaults-file=C:\my-opts1.cnf
C:\>C:\mysql\bin\mysqld --defaults-file=C:\my-opts2.cnf
每个服务器都在前台启动(在服务器退出之前不会出现新提示),因此您需要在单独的控制台窗口中发出这两个命令。
要关闭服务器,请使用相应的端口号连接到每个服务器:
C:\>C:\mysql\bin\mysqladmin --port=3307 --host=127.0.0.1 --user=root --password shutdown
C:\>C:\mysql\bin\mysqladmin --port=3308 --host=127.0.0.1 --user=root --password shutdown
如上所述配置的服务器允许客户端通过TCP / IP进行连接。
如果您的Windows版本支持命名管道,并且您还希望允许命名管道连接,请指定启用命名管道并指定其名称的选项。
每个支持命名管道连接的服务器都必须使用唯一的管道名称。
例如,
C:\my-opts1.cnf
文件可能写成如下:
的[mysqld] datadir = C:/ mydata1 port = 3307 启用命名管道 socket = mypipe1
C:\my-opts2.cnf
类似地
修改
以供第二服务器使用。
然后如前所述启动服务器。
类似的过程适用于您希望允许共享内存连接的服务器。
使用该
--shared-memory
选项
启用此类连接,
并
使用该
选项为每个服务器指定唯一的共享内存名称
--shared-memory-base-name
。
在Windows上,MySQL服务器可以作为Windows服务运行。 第2.3.5.8节“将MySQL作为Windows服务启动” 中介绍了安装,控制和删除单个MySQL服务的过程 。
要设置多个MySQL服务,除了每个实例必须唯一的其他参数之外,还必须确保每个实例使用不同的服务名称。
对于以下说明,假设您要分别
从安装在
和的
两个不同版本的MySQL
运行
mysqld
服务器
。
(如果您将5.5.9作为生产服务器运行,但也希望使用8.0.18进行测试,则可能出现这种情况。)
C:\mysql-5.5.9
C:\mysql-8.0.18
要将MySQL安装为Windows服务,请使用
--install
或
--install-manual
选项。
有关这些选项的信息,请参见
第2.3.5.8节“将MySQL作为Windows服务启动”
。
根据上述信息,您可以通过多种方式设置多个服务。 以下说明描述了一些示例。 在尝试其中任何一个之前,请关闭并删除任何现有的MySQL服务。
方法1:
在其中一个标准选项文件中指定所有服务的选项。
为此,请为每个服务器使用不同的服务名称。
假设你要运行5.5.9
的mysqld
使用的服务名称
mysqld1
和8.0.18
的mysqld
使用的服务名称
mysqld2
。
在这种情况下,您可以使用
[mysqld1]
组5.5.9和
[mysqld2]
组8.0.18。
例如,您可以这样设置
C:\my.cnf
:
#mysqld1服务的选项 [mysqld1] basedir = C:/mysql-5.5.9 port = 3307 启用命名管道 socket = mypipe1 #mysqld2服务的选项 [mysqld2] basedir = C:/mysql-8.0.18 port = 3308 启用命名管道 socket = mypipe2
使用完整服务器路径名安装以下服务,以确保Windows为每个服务注册正确的可执行程序:
C:\>C:\mysql-5.5.9\bin\mysqld --install mysqld1
C:\>C:\mysql-8.0.18\bin\mysqld --install mysqld2
要启动服务,请使用服务管理器或 NET START 或 SC START 以及相应的服务名称:
C:\>SC START mysqld1
C:\>SC START mysqld2
要停止服务,请使用服务管理器,或使用 具有相应服务名称的 NET STOP 或 SC STOP :
C:\>SC STOP mysqld1
C:\>SC STOP mysqld2
方法2:
在单独的文件中指定每个服务器的选项,并
--defaults-file
在安装服务时
使用
,以告知每个服务器要使用的文件。
在这种情况下,每个文件都应使用
[mysqld]
组
列出选项
。
使用这种方法,要为5.5.9
mysqld
指定选项
,请创建一个如下所示的文件
C:\my-opts1.cnf
:
的[mysqld] basedir = C:/mysql-5.5.9 port = 3307 启用命名管道 socket = mypipe1
对于8.0.18
mysqld
,创建一个如下所示的文件
C:\my-opts2.cnf
:
的[mysqld] basedir = C:/mysql-8.0.18 port = 3308 启用命名管道 socket = mypipe2
按如下方式安装服务(在一行中输入每个命令):
C:\> C:\>C:\mysql-5.5.9\bin\mysqld --install mysqld1
--defaults-file=C:\my-opts1.cnf
C:\mysql-8.0.18\bin\mysqld --install mysqld2
--defaults-file=C:\my-opts2.cnf
将MySQL服务器作为服务安装并使用
--defaults-file
选项时,服务名称必须位于该选项之前。
安装服务后,以与上一示例相同的方式启动和停止它们。
要删除多个服务,请
为每个
服务使用
SC DELETE
mysqld_service_name
。
或者,
对每个
使用
mysqld --remove
,在该
--remove
选项
后面指定服务名称
。
如果服务名称是默认值(
MySQL
),则可以在使用
mysqld --remove
时省略它
。
这里的讨论使用 mysqld_safe 来启动MySQL的多个实例。 对于使用RPM分发的MySQL安装,服务器启动和关闭由systemd在几个Linux平台上管理。 在这些平台上, 没有安装 mysqld_safe, 因为它是不必要的。 有关使用systemd处理多个MySQL实例的信息,请参见 第2.5.9节“使用systemd管理MySQL服务器” 。
一种方法是在Unix上运行多个MySQL实例,用不同的默认TCP / IP端口和Unix套接字文件编译不同的服务器,这样每个服务器都可以监听不同的网络接口。 在每个安装的不同基目录中进行编译也会自动生成每个服务器的单独的已编译数据目录,日志文件和PID文件位置。
假设为默认的TCP / IP端口号(3306)和Unix套接字文件(
/tmp/mysql.sock
)
配置了现有的5.7服务器
。
要将新的8.0.18服务器配置为具有不同的操作参数,请使用以下
类似
的
CMake
命令:
外壳>cmake . -DMYSQL_TCP_PORT=
port_number
\-DMYSQL_UNIX_ADDR=
file_name
\-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-8.0.18
这里,
port_number
并且
file_name
必须与默认的TCP / IP端口号和Unix套接字文件路径名不同,并且该
CMAKE_INSTALL_PREFIX
值应指定与现有MySQL安装所在的安装目录不同的安装目录。
如果您有MySQL服务器侦听给定的端口号,您可以使用以下命令找出它用于几个重要的可配置变量的操作参数,包括基本目录和Unix套接字文件名:
外壳> mysqladmin --host=host_name
--port=port_number
variables
使用该命令显示的信息,您可以确定 在配置其他服务器时 不 使用 哪些选项值 。
如果指定
localhost
为主机名,则
mysqladmin
默认使用Unix套接字文件连接而不是TCP / IP。
要显式指定连接协议,请使用该
--protocol={TCP|SOCKET|PIPE|MEMORY}
选项。
您不需要编译新的MySQL服务器只是为了从不同的Unix套接字文件和TCP / IP端口号开始。 也可以使用相同的服务器二进制文件,并在运行时使用不同的参数值开始每次调用它。 一种方法是使用命令行选项:
外壳> mysqld_safe --socket=file_name
--port=port_number
要启动第二个服务器,请提供不同的
--socket
和
--port
选项值,并将
选项
传递
给
mysqld_safe,
以便服务器使用不同的数据目录。
--datadir=
dir_name
或者,将每个服务器的选项放在不同的选项文件中,然后使用
--defaults-file
指定相应选项文件路径
的
选项
启动每个服务器
。
例如,如果两个服务器实例的选项文件被命名为
/usr/local/mysql/my.cnf
和
/usr/local/mysql/my.cnf2
,像这样开头的服务器:命令:
shell>mysqld_safe --defaults-file=/usr/local/mysql/my.cnf
shell>mysqld_safe --defaults-file=/usr/local/mysql/my.cnf2
实现类似效果的另一种方法是使用环境变量来设置Unix套接字文件名和TCP / IP端口号:
shell>MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell>MYSQL_TCP_PORT=3307
shell>export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell>bin/mysqld --initialize --user=mysql
shell>mysqld_safe --datadir=/path/to/datadir &
这是启动第二台服务器用于测试的快速方法。 这个方法的好处是环境变量设置适用于从同一个shell调用的任何客户端程序。 因此,这些客户端的连接会自动定向到第二个服务器。
第4.9节“MySQL程序环境变量” 包括可用于影响MySQL程序的其他环境变量的列表。
在Unix上, mysqld_multi 脚本提供了另一种启动多个服务器的方法。 请参见 第4.3.4节“ mysqld_multi - 管理多个MySQL服务器” 。
要将客户端程序连接到侦听与编译到客户端的网络接口不同的网络接口的MySQL服务器,可以使用以下方法之一:
启动客户端
以使用TCP / IP连接到远程服务器,
使用TCP / IP连接到本地服务器,或
使用Unix套接字文件或Windows命名管道连接到本地服务器。
--host=
host_name
--port=
port_number
--host=127.0.0.1
--port=
port_number
--host=localhost
--socket=
file_name
启动客户端
--protocol=TCP
以使用TCP / IP
--protocol=SOCKET
进行连接,使用Unix套接字文件
--protocol=PIPE
进行连接,使用命名管道
--protocol=MEMORY
进行连接
,或
使用共享内存进行连接。
对于TCP / IP连接,您可能还需要指定
--host
和
--port
选项。
对于其他类型的连接,您可能需要指定
--socket
用于指定Unix套接字文件或Windows命名管道名称的
--shared-memory-base-name
选项
,或
指定用于指定共享内存名称
的
选项。
仅在Windows上支持共享内存连接。
在Unix上,设置
MYSQL_UNIX_PORT
和
MYSQL_TCP_PORT
环境变量启动您的客户端之前指向Unix套接字文件和TCP / IP端口号。
如果您通常使用特定的套接字文件或端口号,则可以放置命令在
.login
文件中
设置这些环境变量,
以便每次登录时都应用它们。请参见
第4.9节“MySQL程序环境变量”
。
在
[client]
选项文件
的
组中
指定默认的Unix套接字文件和TCP / IP端口号
。
例如,您可以
C:\my.cnf
在Windows上
使用
,或
.my.cnf
在Unix上的主目录中
使用
该
文件。
请参见
第4.2.2.2节“使用选项文件”
。
在C程序中,您可以在
mysql_real_connect()
调用中
指定套接字文件或端口号参数
。
您也可以通过调用程序读取选项文件
mysql_options()
。
请参见
第28.7.7节“C API函数描述”
。
如果您使用的是Perl
DBD::mysql
模块,则可以从MySQL选项文件中读取选项。
例如:
$ dsn =“DBI:mysql:test; mysql_read_default_group = client;” 。“MYSQL_READ_DEFAULT_FILE =的/ usr /本地/ MySQL的/数据/ my.cnf中”; $ dbh = DBI-> connect($ dsn,$ user,$ password);
请参见 第28.9节“MySQL Perl API” 。
其他编程接口可以提供用于读取选项文件的类似功能。