MySQL支持單向、異步復制,復制過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入二進制日志文件,並維護日志文件的一個索引以跟蹤日志循環。當一個從服務器連接到主服務器時,它通知主服務器從服務器在日志中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,然後封鎖並等待主服務器通知下一次更新。
為什麼使用主從復制?
1、主服務器/從服務器設置增加了健壯性。主服務器出現問題時,你可以切換到從服務器作為備份。
2、通過在主服務器和從服務器之間切分處理客戶查詢的負荷,可以得到更好的客戶響應時間。但是不要同時在主從服務器上進行更新,這樣可能引起沖突。
3、使用復制的另一個好處是可以使用一個從服務器執行備份,而不會干擾主服務器。在備份過程中主服務器可以繼續處理更新。
MySQL使用3個線程來執行復制功能(其中1個在主服務器上,另兩個在從服務器上。當發出START SLAVE時,從服務器創建一個I/O線程,以連接主服務器並讓主服務器發送二進制日志。主服務器創建一個線程將二進制日志中的內容發送到從服務器。從服務器I/O線程讀取主服務器Binlog Dump線程發送的內容並將該數據拷貝到從服務器數據目錄中的本地文件中,即中繼日志。第3個線程是SQL線程,從服務器使用此線程讀取中繼日志並執行日志中包含的更新。SHOW PROCESSLIST語句可以查詢在主服務器上和從服務器上發生的關於復制的信息。
默認中繼日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是從服務器主機名,nnnnnn是序列號。用連續序列號來創建連續中繼日志文件,從000001開始。從服務器跟蹤中繼日志索引文件來識別目前正使用的中繼日志。默認中繼日志索引文件名為host_name-relay-bin.index。在默認情況,這些文件在從服務器的數據目錄中被創建。中繼日志與二進制日志的格式相同,並且可以用mysqlbinlog讀取。當SQL線程執行完中繼日志中的所有事件後,中繼日志將會被自動刪除。
從服務器在數據目錄中另外創建兩個狀態文件--master.info和relay-log.info。狀態文件保存在硬盤上,從服務器關閉時不會丟失。下次從服務器啟動時,讀取這些文件以確定它已經從主服務器讀取了多少二進制日志,以及處理自己的中繼日志的程度。
主master:192.168.5.60
從slave:192.168.5.61
1、在master mysql創建同步用戶
grant emuser slave,file on *.* to [email protected] identified by 123456;
flush privileges;
修改master的my.cnf的配置
wait_timeout = 30000000
interactive-timeout = 30000000
binlog-do-db=cdn_view #設置二進制日志記錄的庫
log-bin=mysql-bin #打開mysql二進制日志
binlog-ignore-db=mysql ##設置二進制日志不記錄的庫
server-id = 12760 #設置mysql_id,主從不能相同
long_query_time = 5
expire_logs_days= 3
2、修改slave的my.cnf的配置
wait_timeout = 30000000
interactive-timeout = 30000000
log-bin=mysql-bin
server-id = 12761
replicate-do-db=cdn_view #設置同步的庫
replicate-ignore-db=mysql #設置不同步的庫
log-slave-updates #同步後記錄二進制日志
slave-skip-errors=all
slave-net-timeout=60
sync_binlog=1
binlog_format=mixed
############################################################################
分別重啟主從mysqld服務,登錄主mysql,在主上執行flush tables with read lock;
然後將cdn_view數據庫的數據copy到從上,並記錄下主上show master statusG的結果:
mysql> show master statusG;
*************************** 1. row ***************************
File: mysql-bin.000009
Position: 341
Binlog_Do_DB: cdn_view
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
然後執行unlock tables;
登錄從mysql,在從上執行:
stop slave;
change master to master_host=192.168.5.60,master_user=emuser,master_password=123456, master_log_file=mysql-bin.000009, master_log_pos=341;
start slave;
show slave statusG;
如果出現如下信息說明主從同步成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes