高冷的菜單欄
- 安裝MySQL
- 測試環境介紹
- 主從備份原理
- 在A機器中的操作
-
-
- 建立一個測試資料庫zengraoli2
- 建立一個遠端使用者zeng
- 配置my.cnf
- 在MySQL終端檢視mater資訊
-
- 在B機器中的操作
-
-
- 建立資料庫zengraoli
- 配置my.cnf
- 設定slava資訊
-
- 進行資料測試
-
-
- 對A機器進行資料的插入
- 在B機器上查詢表中資料是否更新
- 停用A機器的MySQL,再來看插入
- 是以簡單下一個結論
- 為什麼沒有自帶的哨兵模式?
-
- 一些其他需要到的指令
- 如果是另一台MySQL伺服器通過克隆出來
安裝MySQL
請參考網上
測試環境介紹
測試環境為centos7.5
A機器ip:10.0.8.37(主)
B機器ip:10.0.8.243(從)
MySQL版本:5.6.42
主從備份原理
主伺服器資料庫的每次操作都會記錄在二進制日志檔案mysql-bin.xxx中。從伺服器的I/O線程使用專用帳号登陸到主伺服器中讀取該二進制檔案,并将檔案内容寫入到自己本地的中繼日志relay-log檔案中。然後從伺服器的SQL線程會根據中繼日志中的内容執行SQL語句。
本段說明參考:https://www.cnblogs.com/ahaii/p/6307648.html
在A機器中的操作
建立一個測試資料庫zengraoli2
CREATE DATABASE zengraoli2;
USE zengraoli2;
CREATE TABLE test2 ( id int not null primary key,name char(20) );

建立一個遠端使用者zeng
讓這個使用者隻能操作zengraoli這個資料庫的表
CREATE USER 'zeng'@'%' IDENTIFIED BY '123456';
grant all privileges on zengraoli2.* to 'zeng'@'%' identified by '123456';
GRANT REPLICATION SLAVE ON *.* TO 'zeng'@'10.0.8.243' IDENTIFIED BY '123456';
flush privileges;
在本機測試一下,看看能否用遠端進行連結本地的資料庫
mysql -h 10.0.8.37 -u zeng -p
正常進入,說明建立成功
配置my.cnf
修改my.cnf,
sudo vi /etc/my.cnf
找到port=3306這一行,在其下面添加如下内容
server-id=2 # 要與從庫不一樣
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql # 不同步哪個庫 預設是全部
binlog-do-db=zengraoli2 # 隻同步哪個庫
expire_logs_days = 10
log-bin=mysql-bin
max_binlog_size = 100M
binlog_format = row # binlog的格式 row 具有 statement和mixed 不具備的優勢 填寫 row
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1 # 和 sync_binlog 組成雙1 配置 保證資料的完整性
重新開機資料庫即可生效
sudo service mysqld restart
在B機器上沒有建立資料庫的腳本,是以我們需要先把剛才建立的資料庫導出到.sql檔案中,在B中導入
在MySQL終端檢視mater資訊
show master status;
在B機器中的操作
建立資料庫zengraoli
并導入剛才的.sql檔案
CREATE DATABASE zengraoli2;
USE zengraoli2;
source zengraoli.sql;
配置my.cnf
修改my.cnf,
sudo vi /etc/my.cnf
找到port=3306這一行,在其下面添加如下内容
重新開機資料庫即可生效
sudo service mysqld restart
設定slava資訊
進入MySQL的終端,直接幹
stop slave;
change master to master_host='10.0.8.37',master_user='zeng',master_password='123456',master_log_file='mysql-bin.000014', master_log_pos=120;
start slave;
master_user要指定能通路的使用者名和,master_password則是密碼,master_log_file、master_log_pos要對應上面master中顯示的
設定完成後,用
show slave status\G;
檢視目前的slave資訊如下
進行資料測試
對A機器進行資料的插入
INSERT INTO `test2`(`id`, `name`) VALUES('1', 'zeng1');
INSERT INTO `test2`(`id`, `name`) VALUES('2', 'zeng2');
SELECT * FROM `test2`;
在B機器上查詢表中資料是否更新
use zengraoli2;
SELECT * FROM `test2`;
看下以下兩條資料,證明已經把資料複制過來了
停用A機器的MySQL,再來看插入
在A機器上執行
sudo service mysqld stop
在B中插入資料
SELECT * FROM `test2`;
重新打開A上的MySQL,進入MySQL終端,查詢一下,第三條資料沒有過來
是以簡單下一個結論
A丢失資料這段時間,無法進行資料的插入,B機器能做的就是A機器崩的時候,可以臨時頂替A,然後手工同步資料,再進行切換
為什麼沒有自帶的哨兵模式?
是啊,為什麼沒有自帶的哨兵模式?@MySQL
一些其他需要到的指令
進入本地MySQL之後,要删除使用者dog3
use mysql;
select host,user,password from user;
delete from user where user='dog3';
即可完成删除
如果是另一台MySQL伺服器通過克隆出來
那麼,極有可能因為MySQL的id相同,出現以下問題
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
方法一:修改配置檔案,直接修改ID
vim /var/lib/mysql/auto.cnf
方法二:停止從庫的mysqld服務,删除他的auto.cnf檔案,再啟動資料庫服務即可
sudo service mysqld stop
mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak
sudo service mysqld start
vi /var/lib/mysql/auto.cnf
show slave status\G;
再看看從庫的資訊,可以看到恢複正常了