主要爲了解決一個比較「古老」的MySQL在NUMA架構下的「swap insanity」問題,其表現爲儘管爲InnoDB buffer pool分配了足夠多的內存,但依然會產生swap。而swap對數據庫系統性能而言是比較致命的。html
當咱們配置的buffer pool超過單個node的內存時,例如總共64GB內存,每一個節點32GB,分配buffer pool爲40GB,默認狀況下,會先用滿node 0,再在node1上分配8GB內存。若是綁定到node 0上的線程須要申請新的內存時,不是從node1上申請(還有24GB空餘),而是swap node0的內存,再作申請。node
這個問題在社區討論了好久,大神Jeremy Cole 對該問題有寫博客作過詳細的介紹(http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/)mysql
解決:linux
增長了一個只讀的新參數innodb_numa_interleave選項,當開啓該選項,能夠容許在NUMA架構下采起交叉分配內存的方式。git
在啓動MySQL時,採用MPOL_INTERLEAVE方式分配內存,如上例,在啓動時每一個node上分配20GB內存,保證每一個node依然有空閒內存可用;在完成InnoDB buffer pool內存分配後,再將內存分配策略設置爲MPOL_DEFAULT,以後的線程申請內存,都在各自的節點完成。github
補丁:sql
https://github.com/mysql/mysql-server/commit/242fa2c92de304637e794e531df1f1b86b8d1dee數據庫
https://github.com/mysql/mysql-server/commit/d2578b57ba7d90a00281ae124a1cd6c83193f62asession
問題描述:架構
這是由於每次打開表時,老是經過計算表上記錄最大自增列值的方式來從新設置,當表被打開時,若是沒有數據,AUTO_INCREMENT就會被重置成最小值。
解決:
在驅逐表時,將這個表的AUTO_INCREMENT值存儲在內存中(dict_sys->autoinc_map),當表從新讀入時,再恢復其AUTO_INCREMENT值。
這個Fix並不算一個完整的修復,當實例重啓時,AUTO_INCREMENT依然會被重置(參閱bug#199), RDS MYSQ已經Fix了這個bug,可以持久化自增列到物理文件中,在重啓後不會丟失。
補丁:
https://github.com/mysql/mysql-server/commit/d404923aad4693dc152d02461f858d7ef218c336
問題描述:
Memcached的一段開啓事務的代碼在assert中調用,而根據assert的文檔定義(
http://man7.org/linux/man-pages/man3/assert.3.html
),他的行爲是未知的,受NDEBUG控制,可能assert會被定義成空函數,致使assert中的函數調用被忽略掉。這個bug在某些平臺下可能極易觸發。使用memcached的同窗須要注意下。 (Bug #21239299, Bug #75199)
解決:
將函數調用從assert中移出來,只assert函數返回值。
補丁:
https://github.com/mysql/mysql-server/commit/db5dc6fd3abe855685a554bc3c555b1b63914b60
問題描述:
在ARM64平臺上, GCC的內建的TAS操做函數__sync_lock_test_and_set
該bug最初從MariaDB爆出,參考MDEV-6615 https://mariadb.atlassian.net/browse/MDEV-6615
解決:
若是定義了__atomic_test_and_set(ptr, __ATOMIC_ACQUIRE)/ __atomic_clear(ptr, __ATOMIC_RELEASE)操做,則優先使用該函數進行變量設置,不然若是是X86平臺,使用__sync_lock_test_and_set ,其餘狀況,在編譯階段報錯。
補丁:
https://github.com/mysql/mysql-server/commit/f59d68eeae37338d7b25f2571407e763fa897e15
問題描述:
InnoDB shutdown時須要調用三次trx_purge操做,每次處理300個undo log page,最終處理900個undo log page,可是shutdown須要等待purge線程退出,,這可能須要耗費比較長的時間,shutdown會更耗時。(Bug #21040050)
補丁:
https://github.com/mysql/mysql-server/commit/3e8202ff443909e93231d453a3f1560b5a5ce3cb
問題描述:
在READ COMMITED隔離級別下,併發replace into操做可能致使惟一二級索引損壞,惟一鍵約束失效。這主要是鎖繼承邏輯錯誤致使,具體的見以前的一篇月報分析http://mysql.taobao.org/monthly/2015/06/02/
解決:
調整鎖繼承邏輯,若是是相似REPLACE INTO這樣的操做,須要進行鎖繼承。以前月報有詳細分析。
補丁:
https://github.com/mysql/mysql-server/commit/608efca4c4e4afa1ffea251abda675fcc06efc69
補丁:
https://github.com/mysql/mysql-server/commit/641ab6f36813516255738ba25d3c6b721189832e
CREATE TABLE t1(c1 int) ENGINE=InnoDB;
CREATE TABLE t2(c1 int) ENGINE=InnoDB;set session binlog_format=’STATEMENT';START TRANSACTION;
UPDATE t1,t2 SET t1.c1 = 0;
SAVEPOINT sp1;
UPDATE t1,t2 SET t1.c1 = 0;
SAVEPOINT sp2;COMMIT;
| master-bin.000001 | 229 | Query | 1 | 340 | use `test`; CREATE TABLE t1(c1 int) ENGINE=InnoDB |
| master-bin.000001 | 340 | Query | 1 | 451 | use `test`; CREATE TABLE t2(c1 int) ENGINE=InnoDB |
| master-bin.000001 | 451 | Query | 1 | 539 | BEGIN |
| master-bin.000001 | 539 | Query | 1 | 648 | use `test`; UPDATE t1,t2 SET t1.c1 = 0 |
| master-bin.000001 | 648 | Query | 1 | 737 | COMMIT |
| master-bin.000001 | 737 | Query | 1 | 825 | BEGIN |
| master-bin.000001 | 825 | Query | 1 | 934 | use `test`; UPDATE t1,t2 SET t1.c1 = 0 |
| master-bin.000001 | 934 | Query | 1 | 1023 | COMMIT |
| master-bin.000001 | 1023 | Query | 1 | 1095 | BEGIN |
| master-bin.000001 | 1095 | Query | 1 | 1177 | SAVEPOINT `sp1` |
| master-bin.000001 | 1177 | Query | 1 | 1259 | SAVEPOINT `sp2` |
| master-bin.000001 | 1259 | Query | 1 | 1332 | COMMIT |
+——————-+——+————-+———–+————-+—————————————————+
[ERROR] Slave SQL for channel 」: Could not execute Write_rows event on table test.t3; Unknown error, Error_code: 1105; handler error HA_ERR_GENERIC; the event’s master log master-bin.000001, end_log_pos 1553, Error_code: 1105
BEGINTable_mapWrite_rowsXidBEGINTable_mapTable_mapTable_mapWrite_rowsSAVEPOINT `event_logging`Write_rowsXid
Format_desc (of slave)Previous-GTIDs (of slave)Rotate (of master)Format_desc (of master)
Format_desc (of slave)Rotate (of master)Format_desc (of master)