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