千家信息网

MySQL5.7新增了什么新特性

发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,这篇文章主要介绍"MySQL5.7新增了什么新特性",在日常操作中,相信很多人在MySQL5.7新增了什么新特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"MySQL
千家信息网最后更新 2024年11月19日MySQL5.7新增了什么新特性

这篇文章主要介绍"MySQL5.7新增了什么新特性",在日常操作中,相信很多人在MySQL5.7新增了什么新特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"MySQL5.7新增了什么新特性"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

新增特性

Security improvements.
MySQL.user表新增plugin列,且若某账户该字段值为空则账户不能使用。从低版本MySQL升级至MySQL5.7时要注意该问题,且建议DBA将使用mysql_old_password插件的账户替换为使用 mysql_native_password插件。

数据库管理员可以制定账户密码自动过期策略,密码过期后必须强制进行更改。(http://dev.mysql.com/doc/refman/5.7/en/password-expiration-policy.html)

数据库管理员可以锁定/解锁账户来进行更好的登录控制,对应的,mysql.user表中新增account_locked列来表示锁定状态。版本升级过程中要注意该问题。(http://dev.mysql.com/doc/refman/5.7/en/account-locking.html)

MySQL Server可以自动创建SSL、RSA证书和Key文件来支持安全连接,前提是Server用OpenSSL编译(http://dev.mysql.com/doc/refman/5.7/en/creating-ssl-rsa-files-using-mysql.html)

MySQL默认的部署策略发生了变化,变得更加安全。mysql_install_db 弃用了,改用emysqld加-initialize或-initialize-insecure选项来初始化数据目录。使用-initialize时,默认只创建'root'@'localhost'账户并产生随机密码、设置密码过期,保存于error log,初次登录需使用密码并改变密码。不再创建匿名账户和test数据库。(http://dev.mysql.com/doc/refman/5.7/en/data-directory-initialization-mysqld.htmlhttp://dev.mysql.com/doc/refman/5.7/en/mysql-install-db.html)

SQL mode changes.
默认开启STRICT_TRANS_TABLES SQL mode。
ONLY_FULL_GROUP_BY SQL mode的实现更加精细,且默认开启。 ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE和NO_ZERO_IN_DATE默认开启(将来可能包含进strict SQL mode,而移除这些单独的模式),也即目前默认的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. (http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-changes)

Online ALTER TABLE.
支持RENAME INDEX从句且为in place操作无需table-copy,适用于各引擎。(http://dev.mysql.com/doc/refman/5.7/en/alter-table.html)

ngram and MeCab full-text parser plugins.
内置支持中日韩全文解析的ngram parser plugin和可安装的支持日文全文解析的MeCab plugin。

InnoDB enhancements.
VARCHAR 大小可通过 ALTER TABLE语句进行原地(in place)修改,而无需table-copy。如:ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);但存在限制,即只支持0~255字节内的或者255以上字节间的增加,也就是说若从254增到256时不能使用INPLACE算法,必须使用COPY算法,否侧报错.这是因为0~255内的VARCHAR值需要一个额外的字节来编码,而256以上的VARCHAR值需要两个字节来编码。另外使用INPLACE算法缩小VARCHAR的ALTER TABLE也是不支持的,必须用COPY算法。

InnoDB临时表的DDL性能提升。

InnoDB临时表元数据不再存储于InnoDB系统表而是存储在INNODB_TEMP_TABLE_INFO,包含所有用户和系统创建的临时表信息。该表在第一次在其上运行select时被创建。

InnoDB现在支持MySQL-supported空间数据类型。也即,之前的空间数据是以binary BLOB数据存储的,现在空间数据类型被映射到了一个InnoDB内部数据类型DATA_GEOMETRY.

对于non-compressed InnoDB临时表有独立的表空间,表空间在每次服务器重启时于默认的DATADIR中被重建,可通过innodb_temp_data_file_path选项指定其他路径。

innochecksum (离线的InnoDB文件校验工具),新增新的选择项或扩展的功能,如,可指定特定的校验算法、可以只重写校验值而不进行验证、可指定允许的校验和不匹配量、显示各类页的个数、导出页类型信息、输出至日志、从标准输入读取数据等。目前可支持超过2G的文件。(http://dev.mysql.com/doc/refman/5.7/en/innochecksum.html)

针对临时表及相关对象引入新的"non-redo" undo log,存放于临时表空间。该类型的undo log非 redolog 因为临时表不需崩溃恢复、也就无需redo logs,但却需要 undo log用于回滚、MVCC等。默认的临时表空间文件为ibtmp1,位于数据目录在每次服务器启动时被重新创建,可通过innodb_temp_data_file_path指定临时表空间。(http://dev.mysql.com/doc/refman/5.7/en/innodb-temporary-table-undo-logs.html)

可通过innodb_buffer_pool_dump_pct调整buffer pool中最近使用的页读取并dump的百分比。当有其他InnoDB后台任务所引起的I/O活动时,可通过 innodb_io_capacity 限制各I/O活动包括 buffer pool load 操作的频次。

InnoDB支持full-text parser 插件(http://dev.mysql.com/doc/refman/5.7/en/full-text-plugins.html)

支持多page cleaner线程从buffer pool中刷脏页,通过 innodb_page_cleaners配置线程数,默认值为1.

支持使用INPLACE算法的online DDL语句重建普通表和分区表:OPTIMIZE TABLE、ALTER TABLE … FORCE、ALTER TABLE … ENGINE=INNODB。

Linux系统中Fusion-io Non-Volatile Memory (NVM)文件系统提供了原子写能力,使InnoDB双写变得冗余。因此,MySQL5.7.4以后,对于支持原子写的Fusion-io设备上的系统表空间InnoDB doublewrite buffer会自动关闭。

对于分区表和独立的InnoDB表分区从MySQL5.7.4开始支持"可传输"表空间,使得分区表的备份步骤更加容易也使得在不同MySQl实例间拷贝分区表和独立的表分许成为可能。(http://dev.mysql.com/doc/refman/5.7/en/tablespace-copying.html)

可通过 innodb_buffer_pool_size 参数动态调整buffer pool大小,resize以chunk为单位,chunk大小通过 innodb_buffer_pool_chunk_size配置,另可通过Innodb_buffer_pool_resize_status 状态变量观察调整过程。(http://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool-online-resize.html)

MySQL5.7.5开始Multi-threaded page clean也在shutdown和recover阶段被支持。

MySQL5.7.5后支持空间数据类型上建索引。且可通过 ALTER TABLE … ADD SPATIAL INDEX ALGORITHM=INPLACE进行在线操作。

创建和重建索引时支持bulk load,该方法被称为"sorted index build",提升了索引创建效率,支持全文索引但不支持空间索引。可通过innodb_fill_factor定义每个页的填充因子,剩余的空间用于将来的索引增长。(http://dev.mysql.com/doc/refman/5.7/en/sorted-index-builds.html)

使用新的日志记录类型(MLOG_FILE_NAME)来识别上一个检查点以来发生变化的表空间。这简化了崩溃恢复时的表空间发现,消除了redo log应用之前的文件系统扫描。 (http://dev.mysql.com/doc/refman/5.7/en/innodb-recovery-tablespace-discovery.html).需要注意的是这一行为导致了redo log格式的变化,所以升级至MySQL5.7.5或者从改版本降级时需完全关闭MySQL。

可通过配置 innodb_undo_log_truncate来truncate undo表空间中的undo logs。系统表空间内的undo logs不会被truncate。(默认情况下undo log存储于系统表空间,可通过innodb_undo_directory、 innodb_undo_logs、 innodb_undo_tablespaces进行调整。http://dev.mysql.com/doc/refman/5.7/en/truncate-undo-tablespace.html )

支持本地化分区(native partitioning),之前需依赖ha_partition handler为每个分区创建handler对象,现在只需一个partition-aware handler对象,节约了内存。(可通过mysql_upgrade或者ALTER TABLE … UPGRADE PARTITIONING将老方法建的分区表升级为新的)。

支持使用CREATE TABLESPACE语句创建通用表空间。并可以通过 CREATE TABLE tbl_name … TABLESPACE [=] tablespace_name 或者 ALTER TABLE tbl_name TABLESPACE [=] tablespace_name将表添加到创建的通用表空间。(http://dev.mysql.com/doc/refman/5.7/en/general-tablespaces.html)

可通过 innodb_default_row_format指定InnoDB表的默认行格式,新版本的默认值有COMPACT替换为了DYNAMIC 。

JSON support.
MySQL5.7.8开始原生支持JSON数据类型,不再以字符串形式存储而是以二进制格式存储,允许快速读取文档元素。JSON列在插入或更新时会自动进行验证,文档格式不正确会报错。除了可用常用比较操作符进行比较外还引入一系列函数用于处理JSON类型。(http://dev.mysql.com/doc/refman/5.7/en/json.html)

System and status variables. (http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
优先从performance_schema下的表中获取系统变量和状态变量信息(老版本从information_schema下的表中获取,这些表将来会被移除),这对show variables 和show status语句也有影响,也即信息源来自于performance_schema。若想使用原来的表获取信息可开启show_compatibility_56 参数(不推荐,只作为升级过程中的辅助工具,将来会被移除)。(http://dev.mysql.com/doc/refman/5.7/en/performance-schema-variable-table-migration.html)

sys schema.
包含sys库,存储从performance_schema收集用来辅助DBA和开发者的信息的相关对象,如,表和触发器、视图、存储过程
、存储函数等,可用以调优和问题诊断。(http://dev.mysql.com/doc/refman/5.7/en/sys-schema.html)

Condition handling.

Optimizer.
explain可以用来获取其他SESSION/CONNECTION中正在运行的语句的执行计划(前提条件是正在运行语句且语句类型支持EXPLAIN),语法为:EXPLAIN [options] FOR CONNECTION connection_id;其中connection_id即连接id,可由information_schema.processlist或者CONNECTION_ID()获取。
支持在语句中(以往是在optimizer_switch系统变量里)提供优化器提示信息以便于对语句的执行计划进行更还的控制。同样,在使用explain/desc查看执行计划时也可以在语句中使用优化提示,以便于查看优化提示是如何影响执行计划的。(http://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html

Triggers.
之前的版本每个表上对于某一触发事件(insert\update\delete)和触发时机(before\after)的组合只能有一个触发器,新版本取消了这一限制。比如:值之前的版本,创建了如下触发器后CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;不能在创建另外的基于 BEFORE INSERT ON account的触发器了,新版本可以,只要触发器不同名即可。

Logging.
之前版本,Unix或类Unix系统上的MySQL支持将错误日志发送到syslog,具体是通过mysqld_safe捕获错误输出然后传递到syslog来实现的。新的版本原生支持将错误日志输出到syslog,且适用于windows系统,只需要通过简单的参数(log_syslog等)配置即可。(http://dev.mysql.com/doc/refman/5.7/en/error-log.html

mysql支持-syslog选项,可将交互式的语句输出到系统的syslog中(Unix或类Unix系统下一般是/var/log/message)。对于匹配"ignore"过滤规则(可通过 -histignore选项或者 MYSQL_HISTIGNORE环境变量进行设置)的语句不会被记入。关于mysql客户端的日志使用参见:http://dev.mysql.com/doc/refman/5.7/en/mysql-logging.html

Generated Columns.
CREATE TABLE 和 ALTER TABLE语句支持Generated Columns.也即,列的值由其他列计算而得,这个计算列值的表达式在列定义中给出,当有行插入或者更新时列值被计算并存储。(http://dev.mysql.com/doc/refman/5.7/en/create-table.html#create-table-generated-columns

mysql client.
之前mysql客户端运行时若有语句正在运行Control+C会终止语句,若没有语句正在运行则会退出mysql客户端。新版本中不会退出mysql客户端。

Database name rewriting with mysqlbinlog.
mysqlbinlog工具添加新的选项-rewrite-db,支持从行复制格式的二进制日志中读取事件时将数据库名重写 -rewrite-db='dboldname->dbnewname'.可以通过指定多次该参数来指定多个重写规则。

HANDLER with partitioned tables.
可以在分区表上使用HANDLER(http://dev.mysql.com/doc/refman/5.6/en/handler.html)

Index condition pushdown support for partitioned tables.
使用InnoDB或者MyISAM的分区表上的查询支持使用ICP(http://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html

WITHOUT VALIDATION support for ALTER TABLE … EXCHANGE PARTITION.
ALTER TABLE … EXCHANGE PARTITION语句包含{WITH|WITHOUT} VALIDATION 从句,默认为WITH VALIDATION ,会逐行验证交换过来的值是否满足分区边界定义。若指定了WITHOUT VALIDATION则不进行验证。(http://dev.mysql.com/doc/refman/5.7/en/partitioning-management-exchange.html)

Master dump thread improvements.
master dump thread进行了重构来减少锁争用提升master吞吐量。之前的版本中只要读取一个时间dump thread就要获取锁;MySQL5.7.2和后续版本中,只有从最近一次成功写入的事件末位位置读取时才会获取锁。这意味值多个dump threads可并发读取二进制日志,且可以在客户端向二进制日志写入时读取。

Globalization improvements.
开始包含gb18030字符集,支持 China National Standard GB18030 字符集。

Changing the replication master without STOP SLAVE.
新版本MySQL主从复制时在执行CHANGE MASTER TO语句前可不必执行 STOP SLAVE。此时,CHANGE MASTER语句的行为依赖于slave的SQL线程和IO线程;两个线程的启/停决定了某一时刻CHANGE MASTER TO语句中可以/不可以使用的选项。具体规则如下:

· 若SQL线程停止,则可在CHANGE MASTER TO语句中使用 RELAY_LOG_FILE,
RELAY_LOG_POS和MASTER_DELAY
选项的组合,即时是IO线程正在运行中也无妨。若此时IO线程还在运行则不能运行除上述选项之外的选项。

· 若IO线程停止,则可以在CHANGE MASTER TO语句中使用除了RELAY_LOG_FILE,
RELAY_LOG_POS和MASTER_DELAY 选项之外的任何选项的组合,即时是SQL线程正在运行也无妨。

· 在运行CHANGE MASTER TO…MASTER_AUTO_POSITION=1之前SQL线程和IO线程必须停止。

可通过 SHOW SLAVE STATUS命令检查SQL线程和IO线程运行状态。
之前的版本中若使用基于语句的复制且有临时表那么在执行STOP SLVAVE后执行CHANGE MASTER TO可能在远slave上留下临时表。新版本中会给出警告,如果在执行CHANGE MASTER TO使Slave_open_temp_tables 仍为0.

Test suite.
测试套件现在使用InnoDB作为默认存储引擎

Multi-source replication is now possible.
开始支持多源复制也即从多个master向某一个salve复制。用于将多个server备份到单个server、合并表shard、从多个server合并数据到单个server等(目前不提供冲突检测和解决方案,交由应用层处理。http://dev.mysql.com/doc/refman/5.7/en/replication-multi-source.html)。

随多源复制而引入的另外一项技术为复制信道(replication channels),Replication channels 使slave可以打开多个连接,每个信道连接至不同的master进行复制。(http://dev.mysql.com/doc/refman/5.7/en/replication-channels.html)

Group Replication Performance Schema tables.
performance_schema中新增一批表提供复制组相关信息(http://dev.mysql.com/doc/refman/5.7/en/performance-schema-replication-tables.html)

Group Replication SQL.
引入如下两条组复制控制语句:(http://dev.mysql.com/doc/refman/5.7/en/replication-group-sql.html)
START GROUP_REPLICATION
STOP GROUP_REPLICATION

废弃特性

如下特性在MySQL5.7中不推荐使用,可能在将来的版本中被移除:
ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE和NO_ZERO_IN_DATE几个sql mode不赞成使用了(但目前默认开启),长远的计划是将这个mode包含进 strict mode而明确移除这几个单独的mode。
关于账户管理语句有一下不赞成再使用的特性:

不推荐使用GRANT语句创建用户,而推荐使用CREATE USER语句创建。这样一来NO_AUTO_CREATE_USER这一sql mode对于GRANT语句也就没什么意义了,所以也将降级。

不推荐使用GRANT语句修改账户属性,而仅用于账户赋权。账户属性通过CREATE USER或者ALTER USER在创建或修改时赋予或者改动;

不推荐使用IDENTIFIED BY PASSWORD 'hash_string' 语法,推荐使用IDENTIFIED WITH auth_plugin AS 'hash_string' ;

不推荐使用SET PASSWORD语句和PASSWORD()函数,而推荐使用ALTER USER来修改账户密码;

不推荐使用old_password系统变量。

不推荐使用GROUP BY隐式排序,推荐明确使用ORDER BY从句。(GROUP BY排序只是MySQL的扩展语法,可能在将来版本移除)

不推荐使在EXPLAIN语句中使用EXTENDED和PARTITIONS关键字(仍可被识别但在新版本中已不必要。)
-skip-innodb以及-innodb=OFF, -disable-innodb等不赞成使用,因为新版本中InnoDB不能能被禁止了。

不推荐使用log_warnings系统变量和-log_warnings选项,推荐使用 log_error_verbosity 。

binlog_max_flush_queue_time 在新版本中已失效。

innodb_support_xa 在新版本中无效,因为XA事务的两阶段提交在MySQL5.7中默认支持。

metadata_locks_cache_size和metadata_locks_hash_instances、sync_frm、 character_set_database、collation_database系统变量不再起作用。

ENCRYPT(), ENCODE(), DECODE(), DES_ENCRYPT()和DES_DECRYPT() 不推荐使用,建议使用 AES_ENCRYPT() 和 AES_DECRYPT()。

请使用MBREquals()替代MBREqual()。

请使用Performance Schema替代INFORMATION_SCHEMA.PROFILING。

请使用原生的syslog替代mysqld_safe支持的syslog输出。

mysqlcheck工具的-fix-db-names和-fix-table-names选项不推荐使用,以及ALTER DATABASE语句的UPGRADE DATA DIRECTORY NAME从句不推荐使用。

移除特性

对pre-4.1版本的密码hash格式的支持被移除,相关联的,old_passwords系统变量、 OLD_PASSWORD()函数被移除,mysql_old_password认证插件被移除,-secure-auth选项无效且将在后续版本移除、 secure_auth 变量值允许为1,-skip-secure-auth被移除。

YEAR(2)不再被支持,请使用YEAR(4).

innodb_mirrored_log_groups被移除。

使用default_storage_engine代替storage_engine。

thread_concurrency、timed_mutexes 系统变量。

ALTER TABLE的IGNORE从句。

INSERT DELAYED 、 REPLACE DELAYED 中的DELAYED会被忽略,相关联的mysqldump中的-delayed-insert 选项被移除,performance_schema.table_lock_waits_summary_by_table中相关列被移除,mysqlbinlog不再为INSERT DELAYED注解。

Windows系统中使用.sys文件的Database symlinking被移除而使用支持native symlink 的mylink。(http://dev.mysql.com/doc/refman/5.7/en/windows-symbolic-links.html)

mysql_upgrade中的-basedir, -datadir 和-tmpdir 选项。
选项前缀不再被支持,只支持使用选项全名,比如要用-key-buffer-size而不能用-key-buffer,还有-skip-grant-tables与-skip-grant等。

SHOW ENGINE INNODB MUTEX输出被移除,可通过Performance Schema表上创建视图获取相关信息。

InnoDB表空间监控和InnoDB表监控被移除。表监控信息可通过INFORMATION_SCHEMA表获取。

用于启用和禁用InnoDB Monitor以及InnoDB Lock Monitor的特殊命名的表被移除,由 innodb_status_output和innodb_status_output_locks两个动态的系统变量取代.(http://dev.mysql.com/doc/refman/5.7/en/innodb-monitors.html

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 、innodb_log_checksum_algorithm 选项被移除。

到此,关于"MySQL5.7新增了什么新特性"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

支持 语句 系统 空间 推荐 数据 可通 版本 线程 变量 账户 运行 存储 信息 类型 特性 密码 日志 文件 分区表 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云服务器怎么可以使用 2M云服务器 海南网络技术服务概况 迈克菲网络安全误杀 广东金众互联网信息科技有限公司 大数据时代网络安全防护 汉狮网络安全海报 使用网络技术定做价格 支付软件开发哪家好 北京回收服务器估价虚拟主机 一般网络安全设备需要哪些配置 杭州鲲鹏系列服务器厂家供应 dns转发服务器的IP地址 管理服务器 数据库服务器 网络安全微信稿 赣县区网络安全大队 数据库自动执行语句 中国科技部互联网创新创业 神奇宝贝服务器怎么换皮肤 数据库中数据记录 网络技术公司招聘的英语作文 山东工程项目管控软件开发平台 上海微型网络技术型号 湖南质量软件开发过程服务标准 传奇服务数据库非法连接 江苏数据库防护箱推荐厂家 计算机网络服务器管理员密码 新冠集采的核酸证明会入数据库吗 数据库系统组成及作用 连接数据库的中间件有哪些
0