簡單說就是主庫開啓logbin,從數據庫啓動的那一刻起將保存全部修改數據庫結構或內容的一個文件。mysql主從複製是一個異步的複製過程,主庫發送更新事件到從庫,從庫讀取更新記錄,並執行更新記錄,使得從庫的內容與主庫保持一致。在主庫裏,只要有更新事件出現,就會被依次地寫入到binlog裏面,以後會推到從庫中做爲從庫進行復制的數據源。mysql
準備工做:sql
首先安裝好兩臺mysql,而且啓動:shell
systemctl start mysqld; #啓動mysql systemctl stop mysqld;#中止mysql systemctl reload mysqld; #重啓mysql
登陸主庫,建立一個用戶用於主從複製:數據庫
-- 用戶名 SimpleWu 密碼123456 CREATE USER 'SimpleWu'@'*' IDENTIFIED BY '123456'; -- 執行刷新權限: flush privileges;
登陸兩個數據庫同時建立數據庫(CORE):安全
CREATE DATABASE CORE;
關閉兩個數據庫。服務器
修改主庫配置文件:異步
[mysqld] #開啓二進制日誌 log-bin=mysql-bin #設置server-id server-id=1 binlog-do-db = game binlog-ignore-db = mysql binlog-ignore-db = test binlog-ignore-db = information_schema
log-bin:
設置logbin文件名稱,最好不要改動位置。性能
server-id:
該id主從之間必須是惟一,惟一的標識。日誌
binlog-do-db:
指定能夠主從同步的數據庫,多數據庫則配置多行。code
binlog-ignore-db:
指定不能夠主從同步的數據庫,多數據庫則配置多行
修改從庫配置文件:
#設置server-id,必須惟一 server-id=2
只須要將服務id
設置爲與主庫不一樣的ID既可;如今啓動兩個數據。
啓動後須要查看主庫log-bin信息
:
SHOW MASTER STATUS; -- 主庫執行
獲取到:
+------------------+----------+--------------+----------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+----------------------------------+ | mysql-bin.000012 | 619 | core | mysql,information_schema,sys | +------------------+----------+--------------+----------------------------------+
以目前位置開始主從同步,在從庫執行SQL將從庫關聯主庫:
CHANGE MASTER TO MASTER_HOST='12.122.132.22', -- 主庫ip MASTER_USER='SimpleWu', -- 用戶名 MASTER_PORT=3306, -- 端口號 MASTER_PASSWORD='123456', -- 密碼 MASTER_LOG_FILE='mysql-bin.000012', -- 開始文件 MASTER_LOG_POS=619; -- 開始位置
執行改SQL後咱們須要查看咱們目前的配置信息:
SHOW SLAVE STATUS; -- 從庫執行,查看主從狀態
能夠看到Slave IO STATE
爲空表明未鏈接上,這時候從庫啓動複製:
START SLAVE; -- 從庫執行,啓動從庫
啓動後能夠再次查看從庫狀態,看到Slave IO STATE
變成Waiting for master to send event
表明主從同步成功。
這個時候在主庫建立一張表:
-- 主庫執行 CREATE TABLE `TB_USER`( ID VARCHAR(55) PRIMARY KEY NOT NULL, `NAME` VARCHAR(55) );
建立成功後登陸從庫,會發下多了一張表,這個時候咱們的主從複製就已經搭建完成了。圖就不貼了,貼圖不如本身動手體會效果。
啓動,關閉從庫:
START SLAVE; # 啓動從庫 STOP SLAVE; # 關閉從庫
在修改從庫的master
配置以前必定要關閉從庫,在修改配置信息。
在主從同步過程當中由於全部的SQL必須都要在從服務器裏面執行一遍,可是主服務器若是不斷的有更新操做源源不斷的寫入, 那麼一旦有延遲產生, 那麼延遲加劇的可能性就會原來越大。雖然這個問題又不能徹底解決,可是咱們能夠採起一些措施來緩解。
咱們知道由於主服務器要負責更新操做, 他對安全性的要求比從服務器高, 全部有些設置能夠修改,好比sync_binlog=1,innodb_flush_log_at_trx_commit = 1
之類的設置,而slave則不須要這麼高的數據安全,徹底能夠講sync_binlog
設置爲0或者關閉binlog,innodb_flushlog, innodb_flush_log_at_trx_commit
也 能夠設置爲0來提升sql的執行效率 這個能很大程度上提升效率。另外就是使用比主庫更好的硬件設備做爲slave。