mysql主從服務器配置


1.mysql主從服務器介紹:

MySQL主從又叫做Replication、AB復制。

簡單講就是A和B兩台機器做主從后,在A上寫數據,另外一台B也會跟着寫數據,兩者數據實時同步。
MySQL主從是基於binlog的,主上須開啟binlog才能進行主從。

2.主從過程:

  1. 主將更改操作記錄到binlog中
  2. 從將主的binlog事件(SQL語句)同步到本機並記錄在relaylog中
  3. 從根據relaylog里面的SQL語句按順序執行

說明: 

  • 該過程有三個線程 :主上有一個log dump線程,用來和從的i/o線程傳遞binlog;
  • 從上有兩個線程,其中i/o線程用來同步主的binlog並生成relaylog,另外一個SQL線程用來把relaylog里面的SQL語句落地。

 

 

3.准備工作:
阿里雲的centos:

兩台服務器:(mysql版本盡量保持一致,主服務器的版本不能高於從服務器) 

主服務器:ip1;
從服務器:ip2;
待同步的數據庫:slaveDB;
同步主從數據庫數據,保持主從數據一致!

需要注意的是!!!
線上的項目導出數據的時候,保證主庫上鎖,等slave導入、slave start之后在解鎖;
slave重啟的時候也一樣,重啟之前,主庫上鎖,重啟完畢,解鎖;

主庫表鎖!

flush tables with read lock

主庫解鎖!

unlock tables

 

主從配置參數介紹:

主服務器:
binlog-do-db= 僅同步指定的庫
binlog-ignore-db= 忽略指定的庫

從服務器:
replicate_do_db= 同步指定的庫
replicate_ignore_db= 忽略指定的庫
replicate_do_table= 同步指定的表
replicate_ignore_table= 忽略指定的表

replicate_wild_do_table=    如aming.%,支持通配符
replicate_wild_ignore_table=

 

說明: 進行從服務器的配置時盡量使用參數“replicate_wild_”,使匹配更精確,提升使用性能。

 

4.配置主服務器:

4.1.修改mysql配置文件

vim /etc/my.conf

server-id = 1  #這是數據庫ID,此ID是唯一的,主庫默認為1,其他從庫以此ID進行遞增,ID值不能重復,否則會同步出錯;
log-bin = mysql-bin  #二進制日志文件,此項為必填項,否則不能同步數據;
binlog-do-db = slaveDB  #需要同步的數據庫,如果需要同步多個數據庫;則繼續添加此項。
# binlog-do-db = slaveDB1
# binlog-do-db = slaveDB2
binlog-ignore-db = mysql 不需要同步的數據庫;

 

4.2保存退出!重啟mysql服務,使更改生效!

service mysql restart
或者:
/etc/init.d/mysqld restart

 

4.3查看同步和不同步的數據庫有哪些

mysql> show variables like 'server_id';
mysql> show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000013| 10844 | | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) #記住file和position(設置主從同步時會使用)

4.4添加一個同步用戶slaveUser並賦值權限(用於從服務器slave使用)!

[root@123 mysql]# mysql -uroot -p123456
mysql> create user slaveUser;
mysql> grant replication slave on *.* to 'slaveUser'@'192.168.1.130' identified by '123456';

 

4.5主服務器鎖表:

mysql> flush tables with read lock;   #鎖定數據表(目的是暫時使其不能繼續寫,保持現有狀態用於同步)

備份主庫中需要同步的數據庫:

[root@123 mysql]# mysqldump -uroot -p123456 db1 > /backup/db1.sql
[root@123 mysql]# mysqldump -uroot -p123456 db2 > /backup/db2.sql

 

5.配置從服務器

准備:導入主服務器上的數據庫

# scp ./db1.sql root@192.168.1.16:~
# mysql -uroot -hlocalhost -p slaveDB > ./db1.sql;

 

 

5.1.編輯配置文件:

vim /etc/my.conf

server-id=2    #默認是1改成2
log-bin=mysql-bin    #這行本身有
replicate-do-db=slaveDB    #需要同步的數據庫
replicate-ignore-db=mysql    #不同步系統數據庫
read_only     #設只讀權限

 

5.2保存退出!重啟mysql服務,使更改生效!

service mysql restart
或者:
/etc/init.d/mysqld restart

5.3查看結果:

mysql> show variables like 'server_id';

5.4.0設置主服務器上用戶的權限:

grant file on *.* to slaveUser@'%' identified by '123456';
flush privileges;

5.4修改slave參數,設置主從同步:

[root@localhost ~]# mysql -uroot
mysql> stop slave;
mysql> change master to master_host='192.168.8.132',master_user='slaveUser',master_password='123456',master_log_file='mysql-bin.00001',master_log_pos=10844;
# 注:master_log_file=上面提到的二進制文件;master_log_pos=上面提到的pos ,master_host為主的IP;file、pos分別為主的filename和position。

 
# 啟用主從同步:
mysql> start slave;
Query OK, 0 rows affected (0.22 sec)

檢測主從是否建立成功

mysql> show slave status\G;

1)Slave_IO_Running:yes
該參數可作為io_thread的監控項,Yes表示io_thread的和主庫連接正常並能實施復制工作,No則說明與主庫通訊異常,多數情況是由主從間網絡引起的問題;
   2)Slave_SQL_Running:yes
該參數代表sql_thread是否正常,YES表示正常,NO表示執行失敗,具體就是語句是否執行通過,常會遇到主鍵重復或是某個表不存在。
   3)Seconds_Behind_Master:0
是通過比較sql_thread執行的event的timestamp和io_thread復制好的event的timestamp(簡寫為ts)進行比較,而得到的這么一個差值;
        NULL—表示io_thread或是sql_thread有任何一個發生故障,也就是該線程的Running狀態是No,而非Yes。
        0 — 該值為零,是我們極為渴望看到的情況,表示主從復制良好,可以認為lag不存在。
        正值 — 表示主從已經出現延時,數字越大表示從庫落后主庫越多。
        負值 — 幾乎很少見,我只是聽一些資深的DBA說見過,其實,這是一個BUG值,該參數是不支持負值的,也就是不應該出現。

 

 5.5解鎖主庫的表(在主上操作):

[root@123 mysql]# mysql -uroot -p123456
mysql> unlock tables;

至此主從配置搭建完成!!!

說明:以上搭建的是主服務器用於寫操作,從服務器用於讀操作。

問題1:若是slave status 里面有報錯,手動解決之后,執行如下命令即可!

mysql> slave stop;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER =1;
mysql> slave start;

問題2:在slave上執行show slave status\G,結果中顯示Last_IO_Error: error connecting to master ……

先在主服務器上確認復制用戶賬戶是否存在且是否賦了正確的權限:

 mysql> show grants for 'slaveUser'@'%';

顯示沒問題:GRANT REPLICATION SLAVE ON *.* TO 'slaveUser'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'

然后,在從服務器上使用該賬戶連接至主:

[root@localhost data]# mysql -u salveUser -h 192.168.1.10 -p -P3306

 

提示密碼錯誤~~~

最后,在從上修改連接密碼:

mysql>stop slave;
mysql>reset slave;
mysql>change master to master_host='192.168.1.10',
master_user='slaveUser',master_password='123456',
master_port=3306,master_log_file='mysql-bin.000003',master_log_pos=120; mysql>start slave; mysql>show slave status\G;

 

 防火牆原因:

查看3306端口是否開放:

systemctl status firewalld #查看firewall啟動情況
firewall-cmd --query-port=3306/tcp 檢查3306端口是否已經開啟,如果顯示yes,則表示防火牆已開啟該端口。
firewall-cmd --zone=public --add-port=3306/tcp --permanent 開啟3306端口
firewall-cmd --reload #  然后重啟 firewalld 

 

firewall-cmd --query-port=3306/tcp

 

復制帳號權限原因:

 select * from user where user='slaveUser'\G;
update user set Grant_pri='Y' where user='slaveUser';
flush privileges;

 

6.主主雙向服務器

如果要搭建主從服務器,主從都可以寫數據庫、讀數據庫。就是主主雙向服務器,在以上配置的基礎上,增加以下步驟即可:

  • 在從服務器,重復上面4.4的 操作; 
  • 在主服務器,重復上面5.4的操作即可。

7.測試主從

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM