準(zhǔn)備兩臺(tái)服務(wù)器并安裝MySQL5.7
master服務(wù)器
192.168.254.132
slave服務(wù)器
192.168.254.136
確保兩臺(tái)服務(wù)器安裝的mysql版本一致,本測(cè)試使用的是mysql5.7,登錄mysql數(shù)據(jù)庫,使用如下命令查看mysql數(shù)據(jù)庫版本
[root@localhost ~]# mysql -u root -p Enter password: mysql> show variables like '%version%';
master服務(wù)器配置流程
1、登錄mysql數(shù)據(jù)庫
[root@localhost ~]# mysql -u root -p Enter password:
2、創(chuàng)建數(shù)據(jù)庫,數(shù)據(jù)庫名稱為:TONGBU
mysql> create database TONGBU;
3、進(jìn)入TONGBU數(shù)據(jù)庫并創(chuàng)建表TB1
mysql> use TONGBU; mysql> create table TB1(id varchar(60),name varchar(100));
4、修改配置/etc/my.cnf文件
修改的具體參數(shù)如下:
server-id=1 log-bin=mysql-bin binlog-do-db=TONGBU binlog-ignore-db=mysql sync_binlog=1 binlog_checksum=none binlog_format=mixed
提示
[mysqld] server-id=1 #數(shù)據(jù)庫唯一ID,主從的標(biāo)識(shí)號(hào)絕對(duì)不能重復(fù)。
log-bin=mysql-bin #開啟bin-log,并指定文件目錄和文件名前綴
binlog-do-db=liting #需要同步liting數(shù)據(jù)庫。如果是多個(gè)同步庫,就以此格式另寫幾行即可。如果不指明對(duì)某個(gè)具體庫同步,就去掉此行,表示同步所有庫(除了ignore忽略的庫)。
binlog-ignore-db=mysql #不同步mysql系統(tǒng)數(shù)據(jù)庫。如果是多個(gè)不同步庫,就以此格式另寫幾行;也可以在一行,中間逗號(hào)隔開。
sync_binlog = 1 #確保binlog日志寫入后與硬盤同步
binlog_checksum = none #跳過現(xiàn)有的采用checksum的事件,mysql5.6.5以后的版本中binlog_checksum=crc32,而低版本都是binlog_checksum=none
binlog_format = mixed #bin-log日志文件格式,設(shè)置為MIXED可以防止主鍵重復(fù)。
在主服務(wù)器上最重要的二進(jìn)制日志設(shè)置是sync_binlog,這使得mysql在每次提交事務(wù)的時(shí)候把二進(jìn)制日志的內(nèi)容同步到磁盤上,即使服務(wù)器崩潰也會(huì)把事件寫入日志中。
sync_binlog這個(gè)參數(shù)是對(duì)于MySQL系統(tǒng)來說是至關(guān)重要的,他不僅影響到Binlog對(duì)MySQL所帶來的性能損耗,而且還影響到MySQL中數(shù)據(jù)的完整性。對(duì)于"sync_binlog"參數(shù)的各種設(shè)置的說明如下:
sync_binlog=0,當(dāng)事務(wù)提交之后,MySQL不做fsync之類的磁盤同步指令刷新binlog_cache中的信息到磁盤,而讓Filesystem自行決定什么時(shí)候來做同步,或者cache滿了之后才同步到磁盤。
sync_binlog=n,當(dāng)每進(jìn)行n次事務(wù)提交之后,MySQL將進(jìn)行一次fsync之類的磁盤同步指令來將binlog_cache中的數(shù)據(jù)強(qiáng)制寫入磁盤。
在MySQL中系統(tǒng)默認(rèn)的設(shè)置是sync_binlog=0,也就是不做任何強(qiáng)制性的磁盤刷新指令,這時(shí)候的性能是最好的,但是風(fēng)險(xiǎn)也是最大的。因?yàn)橐坏┫到y(tǒng)Crash,在binlog_cache中的所有binlog信息都會(huì)被丟失。而當(dāng)設(shè)置為“1”的時(shí)候,是最安全但是性能損耗最大的設(shè)置。因?yàn)楫?dāng)設(shè)置為1的時(shí)候,即使系統(tǒng)Crash,也最多丟失binlog_cache中未完成的一個(gè)事務(wù),對(duì)實(shí)際數(shù)據(jù)沒有任何實(shí)質(zhì)性影響。
從相關(guān)測(cè)試來看,對(duì)于高并發(fā)事務(wù)的系統(tǒng)來說,“sync_binlog”設(shè)置為0和設(shè)置為1的系統(tǒng)寫入性能差距可能高達(dá)5倍甚至更多。
5、重置mysql數(shù)據(jù)庫
[root@hadoop4 ~]# systemctl restart mysqld.service
6、授權(quán)給slave查同步權(quán)限
mysql> grant replication slave on *.* to [email protected] identified by "123456";
注意,注意,注意:::
授權(quán)的用戶:slave,不是從服務(wù)器的用戶名,也不是從服務(wù)器中Mysql登錄用的用戶名,也是主服務(wù)器為從服務(wù)器自定義開戶的一個(gè)可供從服務(wù)讀(或者說是同步數(shù)據(jù))數(shù)據(jù)用的一個(gè)用戶名,可以自定義,但是要求從服務(wù)器在my.cnf配置文件中配置的master-user參數(shù)的名稱一致,
如:master-user=slave #該名稱為主服務(wù)器上可以進(jìn)行同步的用戶名,也是在此處授權(quán)的用戶;
另外這一步容易出現(xiàn)一個(gè)異常,異常如下
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
原因是不滿足密碼設(shè)置的策略,這里需要兩個(gè)命令來設(shè)置一下slave服務(wù)器mysql密碼設(shè)置的策略
mysql> set global validate_password_policy=0; mysql> set global validate_password_length=1;
執(zhí)行刷新數(shù)據(jù)庫:
flush privileges;
7、授權(quán)成功后,查看主從狀態(tài)
mysql> show master status;
8、查看二進(jìn)制日志文件
[root@hadoop4 ~]# find / -name mysql-bin.000001
可以看到二進(jìn)制日志文件在路徑:/var/lib/mysql/mysql-bin.000001下
[root@hadoop4 ~]# ll /var/lib/mysql
9、備份要同步的數(shù)據(jù)庫
1)、數(shù)據(jù)庫備份語法
表結(jié)構(gòu)+數(shù)據(jù)
mysqldump -u用戶名 -p 數(shù)據(jù)庫名 > 數(shù)據(jù)庫名.sql
只導(dǎo)出表結(jié)構(gòu)
mysqldump -u用戶名 -p -d 數(shù)據(jù)庫名 > 數(shù)據(jù)庫名.sql如 示例: #/usr/local/mysql/bin/mysqldump -uroot -p -d abc > abc.sql
執(zhí)行備份命令前,一定要先到mysql的運(yùn)行路徑下,再執(zhí)行一下命令,如果不知道可以通過find命令查詢:
[root@hadoop4 ~]# find / -name mysqldump
本系統(tǒng)中mysql數(shù)據(jù)庫導(dǎo)出目錄如下:
/usr/bin/mysqldump
2)、執(zhí)行數(shù)據(jù)庫導(dǎo)出命令
[root@hadoop4 ~]# /usr/bin/mysqldump -uroot -p TONGBU > /usr/mytest/TONGBU.sql
10、把導(dǎo)出的數(shù)據(jù)庫文件拷貝到slave(192.168.254.136)服務(wù)器上
[root@hadoop4 mytest]# src TONGBU.sql [email protected]:/usr/mytest/
slave(192.168.254.136)服務(wù)器上拷貝成功:
11、slave(192.168.254.136)數(shù)據(jù)庫導(dǎo)入備份腳本
1)、數(shù)據(jù)庫導(dǎo)入語法
使用 mysql 命令導(dǎo)入數(shù)據(jù)庫格式如下:
mysql -u用戶名 -p 數(shù)據(jù)庫名 < 數(shù)據(jù)庫名.sql 示例: # mysql -uroot -p123456 < abc.sql
使用 source 命令導(dǎo)入
先登錄到 mysql 中,并創(chuàng)建一個(gè)空的數(shù)據(jù)庫:
mysql> create database abc; # 創(chuàng)建數(shù)據(jù)庫 mysql> use abc; # 使用已創(chuàng)建的數(shù)據(jù)庫 mysql> set names utf8; # 設(shè)置編碼 mysql> source /home/abc/abc.sql # 導(dǎo)入備份數(shù)據(jù)庫
2)、slave(192.168.254.136)數(shù)據(jù)庫具體導(dǎo)入步驟
登錄數(shù)據(jù)庫,并創(chuàng)建數(shù)據(jù)庫
[root@localhost mytest]# mysql -u root -p mysql> create database TONGBU; Query OK, 1 row affected (0.03 sec) mysql> use TONGBU; Database changed mysql> set names utf8; Query OK, 0 rows affected (0.00 sec)
執(zhí)行導(dǎo)入命令如下:
[root@localhost mytest]# mysql -uroot -p TONGBU < /usr/mytest/TONGBU.sql
slave服務(wù)器配置流程
1、設(shè)置slave數(shù)據(jù)庫的my.cnf配置文件
[root@localhost mytest]# vi /etc/my.cnf
具體配置:
[mysqld] server-id=2 log-bin=mysql-bin-slave #從主機(jī)中可要可不要 replicate-do-db=TONGBU replicate-ignore-db=mysql slave-skip-errors = all master-host=192.168.254.132 #指定主服務(wù)器IP地址 master-user=slave #指定定在主服務(wù)器上可以進(jìn)行同步的用戶名 master-password=123456 #密碼 #master-port=3306 master-connect-retry=60 #斷點(diǎn)重新連接時(shí)間
提示:
[mysqld]
server-id=2 #設(shè)置從服務(wù)器id,必須于主服務(wù)器不同
log-bin=mysql-bin #啟動(dòng)MySQ二進(jìn)制日志系統(tǒng)
replicate-do-db=liting #需要同步的數(shù)據(jù)庫名。如果不指明同步哪些庫,就去掉這行,表示所有庫的同步(除了ignore忽略的庫)。
replicate-ignore-db=mysql #不同步test數(shù)據(jù)庫
slave-skip-errors = all #跳過所有的錯(cuò)誤,繼續(xù)執(zhí)行復(fù)制操作
當(dāng)只針對(duì)某些庫的某張表進(jìn)行同步時(shí),如下,只同步liting庫的haha表和test庫的heihei表:
replicate-do-db = liting
replicate-wild-do-table = liting.haha //當(dāng)只同步幾個(gè)或少數(shù)表時(shí),可以這樣設(shè)置。注意這要跟上面的庫指定配合使用;
replicate-do-db = test
replicate-wild-do-table = test.heihei //如果同步的庫的表比較多時(shí),就不能這樣一一指定了,就把這個(gè)選項(xiàng)配置去掉,直接根據(jù)指定的庫進(jìn)行同步。
重點(diǎn)
master-user=slave #指定定在主服務(wù)器上可以進(jìn)行同步的用戶名
master-password=123456 #密碼
這兩個(gè)配置要與主服務(wù)器上授權(quán)的用戶名和密碼一致,不到主從無法同步數(shù)據(jù),一定要清楚這一點(diǎn),也是主服務(wù)器和從服務(wù)器是否能同步的核心要點(diǎn)
mysql> grant replication slave on *.* to [email protected] identified by "123456";
2、設(shè)置啟用授權(quán)用戶
mysql>stop slave; #停止slave mysql> change master to master_host='192.168.254.132',master_user='slave',master_password='123456'; mysql> start slave; #啟動(dòng)slave
3、查看配置狀態(tài)是否成功
1)、從服務(wù)器配置狀態(tài)查看如下
mysql> show slave statusG
2)、主服務(wù)器配置狀態(tài)查看命令如下:
mysql> show processlist G
目前主服務(wù)器和從服務(wù)器的配置已經(jīng)全部結(jié)束,下面我們進(jìn)行測(cè)試
1、進(jìn)入主服務(wù)器,登錄mysql數(shù)據(jù)庫
[root@localhost ~]# mysql -u root -p Enter password:
2、進(jìn)入TONGBU數(shù)據(jù)庫,并在TB1表中添加一條數(shù)據(jù)
mysql> use TONGBU;
mysql> insert into TB1 values('10001','testname1');
3、查看主服務(wù)器中,TONGBU數(shù)據(jù),TB1表中是否添加成功
mysql> select * from TB1;
4、進(jìn)入從服務(wù)器,登錄mysql數(shù)據(jù)庫
[root@localhost ~]# mysql -u root -p Enter password:
5、進(jìn)入TONGBU數(shù)據(jù)庫,并查詢TB1表
mysql> select * from TB1;
可以看到,從服務(wù)器已經(jīng)同步了主服務(wù)器的數(shù)據(jù)庫信息,linux下部署mysql主從同步-成功!!!!






