MySQL8從零數據開始主從複製

爲什麼要複製數據庫?

簡單來說有以下幾個用處:

  1. 讀寫分離
    通過MySQL複製可以實現讀寫分離,將讀操作分佈到多個不同的服務器上,減輕服務器的壓力。
  2. 備份
    從庫可以作爲數據的異地實時備份。
  3. 故障切換
    當主庫遇到故障,系統可以切換到從庫,實現故障切換。
  4. 升級測試
    從庫可作爲測試服務器的數據庫。

主從複製圖示如下:
在這裏插入圖片描述

複製數據的步驟

  1. 在主庫上把數據更改記錄到二進制日誌(Binary Log)中。
  2. 備庫將主庫上的日誌複製到自己的中繼日誌(Relay Log)中。
  3. 備庫讀取中繼日誌中的事件,將其在備庫上重新執行一遍。

在這裏插入圖片描述

具體操作步驟如下:

主服務器地址:10.145.1.17
從服務器地址:10.145.1.22

分別登錄主從服務器上的MySQL
在這裏插入圖片描述

在主從服務器上分別新建數據庫sync

在這裏插入圖片描述
這樣主從服務器上都新建了一個新的數據庫sync。

創建複製賬號repl,並賦予replication slave權限

create user ‘repl’@‘10.145.1.%’ identified by ‘[email protected]#’;
grant replication slave on . to ‘repl’@‘10.145.1.%’;
在這裏插入圖片描述

修改主備數據庫的配置文件

主服務器配置
用命令 whereis my.cnf 找到my.cnf文件的位置,然後用vim打開
在這裏插入圖片描述

在文件中添加:

log_bin = mysql-bin
server_id = 17

這裏的log_bin爲日誌文件名,自己取一個名詞, server_id 只要唯一就行
在這裏插入圖片描述

systemctl restart mysqld 重啓mysql
在這裏插入圖片描述
重新登錄mySQL
輸入命令show master status;
可以看到file那一列變成了mysql-bin.000001,配置成功。
在這裏插入圖片描述

從服務器配置

退出mysql,找到並編輯my.cnf文件
在這裏插入圖片描述
添加以下內容:
log_bin = mysql-bin
server_id = 22
relay_log = /var/lib/mysql/mysql-realay-bin
log_slave_updates = 1
read_only = 1

log_bin默認情況下會使用機器名命名,這裏設成和主庫相同的名稱,當然也可以設置成其他名稱。
relay_log指定中繼日誌的位置和名字,log_slave_updates允許備庫將其重放事件記錄到自身的二進制文件中,read_only會阻止沒有權限的線程修改數據。
這裏其實只有server_id是必填項,其他都是選填的。
在這裏插入圖片描述

保存好配置文件後,重啓mysql
在這裏插入圖片描述
重新進入MySQL,使用change master to命令開始複製:

change master to master_host=‘10.145.1.17’,
master_user = ‘repl’,
master_password = ‘[email protected]#’,
master_log_file = ‘mysql-bin-000001’,
master_log_pos = 0;

在這裏插入圖片描述
輸入命令show slave status\G;查看狀態
在這裏插入圖片描述
圖中顯示:
Slave_IO_Running: No
Slave_SQL_Running: No
表示當前備庫還沒有開始複製。

輸入命令:start slave;開始複製。
在這裏插入圖片描述

圖中顯示:
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes

Connecting說明還未連接成功。

哪裏出問題了呢?

用show grants for ‘repl’@‘10.145.1.%’;命令查看,權限已經授予成功了。
在這裏插入圖片描述

查一下mysql日誌
vim /var/log/mysqld.log
在這裏插入圖片描述
最下面顯示
Could not find first log file name in binary log index file
在這裏插入圖片描述
在網上搜了一下,在主服務器上運行flush logs;後查看最新的bin-log變成了mysql-bin.000002。
在這裏插入圖片描述

在從服務器上執行
在這裏插入圖片描述
發現還是不行。
到底哪裏出了問題呢???

我查了好久,心力憔悴啊,終止發現了問題!
在這裏插入圖片描述
我把mysql-bin.000002寫成了mysql-bin-000002!我去,心好累啊。。。

重新設置,這次終於成功了!
在這裏插入圖片描述

哎,不容易啊。

在主數據庫上運行 show processlist\G;
顯示了來自10.145.1.22的連接,並等待更多的更新。
在這裏插入圖片描述

在從數據庫上 show processlist\G;
顯示等待主服務器的數據。
在這裏插入圖片描述

好了,現在我們來驗證一下:

剛開始都沒數據,在主數據庫上建表,並插入數據:在這裏插入圖片描述
從數據庫同步了數據:
第一次show tables沒數據,第二次show tables的時候已經同步了主數據庫上的數據,也就有了數據。
在這裏插入圖片描述

自此主從複製設置完成,最後感慨一句,做程序員,細心真的很重要啊。。。












在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章