1、複製原理
1、Master將數據改變記錄到二進制日誌(binary log)中,也就是配置文件log-bin指定的文件,這些記錄叫做二進制日誌事件(binary log events)
2、Slave通過I/O線程讀取Master中的binary log events並寫入到它的中繼日誌(relay log)
3、Slave重做中繼日誌中的事件,把中繼日誌中的事件信息一條一條的在本地執行一次,完成數據在本地的存儲,從而實現將改變反映到它自己的數據(數據重放)
要求
1、主從服務器操作系統版本和位數一致
2、Master和Slave數據庫的版本要一致
3、Master和Slave數據庫中的數據要一致
4、Master開啟二進制日誌,Master和Slave的server_id在局域網內必須唯一
2、準備工作
例如:A(master)、B(slave),主從兩臺服務器,A、B服務器上的MySql用戶名、密碼均是root/123456,分別新建兩個數據庫test。
3、配置文件
master數據庫my.conf配置
[mysqld] log_bin=mysql-bin-1 #文件名mysql-bin-1 server_id=1 #服務ID,用於區分服務,範圍1~2^32-1 #MySQL 磁盤寫入策略以及數據安全性 #每次事務提交時MySQL都會把log buffer的數據寫入log file,並且flush(刷到磁盤)中去 innodb_flush_log_at_trx_commit=1 #當sync_binlog =N (N>0) ,MySQL 在每寫 N次 二進制日誌binary log時,會使用fdatasync()函數將它的寫二進制日誌binary log同步到磁盤中去。 sync_binlog=1 binlog-do-db=test #同步數據庫 #mysql複製模式,三種:SBR(基於sql語句複製),RBR(基於行的複製),MBR(混合模式複製) binlog_format=MIXED #混合模式複製 expire_logs_days=7 #binlog過期清理時間 max_binlog_size=20M #binlog每個日誌文件大小 skip-name-resolve datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Recommended in standard MySQL setup sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
salve數據庫my.conf配置
[mysqld] log_bin=mysql-bin-2 #文件名mysql-bin-2 server_id=2 #服務ID,用於區分服務,範圍1~2^32-1 #MySQL 磁盤寫入策略以及數據安全性 #每次事務提交時MySQL都會把log buffer的數據寫入log file,並且flush(刷到磁盤)中去 innodb_flush_log_at_trx_commit=1 #當sync_binlog =N (N>0) ,MySQL 在每寫 N次 二進制日誌binary log時,會使用fdatasync()函數將它的寫二進制日誌binary log同步到磁盤中去。 sync_binlog=1 binlog-do-db=test #同步數據庫 #mysql複製模式,三種:SBR(基於sql語句複製),RBR(基於行的複製),MBR(混合模式複製) binlog_format=MIXED #混合模式複製 expire_logs_days=7 #binlog過期清理時間 max_binlog_size=20M #binlog每個日誌文件大小 skip-name-resolve datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Recommended in standard MySQL setup sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
4、創建同步權限及賦權
在A(master)mysql中新建同步權限
grant replication slave on *.* to 'root'@'B' identified by '123456';
5、完成Master和Slave鏈接
5.1:查詢master狀態
show master status;
5.2:根據master狀態信息,在slave上設置master信息
change master to master_host='A',master_port=3306,master_user='root',master_password='123456',master_log_file='mysql-bin-2.000009',master_log_pos=120;
5.3:開始slave的同步
開始slave的同步
start slave;
查看slave的狀態
show slave status\G;
6、實踐
我們在A數據庫test的表example新建一條記錄,觀看B數據庫test的表example的情況。
然後刷新slave的數據庫
⚠️注意點⚠️
1、my.cnf配置文件
master和slave的server_id一定不能一致。
2、在slave中設置master信息
master_log_file文件是master中的日誌文件,以及master_log_pos偏移量。
3、Slave_IO_Running、Slave_SQL_Running
在查詢slave的status時候,slave_io_running和slave_sql_runing兩個參數必須為YES,兩者缺一不可。這裡有一個bug,就是默認my.cnf配置的時候,沒有禁用掉mysql默認的系統數據庫,也沒有指定要複製的數據庫名稱,致使複製的時候我把整個數據庫data文件夾一起復制過去了,導致了 主從服務器上的data/auto.cnf 文件內容一樣auto.cnf裡面記錄的server-id也一模一樣的重複了。
解決辦法:把主服務器或者從服務器data目錄下auto.cnf 裡的server-id值隨便改一個字母或者數字字符,保證兩臺DB服務器auto.cnf 中server-id不重複, 重啟服務 ,即可同步,