共计 12101 个字符,预计需要花费 31 分钟才能阅读完成。
这篇文章主要介绍“MySQL5.7 新增了什么新特性”,在日常操作中,相信很多人在 MySQL5.7 新增了什么新特性问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL5.7 新增了什么新特性”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
新增特性
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 新增了什么新特性”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!