MySQL 5.7中的新功能

MySQL 5.7中的新功能

大家好,又见面了,我是全栈君。

本节总结了MySQL 5.7中添加,弃用和删除的内容。随附部分列出了MySQL服务器选项以及在MySQL 5.7中添加,弃用或删除的变量。请参见第1.5节“在MySQL 5.7中添加,弃用或删除的服务器和状态变量和选项”。

添加的特性

MySQL 5.7中添加了以下功能:

  1. 安全性改进。添加了以下安全增强功能:

(1)在MySQL 8.0中,caching_sha2_password是默认的验证插件。为了使MySQL5.7能够使用使用caching_sha2_password进行身份验证连接到8.0服务器,MySQL 5.7客户端库和客户端程序从MySQL 5.7.23开始支持caching_sha2_password客户端身份验证插件。这提高了MySQL 5.7与MySQL 8.0和更高版本服务器的兼容性。请参见第6.4.1.5节“缓存SHA-2可插入认证”。

(2)服务器现在要求mysql.user表中的帐户行具有非空的列值并禁用具有空值的帐户。有关说明,请参见第2.11.3节“影响升级到MySQL 5.7的更改”。建议DBA使用mysql_old_password认证插件的帐户转换为使用mysql_native_password,因为已删除对mysql_old_password的支持。有关帐户升级说明,请参见第6.4.1.3节,“Migrating Away from Pre-4.1 Password Hashing and the mysql_old_password Plugin”

(3)MySQL现在允许数据库管理员为自动密码过期建立策略:使用密码超过其允许生命周期的帐户连接到服务器的任何用户都必须更改密码。有关更多信息,请参见第6.2.11节“密码过期策略”。

(4)管理员可以锁定和解锁帐户,以便更好地控制谁可以登录。有关更多信息,请参见第6.3.15节“用户帐户锁定”。

(5)为了更容易支持安全连接,使用OpenSSL编译的MySQL服务器可以在启动时自动生成缺少的SSL和RSA证书和密钥文件。请参见第6.3.2.1节“使用MySQL创建SSL和RSA证书和密钥”。

所有服务器(无论是使用OpenSSL还是yaSSL编译),如果没有明确配置SSL,都会尝试在启动时自动启用SSL,如果他们在数据目录中找到必需的SSL文件。请参见第6.3.1节“配置MySQL以使用加密连接”。

此外,MySQL发行版包括一个mysql_ssl_rsa_setup实用程序,可以手动调用该实用程序来创建SSL和RSA密钥和证书文件。有关更多信息,请参见第4.4.5节“mysql_ssl_rsa_setup – 创建SSL / RSA文件”。

(6)使用mysqld –initialize安装的MySQL部署默认是安全的。以下更改已作为默认部署特征实现:

  • 安装过程只创建一个root帐户,’root’@’localhost’,自动为此帐户生成一个随机密码,并标记密码已过期。MySQL管理员必须使用随机密码以root身份连接并分配新密码。 (服务器将随机密码写入错误日志。)
  • 安装不会创建匿名用户帐户。
  • 安装不会创建测试数据库。

有关更多信息,请参见第2.10.1节“初始化数据目录”。

(7)MySQL企业版现在提供数据脱敏和反识别功能。数据脱敏通过用替换实际值来隐藏敏感信息。 MySQL企业数据脱敏和反识别功能可以使用多种方法脱敏现有数据,例如模糊处理(删除识别特征),格式化随机数据的生成以及数据替换或换算。有关更多信息,请参见第6.4.7节“MySQL企业数据数据脱敏和反识别功能”。

  1. SQL mode改变。现在,默认情况下启用事务存储引擎的严格SQL mode (STRICT_TRANS_TABLES)

ONLY_FULL_GROUP_BY SQL模式的实现变得更加复杂,不再拒绝先前被拒绝的确定性查询。因此,此模式现在默认启用,以禁止仅包含不保证在组内唯一确定的表达式的非确定性查询。

ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE SQL模式现已弃用,但默认情况下已启用。长期计划是将它们包含在严格的SQL模式中,并在未来的MySQL版本中将它们作为显式模式删除。请参阅MySQL 5.7中的SQL模式更改。

对默认SQL模式的更改会导致启用这些模式的默认sql_mode系统变量值: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。

  1. 在线ALTER TABLE。ALTER TABLE现在支持重命名索引的RENAME INDEX子句。在没有表复制操作的情况下进行更改。它适用于所有存储引擎。请参见第13.1.6节“ALTER TABLE语法”。
  2. ngram和MeCab全文解析器插件。从MySQL 5.7.6开始,MySQL提供了一个内置的全文ngram解析器插件,支持中文,日文和韩文(CJK),以及一个可安装的日文MeCab全文解析器插件。有关更多信息,请参见第12.9.8节“ngram全文分析器”和第12.9.9节“MeCab全文分析器插件”。
  3. InnoDB增强功能。添加了这些InnoDB增强功能
  4. 可以in-place使用ALTER TABLE增加VARCHAR大小,如下例所示:

ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);

只要VARCHAR列所需的长度字节数保持不变,就是可以in-place更改。对于0到255的VARCHAR值,需要一个长度字节来对值进行编码。对于256字节或更多的VARCHAR值,需要两个长度字节。因此,in-place ALTER TABLE仅支持将VARCHAR大小从0增加到255个字节,或者将VARCHAR大小从等于或大于256个字节的值增加。

In-place ALTER TABLE不支持将VARCHAR大小从小于256字节增加到等于或大于256字节的值。在这种情况下,所需长度字节数将从1更改为2,只有table copy(ALGORITHM = COPY)支持。

不支持使用in-place ALTER TABLE减小VARCHAR大小。减小VARCHAR大小需要table copy(ALGORITHM = COPY)。

有关更多信息,请参见第14.13.1节“在线DDL操作”。

  1. 通过优化CREATE TABLE,DROP TABLE,TRUNCATE TABLE和ALTER TABLE语句,可以提高InnoDB临时表的DDL性能
  2. InnoDB临时表元数据不再存储到InnoDB系统表中。相反,新表INNODB_TEMP_TABLE_INFO为用户提供活动临时表的快照。该表包含有关在给定InnoDB实例中处于活动状态的所有用户和系统创建的临时表的元数据和报告。在对其运行第一个SELECT语句时创建该表。
  3. InnoDB现在支持MySQL支持的空间数据类型。在此版本之前,InnoDB将空间数据存储为二进制BLOB数据。 BLOB仍然是基础数据类型,但空间数据类型现在对应新的InnoDB内部数据类型DATA_GEOMETRY。
  4. 现在,所有非压缩的InnoDB临时表都有一个单独的表空间。新表空间始终在服务器关闭时删除,启动时重新创建,默认情况下位于DATADIR中(不配置参数)。新添加的配置文件选项innodb_temp_data_file_path允许用户定义的临时数据文件路径。
  5. innochecksum功能通过几个新选项和扩展功能得到增强。请参见第4.6.1节“innochecksum – 离线InnoDB文件校验和实用程序”。
  6. 普通和压缩临时表及相关对象的新型non-redo undo log现在驻留在临时表空间中。有关更多信息,请参见第14.6.7节“Undo Logs”。
  7. 增强了InnoDB缓冲池转储和加载操作。新的系统变量innodb_buffer_pool_dump_pct允许您指定每个缓冲池中最近使用的页面读取和转储的百分比。当InnoDB后台任务执行其他I / O活动时,InnoDB会尝试使用innodb_io_capacity设置限制每秒缓冲池加载操作的数量。
  8. InnoDB为全文解析器插件添加了支持。有关全文解析器插件的信息,请参见“全文解析器插件”和第28.2.4.4节“Writing Full-Text Parser Plugins”。
  9. 从MySQL 5.7.4开始,InnoDB支持多个页面清理线程,用于从缓冲池实例中刷新脏页面。新的系统变量innodb_page_cleaners用于指定页面清除程序线程的数量。默认值1维护MySQL 5.7.4之前的配置,其中有一个页面清理线程。此增强功能建立在MySQL 5.6中完成的工作之上,它引入了单个页面清理程序线程来从InnoDB主线程卸载缓冲池刷新工作。
  10. 从MySQL 5.7.4开始,MySQL支持使用在线DDL(ALGORITHM = INPLACE)重建常规和分区的InnoDB表,以进行以下操作:
  • OPTIMIZE TABLE
  • ALTER TABLE … FORCE
  • ALTER TABLE … ENGINE=INNODB (在InnoDB表上运行时)

在线DDL支持减少了表重建时间并允许并发DML,这有助于减少用户应用程序的停机时间。有关其他信息,请参见第14.13节“InnoDB and Online DDL”。

  1. Linux上的Fusion-io非易失性存储器(NVM)文件系统提供原子写入功能,这使InnoDB双写缓冲区变得多余。在MySQL 5.7.4中,InnoDB双写缓冲区会自动禁用位于支持原子写入的Fusion-io设备上的系统表空间文件(ibdata文件)。
  2. 从MySQL 5.7.4开始,InnoDB支持InnoDB分区表和单个InnoDB表分区的传输表空间功能。此增强功能简化了分区表的备份过程,并允许在MySQL实例之间复制分区表和单个表分区。有关其他信息,请参见第14.6.3.7节“复制表空间到另一个服务器”。
  3. 从MySQL 5.7.5开始,innodb_buffer_pool_size参数是动态的,允许您在不重新启动服务器的情况下调整缓冲池的大小。调整大小操作,包括将页面移动到内存中的新位置,以块的形式执行。可以使用新的innodb_buffer_pool_chunk_size配置选项配置块大小。您可以使用新的Innodb_buffer_pool_resize_status状态变量监控调整大小进度。有关更多信息,请参见“在线调整InnoDB缓冲池大小”。
  4. 多线程页面清理程序支持(innodb_page_cleaners)扩展到MySQL 5.7.5中的关闭和恢复阶段。
  5. 从MySQL 5.7.5开始,InnoDB支持使用SPATIAL索引来索引SPATIAL数据类型,包括使用ALTER TABLE … ALGORITHM = INPLACE进行在线操作(ADD SPATIAL INDEX)。
  6. 从MySQL 5.7.5开始,InnoDB在创建或重建索引时执行批量加载。这种索引创建方法称为“sorted index build”。此增强功能可提高索引创建的效率,也适用于全文索引。新的全局配置选项innodb_fill_factor定义了在排序索引构建期间填充数据的每个页面上的空间百分比,其余空间保留用于将来的索引增长。有关更多信息,请参见第14.6.2.3节“排序索引构建”。
  7. 从MySQL 5.7.5开始,新的日志记录类型(MLOG_FILE_NAME)用于标识自上一个检查点以来已修改的表空间。此增强功能简化了崩溃恢复期间的表空间发现,并在重做日志应用之前消除了对文件系统的扫描。有关此增强功能的好处的更多信息,请参见“崩溃恢复期间的表空间发现”。

此增强功能更改了重做日志格式,要求在升级到MySQL 5.7.5或从MySQL 5.7.5降级之前彻底关闭MySQL。

  1. 从MySQL 5.7.5开始,您可以截断驻留在撤消表空间中的撤消日志。使用innodb_undo_log_truncate配置选项启用此功能。有关更多信息,请参见第“截断撤消驻留表空间中的日志”。
  2. 从MySQL 5.7.6开始,InnoDB支持本地分区。以前,InnoDB依赖于ha_partition处理程序,该处理程序为每个分区创建一个处理程序对象。使用本地分区,分区的InnoDB表使用单个分区感知处理程序对象。此增强功能可减少分区InnoDB表所需的内存量。

从MySQL 5.7.9开始,mysql_upgrade会查找并尝试升级使用ha_partition处理程序创建的InnoDB分区表。同样在MySQL 5.7.9及更高版本中,您可以使用ALTER TABLE … UPGRADE PARTITIONING在mysql客户端中按名称升级此类表。

  1. 从MySQL 5.7.6开始,InnoDB支持使用CREATE TABLESPACE语法创建通用表空间。

CREATE TABLESPACE `tablespace_name`

ADD DATAFILE ‘file_name.ibd’

[FILE_BLOCK_SIZE = n]

一般表空间可以在MySQL数据目录之外创建,能够保存多个表,并支持所有行格式的表。

使用CREATE TABLE tbl_name … TABLESPACE [=] tablespace_name或ALTER TABLE tbl_name TABLESPACE [=] tablespace_name语法将表添加到常规表空间。

有关更多信息,请参见第14.6.3.3节“InnoDB通用表空间”。

  1. 在MySQL 5.7.9中,DYNAMIC代替COMPACT成为InnoDB表的默认行格式。新配置选项innodb_default_row_format指定默认的InnoDB行格式。有关更多信息,请参见“指定表的行格式”。
  2. 从MySQL 5.7.11开始,InnoDB支持每个表一个表空间的数据静态加密。通过在创建或更改InnoDB表时指定ENCRYPTION选项来启用加密。此功能依赖于密钥环插件进行加密密钥管理。有关更多信息,请参见第6.4.4节“MySQL密钥”和第14.6.3.8节“InnoDB静态数据加密”。
  3. 从MySQL 5.7.24开始,与MySQL捆绑在一起的zlib库版本从1.2.3升级到版本1.2.11。 MySQL在zlib库的帮助下实现压缩。

如果您使用InnoDB压缩表,请参见第2.11.3节“MySQL 5.7中的更改”以了解相关的升级含义。

  1. JSON支持。从MySQL 5.7.8开始,MySQL支持本机JSON类型。 JSON值不存储为字符串,而是使用允许对文档元素进行快速读取访问的内部二进制格式。存储在JSON列中的JSON文档会在插入或更新时自动验证,并且无效文档会产生错误。 JSON文档在创建时进行了规范化,可以使用大多数比较运算符进行比较,例如=,<,<=,>,> =,<>,!=和<=>;有关受支持的运算符以及MySQL在比较JSON值时遵循的优先级和其他规则的信息,请参阅JSON值的比较和排序。

MySQL 5.7.8还引入了许多用于处理JSON值的函数。这些功能包括这里列出的功能:

  • 创建JSON值的函数:JSON_ARRAY(),JSON_MERGE()和JSON_OBJECT()。请参见第12.17.2节“创建JSON值的函数”。
  • 搜索JSON值的函数:JSON_CONTAINS(),JSON_CONTAINS_PATH(),JSON_EXTRACT(),JSON_KEYS()和JSON_SEARCH()。请参见第12.17.3节“搜索JSON值的函数”。
  • 搜索JSON值的函数:JSON_CONTAINS(),JSON_CONTAINS_PATH(),JSON_EXTRACT(),JSON_KEYS()和JSON_SEARCH()。请参见第12.17.3节“搜索JSON值的函数”。
  • 提供有关JSON值的信息的函数:JSON_DEPTH(),JSON_LENGTH(),JSON_TYPE()和JSON_VALID()。请参见第12.17.5节“返回JSON值属性的函数”。

在MySQL 5.7.9及更高版本中,您可以使用column-> path作为JSON_EXTRACT(列,路径)的简写。这可以作为列的别名,只要在SQL语句中可以出现列标识符,包括WHERE,ORDER BY和GROUP BY子句。这包括SELECT,UPDATE,DELETE,CREATE TABLE和其他SQL语句。左侧必须是JSON列标识符(而不是别名)。右侧是引用的JSON路径表达式,它根据作为列值返回的JSON文档进行评估。

MySQL 5.7.22添加了以下JSON函数:

  • 两个JSON聚合函数JSON_ARRAYAGG()和JSON_OBJECTAGG()。JSON_ARRAYAGG()将列或表达式作为其参数,并将结果聚合为单个JSON数组。表达式可以评估任何MySQL数据类型;这不一定是JSON值。 JSON_OBJECTAGG()接受两个列或表达式,它将其解释为键和值;它将结果作为单个JSON对象返回。有关更多信息和示例,请参见第12.20节“聚合(GROUP BY)函数”。
  • JSON实用程序函数JSON_PRETTY(),它以易于读取的格式输出现有的JSON值;每个JSON对象成员或数组值都打印在一个单独的行上,子对象或数组相对于其父对象是2个空格。

此函数也适用于可以解析为JSON值的字符串。

另请参见第12.17.6节“JSON实用程序函数”。

  • JSON实用程序函数JSON_STORAGE_SIZE(),它返回在任何部分更新之前用于JSON文档的二进制表示的字节存储空间(请参阅上一项)。

此函数还接受JSON文档的有效字符串表示形式。对于这样的值,JSON_STORAGE_SIZE()返回其转换为JSON文档后其二进制表示所使用的空间。对于包含JSON文档的字符串表示形式的变量,JSON_STORAGE_FREE()返回零。如果无法将其(非null)参数解析为有效的JSON文档,则任一函数都会产生错误;如果参数为NULL,则该函数为NULL。

有关更多信息和示例,请参见第12.17.6节“JSON实用程序函数”。

  • JSON合并函数旨在符合RFC 7396. JSON_MERGE_PATCH()在2个JSON对象上使用时,将它们合并为单个JSON对象,该对象具有以下集合的成员作为成员:
  1. 第一个对象的每个成员,在第二个对象中没有成员具有相同的键。
  2. 第二个对象的每个成员,其中没有成员在第一个对象中具有相同的键,并且其值不是JSON空文字。
  3. 每个成员都有一个存在于两个对象中的键,并且其第二个对象中的值不是JSON空文字。

作为此工作的一部分,JSON_MERGE()函数已重命名为JSON_MERGE_PRESERVE()。JSON_MERGE()继续被认为是MySQL 5.7中JSON_MERGE_PRESERVE()的别名,但现在已被弃用,并且将在未来的MySQL版本中删除。

有关更多信息和示例,请参见第12.17.4节“修改JSON值的函数”。

有关 – >和JSON_EXTRACT()的更多信息,请参见第12.17.3节“搜索JSON值的函数”。有关MySQL 5.7中的JSON路径支持的信息,请参阅搜索和修改JSON值。另请参见索引生成的列以提供JSON列索引。

  1. 系统和状态变量。系统和状态变量信息现在可用于Performance Schema tables,优先使用INFORMATION_SCHEMA表来获取这些变量。这也会影响SHOW VARIABLES和SHOW STATUS语句的操作。show_compatibility_56系统变量的值会影响系统和状态变量语句和表所产生的输出和权限。有关详细信息,请参见第5.1.7节“服务器系统变量”中该变量的说明。
  2. 系统表。MySQL发行版现在包括sys schema,它是一组对象,可帮助DBA和开发人员理解Performance Schema收集的数据。 sys模式对象可用于典型的调优和诊断用例。有关更多信息,请参见第26章,MySQL sys Schema。
  3. 条件处理。MySQL现在支持堆栈诊断区域。诊断区域堆栈进行push后,第一个(当前)诊断区域将成为第二个(堆叠)诊断区域,并创建一个新的当前诊断区域作为其副本。在条件处理程序中,已执行语句会修改新的当前诊断区域,但可以使用GET STACKED DIAGNOSTICS检查堆栈诊断区域,以获取有关导致处理程序激活的条件的信息,而与处理程序本身内的当前条件无关。 (以前,只有一个诊断区域。要检查处理程序中的处理程序激活条件,有必要在执行任何可能更改它的语句之前检查此诊断区域。)请参见第13.6.7.3节“获取诊断语法”,和第13.6.7.7节“MySQL诊断区域”。
  4. 优化器。添加了以下优化程序增强功能:
  • EXPLAIN可用于获取在命名连接中执行的可解释语句的执行计划:

EXPLAIN [options] FOR CONNECTION connection_id;

有关更多信息,请参见第8.8.4节“获取命名连接的执行计划信息”。

  • 可以在各个SQL语句中为优化器提供提示,这使得可以更好地控制语句执行计划,而不是使用optimizer_switch系统变量。在EXPLAIN使用的语句中也允许使用提示,使您可以查看提示如何影响执行计划。有关更多信息,请参见第8.9.3节“优化程序提示”。
  1. 触发器。以前,对于触发事件(INSERT,UPDATE,DELETE)和动作时间(BEFORE,AFTER)的每个组合,一个表最多只能有一个触发器。已取消此限制并允许多个触发器。有关更多信息,请参见第23.3节“使用触发器”。
  2. 日志记录。添加了以下日志记录增强功能:
  • 以前,在Unix和类Unix系统上,MySQL支持将服务器错误日志发送到syslog是通过使mysqld_safe捕获服务器错误输出并将其传递给syslog来实现的。服务器现在包括本机syslog支持,该支持已扩展到包括Windows。有关将服务器错误输出发送到syslog的更多信息,请参见第5.4.2节“错误日志”。
  • mysql客户端现在有一个–syslog选项,可以将交互式语句发送到系统syslog工具。对于与默认“忽略”模式列表(“* IDENTIFIED *:* PASSWORD *”)匹配的语句以及与使用–histignore选项指定的任何模式匹配的语句,将禁止日志记录。请参见第4.5.1.3节“mysql客户端日志记录”。
  1. 生成列。MySQL现在支持CREATE TABLE和ALTER TABLE语句中生成列的规范。生成列的值是根据列创建时指定的表达式计算的。生成的列可以是虚拟的(在读取行时“在MySQL 5.7中添加的功能”中计算)或存储(在插入或更新行时计算)。有关更多信息,请参见第13.1.18.8节“创建表和生成的列”。
  2. MySQL客户端。以前,如果有的话,mysql中的Control + C会中断当前语句,如果没有,则会中断mysql。现在,Control + C会中断当前语句(如果有),或者取消任何部分输入行,否则不会退出。
  3. 使用mysqlbinlog重写数据库名称。现在,使用MySQL 5.7.1中添加的-rewrite-db选项,可以在读取使用基于行的格式编写的二进制日志时通过mysqlbinlog重命名数据库。

此选项使用格式–rewrite-db =’dboldname-> dbnewname’。您可以通过多次指定选项来实现多个重写规则。

  1. 分区表的HANDLER。HANDLER语句现在可以与user-partitioned表一起使用。此类表可以使用任何可用的分区类型(请参见第22.2节“分区类型”)。
  2. 分区表的索引条件下推。使用InnoDB或MyISAM存储引擎对分区表进行查询可以使用MySQL 5.6中引入的索引条件下推优化。有关更多信息,请参见第8.2.1.5节“索引条件下推优化”。
  3. ALTER TABLE … EXCHANGE PARTITION支持WITHOUT VALIDATION。从MySQL 5.7.5开始,ALTER TABLE … EXCHANGE PARTITION语法包含一个可选的{WITH | WITHOUT} VALIDATION子句。指定WITHOUT VALIDATION时,ALTER TABLE … EXCHANGE PARTITION在与分区交换填充表时不执行逐行验证,允许数据库管理员承担确保行位于分区定义边界内的责任。 WITH VALIDATION是默认行为,无需明确指定。有关更多信息,请参见第22.3.3节“使用表交换分区和子分区”。
  4. Master dump线程改进。Master dump线程重构以减少锁争用并提高Master的吞吐量。在MySQL5.7.2以前版本,dump线程在读取event时会锁定二进制日志;在5.7.2以后,只有在读取上一次成功写入event结束时的位置时才会保持此锁定。这意味着可以有多个dump线程从二进制文件中同时读取,并且dump线程现在可以在客户端写入二进制日志时读取。
  5. 全球化改进。MySQL 5.7.4包含一个支持中国国家标准GB18030字符集的gb18030字符集。有关MySQL字符集支持的更多信息,请参见第10章,字符集,排序规则,Unicode。
  6. 在没有STOP SLAVE的情况下更改复制主服务器。在MySQL 5.7.4及更高版本中,删除了在发出任何CHANGE MASTER TO语句之前执行STOP SLAVE的严格要求。CHANGE MASTER TO的行为现在取决于slave SQL线程和slave I / O线程的状态,而不是取决于slave是否停止,;现在停止或运行这些线程中的哪一个确定了在给定时间点可以使用或不能与CHANGE MASTER TO语句一起使用的选项。此处列出了进行此确定的规则:
  • 如果SQL线程已停止,则可以使用RELAY_LOG_FILE,RELAY_LOG_POS和MASTER_DELAY选项的任意组合执行CHANGE MASTER TO,即使slave I / O线程正在运行。当I / O线程运行时,此语句不能使用其他选项。
  • 如果I / O线程已停止,则可以使用此语句的任何选项(在任何允许的组合中)执行CHANGE MASTER TO,但RELAY_LOG_FILE,RELAY_LOG_POS或MASTER_DELAY除外,即使SQL线程正在运行。 I / O线程运行时,可能无法使用这三个选项。
  • 在发出CHANGE MASTER TO … MASTER_AUTO_POSITION = 1之前,必须停止SQL线程和I / O线程。

您可以使用SHOW SLAVE STATUS检查从属SQL和I / O线程的当前状态。

如果使用基于语句的复制和临时表,则STOP SLAVE语句后面的CHANGE MASTER TO语句可能会在slave服务器上留下临时表。作为这组改进的一部分,当使用基于语句的复制并且Slave_open_temp_tables保持大于0时,只要在STOP SLAVE之后发出CHANGE MASTER TO,就会发出警告。

有关更多信息,请参见第13.4.2.1节“更改主语法”和第16.3.7节“在故障转移期间切换Master”。

  1. 测试套件。MySQL测试套件现在使用InnoDB作为默认存储引擎。
  2. 现在可以进行多源复制。MySQL多源复制增加了从多个主服务器复制到从服务器的功能。 MySQL多源复制拓扑可用于将多个服务器备份到单个服务器,合并表分片,以及将来自多个服务器的数据合并到单个服务器。请参见第16.1.4节“MySQL多源复制”。

作为MySQL多源复制的一部分,添加了复制通道。复制通道使从库能够打开多个连接以进行复制,每个通道都是与主站的连接。请参见第16.2.3节“复制通道”。

  1. 组复制性能表。MySQL 5.7在Performance Schema中添加了许多新表,以提供有关复制组和通道的信息。这些包括以下表格:
  • replication_applier_configuration
  • replication_applier_status
  • replication_applier_status_by_coordinator
  • replication_applier_status_by_worker
  • replication_connection_configuration
  • replication_connection_status
  • replication_group_members
  • replication_group_member_stats

除了在MySQL 5.7.6中添加的replication_group_members和replication_group_member_stats之外,其余所有这些表都添加在MySQL 5.7.2中。有关更多信息,请参见第25.12.11节“性能模式复制表”。

  1. 组复制SQL。MySQL 5.7.6中添加了以下语句来控制组复制:
  • START GROUP_REPLICATION
  • STOP GROUP_REPLICATION

有关更多信息,请参见第13.4.3节“用于控制组复制的SQL语句”。

 

在MySQL 5.7中不推荐使用的功能

MySQL 5.7中不推荐使用以下功能,可能会在将来的系列中删除。在显示替代方案的地方,应更新应用程序以使用它们。

对于使用MySQL 5.7中已弃用的,在较高MySQL系列中删除的功能的应用程序,从MySQL 5.7主服务器复制到更高级别的从服务器时语句可能会失败,或者可能对主服务器和从服务器产生不同的影响。为避免此类问题,应修改使用5.7中不推荐使用的功能的应用程序以避免它们并尽可能使用替代方案。

  • ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE SQL模式现已弃用,但默认情况下已启用。长期计划是将它们包含在严格的SQL模式中,并在未来的MySQL版本中将它们作为显式模式删除。

不推荐使用已弃用的ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE SQL模式,以便命名它们的语句不会产生错误,但将在MySQL的未来版本中删除。要对不存在这些模式名称的MySQL版本进行预先准备,应修改应用程序以不引用它们。请参阅MySQL 5.7中的SQL模式更改。

  • 这些SQL模式现已弃用,将在未来版本的MySQL中删除:DB2,MAXDB,MSSQL,MYSQL323,MYSQL40,ORACLE,POSTGRESQL,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS。这些弃用有两个含义:
  1. 将sql_mode系统变量设置成不推荐使用的模式会产生警告。
  2. 启用MAXDB SQL模式后,使用CREATE TABLE或ALTER TABLE将TIMESTAMP列添加到表中会产生警告。
  • 以下对帐户管理语句的更改功能已过时。它们现已弃用:
  1. 使用GRANT创建用户。现在要使用CREATE USER。遵循这种做法使得NO_AUTO_CREATE_USER SQL模式对GRANT语句无关紧要,因此它也被弃用。
  2. 使用GRANT修改权限分配以外的帐户属性。这包括身份验证,SSL和资源限制属性。相反,使用CREATE USER在帐户创建时建立此类属性,或者使用ALTER USER在之后修改它们。
  3. 通过PASSWORD’auth_string’语法为CREATE USER和GRANT标识。相反,对CREATE USER和ALTER USER使用IDENTIFIED WITH auth_plugin AS’auth_string’,其中’auth_string’值的格式与指定的插件兼容。
  4. PASSWORD()函数已弃用,应在任何上下文中避免使用。因此,也不推荐使用SET PASSWORD … = PASSWORD(’auth_string’)语法。 SET PASSWORD … =’auth_string’语法不被弃用;尽管如此,ALTER USER现在是分配密码的首选语句。
  5. old_passwords系统变量。在mysql.user系统表中不能再指定帐户身份验证插件,因此任何从明文字符串中分配密码的语句都可以明确地确定要在字符串上使用的哈希方法,然后再将其存储在mysql.user表中。这使old_passwords变得极为丰富。
  • 不推荐使用查询缓存。弃用包括以下项目:
  1. FLUSH QUERY CACHE和RESET QUERY CACHE语句。
  2. SQL_CACHE和SQL_NO_CACHE SELECT修饰符。
  3. 这些系统变量:have_query_cache,ndb_cache_check_time,query_cache_limit,query_cache_min_res_unit,query_cache_size,query_cache_type,query_cache_wlock_invalidate。
  4. 这些状态变量:have_query_cache,ndb_cache_check_time,query_cache_limit,query_cache_min_res_unit,query_cache_size,query_cache_type,query_cache_wlock_invalidate。
  • 以前,–transaction-isolation和–transaction-read-only服务器启动选项对应于tx_isolation和tx_read_only系统变量。为了在启动选项和系统变量名之间获得更好的名称对应关系,已将transaction_isolation和transaction_read_only创建为tx_isolation和tx_read_only的别名。 tx_isolation和tx_read_only变量现已弃用,将在MySQL 8.0中删除。应调整应用程序以使用transaction_isolation和transaction_read_only。
  • 不推荐使用–skip-innodb选项及其同义词( – innodb = OFF, – disable-innodb等)。从MySQL 5.7开始,这些选项无效。因为InnoDB无法禁用。
  • 不推荐使用客户端–ssl和–ssl-verify-server-cert选项。使用–sslmode = REQUIRED而不是–ssl = 1或–enable-ssl。使用–ssl-mode = DISABLED而不是–ssl = 0, – skip-ssl或–disable-ssl。使用–ssl-mode = VERIFY_IDENTITY而不是-ssl-verify-server-cert选项。 (不推荐使用服务器端–ssl选项。)

对于C API,mysql_options()的MYSQL_OPT_SSL_ENFORCE和MYSQL_OPT_SSL_VERIFY_SERVER_CERT选项对应于客户端–ssl和–ssl-verifyservercert选项,不推荐使用。使用MYSQL_OPT_SSL_MODE,选项值为SSL_MODE_REQUIRED或SSL_MODE_VERIFY_IDENTITY。

  • 不推荐使用log_warnings系统变量和–log-warnings服务器选项。请改用log_error_verbosity系统变量。
  • 不推荐使用–temp-pool服务器选项。
  • binlog_max_flush_queue_time系统变量在MySQL 5.7中不执行任何操作,自MySQL 5.7.9起不再使用。
  • 从MySQL 5.7.10开始,不推荐使用innodb_support_xa系统变量,该变量支持InnoDB支持XA事务中的两阶段提交。自MySQL 5.7.10起,始终启用InnoDB对XA事务中两阶段提交的支持。
  • 不推荐使用metadata_locks_cache_size和metadata_locks_hash_instances系统变量。从MySQL 5.7.4开始,它们什么都不做。
  • 不推荐使用sync_frm系统变量。
  • 不推荐使用全局character_set_database和collat​​ion_database系统变量,将在未来版本的MySQL中将其删除。

不建议为会话分配系统变量character_set_database和collat​​ion_database,分配会产生警告。会话变量将在MySQL的未来版本中变为只读,并且赋值将产生错误。仍然可以访问会话变量以确定默认数据库的数据库字符集和排序规则。

  • 不推荐使用sql_log_bin系统变量的全局范围,现在只能使用会话范围设置此变量。语句SET GLOBAL SQL_LOG_BIN现在产生错误。仍然可以读取sql_log_bin的全局值,但这样做会产生警告。您现在应该采取行动,从您的应用程序中删除任何读取此值的依赖项;在MySQL 8.0中删除了全局范围sql_log_bin。
  • 随着MySQL 8.0中数据字典的引入, – ignore-db-dir选项和ignore_db_dirs系统变量变得多余,并在该版本中被删除。因此,它们在MySQL 5.7中被弃用。
  • GROUP BY默认情况下隐式排序(即,在没有ASC或DESC指示符的情况下),但不推荐依赖于MySQL 5.7中的隐式GROUP BY排序。要实现分组结果的特定排序顺序,最好使用To生成给定的排序顺序,对GROUP BY列使用显式ASC或DESC标识符或提供ORDER BY子句。 GROUP BY排序是一个MySQL扩展,可能在将来的版本中发生变化;例如,使优化器能够以其认为最有效的任何方式对分组进行排序,并避免排序开销。
  • 不推荐使用EXPLAIN语句的EXTENDED和PARTITIONS关键字。这些关键字仍然可以识别,但现在不再需要,因为它们的效果始终处于启
  • 不推荐使用ENCRYPT(),ENCODE(),DECODE(),DES_ENCRYPT()和DES_DECRYPT()加密函数。对于ENCRYPT(),请考虑使用SHA2()代替单向散列。对于其他人,请考虑使用AES_ENCRYPT()和AES_DECRYPT()。不推荐使用–des-key-file选项,has_crypt系统变量,FLUSH语句的DES_KEY_FILE选项和HAVE_CRYPT CMake选项。
  • 不推荐使用MBREqual()空间函数。请改用MBREquals()。
  • 第12.16.4节“从WKB值创建几何值的函数”中描述的函数以前接受WKB字符串或几何参数。不推荐使用几何参数。有关使用几何参数迁移查询的指南,请参阅该部分。
  • 不推荐使用INFORMATION_SCHEMA PROFILING表。请改用Performance Schema;请参见第25章,MySQL性能架构。
  • 不推荐使用INFORMATION_SCHEMA INNODB_LOCKS和INNODB_LOCK_WAITS表,将在MySQL 8.0中删除,它提供了替换的性能模式表。
  • 不推荐使用Performance Schema setup_timers表,并且在MySQL 8.0中将其删除,与performance_timers表中的TICK行一样。
  • 在SQL语句中将\ N作为NULL的同义词的处理不推荐使用,并在MySQL 8.0中删除;请改用NULL。

此更改不会影响使用LOAD DATA或SELECT … INTO OUTFILE执行的文本文件导入或导出操作,其中NULL继续由\ N表示。请参见第13.2.6节“LOAD DATA语法”。

  • 不推荐使用PROCEDURE ANALYZE()语法。
  • 不推荐使用mysql客户端剥离注释和控制它的选项(–skip-comments,-comments)。
  • 不推荐使用mysqld_safe对syslog输出的支持。请改用使用的本机服务器syslog支持。请参见第5.4.2节“错误日志”。
  • 不推荐将包含特殊字符的MySQL 5.1之前的数据库名称转换为5.1格式并添加#mysql50#前缀。因此,不推荐使用mysqlcheck的–fix-db-names和–fixtablenames选项以及ALTER DATABASE语句的UPGRADE DATA DIRECTORY NAME子句。

仅从一个版本系列到另一个版本系列支持升级(例如,5.0到5.1或5.1到5.5),因此将旧的5.0数据库名称转换为当前版本的MySQL几乎不需要。作为解决方法,在升级到更新版本之前,将MySQL 5.0安装升级到MySQL 5.1。

  • mysql_install_db功能已经集成到MySQL服务器mysqld中。要使用此功能初始化MySQL安装,如果您以前手动调用了mysql_install_db,则MySQL 5.7中不推荐使用的功能会使用–initialize或–initialize-insecure选项调用mysqld,具体取决于您是否希望服务器生成随机密码对于最初的“root”@“localhost”帐户。mysql_install_db现已弃用,mysql_install_db传递给mysqld的特殊–bootstrap选项也是如此。
  • 不推荐使用mysql_plugin工具。替代方案包括使用–plugin-load或–plugin-load-add选项在服务器启动时加载插件,或者在运行时使用INSTALL PLUGIN语句加载插件。
  • 不推荐使用resolveip实用程序。可以使用nslookup,host或dig。
  • 不推荐使用resolve_stack_dump实用程序。来自官方MySQL构建的堆栈跟踪始终是符号化的,因此不需要使用resolve_stack_dump。
  • 不推荐使用mysql_kill(),mysql_list_fields(),mysql_list_processes()和mysql_refresh()C API函数。相应的COM_PROCESS_KILL,COM_FIELD_LIST,COM_PROCESS_INFO和COM_REFRESH客户端/服务器协议命令也是如此。相反,使用mysql_query()分别执行KILL,SHOW COLUMNS,SHOW PROCESSLIST或FLUSH语句。
  • 不推荐使用mysql_shutdown()C API函数。相反,使用mysql_query()来执行SHUTDOWN语句。
  • 从MySQL 5.7.19开始,不推荐使用libmysqld嵌入式服务器库。这些也被弃用:
  1. mysql_config –libmysqld-libs, – embedded-libs和–embedded选项
  2. CMake WITH_EMBEDDED_SERVER,WITH_EMBEDDED_SHARED_LIBRARY和INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR选项
  3. (未记录的)mysql –server-arg选项
  4. mysqltest –embedded-server, – server-arg和–server-file选项
  5. mysqltest_embedded和mysql_client_test_embedded测试程序

因为libmysqld使用的API与libmysqlclient的API相当,所以远离libmysqld的迁移路径很简单:

  1. 打造一个独立的MySQL服务器(mysqld)。
  2. 修改应用程序代码以删除特定于libmysqld的API调用。
  3. 修改应用程序代码以连接到独立的MySQL服务器。
  4. 修改构建脚本以使用libmysqlclient而不是libmysqld。例如,如果使用mysql_config,则使用–libs选项而不是–libmysqld-libs调用它。
  • 不推荐使用replace实用程序。
  • 不推荐支持DTrace。
  • 从MySQL 5.7.22开始,不推荐使用JSON_MERGE()函数。请改用JSON_MERGE_PRESERVE()。
  • 自MySQL 5.7.24起,不支持在共享的InnoDB表空间中放置表分区。共享表空间包括InnoDB系统表空间和通用表空间。有关识别共享表空间中的分区并将其移动到每个表的文件表空间的信息,请参阅准备安装以进行升级。
  • 从MySQL 5.7.24开始,不推荐使用CREATE TEMPORARY TABLE支持TABLESPACE = innodb_file_per_table和TABLESPACE = innodb_temporary子句。
  • 不推荐使用–ndb perror选项。请改用ndb_perror实用程序。

 

MySQL 5.7中删除的功能

以下项目已过时,已在MySQL 5.7中删除。在显示替代方案的地方,应更新应用程序以使用它们。

对于使用MySQL 5.7中删除的功能的MySQL 5.6应用程序,从MySQL 5.6主服务器复制到MySQL 5.7从服务器时,语句可能会失败,或者可能对主服务器和从服务器产生不同的影响。为避免此类问题,应修改使用MySQL 5.7中删除的功能的应用程序以避免它们并尽可能使用替代方案。

  • 将删除对使用旧版pre-4.1密码哈希格式的密码的支持,这涉及以下更改。必须修改使用不再支持的任何功能的应用程序。
  1. mysql_old_password身份验证插件已删除。使用此插件的帐户在启动时被禁用,服务器会将“未知插件”消息写入错误日志。有关升级使用此插件的帐户的说明,请参见第6.4.1.3节“迁移远离4.1之前的密码散列和mysql_old_password插件”。
  2. 服务器和客户端程序的–secure-auth选项是默认选项,但现在是no-op。它已被弃用,将在未来的MySQL版本中删除。
  3. 不再支持服务器和客户端程序的–skip-secure-auth选项,使用它会产生错误。
  4. secure_auth系统变量只允许值为1;不再允许值为0。
  5. 对于old_passwords系统变量,不再允许值为1(产生pre-4.1的哈希值)。
  6. OLD_PASSWORD()函数已删除。
  • 在MySQL 5.6.6中,不推荐使用YEAR(2)数据类型。现在删除了对YEAR(2)的支持。升级到MySQL 5.7.5或更高版本后,任何剩余的YEAR(2)列必须转换为YEAR(4)才能再次使用。有关转换策略,请参见第11.3.4节“年限(2)限制和迁移到年份(4)”。例如,升级后运行mysql_upgrade。
  • innodb_mirrored_log_groups系统变量。唯一支持的值是1,所以它没有任何意义。
  • storage_engine系统变量。请改用default_storage_engine。
  • thread_concurrency系统变量。
  • timed_mutexes系统变量。它什么都不做,没有效果。
  • ALTER TABLE的IGNORE子句。
  • 不再支持INSERT DELAYED。服务器识别但忽略DELAYED关键字,将插入处理为非延迟插入,并生成ER_WARN_LEGACY_SYNTAX_CONVERTED警告。 (“不再支持INSERT DELAYED。语句已转换为INSERT。”)同样,REPLACE DELAYED作为非延迟替换处理。 DELAYED关键字将在以后的版本中删除。

此外,删除了几个与DELAYED相关的选项或功能:

  1. mysqldump的–delayed-insert选项。
  2. Performance Schema 的table_lock_waits_summary_by_table表的COUNT_WRITE_DELAYED,SUM_TIMER_WRITE_DELAYED,MIN_TIMER_WRITE_DELAYED,AVG_TIMER_WRITE_DELAYED和MAX_TIMER_WRITE_DELAYED列。
  3. mysqlbinlog不再写提及INSERT DELAYED的注释。
  • 使用.sym文件在Windows上进行数据库符号链接已被删除,因为使用mklink提供的本机符号链接支持是多余的。任何.sym文件符号链接都将被忽略,并应替换为使用mklink创建的符号链接。请参见第8.12.3.3节“在Windows上使用数据库的符号链接”。
  • mysql_upgrade的未使用的–basedir, – datadir和–tmpdir选项已被删除。
  • 以前,程序选项可以全部指定,也可以作为任何明确的前缀指定。例如,–compress选项可以作为–compr给mysqldump,但不能作为–comp,因为后者是不明确的。不再支持选项前缀;只接受完整选项。这是因为在为程序实现新选项时前缀可能会导致问题,并且当前明确的前缀可能在将来变得模糊不清。这种变化的一些含义:
  1. 现在必须将–key-buffer选项指定为–key-buffer-size。
  2. 现在必须将–skip-grant选项指定为–skip-grant-tables。
  • SHOW ENGINE INNODB MUTEX输出被删除。可以通过在Performance Schema表上创建视图来生成可比较的信息。
  • InnoDB表空间监视器和InnoDB表监视器已删除。对于Table Monitor,可以从InnoDB INFORMATION_SCHEMA表中获取等效信息。
  • 用于启用和禁用标准InnoDB监视器和InnoDB锁定监视器(innodb_monitor和innodb_lock_monitor)的特殊命名表将被删除并替换为两个动态系统变量:innodb_status_output和innodb_status_output_locks。有关其他信息,请参见第14.17节“InnoDB监视器”。
  • 已取消在MySQL 5.6.3中弃用的innodb_use_sys_malloc和innodb_additional_mem_pool_size系统变量。
  • msql2mysql,mysql_convert_table_format,mysql_find_rows,mysql_fix_extensions,mysql_setpermission,mysql_waitpid,mysql_zap,mysqlaccess和mysqlbug实用程序。
  • mysqlhotcopy实用程序。替代方案包括mysqldump和MySQL Enterprise Backup。
  • binary-configure.sh脚本。
  • 将删除INNODB_PAGE_ATOMIC_REF_COUNT个CMake选项。
  • innodb_create_intrinsic选项已删除。
  • innodb_optimize_point_storage选项和相关的内部数据类型(DATA_POINT和DATA_VAR_POINT)已被删除。
  • innodb_log_checksum_algorithm选项已删除。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/112110.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 面试 SQL整理 常见的SQL面试题:经典50题

    面试 SQL整理 常见的SQL面试题:经典50题目录​SQL基础知识整理:常见的SQL面试题:经典50题三、50道面试题2.汇总统计分组分析3.复杂查询sql面试题:topN问题4.多表查询【面试题类型总结】这类题目属于行列如何互换,解题思路如下:其他面试题:SQL基础知识整理:select查询结果如:[学号,平均成绩:组函数avg(成绩)]from从哪张表中查找数…

  • AES加密算法原理

    AES加密算法原理

  • SQL datetime和smalldatetime区别

    SQL datetime和smalldatetime区别datetime存储大小8个字节,精确到分后的3为小数,日期范围从1753年1月1日到9999年12月31日;而smalldatetime存储大小为4个字节,精确到分,日期范围从1900年1月1日到2079年6月6日。参考http://msdn.microsoft.com/zh-cn/library/ms187819%28v=…

  • PostgreSQL是什么?StackOverflow上开发者最爱和最想要的关系型数据库

    PostgreSQL是什么?StackOverflow上开发者最爱和最想要的关系型数据库

  • Linux系统负载LoadAverage详解

    Linux系统负载LoadAverage详解运维工程师在日常运维中经常使用w、top、uptime等命令来查看系统当前运行的负载情况。那么作为运维工程师是如何通过以上命令来判断系统当前负载是否已经达到极限了呢?为此笔者总结了一下如何通过loadaverage返回的数据来判断系统运行情况。什么是Load?什么是LoadAverage?Load用最通俗的语言说就是当前cpu需要干的工作量的多少。简单的说是进程队列的长度。

  • vim中多行注释和多行删除命令「建议收藏」

    vim中多行注释和多行删除命令「建议收藏」vim中多行注释和多行删除命令这些命令也是经常用到的一些小技巧,可以大大提高工作效率。.多行注释:首先按esc进入命令行模式下,按下Ctrl+v,进入列(也叫区块)模式;在行首使用上下键选择需要注释的多行;按下键盘(大写)“I”键,进入插入模式;然后输入注释符(“//”、“#”等);最后按下“Esc”键。注:在按下esc键后,会稍等一会才会出现注释,不要着急~~时间很短的2.删除多行注释:首先按esc进入命令行模式下,按下Ctrl+v,进入列模式;选定要取消注释的多行;

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号