首頁 >資料庫 >mysql教程 >解析MySQL 主從複製的原理和配置

解析MySQL 主從複製的原理和配置

怪我咯
怪我咯原創
2017-04-06 18:10:551484瀏覽

工作原理圖:

解析MySQL 主從複製的原理和配置

#主從複製的原理:

分為同步複製和非同步複製,實際複製架構中大部分為非同步複製。 複製的基本流程如下:

1).Slave上面的IO程序連接上Master,並請求從指定日誌檔案的指定位置(或從最開始的日誌)之後的日誌內容;

2).Master接收到來自Slave的IO進程的請求後,透過負責複製的IO進程根據請求訊息讀取製定日誌指定位置之後的日誌訊息,返回給Slave 的IO進程。傳回訊息中除了日誌所包含的資訊之外,還包括本次傳回的訊息已經到Master端的bin-log檔案的名稱以及bin-log的位置;

3).Slave的IO行程接收到資訊後,將接收到的日誌內容依序加入Slave端的relay-log檔案的最末端,並將讀取到的Master端的bin-log的檔案名稱和位置記錄到master-info檔案中,以便在下次讀取取的時候能夠清楚的告訴Master「我需要從某個bin-log的哪個位置開始往後的日誌內容,請發給我」;

4).Slave的Sql程序偵測到relay- log中新增加了內容後,會馬上解析relay-log的內容成為在Master端真實執行時候的那些可執行的內容,並在自身執行。

環境描述

  • 作業系統:CentOS6.3_x64

  • 主伺服器master:192.168. 0.202

  • 從伺服器slave:192.168.0.203

##一、mysql主從複製

#1、主從安裝mysql,版本一致

我們裝的是mysql-5.5.30.tar.gz 這裡省略…

2、修改master,slave伺服器

master服务器配置:
vi /usr/local/mysql/etc/my.cnf
[mysqld]
server-id=202     #设置服务器唯一的id,默认是1,我们设置ip最后一段,slave设置203
log-bin=mysql-bin # 启用二进制日志
binlog-ignore-db = mysql,information_schema  #忽略写入binlog的库

slave服务器配置:
vi /usr/local/mysql/etc/my.cnf
[mysqld]
server-id=203
replicate-do-db = abc     #只同步abc库
slave-skip-errors = all   #忽略因复制出现的所有错误

3、重新啟動主從伺服器mysql

/etc/init.d/mysqld restart

4、在主伺服器上建立帳戶並授權slave

mysql> mysql -u root -p123.com
mysql> GRANT REPLICATION SLAVE ON *.* to [email protected] identified by ‘1234.com’; #replication:复制

5、查看主資料庫狀態

mysql> show master status;
+------------------+----------+--------------+------------------+
| File  | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 263 |  |   |
+------------------+----------+--------------+------------------+

6、設定從資料庫

mysql> change master to
 -> master_host='192.168.0.202',
 -> master_user='sync',
 -> master_password='1234.com',
 -> master_log_file='mysql-bin.000002',
 -> master_log_pos=263;
#Log和pos是master上随机获取的。这段也可以写到my.cnf里面。

7、啟動slave同步進程並檢視狀態

mysql> start slave;

解析MySQL 主從複製的原理和配置

其中Slave_IO_Running 與Slave_SQL_Running 的值都必須為YES,才會表示狀態正常。

8、驗證主從同步

在主mysql

建立資料庫abc,再從mysql查看已經同步成功!

mysql> create database abc;
mysql> show databases;
+--------------------+
| Database   |
+--------------------+
| information_schema |
| abc    |
| mysql    |
| performance_schema |
| test    |
+--------------------+

在slave啟動報錯:

“Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'”

解決:報錯的原因主要是slave設定master的二進位檔案名稱或pos值不對應!

先flush logs;清空日誌,在查看下主資料庫的狀態show master status;看下日誌檔案名字和position值;

再在slave中,執行:CHANGE MASTER TO MASTER_LOG_FILE ='二進位日誌名稱',MASTER_LOG_POS=值;

最後啟動同步程序:start slave;

以上是解析MySQL 主從複製的原理和配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn