MySQL 5.7新特性
服务器功能增强
数据库初始化方式变更
支持为表增加计算列
引入JSON列类型及相关函数
数据库初始化方式变更
5.7之前
Scripts/mysql_install_db\
--datadir=/data/sql_data \
--user=mysql --basedir=home
Bin/mysqld --initialize --user=mysql \
--basedir=/home/mysql\
--datadir=/home/mysql/data
Docker 容器中数据库数据持久化(Ubuntu系统)
docker run -d --name wen-mysql -e MYSQL_ROOT_PASSWORD=wen mysql
docker exec -it wen-mysql /bin/bash
mkdir -p /opt/data/mysql
docker run -d -v /opt/data/mysql/:/var/lib/mysql -p 3306:3306 --name wen-mysql -e MYSQL_ROOT_PASSWORD=wen mysql
注释:-p 3306:3306->把容器的mysql端口3306映射到宿主机的3306端口
-v /opt/data/mysql:/var/lib/mysql->把宿主机/opt/data/mysql/目录映射到容器的/var/lib/mysql目录
在使用-v选项映射目录时,宿主机需关闭SElinux: setenforce 0
支持为表增加计算列
在CREATE TABLE 及ALTER TABLE 语句中支持增加计算列的方式
col_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [UNIQUE [KEY]] [COMMENT comment] [[NOT] NULL] [[PRIMARY]KEY ]
CREATE TABLE t(id INT auto_increment not null,c1 int,c2 int,c3 int, primary key(id));
DESC t;
CREATE TRIGGER insert_t BEFORE INSERT ON t FOR EACH ROW SET new.c3=new.c1+new.c2;
SHOW TRIGGERS;
-- 插入触发器
INSERT INTO t(c1,c2) VALUES(1,2);
SELECT * FROM t;
-- 更新触发器
CREATE TRIGGER update_t BEFORE UPDATE ON t FOR EACH ROW SET new.c3=new.c1+new.c2;
SHOW TRIGGERS;
UPDATE t set c1=5 WHERE id =1;
-- 视图
CREATE view vw_t as SELECT id,c1,c2,c1+c2 as c3 FROM t;
SHOW TABLE STATUS WHERE COMMENT='view';
SELECT * FROM vw_t;
DROP TABLE t;
DROP TABLE vw_t;
SHOW TRIGGERS;
-- 计算列
CREATE TABLE t(id INT auto_increment not null,c1 int,c2 int,c3 int AS (c1+c2), primary key(id));
SHOW CREATE TABLE t;
INSERT INTO t(c1,c2) VALUES(1,2);
SELECT * FROM t;
UPDATE t set c1=5 WHERE id =1;
SHOW TRIGGERS;
引用JSON列类型及相关函数
SELECT json_array('a','b',NOW());
SELECT json_object('key1',1,'key2',2);
CREATE TABLE t1(jdoc json);
INSERT INTO t1(jdoc) VALUES(json_array('a','b',NOW()));
Replication相关增强
支持多源复制
基于库或是逻辑锁的多线程复制
在线变更复制方式
多源复制(为每一个数据源定义一个channel)
一从多主(一个从服务器配置多个主服务器,将主服务器的数据汇笼)
场景:主服务器分库分表,数据划分到不同的主服务器,为实现数据汇总功能
基于表的多线程复制
从MySQL5.6开始支持多线程复制,但是是对于每一个库一个复制线程
MySQL5.7后对多线程复制功能增强,增加slave_parallel_type参数可以控制并发同步是基于database还是logical_clock(逻辑锁:逻辑时间戳)
在线变更复制方式
MySQL5.7之前要把基于日志点的复制方式变为基于gtid的复制方式或是吧基于gtid的复制方式变为基于日志点的复制方式必须重启master服务器
MySQL5.7之后 允许在线变更列复制的方式,而不用重启master服务器
- SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY=WARN;执行完这一步后要保证所有服务器没有警告发生。
- SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY=ON;
- SET @@GLOBAL..GTI_MODE=OFF_PERMISSIVE;
- SET @@GLOBAL.GTID_MODE=ON_PERMISSIVE;
- SHOW STATUS LIKE ‘ONGOING_ANONYMOUS_TRANSACTION_COUNT’;
- 6SET @@GLOBAL.GTID_MODE=ON;并加gtid-mode=ON到my.cnf.
- STOP SLAVE[FOR CHANNEL ‘channel’];
CHANGEMASTER TO MASTER_AUTO_POSITION=1 [FOR CHANNEL ‘channel’];
START SLAVE [FOR CHANNEL ‘channel’];
Innodb引擎增强
支持缓冲池大小在线变更
Innodb_buffer_pool_size参数变为动态参数,可以在线调整innodb缓存池的大小
增加innodb_buffer_pool导入导出功能
增加以下参数控制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
支持为innodb表建立表空间
Mysql5.7前 具有系统表空间及可以为每个表建立一个的独立表空间。
MySQL5.7后 支持CREATE TABLESPACE语法为一个表或多个表建立共用的表空间
使用公用表空间/系统表空间的时候,回收磁盘空间不方便,不能直接drop。而独立表空间则可以直接回收
SHOW VARIABLES LIKE 'innodb_buffer%';
-- 缓冲池大小
SELECT 134217728/(1024*1024);
SET GLOBAL innodb_buffer_pool_dump_now=on;
SHOW VARIABLES LIKE ‘innodb_buffer_pool%’;
CREATE TABLESPACE ts1 ADD datafile 'ts1.ibd' ENGINE=INNODB;
-- 建立公用表空间 (多表共享数据)
CREATE TABLE t2(c1 int PRIMARY KEY) TABLESPACE ts1;
SHOW CREATE TABLE t2;
安全及管理方面的增强
不再支持old_password认证(mysql_native_password使用)
增加账号默认过期时间及加强了对账号的管理功能
增加sys管理数据库
USE mysql;
SELECT * FROM user;
SELECT * FROM user \G;
SHOW DATABASES;
USE sys;
SHOW TABLES;
SHOW CREATE TABLE statement_analysis;