1、前言:爲何MySQL要作主從複製(讀寫分離)? 通俗來說,若是對數據庫的讀和寫都在同一個數據庫服務器中操做,業務系統性能會下降。 爲了提高業務系統性能,優化用戶體驗,能夠經過作主從複製(讀寫分離)來減輕主數據庫的負載。 並且若是主數據庫宕機,可快速將業務系統切換到從數據庫上,可避免數據丟失。 2、MySQL主從複製(讀寫分離)和集羣的區別: 我對MySQL也是剛開始研究,不是很專業。個人理解是: 一、主從複製(讀寫分離):通常須要兩臺及以上數據庫服務器便可(一臺用於寫入數據,一臺用於同步主的數據並用於數據查詢操做)。 侷限性: (1)配置好主從複製以後,同一張表,只能對一個服務器寫操做。若是在從上執行了寫操做,而以後主也操做了這張表,或致使主從不一樣步;聽說能夠配置成主主方式,但我尚未研究到。 (2)主數據庫服務器宕機,須要手動將業務系統切換到從數據庫服務器。沒法作到高可用性(除非再經過部署keepalive作成高可用方案)。 二、集羣是由N臺數據庫服務器組成,數據的寫入和查詢是隨機到任意一臺數據庫服務器的,其餘數據庫服務器會自動同步數據庫的操做。 任何一臺數據庫宕機,不會對整個集羣形成大的影響。 侷限性:我通過測試才知道目前mysql集羣版本(MySQL Cluster)只能對NDB存儲引擎的數據進行集羣同步,若是是INNODB或其餘的MySQL存儲引擎是不行的。這個也致使了我放棄了在業務系統中應用這種方案。 3、迴歸正題,接下來開始MySQL5.6.12的主從複製教程: 一、MySQL5.6開始主從複製有兩種方式:基於日誌(binlog);基於GTID(全局事務標示符)。 須要注意的是:GTID方式不支持臨時表!因此若是你的業務系統要用到臨時表的話就不要考慮這種方式了,至少目前最新版本MySQL5.6.12的GTID複製仍是不支持臨時表的。 因此此篇教程主要是告訴你們如何經過日誌(binlog)方式作主從複製! 二、MySQL官方提供的MySQL Replication教程: http://dev.mysql.com/doc/refman/5.6/en/replication.html 這個官方教程強烈建議你們閱讀(須要必定的英語閱讀能力哦!不行就google翻譯後再閱讀吧~)。 三、準備工做: (1)配置MySQL主從複製(讀寫分離)以前,須要在主從兩臺服務器先安裝好MySQL5.6。 (2)目前最新的MySQL5.6 GA版本是MySQL5.6.12(點此下載MySQL5.6.12源碼包)。 我的推薦Linux(RedHat/CentOS 6.4)源碼編譯安裝,具體能夠看本站這篇教程:RedHat/CentOS源碼編譯安裝MySQL5.6.12 (3)注意: (a)若是你須要用於生產環境,安教程安裝MySQL時不要急着作mysql啓動操做。建議把mysql初始化生成的/usr/local/mysql/mysql.cnf刪除,而後把你優化好的mysql配置文件my.cnf放到/etc下。 (b)建議主備兩臺服務器在同一局域網,主備兩臺數據庫網絡須要互通。 (4)個人環境: 主數據庫IP:192.168.100.2 從數據庫IP:192.168.100.3 四、修改主數據庫的的配置文件: 1 [mysqld] 2 server-id=1 3 log-bin=mysqlmaster-bin.log 4 sync_binlog=1 5 #注意:下面這個參數須要修改成服務器內存的70%左右 6 innodb_buffer_pool_size = 512M 7 innodb_flush_log_at_trx_commit=1 8 sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO 9 lower_case_table_names=1 10 log_bin_trust_function_creators=1 修改以後要重啓mysql: 1 # /etc/init.d/mysql restart 附一個我已優化過的主數據庫配置文件:點此下載 五、修改從數據庫的的配置文件(server-id配置爲大於1的數字便可): 1 [mysqld] 2 server-id=2 3 log-bin=mysqlslave-bin.log 4 sync_binlog=1 5 #注意:下面這個參數須要修改成服務器內存的70%左右 6 innodb_buffer_pool_size = 512M 7 innodb_flush_log_at_trx_commit=1 8 sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO 9 lower_case_table_names=1 10 log_bin_trust_function_creators=1 修改以後要重啓mysql: 1 # /etc/init.d/mysql restart 附一個我已優化過的從數據庫配置文件:點此下載 六、SSH登陸到主數據庫: (1)在主數據庫上建立用於主從複製的帳戶(192.168.100.3換成你的從數據庫IP): 1 # mysql -uroot -p 2 mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.100.3' IDENTIFIED BY 'repl'; (2)主數據庫鎖表(禁止再插入數據以獲取主數據庫的的二進制日誌座標): 1 mysql> FLUSH TABLES WITH READ LOCK; (3)而後克隆一個SSH會話窗口,在這個窗口打開MySQL命令行: 1 # mysql -uroot -p 2 mysql> SHOW MASTER STATUS; 3 +------------------------+----------+--------------+------------------+-------------------+ 4 | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 5 +------------------------+----------+--------------+------------------+-------------------+ 6 | mysqlmaster-bin.000001 | 332 | | | | 7 +------------------------+----------+--------------+------------------+-------------------+ 8 1 row in set (0.00 sec) 9 mysql> exit; 在這個例子中,二進制日誌文件是mysqlmaster-bin.000001,位置是332,記錄下這兩個值,稍後要用到。 (4)在主數據庫上使用mysqldump命令建立一個數據快照: 1 #mysqldump -uroot -p -h127.0.0.1 -P3306 --all-databases --triggers --routines --events >all.sql 2 # 接下來會提示你輸入mysql數據庫的root密碼,輸入完成後,若是當前數據庫不大,很快就能導出完成。 (5)解鎖第(2)步主數據的鎖表操做: 1 mysql> UNLOCK TABLES; 七、SSH登陸到從數據庫: (1)經過FTP、SFTP或其餘方式,將上一步備份的主數據庫快照all.sql上傳到從數據庫某個路徑,例如我放在了/home/yimiju/目錄下; (2)從導入主的快照: 1 # cd /home/yimiju 2 # mysql -uroot -p -h127.0.0.1 -P3306 < all.sql 3 # 接下來會提示你輸入mysql數據庫的root密碼,輸入完成後,若是當前數據庫不大,很快就能導入完成。 (3)給從數據庫設置複製的主數據庫信息(注意修改MASTER_LOG_FILE和MASTER_LOG_POS的值): 1 # mysql -uroot -p 2 mysql> CHANGE MASTER TO MASTER_HOST='192.168.100.2',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysqlmaster-bin.000001',MASTER_LOG_POS=332; 3 # 而後啓動從數據庫的複製線程: 4 mysql> START slave; 5 # 接着查詢數據庫的slave狀態: 6 mysql> SHOW slave STATUS \G 7 # 若是下面兩個參數都是Yes,則說明主從配置成功! 8 Slave_IO_Running: Yes 9 Slave_SQL_Running: Yes (4)接下來你能夠在主數據庫上建立數據庫、表、插入數據,而後看從數據庫是否同步了這些操做。