在上一章中,我们学习了 MySQL 8 数据类型,详细解释了哪些数据类型可用以及它们是如何分类的。这些数据类型中的每种都有不同的属性,并且存储容量因每种类型而异。上一章还让您深入了解了 MySQL 8 数据类型。现在是时候了解一些 MySQL 8 管理特性的实用知识了。更多地了解 MySQL 8 的管理特性、如何为其进行配置,等等,不是很有趣吗?对于管理员来说,详细了解 MySQL 8 如何用于全球化、如何维护日志以及如何增强服务器的能力非常重要。现在,让我们从一些基本概念开始。
本章将介绍以下主题:
- MySQL 8 服务器管理
- 数据目录
- 系统数据库
- 在一台计算机上运行多个实例
- 组件和插件管理
- 角色和权限
- 缓存技术
- 全球化
- MySQL 8 服务器日志
MySQL 8 有许多可用的操作参数,其中所有必需的参数都是在安装过程中默认设置的。安装完成后,您可以通过在特定参数设置的行开始处删除或添加注释符号(#
,来更改选项文件。用户还可以使用命令行参数或选项文件在运行时设置参数。
在本节中,我们将介绍 MySQL 8 启动时可用的服务器选项、系统变量和状态变量。
- 服务器选项:如前一章所述,MySQL 8 使用选项文件和命令行参数设置启动参数。参见https://dev.mysql.com/doc/refman/8.0/en/mysqld-option-tables.html 了解所有可用选项的详细信息。
mysqld
接受多种命令选项。要获取简要摘要,请执行以下命令:
mysqld --help
要查看完整列表,请使用以下命令:
mysqld –verbose --help
- 服务器系统变量:MySQL 服务器管理多个系统变量。MySQL 为每个系统变量提供默认值。系统变量可以使用命令行设置,也可以在选项文件中定义。MySQL 8 可以灵活地在运行时更改这些变量,而无需启动或停止服务器。有关更多详细信息,请参阅:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html 。
- 服务器状态变量:MySQL 服务器使用多个状态变量提供其运行信息。有关更多详细信息,请参阅:https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html 。
MySQL 8 提供了影响 MySQL 支持和数据验证检查的不同模式。此选项使用户更容易在不同的环境中使用 MySQL。为了设置不同的模式,MySQL 提供了sql_mode
系统变量,可以在全局或会话级别进行设置。详细参考以下几点以了解模式:
可以使用--sql-mode="modes"
选项在启动时设置 SQL 模式。用户也可以在选项文件中将该选项定义为sql-mode="modes"
。您可以通过添加逗号分隔的值来定义多个节点。MySQL 8 使用以下模式作为默认模式: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
要在运行时更改模式,请执行以下命令:
**```sql SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
要检索这两个变量的值,请执行以下命令:
```sql
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
本节介绍所有可用的 SQL 模式。其中,前三种是最重要的 SQL 模式:
ANSI
:此模式用于更改语法和行为,使其更接近标准 SQL。STRICT_TRANS_TABLES
:顾名思义,该模式与事务相关,主要用于事务存储引擎。当此模式对非事务表启用时,MySQL 8 会将无效值转换为最接近的有效值,并将调整后的值插入列中。如果缺少该值,那么 MySQL 8 将插入一个与列的数据类型相关的隐式默认值。在这种情况下,MySQL 8 将生成警告消息而不是错误消息,并在不中断语句的情况下继续执行语句。但是,在事务表的情况下,MySQL 8 将给出错误并中断执行。TRADITIONAL
:这种模式通常与传统的 SQL 数据库系统类似。当在列中插入不正确的值时,它表示给出错误而不是警告。ALLOW_INVALID_DATES
:此模式只检查日期值的月份范围和日期范围。换句话说,月份范围必须介于 1 到 12 之间,日期范围必须介于 1 到 31 之间。此模式适用于DATE
和DATETIME
数据类型,不适用于timestamp
数据类型。- AUT0T0:用于考虑作为一个标识符引号字符,而不是字符串引号字符。启用此模式时,不能使用双引号来引用字符串文字
ERROR_FOR_DIVISION_BY_ZERO
:用于处理被零除的情况。此模式输出还取决于严格的 SQL 模式状态:- 如果未启用此模式,则除零将插入
NULL
且不产生警告。 *** 如果启用此模式,则除零插入NULL
并产生警告。*** 如果启用此模式和严格模式,则除零会产生错误,除非同时给出了IGNORE
。对于INSERT IGNORE
和UPDATE IGNORE
,除零插入NULL
并产生警告。**** *******HIGH_NOT_PRECEDENCE
:此模式用于为NOT
运算符设置高优先级。例如,当模式被启用时,表达式NOT a BETWEEN b AND c
被解析为NOT (a BETWEEN b AND c)
而不是(NOT a) BETWEEN b AND c
。*IGNORE_SPACE
:此模式适用于内置函数,不适用于自定义函数或存储过程。*NO_AUTO_CREATE_USER
:此模式用于防止GRANT
语句,除非指定了身份验证信息,否则自动创建新的用户帐户。*NO_AUTO_VALUE_ON_ZERO
:此模式用于自动增量列。当发现 0 时,MySQL 将为字段创建一个新的序列号,这将在加载转储时产生问题。在重新加载转储之前启用此模式以解决此问题。*NO_BACKSLASH_ESCAPES
:如果启用此模式,反斜杠将变成普通字符。*NO_DIR_IN_CREATE
:此选项对于从属复制服务器非常有用,因为在创建表时忽略了INDEX DIRECTORY
和DATA DIRECTORY
指令。*NO_ENGINE_SUBSTITUTION
:用于提供默认存储引擎的替换。当启用此模式且所需的引擎不可用时,MySQL 将给出一个错误,并且不会创建表。*NO_FIELD_OPTIONS
:表示在SHOW_CREATE_TABLE
的输出中不打印 MySQL 特定的列选项。*NO_KEY_OPTIONS
:表示在SHOW_CREATE_TABLE
的输出中不打印 MySQL 特定的索引选项。*NO_TABLE_OPTIONS
:表示在SHOW_CREATE_TABLE
的输出中不打印 MySQL 特定的表选项。*NO_UNSIGNED_SUBTRACTION
:启用此模式时,确保减法结果必须是有符号值,即使任何操作数都是无符号的。*NO_ZERO_DATE
:该模式的效果取决于以下定义的严格模式: - 如果未启用,则允许 0000-00-00,MySQL 在插入时不产生警告
- 如果启用此模式,则允许 0000-00-00,MySQL 记录警告
- 如果同时启用此模式和严格模式,则 0000-00-00 是不允许的,MySQL 在插入时会产生错误*
NO_ZERO_IN_DATE
:该模式效果还取决于以下定义的严格模式: - 如果未启用,则允许日期包含零部分,MySQL 不会在插入时生成警告
- 如果启用此模式,则允许零部分的日期并生成警告
- 如果启用此模式和严格模式,则不允许日期包含零部分,MySQL 将生成错误******
- 如果未启用此模式,则除零将插入
******* ONLY_FULL_GROUP_BY
:如果启用此模式,MySQL 将拒绝select
列表、order by
列表、HAVING
条件为非聚合列的查询。
PAD_CHAR_TO_FULL_LENGTH
:此模式应用于数据类型设置为CHAR
的列。启用此模式时,MySQL 通过填充到列值的完整长度来检索列值。PIPES_AS_CONCAT
:当该模式设置为启用时| |
将被视为字符串连接运算符,而不是OR
。- 【参考译文】默认情况下,MySQL 8 将考虑作为 Ty2 T2 的同义词,但当启用此标志时,MySQL 将考虑将 T3 T3 作为 OLE T4 的同义词。
STRICT_ALL_TABLES
:在此模式下,拒绝无效数据值。TIME_TRUNCATE_FRACTIONAL
:此模式表示TIME
、DATE
、TIMESTAMP
列是否允许截断。默认行为是对值执行舍入,而不是截断。
MySQL 8 还提供一些特殊模式作为模式值的组合:
ANSI
:包括REAL_AS_FLOAT
、PIPES_AS_CONCAT
、ANSI_QUOTES
、IGNORE_SPACE
和ONLY_FULL_GROUP_BY
模式的影响。DB2
:包括PIPES_AS_CONCAT
、ANSI_QUOTES
、IGNORE_SPACE
、NO_KEY_OPTIONS
、NO_TABLE_OPTIONS
和NO_FIELD_OPTIONS
模式的影响。MAXDB
:包括PIPES_AS_CONCAT
、ANSI_QUOTES
、IGNORE_SPACE
、NO_KEY_OPTIONS
、NO_TABLE_OPTIONS
、NO_FIELD_OPTIONS
、NO_AUTO_CREATE_USER
的影响。MSSQL
:包括PIPES_AS_CONCAT
、ANSI_QUOTES
、IGNORE_SPACE
、NO_KEY_OPTIONS
、NO_TABLE_OPTIONS
、NO_FIELD_OPTIONS
的影响。MYSQL323
:包括MYSQL323
和HIGH_NOT_PRECEDENCE
模式的影响。MYSQL40
:包括MYSQL40
和HIGH_NOT_PRECEDENCE
模式的影响。ORACLE
:包括PIPES_AS_CONCAT
、ANSI_QUOTES
、IGNORE_SPACE
、NO_KEY_OPTIONS
、NO_TABLE_OPTIONS
、NO_FIELD_OPTIONS
和NO_AUTO_CREATE_USER
模式的影响。POSTGRESQL
:包括PIPES_AS_CONCAT
、ANSI_QUOTES
、IGNORE_SPACE
、NO_KEY_OPTIONS
、NO_TABLE_OPTIONS
和NO_FIELD_OPTIONS
模式的影响。TRADITIONAL
:包括STRICT_TRANS_TABLES
、STRICT_ALL_TABLES
、NO_ZERO_IN_DATE
、NO_ZERO_DATE
、ERROR_FOR_DIVISION_BY_ZERO
、NO_AUTO_CREATE_USER
和NO_ENGINE_SUBSTITUTION
模式的影响。
严格模式用于管理无效数据或缺失数据。如果未启用严格模式,则 MySQL 将通过调整值和生成警告消息来管理插入和更新操作。我们可以通过启用INSERT IGNORE
或UPDATE IGNORE
选项在严格模式下执行相同的操作。让我们选择一个键插入示例,其中键值超过最大限制。如果启用了严格模式,MySQL 将生成错误并停止执行,而在另一侧,如果禁用严格模式,MySQL 将通过截断键值来允许执行。同样地,在SELECT
语句中数据没有改变的情况下,MySQL 仍然会产生一个错误,如果启用了严格模式,在无效值的情况下会生成一条警告消息。如果启用了STRICT_ALL_TABLES
或STRICT_TRANS_TABLES
选项,则严格模式有效。这两个选项在事务表中的行为类似,而在非事务表中的行为不同。
- 对于事务表:如果启用了任何一种模式,则 MySQL 将产生错误并中止语句执行,以防出现无效或缺失值。
- 对于非事务表:当表是非事务表时,MySql 的行为将取决于以下因素:
STRICT_ALL_TABLES
:在这种情况下,将生成错误并停止执行。但是,部分数据更新时仍有可能出错。为了避免这种错误情况,请使用单行语句,如果在第一行插入/更新期间发生错误,该语句将中止执行。STRICT_TRANS_TABLES
:此选项提供了将无效值转换为最接近的有效值的灵活性。如果缺少值,MySQL 会在列中插入数据类型的默认值。在这里,MySQL 生成一条警告消息并继续执行。
严格模式影响以零、零日期和日期中的零进行除法的处理,如前面几点中使用的ERROR_FOR_DIVISION_BY_ZERO
、NO_ZERO_DATE
和NO_ZERO_IN_DATE
模式所述。
SQL 模式将应用于以下 SQL 语句:
ALTER TABLE
CREATE TABLE
CREATE TABLE ... SELECT
DELETE (both single table and multiple table)
INSERT
LOAD DATA
LOAD XML
SELECT SLEEP()
UPDATE (both single table and multiple table)
You can go to : https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html for a detailed list of the errors associated with strict SQL mode in MySQL.
MySQL 提供了一个IGNORE
关键字,该关键字对于语句执行是可选的。IGNORE
关键字用于将错误降级为警告,适用于多条语句。对于多行语句,IGNORE
关键字允许您跳过特定行,而不是中止。以下语句支持IGNORE
关键字:
CREATE TABLE ... SELECT
:个别CREATE
和SELECT
语句不支持此关键字,但当我们使用SELECT
语句插入表中时,在唯一键值上重复现有行的行将被丢弃。DELETE
:如果此语句使用IGNORE
选项 MySQL 执行,可以避免执行过程中出现错误。INSERT
:在插入行时,该关键字将处理唯一键中的重复值和数据转换问题。MySQL 将在列中插入最接近的值,并忽略错误。LOAD DATA
和LOAD XML
:如果发现重复,则在加载数据时,如果定义了IGNORE
关键字,则语句将丢弃它并继续插入剩余的数据。UPDATE
:在语句执行过程中,如果在唯一键上出现重复键冲突,MySQL 将使用最接近的标识值更新该列。
The IGNORE
keyword also applies on some specific errors, listed here: https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html.
MySQL 8 提供对IPv6的支持,具备以下功能:
- MySQL 服务器将接受来自具有 IPv6 连接的客户端的 TCP/IP 连接
- MySQL 8 帐户名允许 IPv6 地址,这使 DBA 能够使用 IPv6 为与服务器连接的客户端指定权限
- IPv6 函数支持字符串和内部 IPv6 地址格式之间的转换,并检查这些值是否表示有效的 IPv6 地址
MySQL 8 提供HELP
语句,从 MySQL 参考手册中获取信息。为了管理这些信息,MySQL 使用了几个系统数据库表。为了初始化这些表,MySQL 提供了fill_help_tables.sql
脚本。此脚本可在上获得 http://dev.mysql.com/doc/index-other.html 。下载并解压缩脚本文件后,执行以下命令,调用HELP
函数:
mysql -u root mysql < fill_help_tables.sql
在安装时,会发生内容初始化过程。在升级的情况下,将进行升级;手动执行上述命令。
服务器关闭过程执行以下步骤:
- 关闭过程启动:有几种方法可以初始化关闭过程。执行可在任何平台上执行的
mysqladmin shutdown
命令。有一些特定于系统的方法来初始化关闭过程;例如,基于 Unix 的系统在收到SIGTERM信号时将开始关闭。同样,当服务经理告诉基于窗口的系统时,它们将开始关闭。 - 服务器根据需要创建关机线程:根据关机初始化过程,服务器将决定是否创建新线程。如果客户端请求,将创建一个新线程。如果收到一个信号,那么服务器可能会创建一个线程,或者自己处理它。如果服务器尝试为关机进程创建单独的线程,但出现错误,则会在错误日志中生成以下消息:
Error: Can't create thread to kill server
-
服务器停止接受新连接:当关闭活动启动时,服务器将使用网络接口处理程序停止接受新连接请求。服务器将使用 Windows 功能,例如命名管道、TCP/IP 端口、Unix 套接字文件和 Windows 上的共享内存,以便侦听新的连接请求。
-
服务器终止当前活动:一旦关闭过程初始化,服务器将开始断开与客户端的连接。在正常情况下,连接线程将很快消亡,但正在工作或处于正在进行的活动阶段的线程将需要很长时间才能消亡。因此,如果一个线程正在执行打开的事务,并且如果在执行过程中得到回滚,则用户可能只获得部分更新的数据。另一方面,如果线程正在处理事务,那么服务器将等待事务完成。此外,用户可以通过执行
KILL QUERY
或KILL CONNECTION
语句来终止正在进行的事务。 -
服务器关闭或关闭存储引擎:在此阶段,服务器刷新缓存并关闭所有打开的表。在这里,存储引擎执行表所需的所有操作。
InnoDB
刷新其缓冲池,将当前 LSN 写入表空间并终止其线程。MyISAM
刷新挂起的索引。 -
服务器退出:在此阶段,服务器将向管理流程提供以下值之一:
- 0=成功终止(未完成重新启动)
- 1=终止不成功(未重新启动)
- 2=终止不成功(重启完成)
数据目录是 MySQL 8 存储自己管理的所有信息的地方。数据目录的每个子目录表示一个数据库目录及其相关数据。所有 MySQL 安装都有以下标准数据库:
sys
目录:表示系统架构,包含对性能架构信息解释有用的对象。 ***performance schema
目录:该目录用于观察 MySQL 服务器在运行时的内部执行情况。***mysql
目录:该目录与 MySQL 系统数据库相关,包含数据字典表和系统表。它包含 MySQL 服务器运行时所需的信息。****
****# 系统数据库
系统数据库主要包含存储对象元数据的数据字典表和用于其他操作目的的系统表。系统数据库包含许多系统表。在接下来的章节中,我们将了解更多关于它们的信息。
数据字典表包含有关数据对象的元数据。此目录的表是不可见的,一般 SQL 查询(如SELECT
、SHOW TABLES
、INFORMATION_SCHEMA.TABLES
等)无法读取。MySQL 主要使用INFORMATION_SCHEMA
选项公开元数据。
这些表用于管理和提供用户、数据库和相关权限的授予信息。MySQL 8 使用 grant 表作为事务性表,而不是非事务性(例如MyISAM
)表,因此事务上的所有操作要么完成要么失败;不可能出现部分情况。
这些表包含与存储程序、组件和服务器端插件相关的信息。以下主要表格用于存储信息:
- 组件:作为服务器的注册表。MySQL 8 服务器在服务器启动时加载此表列出的所有组件。
- 函数:此表包含所有自定义函数(自定义函数的相关信息。MySQL 8 将在服务器启动期间加载此表中列出的所有 UDF。
- 插件:包含服务器端插件的相关信息。MySQL 8 服务器在启动期间加载所有可用插件。
这些表对于记录和使用 csv 存储引擎非常有用。例如,函数general_log
和slow_log
。
这些表用于存储帮助信息。此类别中有以下表格:
help_category
:提供有关帮助类别的信息help_keyword
:提供与帮助主题相关的关键字help_relation
:帮助在帮助关键字和主题之间进行映射help_topic
:帮助主题内容
这些表用于存储时区信息。此类别中有以下表格:
time_zone
:提供时区 ID 以及是否使用闰秒time_zone_leap_second
:当闰秒出现时,将派上用场time_zone_name
:有助于时区 ID 和名称之间的映射time_zone_transition
和time_zone_transition_type
:时区说明
这些表对于支持复制功能非常有用。如下表所述,将其配置为时,它有助于存储与复制相关的信息。此类别中有以下表格:
gtid_executed
:用于创建存储 GTID 值的表ndb_binlog_index
:提供 MySQL 集群复制的二进制日志信息slave_master_info
、slave_relay_log_info
和slave_worker_info
:用于在从属服务器上存储复制信息
此表对于优化器非常有用。此类别中有以下表格:
innodb_index_stats
和innodb_table_stats
:用于获取InnoDB
持久化优化器统计信息server_cost
:包含一般服务器操作的优化器成本估算。engine_cost
:包含特定存储引擎操作的估计值
不属于上述类别的表属于此类别。此类别中有以下表格:
servers
:由FEDERATED
存储引擎使用innodb_dynamic_metadata
:由InnoDB
存储引擎用来存储快速变化的表元数据,如自动递增计数器值和索引树损坏标志
You can learn more about the different system tables at: https://dev.mysql.com/doc/refman/8.0/en/system-database.html.
在某些情况下,可能需要在一台计算机上安装多个实例。可能需要检查两个不同版本的性能,或者可能需要在不同的 MySQL 实例上管理两个独立的数据库。原因可能是任何原因,但 MySQL 允许用户通过提供不同的配置值在同一台机器上执行多个实例。MySQL 8 允许用户通过使用命令行、选项文件或设置环境变量来配置参数。MySQL 8 为此使用的主要资源是数据目录,对于这两个实例,它必须是唯一的。我们可以使用--datadir=dir_name
函数定义相同的值。除了数据目录外,我们还将为以下选项配置唯一值:
*** --port=port_num
--socket={file_name|pipe_name}
--shared-memory-base-name=name
--pid-file=file_name
--general_log_file=file_name
--log-bin[=file_name]
--slow_query_log_file=file_name
--log-error[=file_name]
--tmpdir=dir_name
如上所述,每个 MySQL 实例都必须有一个单独的数据目录。允许用户使用以下方法定义单独的目录:
- 新建数据目录:此方法必须遵循第 2 章安装升级 MySQL中定义的相同步骤。对于 Microsoft Windows,当我们从 Zip 存档安装 MySQL 8 时,将其数据目录复制到您要设置新实例的位置。如果是 MSI 包和数据目录,请在安装目录下创建一个名为 data 的原始
template
数据目录。安装完成后,复制数据目录以设置其他实例。 - 复制现有数据目录:此方法将现有实例的数据目录复制到新实例的数据目录中。要复制现有目录,请执行以下步骤:
- 停止现有的 MySQL 实例。确保它完全关闭,以便磁盘中没有挂起的更改可用。
- 将数据目录复制到新位置。
- 将现有实例使用的
my.cnf
或my.ini
选项文件复制到新位置。 - 根据新实例修改新选项。确保所有独特的配置都正确完成。
- 使用新选项文件启动新实例。
用户可以通过使用命令行和传递值或通过窗口服务在单个 Windows 计算机上运行多个 MySQL 实例。
- **在 Windows 命令行启动多个 MySQL 实例:**要使用命令行执行多个实例,可以在运行时指定该选项,也可以在选项文件中设置。选项文件是启动实例的更好选项,因为不需要每次启动时都指定参数。要设置或配置选项文件,请按照第 2 章、安装和升级 MySQL中描述的步骤进行操作。
- **将多个 MySQL 实例作为 Windows 服务启动:**要在 Windows as 服务上启动多个实例,我们必须使用唯一的名称指定不同的服务。如第 2 章*安装和升级 MySQL 中所述,*使用
–install
或--install-manual
选项将 MySQL 定义为 Windows 服务。以下选项可用于将多个 MySQL 实例定义为 Windows 服务:- 方法 1:为实例创建两个单独的选项文件,并在其中定义
mysqld
组。例如,使用函数C:\my-opts1.cnf
。下面给出了相同的代码,供您参考:
- 方法 1:为实例创建两个单独的选项文件,并在其中定义
[mysqld]
basedir = C:/mysql-5.5.5
port = 3307
enable-named-pipe
socket = mypipe1
我们也可以使用C:\my-opts2.cnf
函数进行同样的操作。以下代码描述了该过程:
[mysqld]
basedir = C:/mysql-8.0.1
port = 3308
enable-named-pipe
socket = mypipe2
您可以使用以下命令安装 MySQL8 服务:
C:\> C:\mysql-5.5.5\bin\mysqld --install mysqld1 --
defaults-file=C:\my-opts1.cnf
C:\> C:\mysql-8.0.1\bin\mysqld --install mysqld2 --
defaults-file=C:\my-opts2.cnf
# options for mysqld1 service
[mysqld1]
basedir = C:/mysql-5.5.5
port = 3307
enable-named-pipe
socket = mypipe1
# options for mysqld2 service
[mysqld2]
basedir = C:/mysql-8.0.1
port = 3308
enable-named-pipe
socket = mypipe2
- 执行以下命令以安装 MySQL 服务:
C:\> C:\mysql-5.5.9\bin\mysqld --install mysqld1
C:\> C:\mysql-8.0.4\bin\mysqld --install mysqld2
- 要启动 MySQL 服务,请执行以下命令:
C:\> NET START mysqld1
C:\> NET START mysqld2
MySQL 服务器支持基于组件的结构,以扩展服务器功能。MySQL 8 使用INSTALL COMPONENT
和UNINSTALL COMPONENT
SQL 语句在运行时加载和卸载组件。MySQL 8 将组件细节管理到mysql.component
系统表中。因此,每次安装新组件时,MySQL 8 server 都会执行以下任务:
- 将组件加载到服务器以立即可用
- 将服务注册组件加载到
mysql.component
系统表中
当我们卸载任何组件时,MySQL 服务器将执行相同的步骤,但顺序相反。要查看哪些组件可用,请执行以下查询:
SELECT * FROM mysql.component;
MySQL 8 服务器有一个插件 API,可以创建服务器组件。使用 MySQL 8,您可以灵活地在运行时或启动时安装插件。在以下主题中,我们将了解 MySQL 8 服务器插件的生命周期。
插件的加载因其类型和特性而异。为了更清楚地了解这一点,让我们看一下以下内容:
- 内置插件:服务器知道内置插件并在启动时自动加载。用户可以通过插件的任何激活状态来更改插件的状态,这将在下一节中讨论。
*** 在
mysql.plugin
系统表中注册的插件:启动时 MySQL 8 服务器将加载在mysql.plugin
表中注册的所有插件。如果使用--skip-grant-tables
选项启动服务器,服务器将不会加载此处列出的插件。*** 使用命令行选项命名的插件:MySQL 8 提供了使用命令行加载插件的--plugin-load
、--plugin-load-add
和--early-plugin-load
选项。安装内置插件后,--plugin-load
和--plugin-load-add
选项在服务器启动时加载插件。但是,在初始化内置插件和存储引擎之前,我们可以使用--early-plugin-load
选项加载插件* 使用INSTALL PLUGIN
语句安装的插件:这是一个永久插件注册选项,将插件信息注册到mysql.plugin
表中。它还将加载插件库中所有可用的插件。****
****# 激活插件
为了控制插件的状态(如激活或停用),MySQL 8 提供了以下选项:
--plugin_name=OFF
:禁用指定插件。一些内置插件,如asmysql_native_password
插件,不受此命令的影响。 ***--plugin_name[=ON]
:此命令启用指定的插件。如果在启动期间插件初始化失败,MySQL 8 将在禁用插件的情况下启动。***--plugin_name=FORCE
:与上述命令相同,只是服务器没有启动。这意味着,如果在启动时提到插件,它将强制服务器启动插件。***--plugin_name=FORCE_PLUS_PERMANENT
:与FORCE
选项相同,但额外防止插件在运行时卸载。******
******# 卸载插件
MySQL 8 使用UNINSTALL PLUGIN
语句卸载插件,而不考虑它是在运行时还是在启动时安装的。但此声明不允许我们卸载内置插件和通过--plugin_name=FORCE_PLUS_PERMANENT
选项安装的插件。此语句只是卸载插件并将其从mysql.plugin
表中删除,因此需要在mysql.plugin
表上附加删除权限。
有多种方法可以获取有关已安装插件的信息。以下列出了其中一些,供您参考:
INFORMATION_SCHEMA.PLUGINS
表包含插件详细信息,如PLUGIN_NAME
、PLUGIN_VERSION
、PLUGIN_STATUS
、PLUGIN_TYPE
、PLUGIN_LIBRARY
等。此表中的每一行表示有关插件的信息:
SELECT * FROM information_schema.PLUGINS;
SHOW PLUGINS
语句显示每个插件的名称、状态、类型、库和许可证详细信息。如果库值为NULL
,则表示是内置插件,无法卸载。
SHOW PLUGINS;
mysql.plugin
表包含INSTALL PLUGIN
函数注册的所有插件的详细信息。
简单地说,角色是特权的集合。要在 MySQL 8 中创建角色,您必须具有全局CREATE ROLE
或CREATE USER
权限。MySQL 8 提供了各种附加到角色和用户的权限。参见https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html 了解更多有关可用特权的详细信息。
现在,让我们举一个例子来了解角色创建和权限分配。假设我们在当前数据库中已经创建了一个hr_employee
表,并且我们希望将此表的访问权授予hrdepartment
角色。通过使用以下代码可以解决此难题:
CREATE ROLE hrdepartment;
grant all on hr_employee to hrdepartment;
上述代码将帮助我们创建hrdepartment
角色并授予所有必要的访问权限。本主题将在第 11 章、安全中详细介绍。
缓存是一种用于提高性能的机制。MySQL 使用多种策略在缓冲区中缓存信息。MySQL 8 利用存储引擎级别的缓存来处理其操作。它还在准备好的语句和存储程序中应用缓存以提高性能。MySQL 8 引入了各种系统级变量来管理缓存,如binlog_stmt_cache_size
、daemon_memcached_enable_binlog
、daemon_memcached_w_batch_size
、host_cache_size
等等。我们将在第 12 章、优化 MySQL 8中详细介绍缓存。
全球化是一种为应用程序提供多语言支持的功能,例如支持使用本地语言。我们自己的母语比其他语言更容易理解信息,对吗?为了实现这一目标,全球化应运而生。使用全球化,用户可以将数据存储、检索和更新为多种语言。全球化需要考虑某些参数。我们将在以下章节中详细讨论这些问题
在详细讨论字符集之前,需要了解字符集实际上是什么,以及它的相关术语,对吗?让我们从术语本身开始;字符集是一组符号和编码。与字符集相关的另一个重要术语是排序规则,用于比较字符的规则集。让我们举一个简单的例子来理解字符集和排序规则。考虑两个字母,即:To.T2,p,T3,1,并分配一个数字给每个,这样,Po.t6,p=2,t7,和 t8,q=2,t9。现在,假设P是一个符号,1 是它的编码。这里,字母及其编码的组合称为字符集。现在假设,我们要比较这些值;最简单的方法是引用编码值。当 1 小于 2 时,我们可以说P小于Q,这就是所谓的排序。这是理解字符集和排序规则的最简单示例,但在现实生活中,我们有许多字符,包括特殊字符,同样,排序规则也有许多规则。
MySQL 8 支持许多字符集,具有多种排序规则。可以在列、表、数据库或服务器级别定义字符集。我们可以为InnoDB
、MyISAM
和Memory
存储引擎使用字符集。要检查 MySQL 8 的所有可用字符集,请执行以下命令:
mysql> show character set;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | .........
.........
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.01 sec)
同样,要查看字符的排序规则,请执行以下命令:
mysql> SHOW COLLATION WHERE Charset = 'ascii';
+------------------+---------+----+---------+----------+---------+---------------+
| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute |
+------------------+---------+----+---------+----------+---------+---------------+
| ascii_bin | ascii | 65 | | Yes | 1 | PAD SPACE |
| ascii_general_ci | ascii | 11 | Yes | Yes | 1 | PAD SPACE |
+------------------+---------+----+---------+----------+---------+---------------+
2 rows in set (0.00 sec)
排序规则将具有以下三个特征:
- 两个不同的字符集不能具有相同的排序规则。
- 每个字符集都有一个默认排序规则。如上代码所示,
show character set
命令显示字符集的默认排序规则。 - 排序规则遵循预定义的命名约定,稍后将对此进行解释。
- 字符集曲目:曲目是数据集中字符的集合。任何字符串表达式都将具有 repertoire 属性,并将属于以下值之一:
- ASCII:包含 Unicode 范围 U+0000 到 U+007F 的字符的表达式。
- UNICODE:包含 UNICODE 范围 U+0000 到 U+10FFFF 的字符的表达式。这包括基本多语言平面(BMP范围内的字符(U+0000 到 U+FFFF)和 BMP 范围外的补充字符(U+01000 到 U+10FFFF)。
从这两个值的范围中,我们可以确定 ASCII 是 UNICODE 范围的子集,并且我们可以安全地将 ASCII 值转换为 UNICODE 值,而不会丢失任何数据。该剧目主要用于将表达式从一个字符集转换为另一个字符集。在一些转换案例中,MySQL 8 抛出一个错误,比如非法混合排序规则;要处理这些场景,需要剧目。为了理解它的用途,请考虑下面的例子:
CREATE TABLE employee (
firstname CHAR(10) CHARACTER SET latin1,
lastname CHAR(10) CHARACTER SET ascii
);
INSERT INTO employee VALUES ('Mona',' Singh');
select concat(firstname,lastname) from employee;
+----------------------------+
| concat(firstname,lastname) |
+----------------------------+
| Mona Singh |
+----------------------------+
1 row in set (0.00 sec)
- 元数据 UTF-8:元数据是指与该数据相关的数据。就数据库而言,我们可以说任何描述数据库对象的东西都被称为元数据。例如:列名、用户名等。MySQL 对元数据遵循以下两条规则:
- 包括元数据所有语言中的所有字符;这使用户能够使用自己的语言来表示列名和表名。
- 为所有元数据管理一个公共字符集。否则,
INFORMATION_SCHEMA
中表的SHOW
和SELECT
语句将无法正常工作。
为了遵循上述规则,MySQL 8 将元数据存储为 Unicode 格式。考虑到 MySQL 函数如{ To0t},{ To1,},To.t2,,To.T3,,To.T5,默认为 UTF-8 字符集。MySQL 8 服务器已定义character_set_system
为元数据指定字符集。确保在 Unicode 中存储元数据并不意味着列标题和DESCRIBE
函数将以元数据字符集的形式返回值。根据character_set_results
系统变量工作。
本节介绍如何在 MySQL 8 中添加字符集。此方法可能因字符集类型而异-根据字符类型可能简单也可能复杂。将字符集添加到 MySQL 8 中需要以下四个步骤:
-
将
MYSET
的<charset>
元素添加到sql/share/charsets/Index.xml
文件中。有关语法,请参阅其他字符集的已定义文件。 -
在这一步中,简单字符集和复杂字符集的处理过程是不同的。对于简单字符集,在
sql/share/charsets
目录中创建一个配置文件MYSET.xml
,以描述字符集属性。对于复杂字符集,需要 C 源文件。例如,在 strings 目录中创建ctype-MYSET.c
类型。对于每个<collation>
元件,提供ctype-MYSET.c file
。 -
修改配置信息:
- 编辑
mysys/charset-def.c
,并注册新字符集的排序规则。将这些行添加到声明部分:
- 编辑
#ifdef HAVE_CHARSET_MYSET
extern CHARSET_INFO my_charset_MYSET_general_ci;
extern CHARSET_INFO my_charset_MYSET_bin;
#endif
将这些行添加到注册****部分:
**```sql #ifdef HAVE_CHARSET_MYSET add_compiled_collation(&my_charset_MYSET_general_ci); add_compiled_collation(&my_charset_MYSET_bin); #endif
4. 重新配置、重新编译和测试
# 配置字符集
MySQL 8 提供了`--character-set-server`和`--collation-server`选项来配置字符集,默认字符集由`latin1`改为`UTF8`。`UTF8`是主要的字符集,尽管它在 MySQL 的早期版本中不是默认的。随着这些变化被全球接受,字符集和排序规则
现在基于`UTF8`;一个常见的原因是`UTF8`支持大约 21 种不同的语言,这使得系统提供多语言支持。在配置排序规则之前,请参阅[中提供的排序规则列表 https://dev.mysql.com/doc/refman/8.0/en/show-collation.html](https://dev.mysql.com/doc/refman/8.0/en/show-collation.html)
# 语言选择
默认情况下,MySQL 8 在错误消息中使用英语,但允许用户选择其他几种语言。例如,俄语、西班牙语、瑞典语等。MySQL 8 使用`lc_messages_dir`和`lc_messages`这两个系统变量来管理错误消息的语言,并具有以下属性:
* `lc_messages_dir`:系统变量,在服务器启动时设置。它是全局变量,因此在运行时被所有客户端普遍使用。
* `lc_messages`:该变量用于全局和会话级别。允许单个用户对错误消息使用不同的语言。例如,如果在服务器启动期间设置了`en_US`,但如果您想使用法语,则执行以下命令:
```sql
SET lc_messages = 'fr_FR';
MySQL 8 服务器对错误消息文件遵循以下三条规则:
- MySQL 8 将在由两个系统变量
lc_messages_dir
和lc_messages
构成的位置找到该文件。例如,如果使用下面的命令启动 MySQL 8,mysqld
将区域设置nl_NL
映射为荷兰语,并在/usr/share/mysql/dutch
目录中搜索错误文件。MySQL 8 将所有语言文件存储在MySQL8 Base Directory/share/mysql/LANGUAGE
目录中,默认情况下,语言文件位于 MySQL 基本目录下的share/mysql/LANGUAGE
目录中。
mysqld --lc_messages_dir=/usr/share/mysql --lc_messages=nl_NL
- 如果消息文件不存在于目录下,那么 MySQL 8 将忽略“席”T0 变量的值,并将“{ T1”变量作为一个位置来查看。
- 如果 MySQL 8 服务器找不到消息文件,那么它会在错误日志文件中显示一条消息,并使用英语表示消息。
MySQL 8 服务器以三种不同的方式管理时区:
- 系统时区:由
system_time_zone
系统变量管理,可以在执行 mysqld 之前通过–timezone=timezone_name
或TZ
环境变量进行设置。 - 服务器当前时区:由
time_zone
系统变量管理。time_zone
变量的默认值为SYSTEM
,表示服务器时区与系统时区相同。MySQL 8 允许用户在启动时通过在选项文件中指定default-time-zone='*timezone*'
来设置time_zone
全局变量值,在运行时使用以下命令:
mysql> SET GLOBAL time_zone = timezone;
- 预连接时区:由
time_zone
变量管理,特定于连接 MySQL 8 服务器的客户端,该变量取全局time_zone
的初始值变量,但 MySQL 8 允许用户通过执行以下命令在运行时对其进行更改:
mysql> SET time_zone = timezone;
此会话变量影响区域特定值的显示和存储。例如,NOW()
和CURTIME()
函数返回的值。另一方面,此变量不影响以 UTC 格式显示和存储的值,例如使用UTC_TIMESTAMP()
函数。
MySQL 8 使用lc_time_names
系统变量控制语言,这些语言将影响显示的日期、月份名称和缩写。DATE_FORMAT()
、DAYNAME()
和MONTHNAME()
功能输出取决于lc_time_names
变量的值。首先想到的问题是,这些区域设置是在哪里定义的,我们如何获得它们?不用担心,请参考http://www.iana.org/assignments/language-subtag-registry 。所有地区均由互联网分配号码管理局(IANA使用语言和地区缩写进行定义。默认情况下,MySQL 8 将en_US
设置为系统变量中的区域设置。如果用户具有SYSTEM_VARIABLES_ADMIN
或SUPER
权限,则可以设置服务器启动时的值或设置GLOBAL
。MySQL 8 允许用户检查并设置其连接的区域设置。执行以下命令以检查工作站上的区域设置:
**```sql mysql> SET NAMES 'utf8'; Query OK, 0 rows affected (0.09 sec)
mysql> SELECT @@lc_time_names; +-----------------+ | @@lc_time_names | +-----------------+ | en_US | +-----------------+ 1 row in set (0.00 sec)
mysql> SELECT DAYNAME('2010-01-01'), MONTHNAME('2010-01-01'); +-----------------------+-------------------------+ | DAYNAME('2010-01-01') | MONTHNAME('2010-01-01') | +-----------------------+-------------------------+ | Friday | January | +-----------------------+-------------------------+ 1 row in set (0.00 sec)
mysql> SELECT DATE_FORMAT('2010-01-01','%W %a %M %b'); +-----------------------------------------+ | DATE_FORMAT('2010-01-01','%W %a %M %b') | +-----------------------------------------+ | Friday Fri January Jan | +-----------------------------------------+ 1 row in set (0.00 sec)
mysql> SET lc_time_names = 'nl_NL'; Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@lc_time_names; +-----------------+ | @@lc_time_names | +-----------------+ | nl_NL | +-----------------+ 1 row in set (0.00 sec)
mysql> SELECT DAYNAME('2010-01-01'), MONTHNAME('2010-01-01'); +-----------------------+-------------------------+ | DAYNAME('2010-01-01') | MONTHNAME('2010-01-01') | +-----------------------+-------------------------+ | vrijdag | januari | +-----------------------+-------------------------+ 1 row in set (0.00 sec)
mysql> SELECT DATE_FORMAT('2010-01-01','%W %a %M %b'); +-----------------------------------------+ | DATE_FORMAT('2010-01-01','%W %a %M %b') | +-----------------------------------------+ | vrijdag vr januari jan | +-----------------------------------------+ 1 row in set (0.00 sec)
# MySQL 8 服务器日志
MySQL 8 server 提供以下不同类型的日志,使用户能够在各种情况下跟踪服务器的活动:
| **日志类型** | **写入日志**的信息 |
| --- | --- |
| 错误日志 | 启动、运行或停止`mysqld`时遇到的问题 |
| 一般查询日志 | 已建立的客户端连接和从客户端收到的声明 |
| 二进制日志 | 更改数据的语句(也用于复制) |
| 中继日志 | 从复制主服务器接收到的数据更改 |
| 慢速查询日志 | 执行时间超过`long_query_time`秒的查询 |
| DDL 日志(元数据日志) | 由 DDL 语句执行的元数据操作 |
You can learn more about the different type of logs at [https://dev.mysql.com/doc/refman/8.0/en/server-logs.html](https://dev.mysql.com/doc/refman/8.0/en/server-logs.html).
MySQL 8 不会在 MySQL 8 中生成日志,除非我们启用它,否则 Windows 中的错误日志除外。默认情况下,MySQL 8 将所有日志存储到数据目录下的一个文件中。当我们谈论文件的时候,会有很多问题浮现在我们的脑海里,对吗?例如文件的大小是多少?将生成多少个文件?如何刷新日志文件?MySQL 8 提供了管理日志文件的各种配置;我们将在本章后面的部分中看到所有这些配置。另一个重要的问题是,我们在哪里存储日志?在表格中还是在文件中?以下是一些描述表格与文件相比的优势的要点:
* 如果日志存储在表中,那么可以通过 SQL 语句访问它们的内容。这意味着用户可以使用所需的条件执行 select 查询,以获得特定的输出。
* 任何远程用户都可以连接到数据库并获取日志的详细信息。
* 日志条目按标准格式管理。可以使用以下命令检查日志表的结构:
常规日志的代码:
```sql
SHOW CREATE TABLE mysql.general_log;
慢速查询日志的代码:
SHOW CREATE TABLE mysql.slow_log;
此日志用于记录从 MySQL 8 启动到结束期间发生的错误、警告和注释等诊断消息。MySQL 8 提供了各种配置和组件,供用户根据需要生成日志文件。当我们开始将一些基本问题写入文件时,我们会想到这些问题;我们写什么?我们怎么写呢?我们把它写在哪里?让我们从第一个问题开始。MySQL 8 使用log_error_verbosity
系统变量并分配以下过滤选项,以决定应将何种类型的消息写入错误日志文件:
Error Only
Errors and Warnings
Errors, Warnings and Notes
MySQL 在目的地写入时使用以下格式,其中时间戳取决于log_timestamps
系统变量:
timestamp thread_id [severity] message
在编写日志文件之后,首先想到的问题是,如何刷新这些日志?为此,MySQL 8 提供了三种方式;FLUSH ERROR LOGS
、FLUSH LOGS
或mysqladmin flush-logs
。这些命令将关闭并重新打开正在写入的日志文件。当我们谈论如何写作和在哪里写作时,有很多东西需要理解。
**# 组件配置
MySQL 8 使用log_error_services
系统变量控制错误日志组件。它允许用户用分号定义多个组件,并在执行时分开。在这里,组件将按照其定义的顺序执行。允许用户使用以下约束更改此变量的值:
INSTALL COMPONENT
:要启用任何日志组件,我们必须首先使用此命令安装它,然后通过在log_error_services
系统变量中列出它来使用该组件。按照以下命令添加log_sink_syseventlog
组件:
INSTALL COMPONENT 'file://component_log_sink_syseventlog';
SET GLOBAL log_error_services = 'log_filter_internal;
log_sink_syseventlog';
执行安装命令后,MySQL 8 会将组件注册到mysql.component
系统表中,以便在每次启动时加载。
UNINSTALL COMPONENT
:要禁用任何日志组件,请先将其从log_error_services
系统变量列表中删除,然后使用此命令将其卸载。执行以下命令卸载组件:
UNINSTALL COMPONENT 'file://component_log_sink_syseventlog';
要在每次启动时启用错误日志组件,请在my.cnf
文件中定义或使用SET_PERSIST
。当我们在my.cnf
中定义它时,它将从下一次重启开始生效,而SET_PERSIST
将立即生效。对SET_PERSIST
使用以下命令:
SET PERSIST log_error_services = 'log_filter_internal;
log_sink_internal;
log_sink_json';
MySQL 8 还允许用户将错误日志写入系统日志:对于微软,考虑事件日志,对于基于 UNIX 的系统,考虑 Syslog。要启用错误登录到系统logfibf
中,请配置log_filter_internal
和系统日志写入器log_sink_syseventlog
组件,并按照上述说明操作。另一种方法是将 JSON 字符串写入日志文件配置log_sink_json
组件。JSON 编写器的一个有趣之处是,它将通过添加 NN(两位数)来管理文件命名约定。例如,将文件名看作是 Ty4T4、{ To.T5}等等。
错误日志可以写入日志文件或控制台上。本节介绍如何在不同环境中配置错误日志的目标。
--console
:如果给出此选项,则控制台将被视为默认目的地。如果两者都有定义,则--console
优先于--log-error
。如果默认位置是 console,那么 MySQL 8 服务器将log_error
变量的值设置为stderror
。--log-error
:如果未给出,或未命名文件,则默认文件名为host_name.err
,除非指定了--pid-fileoption
,否则将在数据目录中创建文件。如果在–pid-file
选项中指定了文件名,则命名约定将是数据目录中后缀为.err
的PID文件基名称。
Microsoft Windows 中的所有上述场景将由 Unix 系统中的–log_error
选项管理。
--log-error
:如果未给出,则默认目的地为控制台。如果没有给出文件名,那么与 Windows 一样,它将在数据目录中创建一个名为host_name.err
的文件。允许用户在mysqld
或mysqld_safe
部分下的选项文件中指定–log-error
。
通用查询日志是一个通用日志,用于记录mysqld
执行的所有操作。在此日志中,文件语句按接收顺序写入,但执行顺序可能不同于接收顺序。它从客户端的连接开始记录日志,并一直持续到断开连接。除了 SQL 命令外,它还记录连接协议客户端的connection_type
方式,例如 TCP/IP、SSL、Socket 等。因为它记录了mysqld
执行的大部分操作,所以当我们想找出客户端发生了什么错误时,它非常有用。
默认情况下,此日志处于禁用状态。我们可以使用**--general_log[={0|1}]
**命令来启用它。如果不指定任何参数或将 1 定义为参数,则表示启用常规查询日志,而 0 表示禁用日志。另外,我们可以使用--general_log_file=file_name
命令指定日志文件名。如果命令没有指定文件名,那么 MySQL 8 将考虑默认名称为 OutT2。如果日志目标值不包含FILE
,则设置日志文件名对日志记录没有影响。服务器重启和日志刷新不会导致生成新的常规查询日志文件;您必须使用rename
(适用于 Microsoft Windows)或mv
(适用于 Linux)命令来创建新文件。MySQL 8 通过使用以下命令禁用日志,提供了在运行时重命名文件的第二种方法:
SET GLOBAL general_log = 'OFF';
禁用日志后,重命名日志文件并使用ON
选项再次启用日志。类似地,要在运行时为特定连接启用或禁用日志,请使用会话sql_log_off
变量和ON
或OFF
选项。还有一个选项与常规日志文件对齐,即--log-output
。通过使用此选项,可以指定日志输出的目的地;这并不意味着日志已启用。
此命令提供以下三个不同选项:
TABLE
:记录到表中FILE
:登录到文件NONE
:不要登录表或文件。NONE
(如果存在)优先于任何其他说明符。
如果省略了--log-output
选项,则默认值为 file。
二进制日志是一个文件,其中包含描述更改(例如,表创建、数据更新和从表中删除)的数据库的所有事件。它不用于SELECT
和SHOW
语句,因为它不更新任何数据。二进制日志写入将略微降低数据库操作的性能,但它允许用户使用复制设置和操作还原。二进制日志的主要用途是:
- 主从式复制:对于基于二进制文件的复制,主服务器执行插入和更新操作,这些操作反映在二进制日志文件中。现在,将从节点配置为读取这些二进制文件,并在从服务器的二进制文件中执行相同的事件,以将数据复制到从服务器上。
- 数据恢复操作:一旦备份恢复到数据库中,就会记录二进制日志的事件,这些事件以重新执行的形式出现,从而使数据库从备份点更新。
*默认情况下启用二进制日志,这表示 log_bin 系统变量设置为 ON。要禁用此日志,请在启动时使用--skip-log-bin
或--disable-log-bin
选项。要删除所有二进制日志文件,请使用 RESET MASTER 语句,或将其子集与PURGE BINARY LOGS
一起使用。MySQL 8 server 使用以下三种日志格式将信息记录到二进制日志文件中:
-
基于语句的日志记录:此格式用于通过
--binlog-format=STATEMENT
命令启动服务器。它主要是 SQL 语句的传播。 -
基于行的日志记录:在服务器启动时使用
--binlog-format=ROW
启用基于行的日志记录。此格式指示行如何受到影响。这是默认选项。 -
混合日志:使用
--binlog-format=MIXED
选项启动 MySQL 8,启用混合日志。在这种模式下,默认情况下可以使用基于语句的日志记录,在某些情况下,MySQL 8 将自动切换到基于行的日志记录。
MySQL 8 允许用户在运行时使用全局和会话范围更改格式。当会话用于单个客户端时,为所有客户端设置全局格式。以下内容分别使用全局范围和会话范围设置运行时的格式:
mysql> SET GLOBAL binlog_format = 'STATEMENT';
mysql> SET SESSION binlog_format = 'STATEMENT';
有两种例外情况下,我们无法更改格式:
- 在存储过程或函数中
- 在设置了基于行的格式并且打开了临时表的情况下
MySQL 8 具有--binlog-row-event-max-size
变量,以字节为单位控制二进制日志文件的大小。将 256 的倍数指定为该变量的值;此选项的默认值为 8192。MySQL 8 的各个存储引擎都有自己的日志记录功能。如果存储引擎支持基于行的日志记录,则称为支持行日志记录,如果存储引擎支持基于语句的日志记录,则称为支持语句日志记录。有关存储引擎日志记录功能的更多信息,请参阅下表。
| 存储引擎 | 支持行日志记录 | 支持语句日志记录 |
| ARCHIVE
| 对 | 对 |
| BLACKHOLE
| 对 | 对 |
| CSV
| 对 | 对 |
| EXAMPLE
| 对 | 不 |
| FEDERATED
| 对 | 对 |
| HEAP
| 对 | 对 |
| InnoDB
| 对 | 事务隔离级别为REPEATABLE
、READ
或SERIALIZABLE
时为是;没有别的。 |
| MyISAM
| 对 | 对 |
| MERGE
| 对 | 对 |
| NDB
| 对 | 不 |
如本节所述,二进制日志将基于安全、不安全或二进制注入等语句类型,以ROW
、STATEMENT
或MIXED
等记录格式工作,并具有存储引擎的记录功能,如行功能、语句功能或两者兼有。要了解二进制日志记录的所有可能情况,请参阅此链接中给出的表格:https://dev.mysql.com/doc/refman/8.0/en/binary-log-mixed.html 。
慢速查询日志用于记录执行时间较长的 SQL 语句。MySQL 8 为慢速查询的时间配置定义了以下两个系统变量:
long_query_time
:用于定义查询执行的理想时间。如果 SQL 语句花费的时间超过此时间,则会将其视为慢速查询,并将语句记录到日志文件中。默认值为 10 秒。min_examined_row_limit
:这是执行每个查询所需的最短时间。默认值为 0 秒。
MySQL 8 不会考虑将锁获取到执行时间的初始时间,并且一旦释放所有锁并完成查询执行,则将缓慢的查询日志返回到文件。MySQL 8 启动时,默认禁用慢速查询日志记录;要启动此日志,请使用slow_query_log[={0|1}]
命令,其中0
表示禁用了慢速查询日志,并使用 1 或不带参数来启用它。要记录管理语句和查询而不进行索引,请使用**log_slow_admin_statements
和log_queries_not_using_indexes
**变量。在此,管理声明包括ALTER TABLE
、ANALYZE TABLE
、CHECK TABLE
、CREATE INDEX
、DROP INDEX
、OPTIMIZE TABLE
和REPAIR TABLE
。MySQL 8 允许用户使用--slow_query_log_file=file_name
命令指定日志文件的名称。如果没有指定文件名,那么 MySQL 8 将在数据目录中创建一个具有host_name-slow.log
命名约定的文件。要将最少的信息写入此日志文件,请使用--log-short-format
选项。
上述所有参数由 MySQL 8 按以下顺序控制:
- 查询不能是管理语句,或者必须启用
log_slow_admin_statements
- 查询必须至少采用了
long_query_timeseconds
,或者必须启用log_queries_not_using_indexes
,并且查询必须没有使用任何索引进行行查找 - 查询必须至少检查了
min_examined_row_limitrows
- 根据
log_throttle_queries_not_using_indexes
设置,查询不能被抑制
The --log-output
option is also available for this log file, and has the same implementation and effect as the general purpose log.
顾名思义,此日志文件用于记录所有与 DDL 语句执行相关的详细信息。MySQL 8 使用此日志文件从元数据操作执行期间发生的崩溃中恢复。让我们举一个例子来了解场景:
- 删除表 t1、t2:我们必须确保 t1 和 t2 表都已删除
当我们执行任何 DDL 语句时,这些操作的记录被写入 MySQL 8 数据目录下的ddl_log.log
文件中。此文件是二进制文件,不是人类可读的格式。不允许用户更新此日志文件的内容。MySQL 服务器正常执行时不需要记录元数据语句;仅在需要时启用它。
为了维护日志文件,我们必须定期清理以管理磁盘空间。对于基于 RPM 的 Linux 系统,mysql-log-rotate
脚本自动可用。对于其他系统,没有这样的脚本可用,因此我们必须自己安装一个短脚本来管理日志文件。MySQL 8 提供expire_logs_days
系统变量,用于管理二进制日志文件。使用此变量,二进制日志文件将在指定时间段后自动删除。
此变量的默认值为 30 天;您可以通过配置更改来更改其值。在服务器启动时或刷新日志时删除二进制日志文件。在复制的情况下,您还可以使用binlog_expire_logs_seconds
系统变量来管理主服务器和从服务器的日志。日志刷新执行以下任务:
- 如果启用了日志文件的常规查询日志记录或慢速查询日志记录,服务器将关闭并重新打开查询日志文件
- 如果启用了二进制日志记录,服务器将关闭当前二进制日志文件,并打开一个带有下一个序列号的新日志文件
- 如果使用
--log-error
选项启动服务器以将错误日志写入文件,则服务器将关闭并重新打开日志文件
要在生成新日志文件之前备份或重命名旧日志文件,请在 Unix 系统中使用mv
(移动)命令,并在 Windows 中使用rename
功能。对于常规查询和慢速查询日志文件,可以通过使用以下命令禁用日志来重命名文件:
SET GLOBAL general_log = 'OFF';
重命名日志文件后,使用以下命令启用日志:
SET GLOBAL general_log = 'ON';
对于任何 MySQL 8 用户来说,这是一个有趣的章节,不是吗?在这一章中,我们了解了 MySQL 8 如何管理不同的日志文件以及在什么时候使用哪个日志文件。同时,我们还介绍了许多管理特性,如全球化、系统数据数据库、组件和插件配置,并解释了如何在一台机器上运行多个实例。本章后面部分介绍了日志维护。
继续下一章,我们将向您提供有关存储引擎的信息,例如不同类型的存储引擎是什么,应用程序使用哪种类型,以及如何为 MySQL 8 创建我们自己的自定义存储引擎。*******************************