只記錄一次在一個設備上實現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';
刷新一下權限:
flush privileges;
如果主服務器中的數據庫“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 -u用戶名 -p密碼,但是因為一個設備有多個mysql需要指定端口號來登錄,否則只會進入默認的3306端口服務器):
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服務器設置為互為主從。
