5.7新特性

本文仅翻译了5.7.4 新增和修改的属性,有兴趣的同学可以深入里面感兴趣的东西细看。

增强特性
  1. 安全:
    • 不支持老的password算法
    • 支持密码过期
    • 新装的机器只有root@localhost,匿名账户和test schema都不默认安装了。root密码第一次登录需要修改密码。
  2. sql mode默认值修改: NO_ENGINE_SUBSTITUTION to NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES.

  3. alter table 的rename index从copy table变成inplace

  4. Innodb增强:

    • varchar()字段变长部分支持inplace的online ddl。length bytes 变化和varchar()长度缩短都必须使用copy的方式来做ddl。length bytes:0-255 长度是1个字节;256和256以上长度是2字节。length bytes不变的话,支持inplace修改。length bytes变化的话,必须用copy算法
      ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256);
      ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change
      column type INPLACE. Try ALGORITHM=COPY.
    • CREATE TABLE, DROP TABLE, TRUNCATE TABLE, and ALTER TABLE 的DDL 临时表性能增强。啥都没说
    • innodb的临时表元信息不再存在innodb的系统表空间,而是存储再INNODB_TEMP_TABLE_INFO。从这个表可以查到当前活跃的临时表,不管是用户的还是系统帮忙创建的。
    • innodb支持mysql的空间数据。之前用BLOB现在用DATA_GEOMETRY支持。
    • 对非压缩的Innodb临时表有了专门的独立表空间。这个表空间默认在系统启动时自动在DATADIR上创建起来。另外,可以通过innodb_temp_data_file_path来指定文件路径。
    • innodchecksum增强。
    • innodb buffer pool dump和load增强了。通过innodb_buffer_pool_dump_pct参数控制buffer pool里面最近使用的page中有多少百分比读出并dump去。当InnoDB后台任务在做IO时,InnoDB通过 innodb_io_capacity来限制加载的速度。
    • InnoDB增加了对全文索引插件的支持。
    • Innodb对buffer pool instance提供多页清理线程。innodb_page_cleaners可以指定线程数。跟purge不同:
      purge: A type of garbage collection performed by a separate thread, running on a periodic schedule. The purge includes these actions: removing obsolete values from indexes; physically removing rows that were marked for deletion by previous DELETE statements. 清理index里面的过时数据,对delete删除的数据进行物理清除。cleaner是做脏页刷新的。
    • 支持InnoDB的普通和分区表 online ddl(ALGORITHM=INPLACE)OPTIMIZE TABLE ALTER TABLE … FORCE ALTER TABLE … ENGINE=INNODB (when run on an InnoDB table)。这样的话,online ddl能够缩减吃哦年间时间,允许并并发DML,用户的停机时间就减少了。
    • Fusion-io Non-Volatile Memory (NVM)文件系统支持 atomic write ,这样innodb doublewrite buffer比较多余了,对于把ibdata表空间文件存放在支持原子写的Fusion io上的时候,Innodb的doublewrite buffer会自动禁用掉
    • innodb 支持对分区表和单个的innodb表分区 Transportable Tablespace特性。这样,分区表备份,分区表在MySQL各个instance中迁移就方便了很多。
    • innodb_buffer_pool_size 可以在线修改,不用重启服务器了。通过 innodb_buffer_pool_chunk_size 来控制内存中的多少个页挪动。通过Innodb_buffer_pool_resize_status 监控buffer pool迁移状态。
      Active transactions, and operations performed through InnoDB APIs, should be completed before resizing the buffer pool. When initiating a resizing operation, the operation does not start until all active transactions are completed. Once the resizing operation is in progress, new transactions and operations that require access to the buffer pool must wait until the resizing operation finishes. The exception to this rule is that concurrent access to the buffer pool is permitted when defragmenting the buffer pool and withdrawing pages during an operation to decrease buffer pool size. A drawback of allowing concurrent buffer pool access while withdrawing pages is that there could be a temporary shortage of available pages during this phase of the resizing operation.
      活动事务/通过Innodb api进行的动作需要在buffer pool变更大小前做完。也就是说,resize buffer pool会一直等到active transaction完成之后才开始。这个动作开始后,新的事务和操作只要需要用到buffer pool都必须等到resizing完成。例外:当进行buffer pool碎片整理和释放page以便减少buffer pool时,可以访问buffer pool。允许在释放page时同时访问buffer pool的一个缺点是在这个resizing操作时有一个临时缺页的问题。
  5. 增强了MySQL存储过程。MySQL现在有了stacked diagnostics areas。对于执行过的SQL可以获得它返回的各种信息:
    mysql> DROP TABLE test.no_such_table;
    ERROR 1051 (42S02): Unknown table ‘test.no_such_table’
    mysql> GET DIAGNOSTICS CONDITION 1
    -> @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
    mysql> SELECT @p1, @p2;
    +——-+————————————+
    | @p1 | @p2 |
    +——-+————————————+
    | 42S02 | Unknown table ‘test.no_such_table’ |
    +——-+————————————+

  6. explain可以对正在运行的连接显示执行情况。如果你需要了解那些运行时间很长的会话SQL执行为什么这么慢,就可以用这种方法。

  7. trigger。之前在同一个表上的(insert,update,delete)的(before,after)只能加一个trigger。现在可以加多个了。

  8. mysql 客户端支持–syslog,这样mysql客户端提交的语句就会被记录到系统日志中。可以用来做审核和安全审计。

  9. Test suite. 现在使用innodb作为默认存储引擎

  10. mysql client中ctrl+c会中断真正执行的SQL,或者退出MySQL。但是新版本中只会中断SQL或者中断输入,不会退出MySQL了。

  11. mysqlbinlog现在也支持 –rewrite-db 在输出的时候把数据库名修改掉。mysql自身的复制是本来就支持这个特性的。现在给mysqlbinlog工具也增加了这个特性。

  12. handler 在5.7中支持分区表了。handler提供对表存储引擎的直接访问。比如HANDLER … OPEN 可以打开一张表,HANDLER tbl_name READ index_name =可以直接从存储引擎读一行数据。好处在于比select块,没有Server层的解析,快速。缺点在于没有数据快照,读到的数据可能是刚刚被其他session修改过的。

  13. 分区表 现在支持Index condition pushdown。

  14. alter table exchange artition现在可以忽略一行一行的验证数据。(without validation)

  15. 给slave发送binlog信息的master dump thread减少了锁竞争,增强了吞吐量。之前,master dump thread只要读一个event就要给binlog加一个锁,5.7.2之后,它只在读上次成功写入event的位置的时候加锁。这样多个线程同时读binlog文件也快了,就算binlog 文件正被写入,也没有问题。

  16. 扩展了GB18030字符集

  17. change master to部分情况下可以不用stop slave了。

    • SQL thread停掉时,change master可以修改relay_log_file,relay_log_pos,master_delay.
    • io thread 停掉时,你可以修改除relay_log_file,relay_log_pos,master_delay.以外的所有参数值。
    • io,SQL thread都停掉了,你可以修改master_auto_position=1
去掉的特性
  • insert delay 不支持了
  • show engine innodb mutex去掉了
  • innodb tablespace monitor/innodb table monitor也去掉了
  • innodb_monitor、innodb_lock_monitor去掉了.修改为两个系统变量
  • innodb_status_output、innnodb_status_output_locks.
    innodb_user_sys_malloc、innodb_additional_mem_pool_size去掉了。

Leave a Reply