概要:爲了降低服務的Mysql壓力,常常會有mysql的主從配置
讀寫分離的基本實現是:
- 數據庫服務器搭建主從集羣,一主一從、一主多從都可以。
- 數據庫主機負責讀寫操作,從機只負責讀操作。
- 數據庫主機通過複製將數據同步到從機,每臺數據庫服務器都存儲了所有的業務數據。
- 業務服務器將寫操作發給數據庫主機,將讀操作發給數據庫從機。
下面我們開始配置
一、準備工作
下載
下載地址:https://www.mysql.com/downloads/
二、主機安裝與配置
1、配置主庫: 修改my.ini
# 以下內容手動添加
[client]
# 設置mysql客戶端連接服務端時默認使用的端口
port=3308
default-character-set=utf8
[mysqld]
#主庫配置
server_id=1
log_bin=master-bin
log_bin-index=master-bin.index
#端口
port=3308
character_set_server=utf8
#解壓目錄
basedir=F:\Program Files\mysql-group\mysql-5.6.24-master
#解壓目錄下data目錄
datadir=F:\Program Files\mysql-group\mysql-5.6.24-master\data
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[WinMySQLAdmin]
F:\Program Files\mysql-group\mysql-5.6.24-master\bin\mysqld.exe
2、安裝主mysql
執行命令:mysqld --install master --defaults-file="F:\Program Files\mysql-group\mysql-5.6.24-master\my.ini"
注:其中的master爲主庫mysql的服務名稱
3、啓動主庫的mysql服務器
執行命令:net start master
4、修改密碼
進入mysql命令界面 mysql -uroot -p -P 3308
使用命令 mysql -uroot -p 登錄master數據庫(默認安裝好的mysql的root用戶是沒有密碼的)
登錄上之後修改root用戶的密碼(這裏修改成root)
執行命令
use mysql;
update user set password=password("root") where user="root";
flush privileges;
5、主庫(master)中創建一個用戶用於與從庫同步的用戶名和密碼(這裏我創建一個test用戶,密碼爲mysql),並給test用戶授權,以用於主庫操作從庫。
create user test;
grant replication slave on *.* to '從庫用戶名(test)'@'從庫主機地址(127.0.0.1)'identified by '密碼(mysql)';
flush privileges;
6、查看master的狀態下,生成了一個二進制的日誌文件
命令: show master status;
這裏的這個 File:master-bin.000084和Position:9253348非常重要,只要告訴從庫這兩個東西,就可完成主從關聯
三、從機安裝與配置
1、修改從庫1與從庫2的 my.ini
# 以下內容手動添加
[client]
# 設置mysql客戶端連接服務端時默認使用的端口
port=3309
default-character-set=utf8
[mysqld]
#從庫配置
server_id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
#端口
port=3309
character_set_server=utf8
#解壓目錄
basedir=F:\Program Files\mysql-group\mysql-5.6.24-slave
#解壓目錄下data目錄
datadir=F:\Program Files\mysql-group\mysql-5.6.24-slave\data
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[WinMySQLAdmin]
F:\Program Files\mysql-group\mysql-5.6.24-slave\bin\mysqld.exe
# 以下內容手動添加
[client]
# 設置mysql客戶端連接服務端時默認使用的端口
port=3310
default-character-set=utf8
[mysqld]
#從庫配置
server_id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
#端口
port=3310
character_set_server=utf8
#解壓目錄
basedir=F:\Program Files\mysql-group\mysql-5.6.24-slave2
#解壓目錄下data目錄
datadir=F:\Program Files\mysql-group\mysql-5.6.24-slave2\data
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[WinMySQLAdmin]
F:\Program Files\mysql-group\mysql-5.6.24-slave2\bin\mysqld.exe
2、安裝兩個從庫
mysqld --install slave1 --defaults-file="F:\xxxxxxxx從庫1地址xxxxxxx\my.ini"
mysqld --install slave2 --defaults-file="F:\xxxxxxxx從庫2地址xxxxxxx\my.ini"
3、啓動兩個從庫
net start slave1
net start slave2
4、修改root密碼
使用命令" mysql -uroot -p -P端口 "登錄slave1、slave2數據庫(默認安裝好的mysql的root用戶是沒有密碼的)
登錄上之後修改root用戶的密碼(這裏修改成root)
執行命令
use mysql;
update user set password=password("root") where user="root";
flush privileges;
5、告訴從庫用什麼賬號登錄什麼位置的主庫,主庫的日誌文件是什麼
change master to master_host='127.0.0.1(主庫地址)',master_port=3308(主庫端口),master_user='test',master_password='mysql',master_log_file='master-bin.000084',master_log_pos=9253348;
注:(如果錯誤提示 This operation cannot be performed with a running slave; run STOP SLAVE first,請先輸入命令 stop slave;)
6、開啓主從功能
start slave;
7、查看是否成功
show slave status \G;
只要 Slave_IO_Running: Yes Slave_SQL_Running: Yes 則代表成功
8、驗證
在主庫中增刪改,一套操作猛如虎看看從庫是否跟隨改變
四、個人經驗
如果在配置之前主庫就有很多數據庫和表還有數據,建議先同步數據(否則主從複製時從庫沒有相關數據庫和表,會導致寫入錯誤並暫停)
1、鎖住主庫的寫
FLUSH TABLES WITH READ LOCK;
這時主庫只能讀取數據,其他操作將被掛起
2、傳輸所有主庫已有數據到從庫
3、主庫解鎖
UNLOCK TABLES;
五、異常中斷後咋整
show slave status \G;
Slave_IO_Running Slave_SQL_Running 其中一個變爲no
解決方法
先鎖住主庫(master):FLUSH TABLES WITH READ LOCK;
暫停同步(slave):stop slave;
手動同步主庫數據到從庫
設置(slave): master_log_file與master_log_pos請實時查看主庫當前數值
change master to master_host='127.0.0.1(主庫地址)',master_port=3308(主庫端口),master_user='test',master_password='mysql',master_log_file='master-bin.000084',master_log_pos=9253348;
啓動同步(slave):start slave;
解鎖主庫(master): UNLOCK TABLES;