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