1
分別在兩臺(tái)服務(wù)器上安裝系統(tǒng)和mysql數(shù)據(jù)庫(kù)
主服務(wù)器WIN2008R2,主服務(wù)器虛擬機(jī)和從服務(wù)器上是centos 7系統(tǒng),并在centos 7系統(tǒng)安裝mysql 5.7
本文中的兩臺(tái)服務(wù)器的IP地址分別為主服務(wù)器(58.66.66.66)和從服務(wù)器(49.18.18.18)。
在主服務(wù)器上創(chuàng)建虛擬機(jī)IP 192.168.200.204,主服務(wù)器內(nèi)網(wǎng)IP 192.168.200.1。
主服務(wù)器上要把3306端口映射到虛擬機(jī)192.168.200.204的3306端口上面,并做一下安全放行。
分別在這兩個(gè)服務(wù)器上創(chuàng)建test數(shù)據(jù)庫(kù),以備后面測(cè)試。
2
master主服務(wù)器的配置
2.1
配置文件my.cnf的修改
#根據(jù)上一篇文章,編輯my.cnf文件
[root@localhost
mysql]# vim /etc/my.cnf
#在[mysqld]中添加:
server-id=1
log_bin=master-bin
log_bin_index=master-bin.index
binlog_do_db=test
#備注:
#server-id
服務(wù)器唯一標(biāo)識(shí)。
#log_bin
啟動(dòng)MySQL二進(jìn)制日志,即數(shù)據(jù)同步語(yǔ)句,從數(shù)據(jù)庫(kù)會(huì)一條一條的執(zhí)行這些語(yǔ)句。
#binlog_do_db
指定記錄二進(jìn)制日志的數(shù)據(jù)庫(kù),即需要復(fù)制的數(shù)據(jù)庫(kù)名,如果復(fù)制多個(gè)數(shù)據(jù)庫(kù),重復(fù)設(shè)置這個(gè)選項(xiàng)即可。
#binlog_ignore_db
指定不記錄二進(jìn)制日志的數(shù)據(jù)庫(kù),即不需要復(fù)制的數(shù)據(jù)庫(kù)名,如果有多個(gè)數(shù)據(jù)庫(kù),重復(fù)設(shè)置這個(gè)選項(xiàng)即可。
#其中需要注意的是,binlog_do_db和binlog_ignore_db為互斥選項(xiàng),一般只需要一個(gè)即可。
2.2 創(chuàng)建從服務(wù)器的用戶和權(quán)限
#進(jìn)入mysql數(shù)據(jù)庫(kù)
[root@localhost
mysql]# mysql -uroot -p
Enter
password:
#創(chuàng)建從數(shù)據(jù)庫(kù)的masterbackup用戶和權(quán)限
mysql>
grant replication slave on *.* to masterbackup@'49.18.18.18' identified by
'123456';
mysql>
grant replication slave on *.* to masterbackup@'192.168.200.1' identified by
'123456'; (當(dāng)有虛擬機(jī)轉(zhuǎn)發(fā)端口的時(shí)候使用)
#備注
#若將
49.18.18.18 改為 %,則任何ip均可作為其從數(shù)據(jù)庫(kù)來(lái)訪問(wèn)主服務(wù)器
#退出mysql
mysql>
exit;
2.3 重啟mysql服務(wù)
[root@localhost
mysql]# service mysql restart
Shutting down
MySQL.... SUCCESS!
Starting
MySQL. SUCCESS!
2.4 查看主服務(wù)器狀態(tài)
#進(jìn)入mysql數(shù)據(jù)庫(kù)
[root@localhost
mysql]# mysql -uroot -p
Enter
password:
#查看主服務(wù)器狀態(tài)
mysql> show
master status;
+-------------------+----------+--------------+------------------+-------------------+
| File
| Position | Binlog_Do_DB |
Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
|
master-bin.000001 | 154 | test
| |
|
+-------------------+----------+--------------+------------------+-------------------+
1 row in set
(0.00 sec)
3
slave從服務(wù)器的配置
3.1 配置文件my.cnf的修改
#根據(jù)上一篇文章,編輯my.cnf文件
[root@localhost
mysql]# vim /etc/my.cnf
#在[mysqld]中添加:
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
#replicate-do-db=test
#備注:
#server-id
服務(wù)器唯一標(biāo)識(shí),如果有多個(gè)從服務(wù)器,每個(gè)服務(wù)器的server-id不能重復(fù),跟IP一樣是唯一標(biāo)識(shí),如果你沒(méi)設(shè)置server-id或者設(shè)置為0,則從服務(wù)器不會(huì)連接到主服務(wù)器。
#relay-log
啟動(dòng)MySQL二進(jìn)制日志,可以用來(lái)做數(shù)據(jù)備份和崩潰恢復(fù),或主服務(wù)器掛掉了,將此從服務(wù)器作為其他從服務(wù)器的主服務(wù)器。
#replicate-do-db
指定同步的數(shù)據(jù)庫(kù),如果復(fù)制多個(gè)數(shù)據(jù)庫(kù),重復(fù)設(shè)置這個(gè)選項(xiàng)即可。若在master端不指定binlog-do-db,則在slave端可用replication-do-db來(lái)過(guò)濾。
#replicate-ignore-db
不需要同步的數(shù)據(jù)庫(kù),如果有多個(gè)數(shù)據(jù)庫(kù),重復(fù)設(shè)置這個(gè)選項(xiàng)即可。
#其中需要注意的是,replicate-do-db和replicate-ignore-db為互斥選項(xiàng),一般只需要一個(gè)即可。
3.2 重啟mysql服務(wù)
[root@localhost
mysql]# service mysql restart
Shutting down
MySQL.... SUCCESS!
Starting
MySQL. SUCCESS!
3.3 連接master主服務(wù)器
使用mysql -h58.66.66.66 -umasterbackup -p
進(jìn)行連接測(cè)試,看有沒(méi)有出現(xiàn)連接錯(cuò)誤
#進(jìn)入mysql數(shù)據(jù)庫(kù)
[root@localhost
mysql]# mysql -uroot -p
Enter
password:
#連接master主服務(wù)器
mysql>
change master to
master_host='58.66.66.66',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154;
#備注:
#master_host對(duì)應(yīng)主服務(wù)器的IP地址。
#master_port對(duì)應(yīng)主服務(wù)器的端口。
#master_log_file對(duì)應(yīng)show
master status顯示的File列:master-bin.000001。
#master_log_pos對(duì)應(yīng)show
master status顯示的Position列:154。
3.4 啟動(dòng)slave數(shù)據(jù)同步
#啟動(dòng)slave數(shù)據(jù)同步
mysql>
start slave;
#停止slave數(shù)據(jù)同步(若有需要)
mysql> stop
slave;
3.5 查看slave信息
mysql> show
slave status\G;
Slave_IO_Running和Slave_SQL_Running都為yes,則表示同步成功。
4
測(cè)試
(1)在主服務(wù)器上登陸mysql,且進(jìn)入test數(shù)據(jù)庫(kù),創(chuàng)建test表,且插入一條數(shù)據(jù)
提示:這里可以用數(shù)據(jù)庫(kù)管理工具(如nacicat)或是phpmyadmin來(lái)操作。
#創(chuàng)建tb_test表
create table
tb_test(ID varchar(36) primary key comment '主鍵ID',MEMO varchar(500) not null
comment '信息');
#插入一條數(shù)據(jù)
insert into
tb_test(ID,MEMO) values('1','one test');
#提交
commit;
(2)在從服務(wù)器上登陸mysql,且進(jìn)入test數(shù)據(jù)庫(kù)
你會(huì)發(fā)現(xiàn)從數(shù)據(jù)庫(kù)中,也出現(xiàn)了tb_test表,且表中還有one test數(shù)據(jù)存在,證明同步數(shù)據(jù)成功。
5
解決錯(cuò)誤
若在主從同步的過(guò)程中,出現(xiàn)其中一條語(yǔ)句同步失敗報(bào)錯(cuò)了,則后面的語(yǔ)句也肯定不能同步成功了。例如,主庫(kù)有一條數(shù)據(jù),而從庫(kù)并沒(méi)有這一條數(shù)據(jù),然而,在主庫(kù)執(zhí)行了刪除這一條數(shù)據(jù)的操作,那么從庫(kù)沒(méi)有這么一條數(shù)據(jù)就肯定刪除不了,從而報(bào)錯(cuò)了。在此時(shí)的從數(shù)據(jù)庫(kù)的數(shù)據(jù)同步就失敗了,因此后面的同步語(yǔ)句就無(wú)法繼續(xù)執(zhí)行。
這里提供的解決方法有兩種:
(1)在從數(shù)據(jù)庫(kù)中,使用SET全局sql_slave_skip_counter來(lái)跳過(guò)事件,跳過(guò)這一個(gè)錯(cuò)誤,然后執(zhí)行從下一個(gè)事件組開(kāi)始。
#在從數(shù)據(jù)庫(kù)上操作
mysql >
stop slave;
mysql > set
global sql_slave_skip_counter=1;
mysql >
start slave;
(2)在從數(shù)據(jù)庫(kù)中,重新連上主數(shù)據(jù)庫(kù)。這種操作會(huì)直接跳過(guò)中間的那些同步語(yǔ)句,可能會(huì)導(dǎo)致一些數(shù)據(jù)未同步過(guò)去的問(wèn)題,但這種操作也是最后的絕招。最好就是令從數(shù)據(jù)庫(kù)與主數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)都一致了之后,再來(lái)恢復(fù)主從同步的操作。
#在從數(shù)據(jù)庫(kù)上操作
mysql >
stop slave;
mysql>
change master to
master_host='58.66.66.66',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=2050;
mysql >
start slave;
#備注
#master_log_file和master_log_pos可能會(huì)不同,需要在主數(shù)據(jù)庫(kù)中show
master status來(lái)查看
6
總結(jié)
至此,mysql數(shù)據(jù)庫(kù)的主從同步就完成了。
PS:讀寫分離
我們可以在主服務(wù)器創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶(出于安全,根據(jù)需求給予相應(yīng)的權(quán)限)主要用于寫操作,在程序中通過(guò)這一用戶連接主數(shù)據(jù)庫(kù)的只用于寫操作而不用讀操作。
在從服務(wù)器上創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶(出于安全,只給予讀select的權(quán)限)主要用于讀操作,在程序中通過(guò)這一用戶連接從數(shù)據(jù)庫(kù)即可。