紙上得來終覺淺,絕知此事要躬行。mysql
複製是指將主數據庫的DDL 和 DML 操做經過二進制日誌傳到從庫服務器中,而後在從庫上對這些日誌從新執行(也叫重作),從而使得從庫和主庫的數據保持同步。sql
MySQL支持一臺主庫同時向多臺從庫進行復制, 從庫同時也能夠做爲其餘從服務器的主庫,實現鏈狀複製。shell
MySQL 複製的優勢主要包含如下三個方面:數據庫
主庫出現問題,能夠快速切換到從庫提供服務。服務器
能夠在從庫上執行查詢操做,從主庫中更新,實現讀寫分離,下降主庫的訪問壓力。ide
能夠在從庫中執行備份,以免備份期間影響主庫的服務。測試
在詳細介紹如何設置複製以前,咱們先看看MySQL其實是如何複製數據的,總的來講,複製分爲三個步驟:線程
第一步在主庫上記錄二進制文件(後續介紹設置)。在每次準備提交事務完成數據更新前,主庫將數據更新的事件記錄到二進制日誌中。MySQL會按照事務提交的順序而非每條語句的執行順序來記錄二進制日誌。在記錄二進制日誌以後主庫會告訴存儲引擎提交事務。3d
第二步,從庫將主庫的二進制日誌複製到其本地的中繼日誌。首先從庫會啓動一個工做線程稱爲I/O線程,該線程跟主庫創建一個普通的客戶端鏈接,而後在主庫上啓動一個特殊的二進制轉儲線程,這個二進制轉儲線程會讀取主庫上二進制日誌事件,他不會對事件進行輪詢。若是該線程追遇上了主庫,他將進入睡眠狀態,直到主庫發送信號量通知從庫有新的事件纔會被喚醒,而後線程將接受到的事件記錄到中繼日誌。rest
第三步,從庫中的線程從中繼日誌中讀取事件並在從庫執行,從而實現從庫數據的更新。
mysql --help|grep 'my.cnf'
# 必須,表示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
service mysql restart
grant replication slave on *.* to '用戶名'@'從庫服務器地地址' identified by '密碼'; # 例如:grant replication slave on *.* to 'root'@'192.168.192.131' identified by 'root'; flush privileges;
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)
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 : 指定不須要同步的數據庫
# mysql服務端ID,惟一 server-id=2 # 指定binlog日誌 log-bin=/var/lib/mysql/mysqlbin
service mysql restart
change master to master_host= '192.168.192.130', master_user='主庫用戶名', master_password='主庫密碼', master_log_file='mysqlbin.000001', master_log_pos=413;
指定當前從庫對應的主庫的IP地址,用戶名,密碼,從哪一個日誌文件開始的那個位置開始同步推送日誌。
start slave; show slave status;
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表中的數據: