(四)SQL MODE變化和優(yōu)化online操作

2018-02-24 16:05 更新

本文是基于MySQL-5.7.7-rc版本,未來可能 還會(huì)發(fā)生更多變化。

1、SQL MODE變化

a.?默認(rèn)啟用 STRICT_TRANS_TABLES 模式;
b. 對(duì) ONLY_FULL_GROUP_BY 模式實(shí)現(xiàn)了更復(fù)雜的特性支持,并且也被默認(rèn)啟用;
c. 其他被默認(rèn)啟用的sql mode還有 NO_ENGINE_SUBSTITUTION;

iMySQL建議

對(duì)廣大MySQL使用者而言,以往不是那么嚴(yán)格的模式還是很方便的,在5.7版本下可能會(huì)覺得略為不適,慢慢習(xí)慣吧。比如向一個(gè)20字符長(zhǎng)度的VARCHAR列寫入30個(gè)字符,在以前會(huì)自動(dòng)截?cái)嗖⒔o個(gè)提示告警,而在5.7版本下,則直接拋出錯(cuò)誤了。個(gè)人認(rèn)為這倒是一個(gè)好的做法,避免各種奇葩的寫法。

新特性實(shí)踐

-- 查看默認(rèn)的 sql_mode
[yejr@imysql.com]>?select @@sql_mode;
+-----------------------------------------------------------------------------------+
| @@sql_mode |
+-----------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------+

-- 插入50個(gè)字符
[yejr@imysql.com]> insert into t_char select 0, repeat('x',50);
ERROR 1406 (22001): Data too long for column 'uname' at row 1

-- 修改本 session 的 sql_mode
[yejr@imysql.com]> set sql_mode = 'ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)

-- 去掉 STRICT_TRANS_TABLES 模式后
[yejr@imysql.com]>?select @@sql_mode;
+---------------------------------------------------------------+
| @@sql_mode |
+---------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------------------------------------------------------+

[yejr@imysql.com]> insert into t_char select 0, repeat('x',50);
Query OK, 1 row affected, 1 warning (0.00 sec)  -- 提示有告警信息
Records: 1 Duplicates: 0 Warnings: 1

[yejr@imysql.com]> show warnings;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1265 | Data truncated for column 'uname' at row 1 |
+---------+------+--------------------------------------------+

因?yàn)?uname 字段的長(zhǎng)度為 40 個(gè)字符。

2、優(yōu)化online操作

例如修改buffer pool、修改索引名(非主鍵)、修改REPLICATION FILTER、修改MATER而無需關(guān)閉SLAVE線程?等眾多特性。

可以在線修改buffer pool對(duì)DBA來說實(shí)在太方便了,實(shí)例運(yùn)行過程中可以動(dòng)態(tài)調(diào)整,避免事先分配不合理的情況,不過?innodb_buffer_pool_instances?不能修改,而且在?innodb_buffer_pool_instances 大于 1 時(shí),也不能將 buffer pool 調(diào)整到 1GB 以內(nèi),需要稍加注意。

如果是加大buffer pool,其過程大致是:

1、以innodb_buffer_pool_chunk_size為單位,分配新的內(nèi)存pages;
2、擴(kuò)展buffer pool的AHI(adaptive hash index)鏈表,將新分配的pages包含進(jìn)來;
3、將新分配的pages添加到free list中;

如果是縮減buffer pool,其過程則大致是:

1、重整buffer pool,準(zhǔn)備回收pages;
2、以innodb_buffer_pool_chunk_size為單位,釋放刪除這些pages(這個(gè)過程會(huì)有一點(diǎn)點(diǎn)耗時(shí));
3、調(diào)整AHI鏈表,使用新的內(nèi)存地址。

實(shí)際測(cè)試時(shí),發(fā)現(xiàn)在線修改 buffer poo 的代價(jià)并不大,SQL命令提交完畢后都是瞬間完成,而后臺(tái)進(jìn)程的耗時(shí)也并不太久。在一個(gè)并發(fā)128線程跑tpcc壓測(cè)的環(huán)境中,將 buffer pool 從32G擴(kuò)展到48G,后臺(tái)線程耗時(shí) 3秒,而從 48G 縮減回 32G 則耗時(shí) 18秒,期間壓測(cè)的事務(wù)未發(fā)生任何鎖等待。

-- 演示1:從 1G 擴(kuò)大到 16G
[yejr@imysql.com]> SET GLOBAL innodb_buffer_pool_size = 51539607552; 
Query OK, 0 rows affected (0.00 sec)

-- 看看日志記錄
09:21:19.460543Z 0 [Note] InnoDB: Resizing buffer pool from 1073741824 to 17179869184\. (unit=134217728)
09:21:19.468069Z 0 [Note] InnoDB: disabled adaptive hash index.
09:21:20.760724Z 0 [Note] InnoDB: buffer pool 0 : 60 chunks (491511 blocks) were added.
09:21:21.922869Z 0 [Note] InnoDB: buffer pool 1 : 60 chunks (491520 blocks) were added.
09:21:21.935114Z 0 [Note] InnoDB: buffer pool 0 : hash tables were resized.
09:21:21.947264Z 0 [Note] InnoDB: buffer pool 1 : hash tables were resized.
09:21:22.203031Z 0 [Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
09:21:22.203062Z 0 [Note] InnoDB: Completed to resize buffer pool from 1073741824 to 17179869184.
09:21:22.203075Z 0 [Note] InnoDB: Re-enabled adaptive hash index.

-- 演示2:從 16G 縮減到 1G
[yejr@imysql.com]> SET GLOBAL innodb_buffer_pool_size = 1073741824;
Query OK, 0 rows affected (0.00 sec)

-- 看看日志記錄
09:22:55.591669Z 0 [Note] InnoDB: Resizing buffer pool from 17179869184 to 1073741824\. (unit=134217728)
09:22:55.680836Z 0 [Note] InnoDB: disabled adaptive hash index.
09:22:55.680864Z 0 [Note] InnoDB: buffer pool 0 : start to withdraw the last 491511 blocks.
09:22:55.765778Z 0 [Note] InnoDB: buffer pool 0 : withdrew 489812 blocks from free list. Tried to relocate 1698 pages (491510/491511).
09:22:55.774492Z 0 [Note] InnoDB: buffer pool 0 : withdrew 0 blocks from free list. Tried to relocate 1 pages (491511/491511).
09:22:55.782745Z 0 [Note] InnoDB: buffer pool 0 : withdrawn target 491511 blocks.
09:22:55.782786Z 0 [Note] InnoDB: buffer pool 1 : start to withdraw the last 491520 blocks.
09:22:55.892068Z 0 [Note] InnoDB: buffer pool 1 : withdrew 489350 blocks from free list. Tried to relocate 2166 pages (491517/491520).
09:22:55.900743Z 0 [Note] InnoDB: buffer pool 1 : withdrew 0 blocks from free list. Tried to relocate 2 pages (491519/491520).
09:22:55.908257Z 0 [Note] InnoDB: buffer pool 1 : withdrew 0 blocks from free list. Tried to relocate 0 pages (491519/491520).
09:22:55.915778Z 0 [Note] InnoDB: buffer pool 1 : withdrew 0 blocks from free list. Tried to relocate 1 pages (491520/491520).
09:22:55.923836Z 0 [Note] InnoDB: buffer pool 1 : withdrawn target 491520 blocks.
09:22:56.149172Z 0 [Note] InnoDB: buffer pool 0 : 60 chunks (491511 blocks) were freed.
09:22:56.308997Z 0 [Note] InnoDB: buffer pool 1 : 60 chunks (491520 blocks) were freed.
09:22:56.316258Z 0 [Note] InnoDB: buffer pool 0 : hash tables were resized.
09:22:56.324027Z 0 [Note] InnoDB: buffer pool 1 : hash tables were resized.
09:22:56.393589Z 0 [Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
09:22:56.393616Z 0 [Note] InnoDB: Completed to resize buffer pool from 17179869184 to 1073741824.
09:22:56.393628Z 0 [Note] InnoDB: Re-enabled adaptive hash index.

再來看下在線修改非主鍵索引名,直接用?ALTER TABLE RENAME INDEX?語法即可。

新特性實(shí)踐

例如下面的SQL語法:

[yejr@imysql.com]> ALTER TABLE orders RENAME INDEX idx1 TO idxxx1; 

Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0

可以看到,幾乎瞬間完成,盡管我在執(zhí)行這個(gè)SQL時(shí)正跑著64個(gè)并發(fā)tpcc壓測(cè)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)