第二章 二篇【對比特性】(1)、性能,安全性


【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管理之道(性能調優、高可用與監控)》(賀春暘)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章