一、MySQL 5.6 新特性
MySQL 5.6 主要在查詢性能的優化、InnoDB改進以支持高吞吐量的事務、NoSQL風格的API、分區功能的改進、數據複製的改進,增加 PERFORMANCE_SCHEMA 庫以獲得數據庫性能信息等。
1、查詢性能優化
優化 WHERE 語句改進索引條件的處理性能,Multi-Range Read:通過隨機數據訪問來提升 SSD 上的數據讀取速度,優化文件排序:對一些組合了ORDER BY non_indexed_column和 LIMIT x的SQL語句,該特性將大大加速此類語句的執行速度。
2、InnoDB 的改進
MySQL 5.6 完全集成 InnoDB 作爲默認的存儲引擎。同時 5.6 版本在使用 InnoDB 上的很多細節做了改進,詳情請看這裏。
3、提供 NoSQL 風格的 API
該功能主要適用於將 MySQL 來作爲NoSQL 使用,而 MySQL 使用的是 memcached兼容的 API。通過該接口程序訪問數據可直達 InnoDB 存儲引擎,而無需通過 MySQL 對 SQL 的轉換過程,大大提升了數據訪問的性能。
4、分區的改進
顯式分區數據查詢,例如:
SELECT * FROM employees PARTITION (p0, p2);
DELETE FROM employees PARTITION (p0, p1);
UPDATE employees PARTITION (p0) SET store_id = 2 WHERE fname = 'Jill';
SELECT e.id, s.city FROM employees AS e JOIN stores PARTITION (p1) AS s ...;
分區數據的導入導出,此功能用於快速的將某個表遷移到分區上:ALTER TABLE eEXCHANGE PARTITION p0 WITH TABLE e2;
5、複製功能的改進
支持多線程複製,事實上是針對每個database開啓相應的獨立線程。即每個庫有一個單獨的(sql thread)如果線上業務中,只有一個database或者絕大多數壓力集中在個別database的話,多線程併發複製特性就沒有意義了。
支持啓用GTID,對運維人員來說應該是一件令人高興的事情,在配置主從複製,傳統的方式裏,你需要找到binlog和POS點,然後change master to指向,而不是很有經驗的運維,往往會將其找錯,造成主從同步複製報錯,在mysql5.6裏,無須再知道binlog和POS點,需要知道master的IP、端口,賬號密碼即可,因爲同步複製是自動的,mysql通過內部機制GTID自動找點同步。
6、大大增強 PERFORMANCE_SCHEMA 數據庫
降低了數據庫開銷、表IO的信息彙集和監控、表鎖信息彙集和監控、會話和用戶級別的監控、全局性能信息彙總。
二、GITD 詳解
MySQL 5.6 的新特性之一,是加入了全局事務 ID (GTID) 來強化數據庫的主備一致性,故障恢復,以及容錯能力。
1、什麼是GTID?
官方文檔:http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html在這篇文檔裏,我們可以知道全局事務 ID 的官方定義是:GTID = source_id:transaction_id
MySQL 5.6 中,每一個 GTID 代表一個數據庫事務。在上面的定義中,source_id 表示執行事務的主庫 uuid(server_uuid),transaction_id 是一個從 1 開始的自增計數,表示在這個主庫上執行的第 n 個事務。MySQL 會保證事務與 GTID 之間的 1 : 1 映射。
例如,下面就是一個 GTID:3E11FA47-71CA-11E1-9E33-C80AA9429562:50表示在以 "3E11FA47-71CA-11E1-9E33-C80AA9429562" 爲唯一標示的 MySQL 實例上執行的第 50 個數據庫事務。很容易理解,MySQL只要保證每臺數據庫的 server_uuid 全局唯一,以及每臺數據庫生成的 transaction_id 自身唯一,就能保證 GTID 的全局唯一性。
2、什麼是server_uuid?
MySQL 5.6 用 128 位的server_uuid 代替了原本的 32 位 server_id 的大部分功能。原因很簡單,server_id 依賴於 my.cnf 的手工配置,有可能產生衝突—— 而自動產生 128 位 uuid 的算法可以保證所有的MySQL uuid 都不會衝突。
在首次啓動時 MySQL 會調用generate_server_uuid() 自動生成一個 server_uuid,並且保存到 auto.cnf 文件—— 這個文件目前存在的唯一目的就是保存 server_uuid。
在 MySQL 再次啓動時會讀取auto.cnf 文件,繼續使用上次生成的 server_uuid。使用 SHOW 命令可以查看 MySQL 實例當前使用的 server_uuid?:SHOW GLOBAL VARIABLES LIKE 'server_uuid';它是一個 MySQL 5.6 global variables,文檔鏈接在這裏:server_uuid? 全局唯一的 server_uuid 的一個好處是:可以解決由 server_id 配置衝突帶來的MySQL 主備複製的異常終止(BUG #33815?)
在MySQL 5.6,Slave 向 Master 申請 binlog 時,會首先發送自己的server_uuid,Master 用 Slave 發送的 server_uuid 代替 server_id (MySQL 5.6 之前的方式)作爲 kill_zombie_dump_threads 的參數,終止衝突或者僵死的BINLOG_DUMP 線程。
三、多線程複製基於庫
MySQL 5.6之前的版本,同步複製是單線程的,隊列的,只能一個一個執行,在5.6裏,可以做到多個庫之間的多線程複製,例如數據庫裏,存放着用戶表,商品表,價格表,訂單表,那麼將每個業務表單獨放在一個庫裏,這時就可以做到多線程複製,但一個庫裏的表,多線程複製是無效的。
注:每個數據庫僅能使用一個線程,複製涉及到多個數據庫時多線程複製纔有意義。
四、MySQL 5.6 複製管理工具
官方下載地址:http://dev.mysql.com/downloads/tools/utilities/#downloads
注:這裏只簡單的介紹一下,具體的工具使用,不具體說明,使用方法 命令—help
mysqlreplicate 快速啓動複製
mysqlrplcheck 快速檢查複製環境
mysqlrplshow 顯示覆制拓撲
mysqlfailover 故障轉移
mysqlrpladmim 管理工具
五、具體配置過程
1、環境準備
操作系統
CentOS 6.6 x86_64
軟件版本
Mysql 5.6.22
2、實驗拓撲
3、 關閉防火牆與SELinux
# serverice iptables stop # chkconfig iptables off # sed -i ‘s/%SELINUX=enforcing%SELINUX=disabled%’/etc/sysconfig/selinux # getenforce 0
4、 配置MySQL主從複製
A、配置選項說明
要在MySQL 5.6中使用複製功能,其服務配置段[mysqld]中於少應該定義如下選項:
binlog-format:二進制日誌的格式,有row、statement和mixed幾種類型;需要注意的是:當設置隔離級別爲READ-COMMITED必須設置二進制日誌格式爲ROW,現在MySQL官方認爲STATEMENT這個已經不再適合繼續使用;但mixed類型在默認的事務隔離級別下,可能會導致主從數據不一致;
log-slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report-host:用於啓動GTID及滿足附屬的其它需求;
master-info-repository和relay-log-info-repository:啓用此兩項,可用於實現在崩潰時保證二進制及從服務器安全的功能;
sync-master-info:啓用之可確保無信息丟失;
slave-paralles-workers:設定從服務器的SQL線程數;0表示關閉多線程複製功能;
binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:啓用複製有關的所有校驗功能;
binlog-rows-query-log-events:啓用之可用於在二進制日誌記錄事件相關的信息,可降低故障排除的複雜度;
log-bin:啓用二進制日誌,這是保證複製功能的基本前提;
server-id:同一個複製拓撲中的所有服務器的id號必須惟一。
B、配置主服務器master
# vim /usr/my.cnf
在 [mysqld] 加入如下:
skip-external-locking key_buffer_size= 256M max_allowed_packet= 1M table_open_cache= 256 sort_buffer_size= 1M read_buffer_size= 1M read_rnd_buffer_size= 4M myisam_sort_buffer_size= 64M thread_cache_size= 8 query_cache_size=16M thread_concurrency= 2 log-bin=mysql-bin innodb_file_per_table= 1 binlog-format=ROW //設置二進制日誌格式 log-slave-updates=true//是否記錄從服務器同步數據動作 gtid-mode=on //啓用Gtid模式 enforce-gtid-consistency=true//是否強制GTID的一致性 master-info-repository=TABLE //master信息的記錄位置 relay-log-info-repository=TABLE //中繼日誌信息的記錄位置 sync-master-info=1 slave-parallel-workers=2 //設置從服務器複製線程數 binlog-checksum=CRC32//設置binlog校驗算法(循環冗餘校驗碼) master-verify-checksum=1 //設置主服務器是否校驗 slave-sql-verify-checksum=1//設置從服務器是否校驗 binlog-rows-query-log_events=1 server-id = 10 report-port=3306 report-host=192.168.100.90 //設置報告給哪臺服務器,一般設置爲本機的主機名。
# service mysql restart //重啓MySQL服務
C、在Slave服務器上安裝MySQL與在Master服務器上安裝方法相同,這裏不在介紹,而在Slave服務器上安裝Mysql有兩個參數與Master服務器不同。如下:
server-id=11 report-host=192.168.100.91
# service mysql restart
D、在Master服務器上爲Slave創建複製用戶並測試連接
mysql> grant replication slave,replication client on *.*to 'replication'@'192.168.%.%' identified by 'passwd'; mysql> flush privileges
;
E、啓動slave複製線程
在從服務器上進行操作
mysql> changemaster to master_host='192.168.100.90',master_user='replication',master_password='passwd',master_auto_position=1; mysql> start slave; mysql> show status\G;
好,現在可以在主上面進行創建數據庫。看看從的是否有數據。。。