5.1 Mysql 服务器

参考官方文档:

https://dev.mysql.com/doc/refman/5.7/en/mysqld-server.html

MySQL服务器(mysqld)是执行MySQL安装中大部分工作的主要程序。 本章概述了MySQL服务器并涵盖了一般服务器管理:

  • 服务器支持的启动选项。 您可以在命令行上,通过配置文件或两者都指定这些选项。
  • 服务器系统变量。 这些变量反映了启动选项的当前状态和值,其中一些可以在服务器运行时修改。
  • 服务器状态变量。 这些变量包含运行时操作的计数器和统计信息
  • 如何设置服务器SQL模式。 此设置修改SQL语法和语义的某些方面,例如与其他数据库系统的代码兼容,或者控制特定情况下的错误处理。
  • 配置和使用IPv6支持。
  • 配置和使用时区支持。
  • 服务器端帮助功能。
  • 服务器关机过程。 根据表的类型(事务性或非事务性)以及是否使用复制,存在性能和可靠性方面的考虑。

注意:

并非所有的MySQL服务器二进制文件和配置都支持所有的存储引擎。 要了解如何确定MySQL服务器安装支持哪些存储引擎,请参见第13.7.5.16节“SHOW ENGINES语法”。

5.1.1 配置服务器

MySQL服务器mysqld具有许多命令选项和系统变量,可以在启动时设置它们以配置其操作。 要确定服务器使用的命令选项和系统变量值,请执行以下命令:

shell> mysqld –verbose –help

该命令会生成所有mysqld选项和可配置系统变量的列表。 它的输出包含默认选项和变量值。

要查看服务器运行时使用的当前系统变量值,请连接到它并执行以下语句:

mysql> SHOW VARIABLES;

要查看正在运行的服务器的一些统计和状态指示器,请执行以下语句:

mysql> SHOW STATUS;

系统变量和状态信息也可以通过mysqladmin命令获得:

shell> mysqladmin variables

shell> mysqladmin extended-status

MySQL使用非常具有伸缩性的算法,因此通常可以使用很少的内存运行。 但是,通常给MySQL提供更多的内存会带来更好的性能。

调整MySQL服务器时,要配置的两个最重要的变量是key_buffer_size和table_open_cache。 在尝试更改任何其他变量之前,您应该先确信自己已经设置了这些设置。

以下示例显示了不同运行时配置的一些典型变量值。

  • 如果你有至少1-2GB的内存和许多表,并希望用中等数量的客户端获得最大性能,请使用如下所示的内容:

shell> mysqld_safe –key_buffer_size=384M –table_open_cache=4000 \ –sort_buffer_size=4M –read_buffer_size=1M &

  • 如果你只有256MB的内存和只有几张表,但你仍然做了很多的排序,你可以使用这样的:

shell> mysqld_safe –key_buffer_size=64M –sort_buffer_size=1M

如果您在命令行上为mysqld或mysqld_safe指定了一个选项,则它仅在调用该服务器时才有效。 要在每次运行服务器时使用该选项,请将其放入选项文件中。

5.1.2 服务器配置默认值

MySQL服务器有许多操作参数,您可以在服务器启动时使用命令行选项或配置文件(选项文件)更改这些参数。 在运行时也可以更改许多参数。

在MySQL 5.7.5之前,在Unix平台上,mysql_install_db在基本安装目录中创建一个名为my.cnf的默认选项文件。 该文件是通过包含在名为my-default.cnf的分发包中的模板创建的。您可以在基本安装目录中或下面找到该模板。当开始使用mysqld_safe时,服务器默认使用my.cnf文件。 如果my.cnf已经存在,那么mysql_install_db会假定它正在使用中,并写入一个名为my-new.cnf的新文件。

有一个例外,默认选项文件中的设置会被注释并且不起作用。 例外情况是该文件将sql_mode系统变量设置为NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES。该设置会生成服务器配置,导致错误而不是警告 在修改事务表的操作中的错误数据出现时。

在Windows上,MySQL安装程序在用户交互的情况下,在基本安装目录中创建名为my.ini的文件作为默认选项文件。 如果您在Windows上从Zip存档安装,则可以将基本安装目录中的my-default.ini模板文件复制到my.ini,并将后者用作默认选项文件。

注意:

从MySQL 5.7.18开始,my-default.ini不再包含在发行包中或由发行包安装。

在Windows中,.ini或.cnf选项文件扩展名可能不会显示。

完成安装过程后,您可以随时编辑默认选项文件以修改服务器使用的参数。 例如,要在文件中使用行首的#字符注释的参数设置,请删除#,并在必要时修改参数值。 要禁用设置,请将#添加到行的开头或将其移除。

5.1.3 服务器选项和变量引用

下表提供了mysqld中可用的所有命令行选项,服务器和状态变量的列表。

该表在一个统一列表中列出了命令行选项(Cmd-line),配置文件(选项文件),服务器系统变量(System Var)和状态变量(Status var)中有效的选项,并通知每个选项/ 变量是有效的。 如果在命令行或选项文件中设置的服务器选项与相应服务器系统或状态变量的名称不同,则会在相应选项的下方标记变量名称。 对于状态变量,变量的范围显示为(范围)为全局,会话或两者。 有关设置和使用选项和变量的详细信息,请参阅相应部分。 在适当的情况下,可直接链接该项目的更多信息。

详细参考:

https://dev.mysql.com/doc/refman/5.7/en/mysqld-option-tables.html

注意:

此选项是动态的,则只有服务器应设置此信息。 你不应该手动设置这个变量的值。

5.1.6 使用系统变量

每个系统变量都有一个默认值。 可以在服务器启动时使用命令行上的选项或选项文件来设置系统变量。 它们中的大多数都可以在服务器通过SET语句运行时动态更改,这使您可以修改服务器的操作而不必停止并重新启动服务器。 您也可以在表达式中使用系统变量值。

有两个系统变量存在的范围。 全局变量影响服务器的整体操作。 会话变量影响其对各个客户端连接的操作。 给定的系统变量可以同时具有全局值和会话值。 全局和会话系统变量如下所示:

  • 当服务器启动时,它将每个全局变量初始化为其默认值。 这些默认值可以通过在命令行或选项文件中指定的选项来更改。
  • 服务器还为每个连接的客户端维护一组会话变量。 客户端的会话变量在连接时使用相应全局变量的当前值进行初始化。 例如,客户端的SQL模式由会话sql_mode值控制,该值在客户端连接到全局sql_mode值的值时被初始化。

对于某些系统变量,会话值不是从相应的全局值初始化的; 如果是这样,则在变量描述中指出。

参数值可以使用 标准的k,m,G来作为大小单位,例如:

mysqld –innodb_log_file_size=16M –max_allowed_packet=1G

后缀字母的大小无关紧要; 16M和16m,1G和1g相当。

要限制可以在运行时使用SET语句设置系统变量的最大值,请在服务器启动时使用形式为–maximum-var_name = value的选项来指定此最大值。 例如,要防止innodb_log_file_size的值在运行时增加到超过32MB,请使用–maximum-innodb_log_file_size = 32M选项。

要用SET更改系统变量,请按名称引用它,可选地在前面加上一个修饰符:

  • 要表明变量是全局变量,可以在名称前加上GLOBAL关键字或者 @@global.标识符:

SET GLOBAL max_connections = 1000;

SET @@global.max_connections = 1000;

SUPER权限是设置全局变量所必需的。

  • 要指示变量是会话变量,可以在名称前加上session关键字或者 @@session. 或 @@ 标识符:

SET SESSION sql_mode = ‘TRADITIONAL’;

SET @@session.sql_mode = ‘TRADITIONAL’;

SET @@sql_mode = ‘TRADITIONAL’;

设置会话变量一般不需要特殊权限,但是有例外需要SUPER权限(例如sql_log_bin)。 客户端可以更改自己的会话变量,但不能更改其他客户端的会话变量。

  • LOCAL 和@@local. 是session 和@@session.的同义词
  • 在这些情况下发生错误:
    • 设置仅具有会话值的变量时使用SET GLOBAL(或@@ global.):

mysql> SET GLOBAL sql_log_bin = ON; ERROR 1231 (42000): Variable ‘sql_log_bin’ can’t be set to the value of ‘ON’

  • 设置仅具有全局值的变量时省略GLOBAL(或@@ global.):

mysql> SET max_connections = 1000; ERROR 1229 (HY000): Variable ‘max_connections’ is a GLOBAL variable and should be set with SET GLOBAL

  • 当变量只有全局值时,使用 SET SESSION (或@@SESSION.)

mysql> SET SESSION max_connections = 1000; ERROR 1229 (HY000): Variable ‘max_connections’ is a GLOBAL variable and should be set with SET GLOBAL

前面的修饰符只适用于系统变量。 尝试将它们应用于用户定义的变量,存储过程或函数参数或存储的程序局部变量时发生错误。

SET语句可以包含多个变量赋值,用逗号分隔。 该语句将值分配给用户定义的变量和系统变量:

SET @x = 1, SESSION sql_mode = ”;

如果您设置了多个系统变量,则语句中最新的GLOBAL或SESSION修饰符将用于未指定修饰符的后续赋值。

多变量赋值的例子:

SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;

SET @@global.sort_buffer_size = 1000000, @@local.sort_buffer_size = 1000000;

SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;

如果SET语句中的任何变量赋值失败,则整个语句将失败并且不会更改任何变量。

如果更改了会话系统变量,则该值将在会话中保持有效,直到您将变量更改为不同的值或会话结束。 该更改对其他会话没有影响。

如果更改全局系统变量,则会将该值记住并用于新会话,直到将变量更改为其他值或服务器退出。 任何访问全局变量的客户端都可以看到该更改。 但是,更改仅影响更改后连接的客户端的相应会话变量。 全局变量更改不影响任何当前客户端会话的会话变量(甚至不会影响SET GLOBAL语句发生的会话)。

要使全局系统变量设置为永久性的,以便它适用于跨服务器重新启动,则还应将其设置为选项文件。

要将GLOBAL值设置为已编译的MySQL默认值或将SESSION变量设置为当前对应的GLOBAL值,该变量设置为DEFAULT值。 例如,以下两个语句在将max_join_size的会话值设置为当前全局值时是相同的:

SET @@session.max_join_size=DEFAULT;

SET @@session.max_join_size=@@global.max_join_size;

并非所有系统变量都可以设置为DEFAULT。 在这种情况下,分配 DEFAULT将出现错误。

尝试将DEFAULT分配给用户定义的变量,存储过程或函数参数或存储的程序局部变量时发生错误。

要在表达式中引用系统变量的值,请使用@@- 修饰符之一。 例如,您可以像这样在SELECT语句中检索值:

SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;

在表达式中以@@ var_name(而不是@@ global。或@@ session)引用系统变量,MySQL会返回会话值(如果存在),否则返回全局值。 这与SET @@ var_name = expr不同,后者始终引用会话值。

在服务器启动时设置变量时,可以使用用于指定值乘数的后缀,但不能在运行时使用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或1来启用,或通过将其设置为OFF或0来禁用某些系统变量。但是,要在命令行或选项文件中设置此类变量,必须将其设置为 1或0; 将其设置为ON或OFF将不起作用。 例如,在命令行上,–delay_key_write = 1有效,但–delay_key_write = ON无效。

对于SHOW VARIABLES,如果您既不指定GLOBAL也不指定SESSION,则MySQL会返回SESSION值。

在设置仅GLOBAL变量时要求使用GLOBAL关键字而不是在检索它们时的原因是为了防止将来出现问题:

  • 如果我们要删除一个与GLOBAL变量名称相同的SESSION变量,具有SUPER特权的客户端可能会意外地更改GLOBAL变量,而不仅仅是它自己的连接的SESSION变量。
  • 如果我们要添加一个名称与GLOBAL变量相同的SESSION变量,那么打算更改GLOBAL变量的客户端可能只会找到自己的SESSION变量。

5.1.6.1 系统变量结构

结构化变量在两个方面与常规系统变量不同:

  • 它的值是一个包含组件的结构,这些组件指定被认为密切相关的服务器参数。
  • 可能有几个给定类型的结构化变量的实例。 每个都有不同的名称,并且指的是由服务器维护的不同资源。

MySQL支持一种结构化变量类型,它指定了控制键缓存操作的参数。 密钥缓存结构化变量具有以下组件:

本节介绍用于引用结构变量的语法。 密钥缓存变量用于语法示例,但关于密钥缓存如何操作的具体细节可在别处找到, Section 8.10.2, “The MyISAM Key Cache”.

要引用结构化变量实例的组件,可以使用instance_name.component_name格式的化合物名称。 例如:

hot_cache.key_buffer_size

hot_cache.key_cache_block_size

cold_cache.key_cache_block_size

对于每个结构化系统变量,名称为default的实例始终是预定义的。 如果您引用不带任何实例名称的结构化变量的组件,则使用默认实例。 因此,default.key_buffer_size和key_buffer_size都指向相同的系统变量。

结构化变量实例和组件遵循以下命名规则:

  • 对于给定类型的结构化变量,每个实例必须具有在该类型的变量中唯一的名称。 但是,实例名称在结构变量类型中不必是唯一的。 例如,每个结构化变量都有一个名为default的实例,所以default在变量类型中不是唯一的。
  • 每个结构化变量类型的组件名称在所有系统变量名称中必须是唯一的。 如果这不是真的(即,如果两种不同类型的结构变量可以共享组件成员名称),那么将不清楚哪个默认结构变量用于引用不受实例名称限定的成员名称。
  • 如果结构化变量实例名称作为不加引号的标识符不合法,请使用反引号将其引用为带引号的标识符。 例如,热缓存不合法,但是 `hot-cache`合法。
  • global, session, 和 local 不是合法的实例名称。 这可以避免与用于引用非结构化系统变量的@@ global.var_name等符号冲突。

目前,前两条规则不可能被违反,因为唯一的结构化变量类型是用于键缓存的。 如果将来会创建一些其他类型的结构化变量,这些规则将具有更大的意义

您可以在任何可能出现简单变量名称的上下文中使用复合名称来引用结构化变量组件。 例如,您可以使用命令行选项将值分配给结构化变量:

shell> mysqld –hot_cache.key_buffer_size=64K

在选项文件中,使用下列语法:

[mysqld]

hot_cache.key_buffer_size=64K

如果使用此选项启动服务器,则除默认大小为8MB的缺省键缓存外,还会创建名为hot_cache的键缓存,大小为64KB。

假设您按如下方式启动服务器:

shell> 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比例的key缓存启动服务器:

shell> 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’;

这是能够在任何可能发生简单变量名的地方使用结构化变量名的例外。

5.1.6.2 动态系统变量

许多服务器系统变量都是动态的,可以在运行时使用SET GLOBAL或SET SESSION进行设置。 您还可以使用SELECT获取它们的值。

下表显示了所有动态系统变量的完整列表。 最后一列表示每个变量是否应用GLOBAL或SESSION(或两者)。 该表还列出了可以使用SET语句设置的会话选项。

具有“字符串”类型的变量需要一个字符串值。 具有“数字”类型的变量需要一个数字值。 具有“布尔型”类型的变量可以设置为0,1,ON或OFF。 通常应将标记为“枚举”的变量设置为变量的可用值之一,但也可将其设置为与所需枚举值相对应的编号。 对于枚举系统变量,第一个枚举值对应于0.这与ENUM列不同,第一个枚举值对应于1。

–详细请参考:https://dev.mysql.com/doc/refman/5.7/en/dynamic-system-variables.html

5.1.7 服务器状态变量

MySQL服务器维护许多状态变量,提供有关其操作的信息。 您可以使用SHOW [GLOBAL |。查看这些变量及其值 SESSION] STATUS语句(请参见第13.7.5.35节“SHOW STATUS语法”)。 可选的GLOBAL关键字聚合所有连接的值,SESSION显示当前连接的值。

mysql> SHOW GLOBAL STATUS;

几个状态变量提供语句计数。 要确定执行的语句数量,请使用以下关系:

SUM(Com_xxx) + Qcache_hits

= Questions + statements executed within stored programs

= Queries

FLUSH STATUS语句将许多状态变量重置为0。

下表列出了所有可用的服务器状态变量:

参考:https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html

5.1.8 服务器 SQL 模式

MySQL服务器可以在不同的SQL模式下运行,并且可以根据sql_mode系统变量的值对不同的客户端应用这些模式。 DBA可以设置全局SQL模式以匹配站点服务器操作要求,并且每个应用程序可以将其会话SQL模式设置为自己的要求。

模式会影响MySQL支持的SQL语法以及它执行的数据验证检查。 这使得在不同的环境中使用MySQL更容易,并且可以将MySQL与其他数据库服务器一起使用。

在使用InnoDB表时,请考虑innodb_strict_mode系统变量。 它为InnoDB表启用额外的错误检查。

设置SQL mode

MySQL 5.7中的默认SQL模式包括以下模式: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。

这些模式已添加到MySQL 5.7中的默认SQL模式中:在MySQL 5.7.5中添加了ONLY_FULL_GROUP_BY和STRICT_TRANS_TABLES模式。 MySQL 5.7.7中添加了NO_AUTO_CREATE_USER模式。 在MySQL 5.7.8中添加了ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE模式。

要在服务器启动时设置SQL模式,请在命令行上使用–sql-mode =”modes”选项,或者在my.cnf(Unix操作系统)等选项文件中使用sql-mode =”modes” (.my.ini(Windows) )。 模式是用逗号分隔的不同模式的列表。 要明确清除SQL模式,请在命令行中使用–sql-mode =”” 或选项文件中的sql-mode =”” 将其设置为空字符串。

注意:

MySQL安装程序可能会在安装过程中配置SQL模式。 例如,mysql_install_db在基本安装目录中创建名为my.cnf的默认选项文件。 该文件包含设置SQL模式的行。

如果SQL模式与默认或预期不同,请检查服务器在启动时读取的选项文件中的设置。

要在运行时更改SQL模式,请使用SET语句设置全局或会话sql_mode系统变量:

SET GLOBAL sql_mode = ‘modes‘;

SET SESSION sql_mode = ‘modes‘;

设置GLOBAL变量需要SUPER权限,并影响从此时开始连接的所有客户端的操作。 设置SESSION变量仅影响当前客户端。 每个客户端可以随时更改其会话sql_mode值。

要确定当前的全局或会话sql_mode值,请使用以下语句:

SELECT @@GLOBAL.sql_mode;

SELECT @@SESSION.sql_mode;

重要:

SQL模式和用户定义的分区。

创建数据并将其插入分区表后,更改服务器SQL模式可能会导致此类表的行为发生重大变化,并可能导致数据丢失或损坏。 强烈建议您一旦创建了使用用户定义分区的表格,就不要更改SQL模式。

在复制分区表时,主站和从站上不同的SQL模式也会导致问题。 为了获得最佳结果,您应始终在主服务器和从服务器上使用相同的服务器SQL模式。

比较重要的SQL 模式

最重要的sql_mode值可能是这些:

  • ANSI

此模式更改语法和行为以更贴近地符合标准SQL。 它是本节末尾列出的特殊组合模式之一。

如果无法将某个值插入到事务表中,中止该语句。 对于非事务性表,如果该值出现在单行语句或多行语句的第一行中,则放弃该语句。 更多细节在本节后面给出。

从MySQL 5.7.5开始,默认的SQL模式包括STRICT_TRANS_TABLES。

让MySQL像“传统”SQL数据库系统一样行事。 在将不正确的值插入列时,此模式的简单描述是“给出错误而不是警告”。 它是本节末尾列出的特殊组合模式之一。

注意:

只要发现错误,INSERT或UPDATE就会立即中止。 如果您使用的是非事务性存储引擎,则这可能不是您想要的,因为在错误之前进行的数据更改可能无法回滚,从而导致“部分完成”更新。

当说道引用“ strict mode”时,它表示启用了STRICT_TRANS_TABLES或STRICT_ALL_TABLES中的一种或两种模式。

SQL模式的完整列表

以下列表描述了所有支持的SQL模式:

不要执行完整的日期检查。 只检查月份是在1到12的范围内,天是在1到31的范围内。对于web应用程序包含年,月,日三种不同字段并且你想精确的存储用户插入的(不进行日期验证),是非常便利的。 此模式适用于DATE和DATETIME列。 它不应用始终需要有效日期的TIMESTAMP列。

服务器要求月份和日期值合法,而不仅分别在1到12和1到31的范围内。 禁用严格模式后,无效日期(如“2004-04-31”)将转换为“0000-00-00”,并生成警告。 启用严格模式后,无效日期会生成错误。 要允许这种日期,请启用ALLOW_INVALID_DATES。

将”作为标识符引用字符(像`字符)而不是字符串引号字符,您仍然可以使用`为此模式的标识符。启用ANSI_QUOTES后,不能使用双引号标记文字字符串, 因为它被解释为一个标识符。

ERROR_FOR_DIVISION_BY_ZERO模式影响除零的处理,其中包括MOD(N,0)。 对于数据更改操作(INSERT,UPDATE),其效果也取决于 strict SQL模式是否启用。

  • 如果此模式未启用,除零将插入NULL并不会产生警告。
  • 如果启用此模式,除零将插入NULL并产生警告。
  • 如果启用此模式和严格模式,则除以零除会产生错误,除非给出IGNORE。 对于INSERT IGNORE和UPDATE IGNORE,除以零将插入NULL并产生警告。

对于SELECT,除以零将返回NULL。 无论是否启用严格模式,启用ERROR_FOR_DIVISION_BY_ZERO都会导致产生警告。

从MySQL 5.7.4开始,不推荐使用ERROR_FOR_DIVISION_BY_ZERO。 在MySQL 5.7.4到5.7.7中,当明确命名时,ERROR_FOR_DIVISION_BY_ZERO不执行任何操作。 相反,其效果包含在严格SQL模式的影响中。 在MySQL 5.7.8及更高版本中,ERROR_FOR_DIVISION_BY_ZERO在明确命名时确实有效,而不是像MySQL 5.7.4之前的严格模式的一部分。 但是,它应该与严格模式一起使用,并且默认情况下处于启用状态。 如果启用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); ERROR 1064 (42000): You have an error in your SQL syntax

IGNORE_SPACE SQL模式适用于内置函数,而不适用于用户定义函数或存储函数。 无论是否启用IGNORE_SPACE,始终允许在UDF或存储的函数名称后面有空格。

防止GRANT语句自动创建新的用户帐户,除非指定了认证信息。 该语句必须使用IDENTIFIED BY或使用IDENTIFIED WITH的身份验证插件指定非空密码。

最好使用CREATE USER而不是GRANT创建MySQL帐户。 不建议使用NO_AUTO_CREATE_USER,默认的SQL模式包括NO_AUTO_CREATE_USER。 改变NO_AUTO_CREATE_USER模式状态的赋值给sql_mode会产生一个警告,除了将sql_mode设置为DEFAULT的赋值之外。 NO_AUTO_CREATE_USER将在未来的MySQL版本中被删除,此时它的效果将始终启用(GRANT不会创建帐户)。

NO_AUTO_VALUE_ON_ZERO影响AUTO_INCREMENT列的处理。 通常,通过向其中插入NULL或0来为列生成下一个序列号。 NO_AUTO_VALUE_ON_ZERO将抑制0的行为,以便只有NULL才会生成下一个序列号。

如果已将0存储在表的AUTO_INCREMENT列中,则此模式非常有用。 (顺便说一句,存储0不是推荐的做法。)例如,如果您使用mysqldump转储表并重新加载它,MySQL通常会在遇到0值时生成新的序列号,从而导致内容不同于 被dump的。 重新加载转储文件之前启用NO_AUTO_VALUE_ON_ZERO可解决此问题。 mysqldump现在会在其输出中自动包含一个使NO_AUTO_VALUE_ON_ZERO启用的语句,以避免此问题。

禁用反斜杠字符(\)作为字符串内的转义字符。 启用此模式后,反斜杠将变成与其他任何其他类似的普通字符。

创建表格时,忽略所有的INDEX DIRECTORY和DATA DIRECTORY指令。 该选项在从属复制服务器上很有用。

当语句(如CREATE TABLE或ALTER TABLE)指定禁用或未编译的存储引擎时,控制默认存储引擎的自动替换。

默认的SQL模式包括NO_ENGINE_SUBSTITUTION。

由于存储引擎在运行时可以插入,因此不可用的引擎也会以同样的方式处理:

在禁用NO_ENGINE_SUBSTITUTION的情况下,对于CREATE TABLE,将使用默认引擎,如果所需引擎不可用,则会发生警告。 对于ALTER TABLE,发生警告并且表不会被更改。

如果启用NO_ENGINE_SUBSTITUTION,如果所需的引擎不可用,则不会创建或更改该表,并发生错误。

不在SHOW CREATE TABLE的输出中打印MySQL特定的列选项。 这种模式在可移植性模式下由mysqldump使用。

注意:

从MySQL 5.7.22开始,不推荐使用NO_FIELD_OPTIONS。 它将在未来版本的MySQL中被删除。

不在SHOW CREATE TABLE的输出中打印MySQL特定的索引选项。 这种模式在可移植性模式下由mysqldump使用。

注意:

从MySQL 5.7.22开始,不推荐使用NO_KEY_OPTIONS。 它将在未来版本的MySQL中被删除。

不在SHOW CREATE TABLE的输出中打印MySQL特定的表选项(如ENGINE)。 这种模式在可移植性模式下由mysqldump使用。

注意:

从MySQL 5.7.22开始,不建议使用NO_TABLE_OPTIONS。 它将在未来版本的MySQL中被删除

  • NO_UNSIGNED_SUBTRACTION

整数值之间的减法,其中一个是UNSIGNED类型,默认情况下会生成无符号结果。 如果结果为负数,则会出现错误:

mysql> SET sql_mode = ”;

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) – 1; ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in ‘(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被启用时,即使任何操作数是无符号的,减法结果也是有符号的。 例如,将表t1中的列c2的类型与表t2中的列c2的类型进行比较:

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; +——-+———————+——+—–+———+——-+ | Field | Type | Null | Key | Default | Extra | +——-+———————+——+—–+———+——-+ | c2 | bigint(21) unsigned | NO | | 0 | | +——-+———————+——+—–+———+——-+ mysql> SET sql_mode=’NO_UNSIGNED_SUBTRACTION’;

mysql> CREATE TABLE t2 SELECT c1 – 1 AS c2 FROM test;

mysql> DESCRIBE t2; +——-+————+——+—–+———+——-+ | Field | Type | Null | Key | Default | Extra | +——-+————+——+—–+———+——-+ | c2 | bigint(21) | NO | | 0 | | +——-+————+——+—–+———+——-+

这意味着BIGINT UNSIGNED在所有情况下都不是100%可用。

NO_ZERO_DATE模式会影响服务器是否允许“0000-00-00”作为有效日期。 其效果也取决于是否启用严格的SQL模式。

  • 如果这个模式没被启用, ‘0000-00-00’ 被允许 并且 插入过程没有警告
  • 如果这个模式 被启用, ‘0000-00-00’ 被允许并且插入产生一个警告
  • 如果启用此模式和严格模式,则不允许使用’0000-00-00’,插入会产生错误,除非给出IGNORE。 对于INSERT IGNORE和UPDATE IGNORE,允许使用’0000-00-00’,插入会产生警告。

从MySQL 5.7.4开始,不推荐使用NO_ZERO_DATE。 在MySQL 5.7.4到5.7.7中,如果明确命名,NO_ZERO_DATE将不执行任何操作。 相反,其效果包含在严格SQL模式的影响中。 在MySQL 5.7.8及更高版本中,NO_ZERO_DATE在显式命名时不会产生影响,并且不是严格模式的一部分,就像在MySQL 5.7.4之前一样。 但是,它应该与严格模式一起使用,并且默认情况下处于启用状态。 如果NO_ZERO_DATE未启用严格模式,则发生警告,反之亦然。

由于NO_ZERO_DATE已被弃用,它将在未来的MySQL版本中作为单独的模式名称被删除,其影响包含在严格SQL模式的影响中。

拒绝对选择列表,HAVING条件或ORDER BY列表引用,既未在GROUP BY子句中命名也未在功能上依赖(由GROUP BY列唯一确定)列的非聚合列的查询。

从MySQL 5.7.5开始,默认的SQL模式包括ONLY_FULL_GROUP_BY。 (在5.7.5之前,MySQL没有检测到函数依赖,并且ONLY_FULL_GROUP_BY默认情况下未启用。

对标准SQL的MySQL扩展允许在HAVING子句中引用选择列表中的别名表达式。 在MySQL 5.7.5之前,启用ONLY_FULL_GROUP_BY会禁用此扩展,因此需要使用非混淆表达式来写入HAVING子句。 从MySQL 5.7.5开始,解除了此限制,以便HAVING子句可以引用别名,而不管是否启用ONLY_FULL_GROUP_BY。

默认情况下,尾部空格在检索时从CHAR列值中删除。 如果启用PAD_CHAR_TO_FULL_LENGTH,则不会发生修剪,并将检索的CHAR值填充到其全长。 该模式不适用于VARCHAR列,在检索时保留了尾部空格。

复合 SQL 模式

提供以下特殊模式作为上述列表中模式值组合的简写。

  • ANSI

相当于REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE和(自MySQL 5.7.5开始)ONLY_FULL_GROUP_BY。

ANSI模式还会导致服务器返回一个查询错误,其中具有外部引用S(outer_ref)的集合函数S无法在已解析外部引用的外部查询中聚合。 这是一个这样的查询:

SELECT * FROM t1 WHERE t1.a IN (SELECT MAX(t1.b) FROM t2 WHERE …);

这里,MAX(t1.b)不能在外部查询中聚合,因为它出现在该查询的WHERE子句中。 标准SQL在这种情况下需要一个错误。 如果ANSI模式未启用,则服务器将以与解释S( const)相同的方式在此类查询中处理S(outer_ref)。

  • DB2

相当于PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS。

注意:

从MySQL 5.7.22开始,DB2已被弃用。 它将在未来版本的MySQL中被删除。

  • MAXDB

相当于PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER。

注意:

从MySQL 5.7.22开始,不建议使用MAXDB。 它将在未来版本的MySQL中被删除。

  • MSSQL

相当于PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS。

注意:

从MySQL 5.7.22开始,MSSQL已被弃用。 它将在未来版本的MySQL中被删除。

相当于MYSQL323,HIGH_NOT_PRECEDENCE。 这意味着HIGH_NOT_PRECEDENCE加上一些特定于MYSQL323的SHOW CREATE TABLE行为:

  • TIMESTAMP列显示不包括MySQL 4.1中引入的DEFAULT或ON UPDATE属性。
  • 字符串列显示不包括MySQL 4.1中引入的字符集和归类属性。 对于CHAR和VARCHAR列,如果排序规则是二进制的,则将BINARY附加到列类型。
  • ENGINE = engine_name表选项显示为TYPE = engine +name。
  • 对于MEMORY表,存储引擎显示为HEAP。

相当于MYSQL40,HIGH_NOT_PRECEDENCE。 这意味着HIGH_NOT_PRECEDENCE加上一些特定于MYSQL40的行为。 除了SHOW CREATE TABLE不显示HEAP作为MEMORY表的存储引擎外,它们与MYSQL323相同。

注意:

从MySQL 5.7.22开始,MYSQL40已被弃用。 它将在未来版本的MySQL中被删除。

  • ORACLE

相当于PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER。

注意:

从MySQL 5.7.22开始,不推荐使用ORACLE。 它将在未来版本的MySQL中被删除。

相当于PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS。

注意:

从MySQL 5.7.22开始,不推荐使用POSTGRESQL。 它将在未来版本的MySQL中被删除。

在MySQL 5.7.4和MySQL 5.7.8及更高版本之前,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 5.7.4到5.7.7,TRADITIONAL等同于STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_AUTO_CREATE_USER和NO_ENGINE_SUBSTITUTION。 NO_ZERO_IN_DATE,NO_ZERO_DATE和ERROR_FOR_DIVISION_BY_ZERO模式未命名,因为在这些版本中,它们的效果包含在严格SQL模式(STRICT_ALL_TABLES或STRICT_TRANS_TABLES)的效果中。 因此,TRADITIONAL的效果在所有MySQL 5.7版本中都是相同的(和MySQL 5.6中的相同)。

严格sql 模式

严格模式控制MySQL在数据更改语句(如INSERT或UPDATE)中处理无效或缺失值的方式。 由于多种原因,值可能无效。 例如,它可能具有该列的错误数据类型,或者它可能超出范围。 当要插入的新行不包含非NULL列的值时,缺少其定义中没有显式DEFAULT子句的值。 (对于NULL列,如果值缺失,则插入NULL。)严格模式还会影响DDL语句,如CREATE TABLE。

如果严格模式没有生效,MySQL会为无效值或缺失值插入调整值并产生警告。在严格模式下,您可以使用INSERT IGNORE或UPDATE IGNORE来产生此行为。

对于不改变数据的SELECT等语句,无效值会在严格模式下生成警告,而不是错误。

对于尝试创建超过最大密钥长度的密钥的严格模式会产生错误。 如果严格模式未启用,则会导致警告并将密钥截断为最大密钥长度。

严格模式不影响是否检查外键约束。 foreign_key_checks可以用于此。

如果启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES,则严格SQL模式有效,但这些模式的效果有所不同:

  • 对于事务表,当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES时,数据更改语句中的无效值或缺失值会发生错误。 该声明被中止并回滚。
  • 对于非事务性表,如果在要插入或更新的第一行中出现错误值,那么对于任一模式的行为都是相同的:语句被中止并且表保持不变。 如果语句插入或修改多行,并且第二行或更后一行中出现错误值,则结果取决于启用了哪个严格模式:
    • 对于STRICT_ALL_TABLES,MySQL返回一个错误并忽略其余的行。 但是,因为较早的行已被插入或更新,所以结果是部分更新。 为避免这种情况,请使用单行语句,该语句可以在不更改表格的情况下中止。
    • 对于STRICT_TRANS_TABLES,MySQL将无效值转换为列的最接近的有效值并插入调整后的值。 如果缺少一个值,MySQL将插入列数据类型的隐式默认值。 无论哪种情况,MySQL都会生成警告而不是错误,并继续处理该语句。

严格模式会影响日期中除零,零日期和零的处理。

在MySQL 5.7.4之前以及MySQL 5.7.8和更高版本中,严格模式会影响日期中除零,零日期和零的处理以及ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE模式。 从MySQL 5.7.4到5.7.7,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE模式在显式命名时不起任何作用,它们的效果包含在严格模式的效果中

5.1.10 MySQL 服务器 时区支持

MySQL服务器维护几个时区设置:

  • 系统时区。 当服务器启动时,它会尝试确定主机的时区,并使用它来设置system_time_zone系统变量。 该值此后不会改变。

您可以在启动时使用–timezone =timezone_name选项为mysqld_safe设置MySQL服务器的系统时区。 您也可以在启动mysqld之前设置TZ环境变量来设置它。 –timezone或TZ的许可值取决于系统。 请查阅您的操作系统文档以查看可接受的值。

  • 服务器的当前时区。 全局time_zone系统变量表示服务器当前正在运行的时区.time_zone的初始值为’SYSTEM’,表示服务器时区与系统时区相同。

注意:

如果设置为SYSTEM,则每个需要时区计算的MySQL函数调用都会调用系统库来确定当前系统时区。 此调用可能受全局mutex保护,导致争用。

可以在启动时使用命令行上的–default-time-zone = timezone选项明确指定初始全局服务器时区值,也可以在选项文件中使用以下行:

default-time-zone=’timezone

如果您具有SUPER权限,则可以使用以下语句在运行时设置全局服务器时区值:

mysql> SET GLOBAL time_zone = timezone;

  • 每个连接的时区。 每个连接的客户端都有自己的时区设置,由会话time_zone变量给出。 最初,会话变量从全局time_zone变量中获取其值,但客户端可以使用以下语句更改其自己的时区:

mysql> SET time_zone = timezone;

当前会话时区设置会影响对区域敏感的时间值的显示和存储。 这包括NOW()或CURTIME()等函数显示的值,以及TIMESTAMP列中存储和检索的值。 TIMESTAMP列的值从当前时区转换为UTC存储,并从UTC转换到当前时区以供检索

当前时区设置不会影响由UTC_TIMESTAMP()等函数或DATE,TIME或DATETIME列中的值显示的值。 这些数据类型中的值也不以UTC存储; 时区仅适用于从TIMESTAMP值转换时的时区。 如果您需要针对DATE,TIME或DATETIME值的特定于语言环境的算术,请将它们转换为UTC,执行算术运算,然后再转换回去。

全局和客户特定时区的当前值可以像这样获取:

mysql> SELECT @@global.time_zone, @@session.time_zone;

timezone 值可以以多种格式给出,不区分大小写:

  • 值’SYSTEM’表示时区应该与系统时区相同。
  • 该值可以以字符串的形式给出,指示与UTC的偏移量,例如’+10:00’或’-6:00’。
  • 该值可以作为命名时区给出,例如“’Europe/Helsinki’, ‘US/Eastern’, 或者 ‘MET’. 。 只有在创建和填充mysql数据库中的时区信息表时,才能使用命名时区。

填充时间时区表

mysql系统数据库中有多个表用于维护时区信息。 MySQL安装过程创建时区表,但不加载它们。 您必须使用以下说明手动执行此操作。

注意:

加载时区信息不一定是一次性操作,因为信息偶尔会改变。 发生此类更改时,使用旧规则的应用程序将变得过时,并且您可能会发现需要重新加载时区表以使MySQL服务器使用的信息保持最新状态。

如果您的系统具有自己的zoneinfo数据库(描述时区的文件集),则应使用mysql_tzinfo_to_sql程序填充时区表。 这些系统的例子是Linux,FreeBSD,Solaris和OS X.这些文件的一个可能位置是/usr/share/zoneinfo目录。 如果您的系统没有zoneinfo数据库,则可以使用本节后面所述的可下载软件包。

mysql_tzinfo_to_sql程序用于加载时区表。 在命令行上,将zoneinfo目录路径名称传递给mysql_tzinfo_to_sql并将输出发送到mysql程序。 例如:

shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

mysql_tzinfo_to_sql读取您系统的时区文件并从中生成SQL语句。 mysql处理这些语句来加载时区表。

mysql_tzinfo_to_sql也可用于加载单个时区文件或生成闰秒信息:

  • 要加载与时区名称tz_name相对应的单个时区文件tz_file,请像这样调用mysql_tzinfo_to_sql:

shell> mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql

采用这种方法,您必须执行单独的命令来加载服务器需要了解的每个命名区域的时区文件。

  • 在运行mysql_tzinfo_to_sql之后,最好重新启动服务器,以便它不会继续使用任何先前缓存的时区数据。

如果您的系统没有zoneinfo数据库(例如Windows),那么您可以使用可在MySQL Developer Zone上下载的软件包:

http://dev.mysql.com/downloads/timezones.html

下载包含SQL语句的时区包并将其解压缩,然后将包文件内容加载到时区表中:

shell> mysql -u root mysql < file_name

然后重启服务器

警告:

不要使用包含MyISAM表的可下载软件包。 MySQL 5.7及更高版本使用InnoDB作为时区表。 尝试用MyISAM表替换它们会导致问题。

如果您的系统有zoneinfo数据库,请不要使用可下载的软件包。 改用mysql_tzinfo_to_sql工具。 否则,您可能会在MySQL和系统上的其他应用程序之间的日期时间处理方面产生差异。

5.1.11 服务器-端 帮助

MySQL服务器支持一个HELP语句,该语句返回MySQL参考手册中的信息。 mysql系统数据库中的几个表包含支持此语句所需的信息。 此语句的正确操作要求初始化这些帮助表,这是通过处理fill_help_tables.sql脚本的内容来完成的。

如果您在Unix上使用二进制或源代码发行版安装MySQL,则在初始化数据目录时会发生帮助表内容初始化。 对于Linux上的RPM分发版或Windows上的二进制分发版,内容初始化是作为MySQL安装过程的一部分发生的。

如果使用二进制分发版升级MySQL,则不会自动升级帮助表内容,但可以手动升级它。 在share或share/mysql目录中找到fill_help_tables.sql文件。 将位置更改为该目录,然后使用mysql客户端处理该文件,如下所示:

shell> mysql -u root mysql < fill_help_tables.sql

您也可以随时获取最新的fill_help_tables.sql以升级您的帮助表。 从http://dev.mysql.com/doc/index-other.html下载适用于您的MySQL版本的正确文件。 下载并解压文件后,如前所述用mysql进行处理。

如果您正在使用Git和MySQL开发源代码树,则必须使用fill_help_tables.sql文件的下载副本,因为源代码树仅包含“存根”版本。

注意:

对于参与复制的服务器,帮助表内容升级过程涉及多个服务器。

5.1.13 服务器 关闭 进程

服务器关机过程如下所示:

1.关机进程初始化。

这可能发生在几种方式。 例如,具有SHUTDOWN特权的用户可以执行mysqladmin shutdown命令。 mysqladmin可以在MySQL支持的任何平台上使用。 其他操作系统特定的关闭启动方法也是可能的:服务器在接收到SIGTERM信号时在Unix上关闭。 在服务管理器告诉它时,在Windows上作为服务运行的服务器关闭。

2.服务器根据需要创建关闭线程。

根据启动关闭的方式,服务器可能会创建一个线程来处理关闭过程。 如果客户端请求关闭,则会创建一个关闭线程。 如果关闭是收到SIGTERM信号的结果,则信号线程可能自己处理关闭,或者它可能会创建一个单独的线程来执行此操作。 如果服务器试图创建关闭线程并且不能(例如,如果内存耗尽),它会发出诊断消息,该消息出现在错误日志中:

Error: Can’t create thread to kill server

3.服务器停止接受新的连接。

为防止在关闭期间启动新活动,服务器通过关闭它通常侦听连接的网络接口的处理程序来停止接受新的客户端连接:TCP / IP端口,Unix套接字文件,Windows命名管道和 Windows上的共享内存。

4.服务器终止当前活动。

对于与客户端连接关联的每个线程,服务器将断开与客户端的连接并将该线程标记为被kill。 线程在注意到它们如此标记时死亡。 用于空闲连接的线程快速死亡。 当前正在处理语句的线程会定期检查它们的状态,并花更长的时间死亡 有关线程终止的更多信息,特别是有关MyISAM表上关于终止REPAIR TABLE或OPTIMIZE TABLE操作的指示信息。

对于具有开放事务的线程,事务将回滚。 如果一个线程正在更新非事务表,那么诸如多行UPDATE或INSERT的操作可能会使该表部分更新,因为该操作可能会在完成之前终止。

如果服务器是主复制服务器,它将像其他客户端线程一样处理与当前连接的从属关联的线程。 也就是说,每一个都会被标记为死亡,并在下次检查其状态时退出。

如果服务器是从属复制服务器,则在将客户端线程标记为终止之前,它将停止I / O和SQL线程(如果它们处于活动状态)。 SQL线程被允许完成其当前语句(以避免导致复制问题),然后停止。 如果此时SQL线程处于事务的中间,则服务器将等待直到当前复制事件组(如果有)完成执行,或者直到用户发出KILL QUERY或KILL CONNECTION语句。 另请参见第13.4.2.7节“STOP SLAVE语法”。 由于无法回滚非事务性语句,为了保证崩溃安全的复制,只应使用事务性表。

注意:

为了保证slave的崩溃安全,您必须在slave启用了–relay-log-recovery。

5.服务器关闭或关闭存储引擎。

在这个阶段,服务器刷新表缓存并关闭所有打开的表。

每个存储引擎都会执行其管理的表所需的任何操作。 InnoDB将其缓冲池刷新到磁盘(除非innodb_fast_shutdown为2),将当前LSN写入表空间并终止其自己的内部线程。 MyISAM为表刷新任何挂起的索引写入

6.服务器退出

要向管理进程提供信息,服务器将返回以下列表中描述的退出代码之一。 括号中的短语表示systemd为响应代码而采取的行动,systemd用于管理服务器的平台。

0 =成功终止(不重新启动)

1 =不成功终止(不重新启动)

2 =不成功终止(重新启动完成)

    原文作者:sybbjs
    原文地址: https://zhuanlan.zhihu.com/p/34376711
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞