1.mysql主從服務器介紹:
MySQL主從又叫做Replication、AB復制。
簡單講就是A和B兩台機器做主從后,在A上寫數據,另外一台B也會跟着寫數據,兩者數據實時同步。
MySQL主從是基於binlog的,主上須開啟binlog才能進行主從。
2.主從過程:
- 主將更改操作記錄到binlog中
- 從將主的binlog事件(SQL語句)同步到本機並記錄在relaylog中
- 從根據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.測試主從
