MYSQL一個裝置上的主從複製實現-windows

小小赫下士發表於2021-07-28

只記錄一次在一個裝置上實現mysql主從複製的過程,很詳細,建議收藏,用到的時候照著步驟做就可以,會記錄所有需要注意到的細節和一些容易遇到的坑以及解決辦法!

如果需要在同一臺電腦(伺服器)上實現mysql的主從複製備份,需要一個主資料庫和一個從資料庫。

本文使用的是mysql-5.6.39-winx64免安裝版。安裝版的也可以,需要自行找到安裝生成的data所在目錄以及my.ini檔案位置。

因為在這之前我已經安裝好了主資料庫,本文只記錄從資料庫的安裝過程,(主資料庫也是個全新的,會記錄所有的配置)。

主資料庫埠號 port = 3307。

從資料庫埠號 port = 3308 。

安裝第二個從mysql:

找到第一個安裝的mysql目錄,完整的複製到另一個磁碟裡(因為我的是免安裝的,如果有安裝包或者壓縮包可以重新安裝一個,我懶。)(我這裡放到了一起,好操作,實際看情況為了好區分,我在後面加了字尾-copy

MYSQL一個裝置上的主從複製實現-windows

MYSQL一個裝置上的主從複製實現-windows

編輯copy資料庫的my.ini:

basedir = E:\MYSQL\mysql-5.6.39-winx64-copy
datadir = E:\MYSQL\mysql-5.6.39-winx64-copy\data

port = 3308

新增環境變數:1、右擊我的電腦-2、點選屬性-3、點選高階系統設定-4、點選環境變數

在系統變數裡新增兩個資料庫的變數,不新增的話兩個mysql容易亂(兩個mysql後面分別加了個1、2區分) 

 然後在系統變數裡的PATH裡追加變數值:

%MYSQL_HOME1%\bin     %MYSQL_HOME2%\bin

將兩個mysql註冊成windows服務:

使用管理員命令視窗進入mysql安裝目錄下的bin目錄裡:

 

兩個資料庫分別操作輸入服務安裝命令:

(MYSQL2_copy 是服務名字,可以隨意自定義)

E:\MYSQL\mysql-5.6.39-winx64-copy\bin\mysqld install MYSQL2_copy --defaults-file="E:\MYSQL\mysql-5.6.39-winx64-copy\my.ini"

(補充:移除服務的命令:mysqld remove MYSQL2_copy)

執行提示下面內容表示服務安裝成功:

Service successfully installed.

可以進入服務頁面檢視(服務頁面進入方法:右擊我的電腦,點選管理,然後點選服務和應用下的服務即可):

 啟動mysql服務:

一:命令啟動:

net start MYSQL1

二:服務列表啟動(右擊服務,點選啟動)

修改主資料庫的my.ini配置:

在[mysqld]標籤下新增:

# 伺服器id 可自定義
server-id = 3307
# 開啟二進位制日誌
log-bin=mysql-bin
log-bin-index=master-bin.index
relay_log=mysql-relay-bin
# 需要備份的資料庫
binlog-do-db=test
# 不需要備份的資料庫
binlog-ignore-db=mysql

儲存退出,重啟主資料庫服務

binlog-do-db用於指定需要同步的資料庫,binlog-ignore-db指定不需要同步的資料庫,如果這兩個引數都不設定,則從伺服器會複製主伺服器的所有資料庫

一般同步的話會新建一個專門用在該場景的使用者,所以我們需要在主伺服器上建立一個新的使用者(如user_cp,密碼123456)

方法如下:

開啟管理員命令視窗,切換至主資料庫目錄下的bin目錄下,用 root 賬戶連線MySQL主伺服器(-u賬號 -p密碼)

mysql -uroot -proot --protocol=tcp --host=localhost --port=3307

建立新使用者(@後面的ip地址為允許連線的客戶端的ip地址。): 

create user 'user_cp'@'127.0.0.1' identified by '123456';

給新使用者配置主從複製的許可權(@後面的ip地址為允許連線的客戶端的ip地址,如果改為 '%',就表示客戶端沒有ip地址的限制):

grant replication slave on *.* to 'user_cp'@'127.0.0.1' identified by '123456';

如果主伺服器中的資料庫“test”中,已經有資料,我們需要先手動把主伺服器中的資料複製到從伺服器中,為了防止我們複製資料的時候,資料庫中的test裡的資料發生更新變化,我們可以先鎖定資料庫。

方法:

使用全域性鎖

flush tables with read lock;

這個命令是全域性讀鎖定,它會給主伺服器中的所有資料庫都加上讀鎖,這裡順便說一下讀鎖和寫鎖的區別:
read lock(讀鎖):也叫共享鎖,允許所有的讀操作,但阻塞寫操作,即所有連線只可以讀資料,但不允許寫資料。
write lock(寫鎖):也叫排它鎖、獨佔鎖,只允許當前連線的讀和寫,不允許其他併發的讀操作和寫操作。
鎖定主伺服器的資料庫後,我們在從伺服器中,也建立一個資料庫test,並將所有的表(包括表結構和表資料)都匯入。
然後,我們執行下面的命令,解鎖:

unlock tables;  

檢視主伺服器的master狀態(記住列表中的File 和 Position的值,等會配置從伺服器的時候需要用到):

show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000013 |     497  |     test     | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+

從伺服器配置:

修改從伺服器的資料庫配置檔案E:\MYSQL\mysql-5.6.39-winx64-copy\my.ini:

[mysqld]標籤下新增:

# 埠號
port = 3308
# 服務id 可自定義 server_id = 3308
# 開啟二進位制日誌(從伺服器不是必須要開啟二進位制日誌)
log-bin=mysql-bin 

儲存退出,重啟MySQL服務。

使用管理員命令視窗登入:

mysql -uroot -proot --protocol=tcp --host=localhost --port=3308

然後複製以下內容執行(需要修改裡面的內容,不要複製直接執行):

change master to master_host='127.0.0.1',master_user='user_cp',master_password='123456',master_port=3307,master_log_file='mysql-bin.000013',master_log_pos=497;

引數詳解:

master_host: 主伺服器的IP

master_user: 主伺服器上新建立的使用者名稱

master_password: 使用者的密碼

master_port: 主伺服器的埠,如果未曾修改,預設即可。

master_log_file: 主伺服器二進位制日誌檔案的名稱,填寫檢視主伺服器的master狀態時顯示的File的值

master_log_pos: 日誌的位置,填寫檢視主伺服器的master狀態時顯示的Position的值

 

啟動從伺服器的slave複製功能:

start slave;

停止主從複製功能:

stop slave;

檢視從伺服器的slave狀態:

show slave status \G;

mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: user_cp
Master_Port: 3307
Connect_Retry: 60
Master_Log_File: mysql-bin.000013
Read_Master_Log_Pos: 819
Relay_Log_File: DESKTOP-IDKR9K2-relay-bin.000003
Relay_Log_Pos: 605
Relay_Master_Log_File: mysql-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

如果 Slave_IO_Running 和 Slave_SQL_Running 的值都為 Yes,則說明主從複製的所有配置已成功,即從伺服器已經可以自動與主伺服器的資料庫資料實現同步了。

此後,只要主伺服器的資料有更新(比如:在 test資料庫中新建了一張表或者表中的資料發生了變化),從伺服器都會自動與主伺服器保持一致。但如果有人刻意改變了從伺服器的資料,主伺服器中的資料並不會同步更新,除非我們把這兩個MySQL伺服器設定為互為主從。

 

相關文章