模擬環境:
主(master)服務器IP:192.168.1.10
從(slave)服務器1IP:192.168.1.11
從(slave)服務器2IP:192.168.1.12
同步的數據庫:dbName
一、配置主(master)服務器
1、打開mysql配置文件
PS:一般是/etc/my.cnf,如果忘記當時編譯時填的地址或者不知道的話,可以使用以下命令找出當前mysql命令用的配置文件
[root@master ~]# which mysql
[root@master ~]# /usr/bin/mysql --verbose --help | grep -A 1 'Default options'
結果類似如下:
[root@master ~]# vim /etc/my.cnf
2、在[mysqld](沒有這個就手動加入進去)下面加入以下代碼:
server-id = 1 #數據庫ID號, 爲1時表示爲Master,其中master_id必須爲1到232–1之間的一個正整數值;
read-only = 0 #主機,讀寫都可以
binlog-do-db = dbName #需要同步的數據庫庫名,多個寫多行
binlog-ignore-db = mysql #不需要同步的庫,mysql這個庫不用同步
binlog_format=mixed #設置主從複製模式
log-bin=mysql-bin #設定生成的log文件名
PS:以上binlog-do-db和binlog-ignore-db兩個選項有一定的缺陷,原因及處理辦法在上一篇日誌有詳細說明
保存退出
3、建立從(slave)服務器用於同步的帳號
[root@master ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql>GRANT REPLICATION SLAVE ON *.* TO [email protected] IDENTIFIED BY 'slavePasswd1';
mysql>GRANT REPLICATION SLAVE ON *.* TO [email protected] IDENTIFIED BY 'slavePasswd2';
PS:如果想要在Slave上有權限執行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 語句的話,必須授予全局的 FILE 和 SELECT 權限,語句更改如下:
mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO [email protected] IDENTIFIED BY 'slavePasswd1';
mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO [email protected] IDENTIFIED BY 'slavePasswd2';
4、重啓主服務器Mysql
[root@master ~]# service mysqld restart
重啓Mysql有各種手段,不多舉例了。。
5、查看主服務器狀態,是否設置成功
[root@master ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql> show master status\G
顯示結果如下:
*************************** 1. row ***************************
File: mysql-bin.000013
Position: 1090
Binlog_Do_DB: dbName
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
到此主服務器已經配置完成了!!
二、配置從(slave)服務器
1、檢查主服務器新建的同步帳號是否可用
[root@slave1 ~]# mysql -h 192.168.1.10 -uslaveUserName1 -pslavePasswd1
如果能夠登陸成功,則說明設置是成功的;如果不成功,則到主服務器重新設置。然後查看用戶是否具有相應權限
mysql>SHOW GRANTS;
2、打開mysql配置文件
方法同主服務器配置方法
3、在[mysqld](沒有這個就手動入進去)下面加入以下代碼:
server-id=2 #如果以後要再加Slave號接着往後數就OK了
log-bin=mysql-bin #設定2進制log文件名
master-host=192.168.1.10 #主服務器IP
master-user=slaveUserName1#用於同步的用戶名
master-password=slavePasswd1 #用於同步的用戶名的密碼
master-port=3306 #同服務器mysql端口
master-connect-retry=60 #如果發現主服務器斷線,重新連接的時間差
replicate-do-db=dbName #需要同步的數據庫庫名
replicate-ignore-db=mysql #不同步的數據庫庫名
log-slave-update
slave-skip-errors
保存退出
4、重啓從服務器Mysql
[root@slave1 ~]# service mysqld restart
從服務器配置完成!!
三、將主服務器要同步的數據庫傳到各個從服務器
1、打開主服務器
切換到mysql數據文件存放目錄,我寫的這個目錄是mysql默認數據存放目錄,根據自己情況改寫
[root@master ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql>FLUSH TABLES WITH READ LOCK;
PS:不要退出這個終端,否則這個鎖就不生效了。以下代碼另開終端執行:
[root@master ~]#cd /var/lib/mysql
[root@master ~]# tar zcvf dbName.tar.gz dbName
2、打開從服務器
[root@slave1 ~]# cd /var/lib/mysql/
[root@slave1 ~]# scp [email protected]:/var/lib/mysql/dbName.tar.gz dbName.tar.gz
傳文件有各種手段,不多舉例
[root@slave1 ~]# tar zxvf dbName.tar.gz
[root@slave1 ~]# rm -f dbName.tar.gz
四、啓動slave及查看主/從服務器狀態
1、從服務器啓動slave並查看狀態
[root@slave1 ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql> slave start;
mysql> show slave status\G
類似結果如下:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.10
Master_User: slaveUserName1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000013
Read_Master_Log_Pos: 1090
Relay_Log_File: x1-relay-bin.000017
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: masterTest
Replicate_Ignore_DB: mysql
*****省略N行*******
我們要看其中的Master_Host、Master_User、Master_Port、Master_Log_File是否符合主服務器相關情況,Master_Log_File應該和主服務器show master status\G結果中的File一致。
情況一:Slave_IO_Running顯示connecting..
這個是正常的,因爲主庫服務器還是鎖表狀態,解鎖之後執行以下兩部恢復正常:
mysql> slave stop;
mysql> slave start;
情況二:上述變量值某項不符合不符合主服務器情況。處理辦法如下:
[root@slave1 ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql> slave stop;
PS:修改配置之前都要將slave停掉
mysql>change master to master_host='192.168.1.10', master_user='slaveUserName1', master_password='slavePasswd1', master_port=3306;
mysql>flush privileges;
mysql>slave start;
情況三:Slave_IO_Running和Slave_SQL_Running其中一項爲No,處理辦法如下:
[root@slave1 ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
2、一切正常之後,解鎖主服務器的表
打開剛剛作鎖表操作沒有關閉的主服務器終端,執行如下命令:
mysql>UNLOCK TABLES;
如果Slave_IO_Running和Slave_SQL_Running不全爲Yes,那麼執行以下語句:
mysql> slave stop;
mysql> slave start;
如果在使用過過程中,發現突然不同步了,下面是解決辦法:
情況一、從服務器上show slave status\G中Last_IO_Error報錯;Got fatal error 1236 from masterwhen reading data from binary log
1、 在從服務器上登陸mysql
mysql>stop slave;
2、 在主服務器上登陸mysql
mysql>flushlogs;
mysql>showmaster status;
記錄下“File”和“Position”兩項的值,此處以$fileName和$position代稱
3、 在從服務器上登陸mysql
mysql>CHANGEMASTER TO MASTER_LOG_FILE=’log-bin.00000X’, MASTER_LOG_POS=106;
log-bin.00000X爲$fileName,106爲$position。
mysql>start slave;