MYSQL一個裝置上的主從複製實現-windows
只記錄一次在一個裝置上實現mysql主從複製的過程,很詳細,建議收藏,用到的時候照著步驟做就可以,會記錄所有需要注意到的細節和一些容易遇到的坑以及解決辦法!
如果需要在同一臺電腦(伺服器)上實現mysql的主從複製備份,需要一個主資料庫和一個從資料庫。
本文使用的是mysql-5.6.39-winx64免安裝版。安裝版的也可以,需要自行找到安裝生成的data所在目錄以及my.ini檔案位置。
因為在這之前我已經安裝好了主資料庫,本文只記錄從資料庫的安裝過程,(主資料庫也是個全新的,會記錄所有的配置)。
主資料庫埠號 port = 3307。
從資料庫埠號 port = 3308 。
安裝第二個從mysql:
找到第一個安裝的mysql目錄,完整的複製到另一個磁盤裡(因為我的是免安裝的,如果有安裝包或者壓縮包可以重新安裝一個,我懶。)(我這裡放到了一起,好操作,實際看情況為了好區分,我在後面加了字尾-copy
編輯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伺服器設定為互為主從。