1 複製概述
Mysql內建的複製功能是構建大型,高性能應用程序的基礎。將Mysql的數據分佈到多個系統上去,這種分佈的機制,是通過將Mysql的某一臺主機的數據複製到其它主機(slaves)上,並重新執行一遍來實現的。複製過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌可以記錄發送到從服務器的更新。當一個從服務器連接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,然後封鎖並等待主服務器通知新的更新。
請注意當你進行復制時,所有對複製中的表的更新必須在主服務器上進行。否則,你必須要小心,以避免用戶對主服務器上的表進行的更新與對從服務器上的表所進行的更新之間的衝突。
1.1 mysql支持的複製類型:
(1)基於語句的複製:在主服務器上執行的SQL語句,在從服務器上執行同樣的語句。MySQL默認採用基於語句的複製,效率比較高。一旦發現沒法精確複製時,會自動選着基於行的複製。
(2)基於行的複製:把改變的內容複製過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持
(3)混合類型的複製: 默認採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。
1.2 複製解決的問題
MySQL複製技術有以下一些特點:
(1) 數據分佈 (Data distribution )
(2) 負載平衡(load balancing)
(3) 備份(Backups)
(4) 高可用性和容錯行 High availability and failover
1.3 複製如何工作
整體上來說,複製有3個步驟:
(1) master將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌事件,binary log events);
(2) slave將master的binary log events拷貝到它的中繼日誌(relay log);
(3) slave重做中繼日誌中的事件,將改變反映它自己的數據。
2 .複製配置
有兩臺MySQL數據庫服務器Master和slave,Master爲主服務器,slave爲從服務器,初始狀態時,Master和slave中的數據信息相同,當Master中的數據發生變化時,slave也跟着發生相應的變化,使得master和slave的數據信息同步,達到備份的目的。
要點:
負責在主、從服務器傳輸各種修改動作的媒介是主服務器的二進制變更日誌,這個日誌記載着需要傳輸給從服務器的各種修改動作。因此,主服務器必須激活二進制日誌功能。從服務器必須具備足以讓它連接主服務器並請求主服務器把二進制變更日誌傳輸給它的權限。
一、安裝MySQL
說明:在兩臺MySQL服務器192.168.21.169和192.168.21.168上分別進行如下操作,安裝MySQL 5.5.22
二、配置MySQL主服務器(192.168.21.169)
mysql -u root -p #進入MySQL控制檯 create database AMT_DB; #建立數據庫AMT_DB insert into mysql.user(Host,User,Password) values ('localhost','archermind',password('123456')); #創建用戶archermind,建立MySQL主從數據庫同步用戶replication密碼123456 flush privileges; #刷新系統授權表 #授權用戶replication只能從192.168.21.168這個IP訪問主服務器192.168.21.169上面的數據庫,並且只具有數據庫備份的權限 grant replication slave on *.* to 'replication'@'192.168.21.168' identified by '123456' with grant option;
三、把MySQL主服務器192.168.21.169中的數據庫AMT_DB導入到MySQL從服務器192.168.21.168中
1、導出數據庫AMT_DB
mysqldump -u root -p AMT_DB > /home/replication.sql #在MySQL主服務器進行操作,導出數據庫AMT_DB到/home/replication.sql
備註:在導出之前可以先進入MySQL控制檯執行下面命令
flush tables with read lock; #數據庫只讀鎖定命令,防止導出數據庫的時候有數據寫入 unlock tables; #解除鎖定
2、導入數據庫到MySQL從服務器
mysql -u root -p #進入從服務器MySQL控制檯 create database AMT_DB; #創建數據庫 use AMT_DB #進入數據庫 source /home/replication.sql #導入備份文件到數據庫 mysql -u replication -h 192.168.21.169 -p #測試在從服務器上登錄到主服務器
四、配置MySQL主服務器的my.cnf文件
#vim /etc/my.cnf #編輯配置文件,在[mysqld]部分添加下面內容 server-id=1 #設置服務器id,爲1表示主服務器,注意:如果原來的配置文件中已經有這一行,就不用再添加了。 log_bin=mysql-bin #啓動MySQ二進制日誌系統,注意:如果原來的配置文件中已經有這一行,就不用再添加了。 binlog-do-db=AMT_DB #需要同步的數據庫名,如果有多個數據庫,可重複此參數,每個數據庫一行 binlog-ignore-db=mysql #不同步mysql系統數據庫 #service mysqld restart #重啓MySQL
mysql -u root -p #進入mysql控制檯 show master status; 查看主服務器,出現以下類似信息 +------------------+----------+--------------+------------------+ |File |Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 7131 | AMT_DB |mysql | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
注意:這裏記住File的值:mysql-bin.000001和Position的值:7131,後面會用到。
五、配置MySQL從服務器的my.cnf文件
#vim /etc/my.cnf #編輯配置文件,在[mysqld]部分添加下面內容 server-id=2 #配置文件中已經有一行server-id=1,修改其值爲2,表示爲從數據庫 log-bin=mysql-bin #啓動MySQ二進制日誌系統,注意:如果原來的配置文件中已經有這一行,就不用再添加了。 replicate-do-db=AMT_DB #需要同步的數據庫名,如果有多個數據庫,可重複此參數,每個數據庫一行 replicate-ignore-db=mysql #不同步mysql系統數據庫 :wq! #保存退出 #service mysqld restart #重啓MySQL
注意:MySQL 5.1.7版本之後,已經不支持把master配置屬性寫入my.cnf配置文件中了,只需要把同步的數據庫和要忽略的數據庫寫入即可。
mysql -u root -p #進入MySQL控制檯 slave stop; #停止slave同步進程 change master to master_host='192.168.21.169',master_user='replication',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=7131; #執行同步語句 slave start; #開啓slave同步進程 SHOW SLAVE STATUS\G #查看slave同步信息,出現以下內容 *************************** 1. row *************************** Slave_IO_State:Waiting for master to send event Master_Host:192.168.21.169 Master_User:replication Master_Port:3306 Connect_Retry:60 Master_Log_File:mysql-bin.000001 Read_Master_Log_Pos:7131 Relay_Log_File:MySQLSlave-relay-bin.000001 Relay_Log_Pos:253 Relay_Master_Log_File:mysql-bin.000001 Slave_IO_Running:Yes Slave_SQL_Running:Yes Replicate_Do_DB:AMT_DB Replicate_Ignore_DB:mysql Replicate_Do_Table: Replicate_Ignore_Table: 1 row in set (0.00 sec)
注意查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上這兩個參數的值爲Yes,即說明配置成功!
六、測試MySQL主從服務器雙機熱備是否成功
1、進入MySQL主服務器
mysql -u root-p #進入主服務器MySQL控制檯 use AMT_DB #進入數據庫 CREATETABLE test ( id int not null primary key,name char(20)); #創建test
2、進入MySQL從服務器
mysql -u root-p #進入MySQL控制檯 use AMT_DB #進入數據庫 show tables; #查看AMT_DB表結構,會看到有一個新建的表test,表示數據庫同步成功
至此,MySQL數據庫配置主從服務器實現雙機熱備