MySQL5.7的新特性


MySQL 5.7版本據說已經在了很大的性能提升以及做得更加安全了,想了解更多MySQL 5.7的新特性可以參考我轉載葉金榮老師的MySQL 5.7的新特性說明。這里我簡單演示一下MySQL 5.7的安裝已經一些新特性的使用,希望大家能一起進去,一起探討技術。

MySQL 5.7的官方下載地址:http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz

 

下面簡單介紹一下安裝:

[root@MySQL soft]# tar xf mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz -C /data/service/
[root@MySQL soft]# cd /data/service/
[root@MySQL service]# mv mysql-5.7.10-linux-glibc2.5-x86_64/ mysql-5.7.10

下面進行數據目錄的創建以及授權:

[root@MySQL service]#  mkdir /data/{mysql3306,mysql3306log} -p
[root@MySQL service]# groupadd mysql
[root@MySQL service]# useradd -r -g mysql mysql
[root@MySQL service]# chown -R mysql:mysql mysql-5.7.10/
[root@MySQL service]# chown -R mysql:mysql /data/mysql3306*

基本操作已經完成,下面進行初始化操作,在MySQL 5.7的初始化操作與MySQL 5.6有點不同了,下面在MySQL 5.7的版本用MySQL 5.6的初始化方式進行操作一下,讓大家看下會報什么錯:

[root@MySQL mysql-5.7.10]# ./bin/mysql_install_db --user=mysql --datadir=/data/mysql3306
2016-01-21 11:29:05 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
2016-01-21 11:29:10 [ERROR]   The bootstrap log isn't empty:
2016-01-21 11:29:10 [ERROR]   2016-01-21T03:29:05.633658Z 0 [Warning] --bootstrap is deprecated. Please consider using --initialize instead
2016-01-21T03:29:05.641584Z 0 [ERROR] Can't read from messagefile '/usr/share/mysql/english/errmsg.sys'
[root@MySQL mysql-5.7.10]# 

可以看到mysql_install_db is deprecated,說不贊同使用mysql_install_db,推薦使用的方法是:

Please consider switching to mysqld --initializePlease consider using --initialize instead

正確的初始方式如下:./bin/mysqld --initialize --user=mysql --basedir=/data/service/mysql-5.7.10/  --datadir=/data/mysql3306,如果datadir目錄有文件,則會報以下錯:

[root@MySQL mysql-5.7.10]# ./bin/mysqld --initialize --user=mysql --basedir=/data/service/mysql-5.7.10/  --datadir=/data/mysql3306
2016-01-21T05:43:56.355999Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2016-01-21T05:43:56.357796Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2016-01-21T05:43:56.357814Z 0 [ERROR] Aborting

 所以要把data directory文件刪除掉再執行,如果刪除目錄下的文件還是報同樣的錯,可以試試把目錄刪除掉,再創建一個,然后授權:

[root@MySQL mysql-5.7.10]# ./bin/mysqld --initialize --user=mysql --basedir=/data/service/mysql-5.7.10/  --datadir=/data/mysql3306
2016-01-21T05:47:01.804937Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2016-01-21T05:47:03.552899Z 0 [Warning] InnoDB: New log files created, LSN=45790
2016-01-21T05:47:03.816849Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2016-01-21T05:47:03.883956Z 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: 660686ae-c002-11e5-843e-00163e0217d7.
2016-01-21T05:47:03.886131Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2016-01-21T05:47:03.887120Z 1 [Note] A temporary password is generated for root@localhost: )vyd3aXj8hhC

MySQL 5.7初始化完后會生成一個臨時的密碼,A temporary password is generated for root@localhost: )vyd3aXj8hhC 如果想初始化表空間,在后面加上 --innodb_data_file_path=ibdata1:1G:autoextend即可。

啟動MySQL 5.7,拷貝support-files/my-default.cnf ./

[root@MySQL mysql-5.7.10]# cp support-files/my-default.cnf ./my.cnf
[root@MySQL mysql-5.7.10]# chown -R mysql:mysql my.cnf 

編輯my.cnf加上基本選項:

[mysqld]
# changes to the binary log between backups.
log_bin

# These are commonly set, remove the # and set as required.
basedir =  /data/service/mysql-5.7.10
datadir = /data/mysql3306
port = 3306
server_id = 100
socket = /tmp/mysqld.sock

編輯啟動腳本:

[root@MySQL mysql-5.7.10]# cat start_mysql.sh 
#!/bin/bash

nohup /data/service/mysql-5.7.10/bin/mysqld_safe --defaults-file=/data/service/mysql-5.7.10/my.cnf > /data/service/mysql-5.7.10/start_stop.log 2>&1 &

運行腳本啟動 sh start_mysql.sh 。

 

登錄MySQL 5.7,先添加MySQL 5.7的bin路徑:

[root@MySQL mysql-5.7.10]# cat /etc/profile.d/mysql.sh  
export PATH=/data/service/mysql-5.7.10/bin:$PATH
[root@MySQL mysql-5.7.10]# source /etc/profile.d/mysql.sh 

登錄時輸入的密碼是剛剛初始化完的密碼:

[root@MySQL mysql-5.7.10]# mysql -uroot -p')vyd3aXj8hhC' -S /tmp/mysqld.sock
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.10-log

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

第一次登錄,是必須要修改密碼才能查看show databases;

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> 

 從上面的信息可以看到,叫我們使用ALTER USER進行修改,下面我們修改一下密碼,有關更多MySQL 5.7的用戶密碼設置可以參考:https://dev.mysql.com/doc/refman/5.7/en/password-expiration-policy.html

mysql> ALTER USER USER() IDENTIFIED BY '123456';
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)

mysql> 

MySQL 5.7的mysql.user表已經沒有password這一列了,所以查詢用戶和密碼的方式如下:

mysql> select user,host,authentication_string from mysql.user; +-----------+-----------+-------------------------------------------+ | user | host | authentication_string | +-----------+-----------+-------------------------------------------+ | root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | +-----------+-----------+-------------------------------------------+ 2 rows in set (0.00 sec) mysql> select password('123456'); +-------------------------------------------+ | password('123456') | +-------------------------------------------+ | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +-------------------------------------------+ 1 row in set, 1 warning (0.00 sec)

 

MySQL 5.7支持為表增加計算列

   什么叫計算列呢,簡單來說就是某一列的值是通過別的列計算得來,例如a列值為1,b列值為2,c列不需要操作手動插入,定義為a + b的結果為c的值,那么c就是計算列,是通過別的列計算得來,下面我們進行例子說明:

在MySQL 5.7之前的版本中,要實現這樣的效果要利用觸發器來完成,以下是以前的實現過程:

mysql> show create  table tb1\G 
*************************** 1. row ***************************
       Table: tb1
Create Table: CREATE TABLE `tb1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.01 sec)

mysql> 

創建一個插入的觸發器:

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

我們插入數據:

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

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

mysql> 

但如果我們更新了c1或者c2的值,c3是不會變動的,所以我們要加一個update的觸發器:

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

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

mysql> update tb1 set c1 = 3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

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

mysql> 

可以看到,如果想實現計算列,那么就要借助觸發器或者視圖來實現,但在生產環境中,是不太建議使用觸發器或者視圖的。下面用MySQL 5.7來實現就變得很簡單了。

 

MySQL 5.7計算列的實現:

在CREAE TABLE和ALTER TABLE 中都支持增加計算列的方式:

col_name data_type [GENERATED ALWAYS] AS (expression)
      [VIRTUAL | STORED] [UNIQUE [KEY]] [COMMENT comment]
      [NOT NULL | NULL] [[PRIMARY] KEY]

下面我們創建測試表tb2:

mysql> show create table tb2\G  
*************************** 1. row ***************************
       Table: tb2
Create Table: CREATE TABLE `tb2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) GENERATED ALWAYS AS ((`c1` + `c2`)) VIRTUAL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> 

插入數據看效果:

mysql> select * from tb2;
Empty set (0.00 sec)

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

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

mysql> 

更新數據看效果:

mysql> update tb2 set c1=10;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

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

mysql> 

可以看到相當的方便,MySQL 5.7的很多新特性都給我們帶來了便利和驚喜^.^

 

 

總結:

     一、MySQL 5.7初始方法相比之前的版本都有所不同,做的相對更為安全了,以前版本初始化完root密碼是空的,MySQL 5.7則有一個臨時密碼。

     二、MySQL 5.7在CREAE TABLE和ALTER TABLE 中都支持增加計算列的方式了,所有可以少用觸發器和視圖來實現計算列了。

     三、MySQL 5.7無論在性能還是安全性方面都得到了很大的提升,希望小伙伴們一起好好學習MySQL 5.7的一些新特性。

 

參考資料:

http://dev.mysql.com/doc/refman/5.7/en/binary-installation.html

https://dev.mysql.com/doc/refman/5.7/en/password-expiration-policy.html

http://dev.mysql.com/doc/refman/5.7/en/create-table.html

 

 

 

作者:陸炫志

出處:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111

您的支持是對博主最大的鼓勵,感謝您的認真閱讀。本文版權歸作者所有,歡迎轉載,但請保留該聲明。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM