【MySQL】主從複製

紙上得來終覺淺,絕知此事要躬行。mysql

概述

複製是指將主數據庫的DDL 和 DML 操做經過二進制日誌傳到從庫服務器中,而後在從庫上對這些日誌從新執行(也叫重作),從而使得從庫和主庫的數據保持同步。sql

MySQL支持一臺主庫同時向多臺從庫進行復制, 從庫同時也能夠做爲其餘從服務器的主庫,實現鏈狀複製。shell

優點

MySQL 複製的優勢主要包含如下三個方面:數據庫

  • 主庫出現問題,能夠快速切換到從庫提供服務。服務器

  • 能夠在從庫上執行查詢操做,從主庫中更新,實現讀寫分離,下降主庫的訪問壓力。ide

  • 能夠在從庫中執行備份,以免備份期間影響主庫的服務。測試

原理

在詳細介紹如何設置複製以前,咱們先看看MySQL其實是如何複製數據的,總的來講,複製分爲三個步驟:線程

  1. 當主庫在事務提交時,會把數據變動做爲時間 Events 記錄在二進制日誌文件 Binlog 中。(這些記錄被稱爲二進制日誌事件)
  2. 主庫推送二進制日誌文件 Binlog 中的日誌事件到從庫的中繼日誌 Relay Log 。
  3. slave重作中繼日誌中的事件,將改變反映它本身的數據。

第一步在主庫上記錄二進制文件(後續介紹設置)。在每次準備提交事務完成數據更新前,主庫將數據更新的事件記錄到二進制日誌中。MySQL會按照事務提交的順序而非每條語句的執行順序來記錄二進制日誌。在記錄二進制日誌以後主庫會告訴存儲引擎提交事務。3d

第二步,從庫將主庫的二進制日誌複製到其本地的中繼日誌。首先從庫會啓動一個工做線程稱爲I/O線程,該線程跟主庫創建一個普通的客戶端鏈接,而後在主庫上啓動一個特殊的二進制轉儲線程,這個二進制轉儲線程會讀取主庫上二進制日誌事件,他不會對事件進行輪詢。若是該線程追遇上了主庫,他將進入睡眠狀態,直到主庫發送信號量通知從庫有新的事件纔會被喚醒,而後線程將接受到的事件記錄到中繼日誌。rest

第三步,從庫中的線程從中繼日誌中讀取事件並在從庫執行,從而實現從庫數據的更新。

配置

Master配置

  1. 查看MySQL默認配置文件
mysql --help|grep 'my.cnf'
  1. 選擇一個配置文件輸入一下配置信息
# 必須,表示mysql配置文件
[mysqld]

# mysql 服務ID,保證整個集羣環境中惟一
server-id=1

# mysql binlog 日誌的存儲路徑和文件名
log-bin=/var/lib/mysql/mysqlbin

# 錯誤日誌,默認已經開啓
# log-err

# mysql的安裝目錄
# basedir

# mysql的臨時目錄
# tmpdir

# mysql的數據存放目錄
# datadir

# 是否只讀,1 表明只讀, 0 表明讀寫
read-only=0

# 忽略的數據, 指不須要同步的數據庫
binlog-ignore-db=mysql

# 指定同步的數據庫
# binlog-do-db=db01
  1. 保存完畢以後,重啓服務
service mysql restart
  1. 建立同步數據的帳戶,而且進行受權操做
grant replication slave on *.* to '用戶名'@'從庫服務器地地址' identified by '密碼';	

# 例如:grant replication slave on *.* to 'root'@'192.168.192.131' identified by 'root';	

flush privileges;
  1. 查看log-bin是否已打開
mysql> show variables like '%log_bin%';
+---------------------------------+-------------------------------+
| Variable_name                   | Value                         |
+---------------------------------+-------------------------------+
| log_bin                         | ON                            |
| log_bin_basename                | /var/lib/mysql/mysqlbin       |
| log_bin_index                   | /var/lib/mysql/mysqlbin.index |
| log_bin_trust_function_creators | OFF                           |
| log_bin_use_v1_row_events       | OFF                           |
| sql_log_bin                     | ON                            |
+---------------------------------+-------------------------------+
6 rows in set (0.00 sec)
  1. 查看master狀態
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| mysqlbin.000001 |      154 |              | mysql            |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

# File : 從哪一個日誌文件開始推送日誌文件 
# Position : 從哪一個位置開始推送日誌
# Binlog_Ignore_DB : 指定不須要同步的數據庫

Slave配置

  1. 與Master同樣查找配置文件,輸入如下內容
# mysql服務端ID,惟一
server-id=2

# 指定binlog日誌
log-bin=/var/lib/mysql/mysqlbin
  1. 保存完畢以後,重啓服務
service mysql restart
  1. 登陸數據庫,輸入一下命令
change master to master_host= '192.168.192.130', master_user='主庫用戶名', master_password='主庫密碼', master_log_file='mysqlbin.000001', master_log_pos=413;

指定當前從庫對應的主庫的IP地址,用戶名,密碼,從哪一個日誌文件開始的那個位置開始同步推送日誌。

  1. 開啓同步操做
start slave;
show slave status;

  1. 中止同步操做
stop slave;

測試配置同步

  • 在主庫中建立數據庫,建立表,並插入數據 :
create database db01;

user db01;

create table user(
	id int(11) not null auto_increment,
	name varchar(50) not null,
	sex varchar(1),
	primary key (id)
)engine=innodb default charset=utf8;

insert into user(id,name,sex) values(null,'Tom','1');
insert into user(id,name,sex) values(null,'Trigger','0');
insert into user(id,name,sex) values(null,'Dawn','1');
  • 在從庫中查詢數據,進行驗證 :

在從庫中,能夠查看到剛纔建立的數據庫:

在該數據庫中,查詢user表中的數據:

相關文章
相關標籤/搜索