【2016年11月27日創建】
【2016年11月28日修改】- 添加測試實驗
【2016年12月2日修改】- 添加SSL測試實驗
【2016年12月6日新增】
1. 性能
1)性能提升
MySQL5.7在支持多處理器和高度併發CPU線程的系統上,提供更持續的線性性能和擴展性。實現這一點的關鍵是通過Oracle InnoDB存儲引擎的效率的併發性,來消除InnoDB內核爭用和互斥鎖定的現象。
在OLTP只讀模式下,MySQL5.7比MySQL5.6性能提高3倍。
在OLTP讀/寫模式下,MySQL5.7比MySQL5.6性能提高2倍。
2. 安全性
1) 默認開啓SSL
【2016年11月27日創建】
1) MySQL5.7和Percona5.7版本里支持。
2) MySQL5.7在啓動時,使用openSSL可以自動生成SSL和RSA證書和密鑰文件。
3) 安全套接層(Secure Sockets Layer,SSL)及其繼任者傳輸層安全(Transport Layer Security,TLS)是爲網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡連接加密,用以保障在internet上數據傳輸之安全,利用數據加密(Encryption)技術,可以確保在網絡上傳輸過程中不會被截取及竊聽。
4) 安裝部分請查看MySQL 5.7安裝
5) MySQL 5.7 記錄密碼工具
mysql_config_editor set --login-path=client --host-localhost --user=root --password
會在/root目錄下生成隱藏文件.mylogin.cnf,查看是亂碼
* 在root密碼變更後,需要重新執行mysql_config_editor
* 登錄mysql --login-path=client
* MariaDB 10.1版本沒有此工具
測試:
[root@test03 mysql]# mysql_config_editor set --login-path=client --host=localhost --user=root --password Enter password: 輸入密碼 [root@test03 mysql]# mysql --login-path=client #登錄 [root@test03 mysql]# mysql_config_editor print #查看 [client] user = root password = ***** host = localhost [root@test03 mysql]# mysql_config_editor remove --login-path=client #移除 [root@test03 mysql]# mysql_config_editor print #只顯示client [root@test03 mysql]# mysql_config_editor print --all #顯示所有 mysql_config_editor set --login-path=client330701 --socket=/data/mysql/mysql3307/mysql_3307.sock --port=3307 --host=localhost --user=root --password --host --port --socket # mysql 5.7.14測試版本 --user --password --all # 打印所有login path
6) 指定用戶使用SSL連接
創建用戶
然後我/usr/local/mysql/bin/mysql_ssl_rsa_setup --help verbose FALSE datadir /data/mysql/mysql3306/data suffix 5.7.14 uid (No default value)
【MySQL 5.7】
1)新建SSL權限
使用工具生成密鑰文件
/usr/local/mysql/bin/mysql_ssl_rsa_setup #這也是我的安裝目錄
執行完成之後,我是想看看生成的密碼是什麼樣子,發現各種找,都沒找到。
然後我/usr/local/mysql/bin/mysql_ssl_rsa_setup --helpverbose FALSEdatadir /data/mysql/mysql3306/datasuffix 5.7.14uid (No default value)
有戲,my.cnf在/etc下,自動識別。
[root@test03 mysql3306]# ll /data/mysql/mysql3306/data
總用量 422964
-rw-------. 1 mysql mysql 1679 11月 29 13:26 ca-key.pem
# CA自簽證書
-rw-r--r--. 1 mysql mysql 1074 11月 29 13:26 ca.pem
# CA私鑰
-rw-r--r--. 1 mysql mysql 1078 11月 29 13:26 client-cert.pem
# 客戶端證書
-rw-------. 1 mysql mysql 1675 11月 29 13:26 client-key.pem
# 客戶端
私鑰
-rw-r--r--. 1 mysql mysql 1078 11月 29 13:26 server-cert.pem
# 服務端證書
-rw-------. 1 mysql mysql 1679 11月 29 13:26 server-key.pem
# 服務端
私鑰
#啓動時產生RSA密鑰對
-rw-------. 1 mysql mysql 1675 11月 29 13:26 private_key.pem
-rw-r--r--. 1 mysql mysql 451 11月 29 13:26 public_key.pem
添加SSL參數到my.cnf
[root@test03 mysql3306]# vim /etc/my.cnf [mysql] ssl-ca=/data/mysql/mysql3306/data/ca.pem ssl-cert=/data/mysql/mysql3306/data/client-cert.pem ssl-key=/data/mysql/mysql3306/data/client-key.pem [mysqld] ssl-ca=/data/mysql/mysql3306/data/ca.pem ssl-cert=/data/mysql/mysql3306/data/client-cert.pem ssl-key=/data/mysql/mysql3306/data/client-key.pem
重啓mysql
驗證服務器是否開啓SSL,如果沒有開啓SSL,創建的ssluser是無法連接的
root@localhost [(none)]>show variables like '%ssl%'; +---------------+--------------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | /data/mysql/mysql3306/data/ca.pem | | ssl_capath | | | ssl_cert | /data/mysql/mysql3306/data/client-cert.pem | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | /data/mysql/mysql3306/data/client-key.pem | +---------------+--------------------------------------------+
2)使用SSL用戶登錄
1. 默認登錄是跳過ssl登錄的( Defaults to on; use --skip-ssl to disable.)
2. --ssl參數已經廢棄,可以使用--ssl-mode
3. 下面是相關參數
--ssl-mode=name SSL connection mode. --ssl Deprecated. Use --ssl-mode instead. (Defaults to on; use --skip-ssl to disable.) --ssl-verify-server-cert Deprecated. Use --ssl-mode=VERIFY_IDENTITY instead. --ssl-ca=name CA file in PEM format. --ssl-capath=name CA directory. --ssl-cert=name X509 cert in PEM format. --ssl-cipher=name SSL cipher to use. --ssl-key=name X509 key in PEM format. --ssl-crl=name Certificate revocation list. --ssl-crlpath=name Certificate revocation list path. --tls-version=name TLS version to use, permitted values are: TLSv1, TLSv1.1
3)刪除SSL權限:
root@localhost [(none)]>select user,host,ssl_type,ssl_cipher from mysql.user where user='ssluser';
+---------+-----------+----------+------------+
| user | host | ssl_type | ssl_cipher |
+---------+-----------+----------+------------+
| ssluser | % | ANY | |
| ssluser | localhost | ANY | |
+---------+-----------+----------+------------+
root@localhost [(none)]>show grants for ssluser@'%';
+----------------------------------------------+
| Grants for ssluser@% |
+----------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'%' |
+----------------------------------------------+
刪除SSL權限
root@localhost [(none)]>alter user 'ssluser'@'%' require none; Query OK, 0 rows affected (0.00 sec) root@localhost [(none)]>select user,host,ssl_type,ssl_cipher from mysql.user where user='ssluser'; +---------+-----------+----------+------------+ | user | host | ssl_type | ssl_cipher | +---------+-----------+----------+------------+ | ssluser | % | | | # 看這裏ssl_type沒有ANY了 | ssluser | localhost | ANY | | +---------+-----------+----------+------------+ 2 rows in set (0.00 sec)
2) 不再明文顯示用戶密碼
【2016年11月27日創建】
MySQL 5.6/MySQL 5.7和percona 5.6/5.7支持
Mariadb 10.1對於binlog中和用戶密碼相關的操作不加密。
3)sql_mode改變
【2016年11月27日創建】
MySQL 5.7/MariaDB 10.1默認啓用STRICT_TRANS_TABLES嚴格模式。該模式的作用是進行數據校驗,錯誤數據不能插入,報錯並且進行事務回滾。
例如:如果age字段爲init數值整形,如插入字符類型時會發出警告,如果sql_mode爲空,會繼續插 入。如果爲strict_trans_tables模式,會發警告並進行事務回滾。
3. InnoDB存儲引擎的提升
1)更改索引名字時不會鎖表
【2016年11月27日創建】
MySQL5.7/Percona 5.7版本支持
2)在線DDL修改varchar字段屬性時不鎖表
【2016年11月27日創建】
MySQL 5.7針對DDL功能做了加強,修改varchar字段已不鎖表。
* ALGORITHM用於指定創建或刪除索引的算法
* COPY表示按照MySQL 5.1版本之前的方法,即創建臨時表並全表拷貝數據,原表加全局讀鎖
* INPLACE表示創建字段或刪除字段操作不需要創建臨時表
* DEFAULT表示通過INPLACE的算法還是COPY的算法
alter table sbtest ALGORITHM=INPLACE,modify pad varchar(90) not null;
3)innodb/myisam存儲引擎支持中文全文索引
該功能只在mysql 5.7和percona 5.7版本中支持
4)innodb buffer pool預熱改進
只支持mysql 5.7和percona 5.7。當數據庫重啓時,對innodb buffer pool預熱,以便於快速恢復到之前的性能狀態。
在mysql 5.6/mariadb 10.0版本里,爲解決上述問題,提供了一個新特性來快速預熱buffer_pool緩衝池。在my.cnf添加:
innodb_buffer_pool_dump_at_shutdown =1
該命令用於在關閉時把熱數據dump到本地磁盤。
採用手工方式把熱數據dump到本地磁盤:
innodb_buffer_pool_dump_now = 1
啓動時把熱數據加載到內存:
innodb_buffer_pool_load_at_startup = 1
採用手工方式把熱數據加載到內存:
innodb_buffer_pool_load_now = 1
10)修改innodb redo log事務日誌文件大小更人性化
在MySQL 5.5版本里,如果想修改ib_logfile(redo log)文件大小,那麼必須如下:
1)執行set global innodb_fast_shutdown=0; 命令將所有的髒頁刷到磁盤
2)執行mysqladmin shutdown命令關閉數據庫
3)在my.cnf文件裏修改innodb_log_file_size參數值
4)執行mv ib_logfile* bak/,將redo log移動到bak下(不移走會報錯)
5)執行mysql_safe --defaults-file=/etc/my.cnf --user=mysql &,再啓動mysql
在MySQL 5.6/5.7或MariaDB 10.0/10.1版本里:將步驟4)省略,直接啓動mysql
在MySQL 5.6/5.7或MariaDB 10.0/10.1版本里:
1. innodb redo log的大小從最大4G提高到512G,可通過參數innodb_log_file_size來配置
2. innodb_log_files_in_group設置爲3組redo log,那麼innodb_log_file_size * innodb_log_files_in_group 不能超過512G。設置的值越大,越可以減少checkpoint刷新髒頁的頻率,這對提升mysql性能很重要,風險增加了宕機恢復時。建議TPS在200~300每秒/寫的業務場景,通過設置4GB即可
11)死鎖可以打印到錯誤日誌裏
在MySQL 5.6版本中查看死鎖,需要執行show engine innodb status\G;
在MySQL 5.6/5.7 或 MariaDB 10.0/10.1版本中,在my.cnf配置文件里加入:
innodb_print_all_deadlocks=1
--- 尊重版權《MySQL管理之道(性能調優、高可用與監控)》(賀春暘)