mysql的binlog日誌有三種格式,分別爲statement,mixed,以及row。mysql
1.Statement:每一條會修改數據的sql都會記錄在binlog中sql
優缺點:1)不用記錄每一行的變化,日誌量小(執行update table set column=xx,只需記錄一條sql便可);數據庫
2)有些sql語句可能會跟數據庫環境有關,好比登陸用戶等等數據,致使複製的時候數據出問題。服務器
2.Row:不記錄sql語句上下文相關信息,僅保存哪條記錄被修改(默認的數據複製方式,經過show variables like 'binlog_format'命令查看)session
優缺點:1)binlog日誌會記錄每一行數據修改的細節,不會使用和當前數據庫環境相關的數據;架構
2)日誌量較大(如執行update table set column=xx,會記錄和表數據數量同樣的日誌記錄)ide
3.Mixedlevel: 是以上兩種level的混合使用性能
mysql數據複製架構測試
1、主從架構(Master-Slave)編碼
優缺點:
1)一臺master對應多臺slave,數據修改可在master操做,數據查詢分別在2臺slave中操做,主要用於讀操做大於寫操做的請狀況,可提升數據庫的查詢性能;
2)若是slave比較多,會嚴重增長master數據庫的壓力,由於一臺slave連上master時,會開啓3個線程(Connection Thread 鏈接master的線程,IO Thread slave接受master二進制數據的線程, SQL Thread slave處理日誌重放的線程);
3)可能會形成單點故障,由於master只有一臺,若是master宕機以後,須要從新指定master;
4)slave庫的數據會出現延時(延時時間爲slave端運行show slave status時,Seconds_Behind_Master選項的值)。
實現步驟:(默認都是新裝的機器,數據庫中都沒有數據)
一、安裝3臺mysql服務器,一臺master,二臺slave,master的端口是3307,二臺slave的端口分別是330八、3309;
二、安裝成功以後,修改master配置my.ini文件(假設master的服務名爲mysqlmaster),個人配置以下:
[mysqld]
innodb_buffer_pool_size = 128M
#啓用二進制日誌
log_bin=mysql-bin
innodb_flush_log_at_trx_commit=1
#事物一提交,就必須同步二進制日誌,這樣會下降性能,可是數據比較重要
sync_binlog=1
#服務器ID不能重複
server_id=10
#須要作主從備份的數據庫名字
#binlog-do-db=test_custer
#只保留7天的二進制日誌,以防磁盤被日誌佔滿
expire-logs-days=7
#mysql的安裝目錄
basedir=D:\mysqlcuster\mysqlmaster
#mysql數據存放目錄
datadir=D:\mysqlcuster\mysqlmaster\data
port=3307
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#服務端的編碼方式
character-set-server=utf8
[client]
port=3307
default-character-set=utf8
三、使用net start mysqlmaster啓動master服務器,啓動成功以後,登陸mysql,命令爲mysql -uroot -p -P3307;
四、在master中建立用於複製的帳號,帳號名、密碼、ip可修改:grant replication slave on *.* to repl_user@127.0.0.1 identified by 'repl_password';
五、修改slave的my.ini文件配置,以其中一臺slave爲例,配置以下:
[mysqld]
innodb_buffer_pool_size = 128M
#須要作複製的數據庫名
#replicate-do-db=test_custer
#服務器id
server_id=2
#自動跳過的表,session表不必作複製
#replicate-ignore-table=dzx2.pre_common_session
#自動跳過的錯誤代碼,以防複製出錯被中斷
#slave-skip-errors=1032,1062,126,1114,1146,1048,1396
#避免從庫意外崩潰,致使數據重複複製
sync_master_info=1
basedir=D:\mysqlcuster\mysqlslave
datadir=D:\mysqlcuster\mysqlslave\data
port=3308
#設置從節點只讀,防止從節點寫入數據,致使主從數據庫數據不一致
read_only=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#服務端的編碼方式
character-set-server=utf8
[client]
port=3308
default-character-set=utf8
六、使用net start mysqlsalve啓動salve服務器,啓動成功以後,登陸mysql,命令爲mysql -uroot -p -P3308和mysql -uroot -p -P3309;
七、在master端輸入show master status,獲得查詢結果file和position;
八、在slave設置master的信息
change master to master_host='master的ip',
master_user='master建立的複製帳號',
master_password='master建立的複製帳號用戶名',
master_port=master的數據庫端口,
master_log_file='master運行show master status的結果中的file字段值',
master_log_pos=master運行show master status的結果中的position字段值';
九、在slave端運行start slave,以後再運行show slave status\G;若是查詢結果中的Slave_IO_Running、Slave_SQL_Running的值都爲yes,表示環境設置成功,如圖所示
十、測試。在master中建立test_custer數據庫和test表,查看slave數據庫也會存在test_custer數據庫和test表。
2、主主架構(Master-Master)
master-master模式和master-slave模式差很少,須要在2臺master中打開二進制文件,只是master-master模式中,存在2臺主機,2臺主機都可執行讀寫操做,這種模式有個缺點就是怎麼保證數據完整性,由於2臺主機都可執行寫操做,可能會存在一部分數據存放在master1,另外一部分數據存放在master2中,若是master1宕機了,整個數據庫環境的數據也就不完整了。
3、主從從架構(Master-Slave-Slave)
優勢:1)減輕master的複製壓力;
2)master宕機後,slave可充當master角色,可避免單點故障
步驟:(master-slave-slave2,即slave充當slave2實例的master角色)
1)修改master配置文件my.ini,同上;
2)修改slave、slave2配置文件,同上。不過須要在slave服務器配置文件中新加2項配置
#二進制日誌文件
log_bin=myslave-bin
#從服務器從主服務器接收到的更新記入到slave的二進制日誌
log_slave_updates=1
3)分別啓動master、slave、slave2服務器
4)登陸master服務器,輸入show master status;命令,查看file和position字段的值
5)登陸slave服務器,指定master服務器
6)在slave服務器中輸入start slave;命令,以後再運行show slave status\G;若是查詢結果中的Slave_IO_Running、Slave_SQL_Running的值都爲yes,表示環境設置成功,如圖所示
7)在slave服務器中運行show master status,查看file和position字段的值
8)啓動slave2服務器,設置slave2服務器對應的主服務器的信息
9)在slave2服務器中輸入start slave;命令,以後再運行show slave status\G;若是查詢結果中的Slave_IO_Running、Slave_SQL_Running的值都爲yes,表示環境設置成功,如圖所示
10)測試。在master上的test表中添加數據,若是master、slave、slave2服務器均有新插入的數據,表示成功
11)中止master服務器,而後在slave服務器中添加數據,若是slave2服務器的數據庫中有新添加的數據,表示slave2的主服務器就是slave服務器