linux配置mysql主從--master and slave

模擬環境:

主(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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章