1、主從複製介紹
1)基本原理
slave會從master讀取bin-log來進行數據同步
MySQL複製過程分成三步:
1)master將改變記錄到二進制日誌(binary log)。這些記錄過程叫做二進制日誌事件,binary log events。
2)slave將master的binary log events拷貝到它的中繼日誌(relay log)。
3)slave重做中繼日誌中的事件,將改變應用到自己的數據庫中。MySQL複製是異步且串行化的。
總結一張圖(網上盜的)
2)基本原則
1、每個slave只有一個master
2、每個slave只能有一個唯一的服務器ID
3、每個master可以有多個salve
2、主從複製配置
我使用騰訊雲的雲數據庫作爲主機,自己的linux作爲從機
MySQL版本一致且後臺以服務運行,主從都配置在[mysqld]節點下,都是小寫
1)主機修改my.ini配置文件
1、確認主機服務器唯一ID
server-id=1,這裏的序號隨意,不一定要是1。
查看server_id,也可能是server-id
show variables like '%server_id%';
2、啓用二進制日誌
查看是否已經開啓
show variables like '%log_bin%';
3、read-only=0
主機,讀寫都可以
4、啓用錯誤日誌(可選)
log-err=自己本地的路徑/mysqlerr
5、根目錄(可選)
basedir=自己本地路徑
6、臨時目錄(可選)
tmpdir=自己本地路徑
7、數據目錄(可選)
datadir=自己本地路徑/Data
8、設置不需要複製的數據庫(可選)
binlog-ignore-db=mysql
如果不開啓,代表以後新創建的數據庫都要複製。
9、設置需要複製的數據庫(可選)
binlog-do-db=需要複製的主數據庫名字
2)從機修改my.cnf配置文件
1、確認從機服務器唯一ID
2、啓用二進制日誌(可選)
重啓主機和從機
3、建立主從關係
1)主機建立賬戶授權slave
grant replication slave on *.* to 'zhangsan'@'從機數據庫ip' identified by '123456';
flush privileges;
從機數據庫ip可以是%,意思是所有ip都可以登陸。
查詢master的狀態
show master status;
表示,從機要從二進制文件mysql-bin.000005的第64162055位置開始複製。
記錄File和Position的值,接下來就不用管主機了。
2)從機配置需要複製的主機
從機執行
change master to
master_host = '主機ip',
master_port = 端口號,
master_user = 'zhangsan',
master_password = '123456',
master_log_file = '之前的File',
master_log_pos = 之前的Position值;
例如
change master to
master_host = 'cdb-6lyf7c.cd.tencentcdb.com',
master_port = 3306,
master_user = 'zhangsan',
master_password = '123456',
master_log_file = 'mysql-bin.000005',
master_log_pos = 64162055;
執行
start slave;
show slave status\G
當出現這兩個參數都是Yes,則說明主從配置成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3)常見錯誤
如果出現這種情況Slave_IO_Running: NO
不着急,先停用slave
stop slave;
查看MySQL的日誌,找到錯誤
vim /var/log/mysqld.log
可以看到GTID_MODE主機和從機不一致。解決方法
先查看主機
show variables like '%gtid%';
可以去查看下從機的,這裏我直接通過my.cnf打開從機的這兩個選項。
vim /etc/my.cnf
添加
enforce_gtid_consistency=on
gtid_mode=on
保存,重啓從機MySQL。
再次執行,這裏需要重新查看下主機的File和Position
change master to
master_host = 'cdb-6lyf7c.cd.tencentcdb.com',
master_port = 3306,
master_user = 'zhangsan',
master_password = '123456',
master_log_file = 'mysql-bin.000005',
master_log_pos = 64162055;
start slave;
show slave status\G
可以看到一切OK了。
如果執行change master to出現這個報錯,先得把slave停用先。
4、測試
主機創建數據庫和表
create database test;
use test;
create table dog(name varchar(10));
從機查看
一切OK
5、總結
最後,配置主從並不難,我這裏使用的是騰訊雲,不能打開my.conf這樣的配置文件進行修改MySQL配置,所以都是從機修改,最後也可以達到目的。
遇到問題的時候,記得打開日誌查看。