工作原理圖:
#主從複製的原理:
分為同步複製和非同步複製,實際複製架構中大部分為非同步複製。 複製的基本流程如下:
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
#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;其中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中文網其他相關文章!