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伺服器設置為互為主從。