我記得一年前我就做過一篇關於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設置為主:
停止同步:
清空服務器master日志:
代碼如下 復制代碼reset master;
授權同步賬號:
代碼如下 復制代碼GRANT REPLICATION SLAVE ON *.* TO 'test'@'%' IDENTIFIED BY 'test';
刷新授權:
代碼如下 復制代碼 flush privileges;
鎖定數據庫:
將C設置為從:
停止同步:
配置同步信息:
將C設置為主:
停止同步:
slave stop;
清空服務器master日志:
代碼如下 復制代碼 reset master;
授權同步賬號:
刷新授權:
flush privileges;
鎖定數據庫:
代碼如下 復制代碼 flush tables with read lock;
將A設置為從:
停止同步:
配置同步信息:
2)將B設置為A的從
重啟mysql服務
停止同步:
代碼如下 復制代碼 slave stop;
配置同步信息:
啟動同步:
3)將D設置為C的從
重啟mysql服務
停止同步:
slave stop;
配置同步信息:
啟動同步:
slave start;
完成之後可以創建添加數據測試一下是否可以。
下面是常見錯誤處理:
1)
change master導致的:
2)
在沒有解鎖的情況下停止slave進程:
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
5)
A B的server-id相同:
查看server-id
代碼如下 復制代碼 mysql> show variables like 'server_id';手動修改server-id
代碼如下 復制代碼 mysql> set global server_id=2; #此處的數值和my.cnf裡設置的一樣就行6)change master之後,查看slave的狀態,發現slave_IO_running 為NO
好了,這篇文章總共計到了mysql主從配置與數據相互主從配置配置教程。