mysql 主從複製

一、簡述Mysql複製

  Mysql複製是通過將mysql的某一臺主機的數據複製到其他主機(slaves)上,並且在slaves上重新執行一遍來實現。主服務器每次數據操作都會將更新記錄到二進制日誌文件,並維護文件的一個索引跟蹤日誌循環,slaves服務器通過獲取主服務器的二進制日誌來更新同步數據。當一個從服務器連接主服務器時,它通知主服務器從服務器的日誌中讀取的最後一次成功更新的爲止。

注意:當進行主從複製時,所有對錶的更新必須在主服務器上進行,否則會造成衝突

1.1 mysql支持的複製類型

  1)基於語句的複製:在主服務器上執行SQL語句,在從服務器上執行同樣的SQL語句(默認採用的),如果沒法精確複製,就會自動選擇基於行的複製

     2)基於行的複製:把改變的內容複製過去,而不是把命令在從服務器執行一遍,從mysql5.0開始支持

     3)混合類型,默認採用基於語句的複製,一旦發現基於語句的無法精確的複製時,採用基於行的複製

1.2 複製如何工作

     1)master服務器將數據更新記錄到二進制日誌文件中(主服務器上必須開啓log-bin)

     2)slave將master的二進制日誌拷貝到它的中繼日誌(relay log)

     3)slave通過SQL線程從relay log中讀取二進制日誌,重新執行一遍,以改變自己的數據

下圖描述複製的過程:

1)master服務器上開啓二進制日誌,每個事務更新數據完成之前,master都會把數據變化記錄到二進制日誌文件中(串行寫入)

2)slave上配置change master to,將master的binary日誌拷貝到它自己的中繼日誌(I/O線程)

3)SQL線程從中繼日誌中讀取事件,並重放其中的事件更新slave的數據,使得和master的數據一樣

二、mysql主從複製的配置

操作系統:Linux 2.6.32-573.el6.x86_64 

數據庫版本:10.1.18-MariaDB 

數據目錄:/mydata/data

備份目錄:/server/backup

主服務器(master): 192.168.119.128

從服務器(slave): 192.168.119.129

(在主從服務器上安裝mariadb省略)

A:在主服務器上配置如下

1、在master上創建一個備份賬戶,每個slave使用標準的mysql用戶名和密碼連接master,進行復制操作的用戶會授予replication slave權限。

命令:

mariaDB [jiaoyu]> grant replication slave,reload on *.* to 'backup'@'192.168.119.%' identified by '1234'

2、master上開啓log-bin

配置my.cnf(啓用log-bin,配置server-id)

3、備份master服務器上的數據(/server/backup)

[root@db backup]# mysqldump -uroot -pLsf@8816 -A -x > /server/backup/mysql_`date +%F`.sql
[root@db backup]# cd /server/backup/
[root@db backup]# ll
total 948
drwxr-x---. 4 root root 4096 Oct 13 11:03 2016-10-13_10-47-03
-rw-r--r--. 1 root root 0 Oct 13 11:16 aa.sql
-rw-r--r--. 1 root root 481986 Oct 13 13:54 mysql_2016-10-13.sql

4、通過SCP把主服務器上的數據拷貝到從服務器上,在從服務器上執行一遍,以便在主從同步之前,數據是一致的

5、記錄master服務器上master_log_file和master_log_pos

MariaDB [jiaoyu]> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000009 | 643 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

B、在從服務器上配置如下(slave)

1、配置change master(master.info)

mariaDB [jiaoyu]>change master to master_host='192.168.119.128',master_port=3306,master_user='backup',master_password='1234',master_file_log='mysql-bin.000009',master_file_pos=643;

2、配置my.cnf開啓

log_bin           = mysql-bin

server_id         = 2
relay_log         = mysql-relay-bin
log_slave_updates = 1
read_only         = 1
(server-id必須唯一,relay_log中繼日誌,log_slave_updates表示slave將複製事件寫進自己的二進制日誌(後面會看到它的用處))
3、把從主服務器拷貝過來的備份數據,還原數據庫
4、開啓start slave

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.119.129
Master_User: req
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 643
Relay_Log_File: test-relay-bin.000012
Relay_Log_Pos: 537
Relay_Master_Log_File: mysql-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

....

Seconds_Behind_Master: 0

你可查看master和slave上線程的狀態。在master上,你可以看到slave的I/O線程創建的連接

*************************** 2. row ***************************
Id: 11
User: req
Host: 192.168.119.128:44967
db: NULL
Command: Binlog Dump
Time: 240
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
Progress: 0.000
2 rows in set (0.00 sec)

 C 演示數據同步

在master上操作:


MariaDB [jiaoyu]> insert into student(Sname,Sage,gender,CID)values('hai',34,'m',5);
Query OK, 1 row affected (0.02 sec)

MariaDB [jiaoyu]> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000009 | 865 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

在slave上查看

MariaDB [jiaoyu]> select * from student;
+-----+-------------+------+--------+-----+
| SID | Sname | Sage | gender | CID |
+-----+-------------+------+--------+-----+
| 1 | xionghaihua | 22 | m | 1 |
| 2 | zhaomei | 22 | f | 2 |
| 3 | liming | 30 | m | 3 |
| 4 | wenli | 32 | NULL | 2 |
| 5 | hai | 34 | m | 5 |
+-----+-------------+------+--------+-----+
5 rows in set (0.00 sec)

[root@test data]# vim master.info

33
mysql-bin.000009
865

本文出自http://www.cnblogs.com/louis2008/p/mysql1.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章