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;