mysql5.7新特性探究

一、MySql5.7增加的特性

1、MySql服务方面新特性

1) 初始化方式改变

  • MySql5.7之前版本初始化方式:
scripts/mysql_install_db
  • MySql5.7版本初始化方式:
[[email protected] mysql_new]# ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql_new/ --datadir=/usr/local/mysql_new/data/

2015-10-10T06:19:06.463455Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2015-10-10T06:19:10.230200Z 0 [Warning] InnoDB: New log files created, LSN=45790
2015-10-10T06:19:10.766701Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2015-10-10T06:19:10.972179Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: d21c9212-6f16-11e5-8cb9-000c296da6f8.
2015-10-10T06:19:10.979028Z 0 [Warning] Gtid table is not ready to be used. Table ‘mysql.gtid_executed‘ cannot be opened.
2015-10-10T06:19:10.982274Z 1 [Note] A temporary password is generated for [email protected]: u=SwU?ClN9fR

初始化完成后为[email protected]用户提供一个默认密码,5.7版本之前密码是空的,还是为安全考虑。

第一次进入mysql命令行,强制修改密码,否则你无法进行任何操作:

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> select user,host,password from mysql.user;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> create table t1(id int auto_increment not null,c1 int ,c2 int ,c3 int primary key(id));
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> create database tt;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.mysql> alter user [email protected] identified by "root";Query OK, 0 rows affected (0.01 sec)mysql> show databases;

+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)

mysql5.7版本中还去掉了test库。

2) MySql5.7版本支持为表添加计算列

所谓计算列,就是通过其他列计算得到的值。

  • 5.7之前版本实现计算列一般通过触发器实现。如下:
mysql> create trigger insr_tig before insert on t1 for each row set new.c3=new.c1+new.c2;
Query OK, 0 rows affected (0.09 sec)

mysql> create trigger upd_tig before update on t1 for each row set new.c3=new.c1+new.c2;
Query OK, 0 rows affected (0.01 sec)

mysql> show triggers;
+----------+--------+-------+--------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| Trigger  | Event  | Table | Statement                | Timing | Created                | sql_mode                                                                          | Definer        | character_set_client | collation_connection | Database Collation |
+----------+--------+-------+--------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| insr_tig | INSERT | t1    | set new.c3=new.c1+new.c2 | BEFORE | 2015-10-10 14:45:31.28 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
| upd_tig  | UPDATE | t1    | set new.c3=new.c1+new.c2 | BEFORE | 2015-10-10 14:45:55.33 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+----------+--------+-------+--------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
2 rows in set (0.00 sec)

mysql> insert into t1(c1,c2) values(1,2);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 |    2 |    3 |
+----+------+------+------+
1 row in set (0.00 sec)

mysql> update t1 set c1=5 where id=1;
Query OK, 1 row affected (0.08 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t1;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    5 |    2 |    7 |
+----+------+------+------+
1 row in set (0.00 sec)
  • 5.7版本实现计算列只需要在建表/修改表时添加列的as参数就可以了,如下:
mysql> create table t2(id int auto_increment not null,c1 int ,c2 int ,c3 int as(c1+c2),primary key(id));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t2(c1,c2) values(2,3);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t2;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    2 |    3 |    5 |
+----+------+------+------+
1 row in set (0.00 sec)

mysql> update t2 set c1=10 where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t2;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |   10 |    3 |   13 |
+----+------+------+------+
1 row in set (0.00 sec)

3) 引入JSON列数据类型及相关函数

  • 5.7版本之前,只能在varchar或是text等字符类型的列中存储json类型的字符串,并通过程序解析使用json字符串。
  • 5.7版本:增加了json列类型以及json_开头的函数,如json_type(),json_object(),json_merge()等
mysql> show create table json_test;
+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table     | Create Table                                                                                                                                          |
+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| json_test | CREATE TABLE `json_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `jos` json NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select json_object("key1",1,"key2",2);
+--------------------------------+
| json_object("key1",1,"key2",2) |
+--------------------------------+
| {"key1": 1, "key2": 2}         |
+--------------------------------+
1 row in set (0.00 sec)

mysql> insert into json_test(jos) values(json_object("key1",1,"key2",2));
Query OK, 1 row affected (0.00 sec)

mysql> select * from json_test;
+----+------------------------+
| id | jos                    |
+----+------------------------+
|  1 | {"key1": 1, "key2": 2} |
+----+------------------------+
1 row in set (0.00 sec)

2、MySql5.7在复制中的新特性

1)支持多源复制

MySql5.7之前版本是不支持多源复制的,也就是多主一从,我们一般都是这样的架构形式:

但是MySql5.7版本为我们实现了多主一从的方式,这种方式也有很多用处,比如我们利用从库备份,以前都是一主一从,现在可以将多主复制到一从上,这样省了很多机器,节约了成本。

2)基于库或者逻辑锁的多线程复制

  • Mysql5.7版本之前:

从5.6版本开始支持多线程复制,只不过是对于每个数据库一个复制线程,作用不是很大。

  • MySql5.7版本:

增加了slave_parallel_type参数进行并发控制,用户可以选择database还是logical_lock,如果logical_lock实现了基于事务的多线程复制。

3)在线变更复制方式

  • MySql5.7之前

要把基于日志点的复制方式变为基于GTID的复制方式或者把基于GTID的复制方式变为基于日志点的复制方式必须要重启master服务器。

  • MySql5.7之后

可以在线变更,不需要重启服务器

3、MySql5.7在Innodb中的新特性

1)支持在线变更innodb_buffer_pool大小

  • MySql5.7之前:

要变更innodb_buffer_pool大小必须更改my.cnf文件后重启数据库服务器方生效。

  • MySql5.7之后:

变为动态参数,可以在线调整大小。

2)增加innodb_buffer_pool导入导出功能

  • MySql5.7之后:

增加以下参数控制innodb_buffer_pool的导入导出

innodb_buffer_pool_dump_pct

innodb_buffer_pool_dump_now

innodb_buffer_pool_dump_at_shutdown

innodb_buffer_pool_load_at_startup

innodb_buffer_pool_load_now

3)支持为Innodb建立表空间

  • MySql5.7之前:

具有系统共享表空间和为每个表建立的独立表空间

  • MySql5.7之后:

支持create tablespace语法为一个表或者多个表建立公用表空间。

时间: 2024-12-27 20:26:47

mysql5.7新特性探究的相关文章

MySQL5.7新特性——gtid基础

1.MySQL5.7 新特性:gtid复制 ①:GTID是什么 是事务的ID,唯一识别号,全局唯一. 随事务记录到Binary Log中,用来标识事务. 每个事务有一个Gtid_log_event. ②:GTID的构成 UUID + Sequence Number 注意:Sequence Number是MySQL服务器内部的一个事务顺序号.一个MySQL服务器上的事务不会有重复的顺序号(保证服务器内唯一). 每个MySQL服务器有一个全局唯一的UUID. ③:GTID的目的 简化复制的使用过程和

Java 8新特性探究(八)精简的JRE详解

http://www.importnew.com/14926.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 Java 8新特性探究(八)精简的JRE详解 2015/02/05 | 分类: 基础技术 | 0 条评论 | 标签: JRE 分享到:2 原文出处: 成熟的毛毛虫的博客 Oracle公司如期发布了Java 8正式版!没有让广大javaer失望.对于

[MySQL5.6 新特性] 全局事务标示符(GTID)

GTID的全称为 global transaction identifier  , 可以翻译为全局事务标示符,GTID在原始master上的事务提交时被创建.GTID需要在全局的主-备拓扑结构中保持唯一性,GTID由两部分组成: GTID = source_id:transaction_id source_id用于标示源服务器,用server_uuid来表示,这个值在第一次启动时生成,并写入到配置文件data/auto.cnf中 transaction_id则是根据在源服务器上第几个提交的事务来

MySQL5.6 新特性之GTID【转】

转自 MySQL5.6 新特性之GTID - jyzhou - 博客园http://www.cnblogs.com/zhoujinyi/p/4717951.html 背景: MySQL5.6在5.5的基础上增加了一些改进,本文章先对其中一个一个比较大的改进"GTID"进行说明. 概念: GTID即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的.其中UUID是一个MySQL实例的唯一标识.TID代表了该实例上已经提交的

mysql-5.6新特性

1. undo log undo log分离到独立的表空间,并放到单独的文件目录下:这给我们部署不同IO类型的文件位置带来便利,对于并发写入型负载,我们可以把undo文件部署到单独的高速存储设备上. 1.1. 设置 vim /etc/my.cnf [mysqld] innodb_undo_directory=/data/undolog innodb_undo_log=128 innodb_undo_tablespaces=16 1.2. 说明 innodb_undo_directory 用来指定

[转]Java 8新特性探究(lambda)

原文地址:http://my.oschina.net/benhaile/blog/175012 目录[-] 函数式接口 Lambda语法 方法引用 总结 函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是只包含一个方法的接口.比如Java标准库中的java.lang.Runnable和 java.util.Comparator都是典型的函数式接口.java 8提供 @FunctionalInterface作为注解,这个注解

MySQL5.7新特性——在线收缩undo表空间

1. MySQL 5.5时代的undo log 在MySQL5.5以及之前,大家会发现随着数据库上线时间越来越长,ibdata1文件(即InnoDB的共享表空间,或者系统表空间)会越来越大,这会造成2个比较明显的问题: (1)磁盘剩余空间越来越小,到后期往往要加磁盘: (2)物理备份时间越来越长,备份文件也越来越大. 这是怎么回事呢? 原因除了数据量自然增长之外,在MySQL5.5以及之前,InnoDB的undo log也是存放在ibdata1里面的.一旦出现大事务,这个大事务所使用的undo

MySQL5.6 新特性之GTID

MySQL5.6在5.5的基础上增加了一些改进,本文章先对其中一个一个比较大的改进"GTID"进行说明. 概念: GTID 即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的.其中UUID是一个MySQL实例的唯一标识.TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增.下面是一个GTID的具体形式: 4e659069-3cd8-11e5-9a49-001c4270714e:1-77 更具体的说明见 官方

mysql5.7新特性

mysql5.7版本出来后还是有大量的修改以及一些调优,修复一些bug,删掉了一些旧的参数,在这里就简单的整理一下 因为平时都是使用二进制包安装mysql,所以这里就以mysql的二进制包部署开始.首先,mysql的安装初始化抛弃了旧版的mysql_install_db而使用mysqld --initialize初始化,在完成初始化后mysql的root密码并不是空密码,而是在初始化后会给出一个随机密码,要正常使用时需要在改掉密码后才可以使用,在mysql其他的安装部分都和以前的版本都是一样的