- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業(yè)務(wù)經(jīng)營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯(lián)網(wǎng)協(xié)會理事單位
- 安全聯(lián)盟認(rèn)證網(wǎng)站身份V標(biāo)記
- 域名注冊服務(wù)機構(gòu)許可:滇D3-20230001
- 代理域名注冊服務(wù)機構(gòu):新網(wǎng)數(shù)碼
1 分別在兩臺服務(wù)器上安裝系統(tǒng)和mysql數(shù)據(jù)庫
主服務(wù)器WIN2008R2,主服務(wù)器虛擬機和從服務(wù)器上是centos 7系統(tǒng),并在centos 7系統(tǒng)安裝mysql 5.7
本文中的兩臺服務(wù)器的IP地址分別為主服務(wù)器(58.66.66.66)和從服務(wù)器(49.18.18.18)。
在主服務(wù)器上創(chuàng)建虛擬機IP 192.168.200.204,主服務(wù)器內(nèi)網(wǎng)IP 192.168.200.1。
主服務(wù)器上要把3306端口映射到虛擬機192.168.200.204的3306端口上面,并做一下安全放行。
分別在這兩個服務(wù)器上創(chuàng)建test數(shù)據(jù)庫,以備后面測試。
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)識。
#log_bin 啟動MySQL二進制日志,即數(shù)據(jù)同步語句,從數(shù)據(jù)庫會一條一條的執(zhí)行這些語句。
#binlog_do_db 指定記錄二進制日志的數(shù)據(jù)庫,即需要復(fù)制的數(shù)據(jù)庫名,如果復(fù)制多個數(shù)據(jù)庫,重復(fù)設(shè)置這個選項即可。
#binlog_ignore_db 指定不記錄二進制日志的數(shù)據(jù)庫,即不需要復(fù)制的數(shù)據(jù)庫名,如果有多個數(shù)據(jù)庫,重復(fù)設(shè)置這個選項即可。
#其中需要注意的是,binlog_do_db和binlog_ignore_db為互斥選項,一般只需要一個即可。
2.2 創(chuàng)建從服務(wù)器的用戶和權(quán)限
#進入mysql數(shù)據(jù)庫
[root@localhost mysql]# mysql -uroot -p
Enter password:
#創(chuàng)建從數(shù)據(jù)庫的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)有虛擬機轉(zhuǎn)發(fā)端口的時候使用)
#備注
#若將 49.18.18.18 改為 %,則任何ip均可作為其從數(shù)據(jù)庫來訪問主服務(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)
#進入mysql數(shù)據(jù)庫
[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)識,如果有多個從服務(wù)器,每個服務(wù)器的server-id不能重復(fù),跟IP一樣是唯一標(biāo)識,如果你沒設(shè)置server-id或者設(shè)置為0,則從服務(wù)器不會連接到主服務(wù)器。
#relay-log 啟動MySQL二進制日志,可以用來做數(shù)據(jù)備份和崩潰恢復(fù),或主服務(wù)器掛掉了,將此從服務(wù)器作為其他從服務(wù)器的主服務(wù)器。
#replicate-do-db 指定同步的數(shù)據(jù)庫,如果復(fù)制多個數(shù)據(jù)庫,重復(fù)設(shè)置這個選項即可。若在master端不指定binlog-do-db,則在slave端可用replication-do-db來過濾。
#replicate-ignore-db 不需要同步的數(shù)據(jù)庫,如果有多個數(shù)據(jù)庫,重復(fù)設(shè)置這個選項即可。
#其中需要注意的是,replicate-do-db和replicate-ignore-db為互斥選項,一般只需要一個即可。
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 進行連接測試,看有沒有出現(xiàn)連接錯誤
#進入mysql數(shù)據(jù)庫
[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對應(yīng)主服務(wù)器的IP地址。
#master_port對應(yīng)主服務(wù)器的端口。
#master_log_file對應(yīng)show master status顯示的File列:master-bin.000001。
#master_log_pos對應(yīng)show master status顯示的Position列:154。
3.4 啟動slave數(shù)據(jù)同步
#啟動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 測試
(1)在主服務(wù)器上登陸mysql,且進入test數(shù)據(jù)庫,創(chuàng)建test表,且插入一條數(shù)據(jù)
提示:這里可以用數(shù)據(jù)庫管理工具(如nacicat)或是phpmyadmin來操作。
#創(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,且進入test數(shù)據(jù)庫
你會發(fā)現(xiàn)從數(shù)據(jù)庫中,也出現(xiàn)了tb_test表,且表中還有one test數(shù)據(jù)存在,證明同步數(shù)據(jù)成功。
5 解決錯誤
若在主從同步的過程中,出現(xiàn)其中一條語句同步失敗報錯了,則后面的語句也肯定不能同步成功了。例如,主庫有一條數(shù)據(jù),而從庫并沒有這一條數(shù)據(jù),然而,在主庫執(zhí)行了刪除這一條數(shù)據(jù)的操作,那么從庫沒有這么一條數(shù)據(jù)就肯定刪除不了,從而報錯了。在此時的從數(shù)據(jù)庫的數(shù)據(jù)同步就失敗了,因此后面的同步語句就無法繼續(xù)執(zhí)行。
這里提供的解決方法有兩種:
(1)在從數(shù)據(jù)庫中,使用SET全局sql_slave_skip_counter來跳過事件,跳過這一個錯誤,然后執(zhí)行從下一個事件組開始。
#在從數(shù)據(jù)庫上操作
mysql > stop slave;
mysql > set global sql_slave_skip_counter=1;
mysql > start slave;
(2)在從數(shù)據(jù)庫中,重新連上主數(shù)據(jù)庫。這種操作會直接跳過中間的那些同步語句,可能會導(dǎo)致一些數(shù)據(jù)未同步過去的問題,但這種操作也是最后的絕招。最好就是令從數(shù)據(jù)庫與主數(shù)據(jù)庫的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)都一致了之后,再來恢復(fù)主從同步的操作。
#在從數(shù)據(jù)庫上操作
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可能會不同,需要在主數(shù)據(jù)庫中show master status來查看
6 總結(jié)
至此,mysql數(shù)據(jù)庫的主從同步就完成了。
PS:讀寫分離
我們可以在主服務(wù)器創(chuàng)建一個數(shù)據(jù)庫用戶(出于安全,根據(jù)需求給予相應(yīng)的權(quán)限)主要用于寫操作,在程序中通過這一用戶連接主數(shù)據(jù)庫的只用于寫操作而不用讀操作。
在從服務(wù)器上創(chuàng)建一個數(shù)據(jù)庫用戶(出于安全,只給予讀select的權(quán)限)主要用于讀操作,在程序中通過這一用戶連接從數(shù)據(jù)庫即可。
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP