萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql數據庫主從配置詳解

mysql數據庫主從配置詳解

我記得一年前我就做過一篇關於mysql主從配置的教程,今天看到一個網站可以把數據庫相互主從這個覺得不錯,正好我有兩台機器想這樣操作,下面看看過程。


我們先來回顧一下我以前的做法


mysql服務器的主從配置,本來是一件很簡單的事情,無奈不是從零開始,總是在別人已經安裝好的mysql服務器之上 ,這就會牽扯到,mysql的版本,啟動文件,等一些問題。

不過沒關系,先問清楚兩點

1、mysql配置文件my.cnf的位置

2、如何啟動、停止mysql,找好啟動文件

假設有兩台機器,已經安裝好了mysql(盡量同版本,且兩台機器同一網絡,可以ping通)

有朋友說:“從服務器,不能低於主服務器的版本”,不過我是低於的,沒有出現問題。

主機A: 192.168.1.100

從機B:192.168.1.101

可以有多台從機

1、先登錄主機 A

 代碼如下 復制代碼

mysql>GRANT REPLICATION SLAVE ON *.* TO ‘backup’@’192.168.1.101‘ IDENTIFIED BY ‘123456’;

賦予從機權限,有多台叢機,就執行多次

2、 打開主機A的my.cnf,輸入

 代碼如下 復制代碼

server-id               = 1    #主機標示,整數
log_bin                 = /var/log/mysql/mysql-bin.log   #確保此文件可寫
read-only       =0  #主機,讀寫都可以
binlog-do-db    =test   #需要備份數據,多個寫多行
binlog-ignore-db=mysql #不需要備份的數據庫,多個寫多行

3、打開從機B的my.cnf,輸入

 代碼如下 復制代碼

server-id               = 2
log_bin                 = /var/log/mysql/mysql-bin.log
master-host     =192.168.1.100
master-user     =backup
master-pass     =123456
master-port     =3306
master-connect-retry=60 #如果從服務器發現主服務器斷掉,重新連接的時間差(秒)
replicate-do-db =test #只復制某個庫
replicate-ignore-db=mysql #不復制某個庫

4、同步數據庫

有多種方法,我說最笨的一種,先mysqldump導出主機A的數據test為 test.sql

然後在,從機B上建立數據庫test,mysql導入 test.sql到test庫中

5、先重啟主機A的mysql,再重啟從機B的mysql

6、驗證

 代碼如下 復制代碼

在主機A中,mysql>show master statusG;

在從機B中,mysql>show slave statusG;

能看到大致這些內容

 代碼如下 復制代碼

File: mysql-bin.000001
Position: 1374
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql

可以在主機A中,做一些INSERT, UPDATE, DELETE 操作,看看主機B中,是否已經被修改


好了,如果上面沒有問題大家可以看看mysql數據相互主從配置小記:

共有四台機器:A(10.1.10.28),B(10.1.10.29),C(10.1.10.30),D(10.1.10.31)。
配置後結果:A-C互為主從,B為A的slave,D為C的slave。


0)准備工作

在四台機器上面安裝好mysql後,創建用於同步的賬號。

添加賬戶:

 代碼如下 復制代碼 INSERT INTO user (Host,User, Password,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES('%','test',password('test'),'Y','Y','Y','Y','Y','Y');

 
刷新數據庫:

 代碼如下 復制代碼

FLUSH PRIVILEGES;

1)配置A-C互為主從

修改A配置文件為:

 代碼如下 復制代碼

server-id   = 1
replicate-do-db=test
replicate-do-db=test_admin
log-bin=mysql-bin
log-slave-updates
replicate-wild-do-table=test.%
replicate-wild-do-table=test_admin.%
binlog-ignore-db=mysql
slave-skip-errors=all

修改C配置文件為:

 代碼如下 復制代碼

server-id   = 3
binlog-do-db=test
binlog-do-db=test_admin
log-bin=mysql-bin
log-slave-updates
replicate-wild-do-table=test.%
replicate-wild-do-table=test_admin.%
binlog-ignore-db=mysql
slave-skip-errors=all

重啟mysql是配置生效

將A設置為主:
停止同步:

 代碼如下 復制代碼 slave stop;

清空服務器master日志:

 代碼如下 復制代碼

reset master;

授權同步賬號:

 代碼如下 復制代碼

GRANT REPLICATION SLAVE ON *.* TO 'test'@'%' IDENTIFIED BY 'test';

刷新授權:

 代碼如下 復制代碼 flush privileges;

 
鎖定數據庫:

 代碼如下 復制代碼 flush tables with read lock;

 
將C設置為從:
停止同步:

 代碼如下 復制代碼 slave stop;

 
配置同步信息:

 代碼如下 復制代碼 CHANGE MASTER TO MASTER_HOST='10.1.10.28', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

 
將C設置為主:
停止同步:

 代碼如下 復制代碼

slave stop;

清空服務器master日志:

 代碼如下 復制代碼 reset master;

 
授權同步賬號:

 代碼如下 復制代碼 GRANT REPLICATION SLAVE ON *.* TO 'test'@'%' IDENTIFIED BY 'test';

 
刷新授權:

 代碼如下 復制代碼

flush privileges;

鎖定數據庫:

 代碼如下 復制代碼 flush tables with read lock;

 
將A設置為從:
停止同步:

 代碼如下 復制代碼 slave stop;

 
配置同步信息:

 代碼如下 復制代碼 CHANGE MASTER TO MASTER_HOST='10.1.10.30', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

 
2)將B設置為A的從

 代碼如下 復制代碼 server-id   = 2
replicate-do-db=test
replicate-do-db=test_admin
log-bin=mysql-bin
log-slave-updates
replicate-wild-do-table=test.%
replicate-wild-do-table=test_admin.%
binlog-ignore-db=mysql
slave-skip-errors=all

 

重啟mysql服務

停止同步:

 代碼如下 復制代碼 slave stop;

 
配置同步信息:

 代碼如下 復制代碼 CHANGE MASTER TO MASTER_HOST='10.1.10.28', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

 
啟動同步:

 代碼如下 復制代碼 slave start;

 
3)將D設置為C的從

 代碼如下 復制代碼 server-id   = 4
replicate-do-db=test
replicate-do-db=test_admin
log-bin=mysql-bin
log-slave-updates
replicate-wild-do-table=test.%
replicate-wild-do-table=test_admin.%
binlog-ignore-db=mysql
slave-skip-errors=all
 


重啟mysql服務

停止同步:

slave stop;
 
配置同步信息:

 代碼如下 復制代碼 CHANGE MASTER TO MASTER_HOST='10.1.10.30', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

 
啟動同步:

 代碼如下 復制代碼

slave start;


完成之後可以創建添加數據測試一下是否可以。

下面是常見錯誤處理:

1)
change master導致的:
             

 代碼如下 復制代碼 Last_IO_Error: error connecting to master 'repl1@IP:3306' - retry-time: 60  retries

2)   
在沒有解鎖的情況下停止slave進程:

 代碼如下 復制代碼      mysql> stop slave;
ERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transaction

3)
change master語法錯誤,落下逗號

 代碼如下 復制代碼

mysql> change master to
    -> master_host='IP'
    -> master_user='USER',
    -> master_password='PASSWD',
    -> master_log_file='mysql-bin.000002',
    -> master_log_pos=106;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'master_user='USER',
master_password='PASSWD',
master_log_file='mysql-bin.000002' at line 3

 


4)
在沒有停止slave進程的情況下change master

 代碼如下 復制代碼 mysql> change master to master_host=‘IP', master_user='USER', master_password='PASSWD', master_log_file='mysql-bin.000001',master_log_pos=106;
ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first


5)
A B的server-id相同:

 代碼如下 復制代碼 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids;
these ids must be different for replication to work (or the --replicate-same-server-id option must be used on
slave but this does not always make sense; please check the manual before using it).

查看server-id

 代碼如下 復制代碼 mysql> show variables like 'server_id';

手動修改server-id

 代碼如下 復制代碼 mysql> set global server_id=2; #此處的數值和my.cnf裡設置的一樣就行
mysql> slave start;

6)change master之後,查看slave的狀態,發現slave_IO_running 為NO

好了,這篇文章總共計到了mysql主從配置與數據相互主從配置配置教程。

copyright © 萬盛學電腦網 all rights reserved