MYSQL 從3.25.15版本開始提供數據庫復制功能(replication)。mysql復制是指從一個mysql主服務器(MASTER)將數據復制到另一台或多台mysql從服務器(SLAVE)的過程,將主數據庫的DDL和DML操作通過二進制日志傳到復制服務器上,然後在從服務器上對這些日志重新執行,從而使從服務器的數據保持同步。在mysql中,復制操作是異步進行的,slave服務器不需要持續的保持連接接收master服務器的數據mysql支持一台主服務器同時向多台從服務器進行復制操作,從服務器同時可以作為其他從服務器的主服務器,如果mysql主服務器訪問量大,可以通過復制數據,然後在從服務器上進行查詢操作,從而降低主服務器的訪問壓力(讀寫分離),同時從服務器作為主服務器的備份,可以避免主服務器因為故障數據丟失的問題。
mysql數據庫復制操作大致可以分為三個步驟
1主服務器將數據的改變記錄到二進制日志(binlog)中。
2、從服務器將主服務器的binary log events復制到他的中繼日志(relay log)中。
3、從服務器做中繼日志中的事件,將數據的改變與從服務器保持同步。
首先,主服務器會記錄二進制日志,每個事務更新完畢數據之前,主服務器將這些操作的信息記錄在二進制日志裡面,在事件寫入
二進制日志完成後,主服務器 通知存儲引擎提交事務。SLAVE上面的I/O進程連接上MASTER,並發出日志請求,MASTER接收到來自SLAVE的I/O進程的請求後,通過負責復制的I/O進程根據請求信息讀取指定日志位置之後的日志信息,返回給SLAVE的I/O進程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息已經到MASTER端的binlog文件的名稱以及binlog的位置SLAVE的I/O進程接收到信息後,將接收到的日志內容依次添加到SLAVE端的relay-log文件的最末端,並將讀取到的MASTER端的binlog文件名和位置記錄到master-Info文件中。SLAVE的SQL進程檢測到relay-log中新增了內容後,會馬上解析relay-log的內容成為在master端真實執行時候的那些可執行內容,並在自身執行mysql復制環境,90%以上都是一個master帶一個或者多個slave的架構模式。如果master和slave壓力不是太大的話,異步復制的延時一般都很少。尤其是slave端的復制方式改成兩個進程處理之後,更是減少了slave端的延時
提示:對於數據實時性要求不是特別嚴格的應用,只需要通過廉價的電腦服務器來擴展slave的數量,將讀壓力分散到多台slave的機器上面
即可解決數據庫端的讀壓力瓶頸。這在很大程度上解決了目前很多中小型網站的數據庫壓力瓶頸問題,甚至有些大型網站也在使用類似方案解決
數據庫瓶頸問題
Windows環境下的mysql主從復制
復制前的准備工作
在Windows環境下,如果想實現主從復制需要准備的操作環境
角色 ip 端口 操作系統 mysql版本
master 192.168.1.100 3306 Windows7 5.5.20
slave 192.168.1.102 3306 Windows8 5.5.20
Windows環境下實現主從復制
准備好兩台安裝mysql5.6的計算機,即可實現兩台mysql服務器主從復制備份操作。
具體操作步驟如下:
1、在Windows下安裝好兩台mysql服務器,配置好兩台主機的ip地址,實現兩台計算機可以網絡連通
2、配置master的相關配置信息,在master主機上開啟binlog日志,首先,看下datadir的具體路徑
show variables LIKE '%datadir%'
3、此時需要打開在D:\Program Files (x86)\MySQL\MySQL Server 5.5路徑下的配置文件my.ini,添加如下代碼,開啟binlog功能
[mysqld] log-bin="D:/MYSQLDataBase/binlog" expire_logs_days=10 max_binlog_size=100M
提示:此事我們需要在D盤下面創建MYSQLDATABASE文件夾,binlog日志記錄在該文件夾裡面,該配置文件中的其他參數如下所示
expire_logs_days:表示二進制日志文件刪除的天數
max_binlog_size:表示二進制日志文件最大的大小
4、登錄mysql後,可以執行show VARIABLES LIKE '%log_bin%'命令來測試下log_bin是否成功開啟
show VARIABLES LIKE '%log_bin%';
如果log_bin參數是ON的話,那麼表示二進制日志文件已經成功開啟,如果為OFF的話,那麼表示二進制日志文件開啟失敗
5、在master上配置復制所需要的賬戶,這裡創建一個repl的用戶,%表示任何遠程地址的repl用戶都可以連接master主機
GRANT replication slave ON *.*TO repl@'%' IDENTIFIED BY '123'; flush privileges;
6、在my.ini配置文件裡配置master主機的相關信息
[mysqld] log-bin="D:/MYSQLDataBase/binlog" expire_logs_days=10 max_binlog_size=100M server-id=1 binlog-do-db=test binlog-ignore-db=mysql
這些配置語句的含義
server-id:表示服務器表示id號,master和slave主機的server-id不能一樣
binlog-do-db:表示需要復制的數據庫,這裡以test庫為例
binlog-ignore-db:表示不需要復制的數據庫
7、重啟master主機上的mysql服務,然後輸入show master status命令查詢master主機的信息
8、將master主機的數據備份出來,然後導入到slave主機中去,具體執行語句如下
mysqldump -u root -p -h 127.0.0.1 test >D:\TEST.TXT
TEST庫裡面的表和數據
innodb_monitor表是沒有數據的
dump出來的txt文件內容
-- MySQL dump 10.13 Distrib 5.5.20, for Win32 (x86) -- -- Host: 127.0.0.1 Database: test -- ------------------------------------------------------ -- Server version 5.5.20-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `book` -- DROP TABLE IF EXISTS `book`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `book` ( `bookid` int(11) NOT NULL, `bookname` varchar(255) NOT NULL, `authors` varchar(255) NOT NULL, `info` varchar(255) DEFAULT NULL, `comment` varchar(255) DEFAULT NULL, `year_publication` year(4) NOT NULL, KEY `year_publication` (`year_publication`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `book` -- LOCK TABLES `book` WRITE; /*!40000 ALTER TABLE `book` DISABLE KEYS */; INSERT INTO `book` VALUES (12,'dajiahao','NIHAO','??','henhao',1990); /*!40000 ALTER TABLE `book` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `innodb_monitor` -- DROP TABLE IF EXISTS `innodb_monitor`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `innodb_monitor` ( `a` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `innodb_monitor` -- LOCK TABLES `innodb_monitor` WRITE; /*!40000 ALTER TABLE `innodb_monitor` DISABLE KEYS */; /*!40000 ALTER TABLE `innodb_monitor` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2014-08-05 22:36:17
將D:\TEST.TXT文件復制到slave機器上,然後執行如下操作
在命令行登錄mysql,然後 USE TEST;
記得一定要USE TEST,切換數據庫上下文,否則會報錯:NO DATABASE SELECTED 的錯誤信息
然後執行source命令導入TEXT.txt文件的內容
可以看到,數據已經導入到slave上面了
9、配置slave機器(192.168.1.102)的my.ini配置文件
具體配置信息如下
[mysql] default-character-set=utf8 log_bin="C:/MYSQLLOG/binlog" expire_logs_days=10 max_binlog_size=100M [mysqld] server-id=2
提示:配置slave主機my.ini文件的時候,需要將server-id=2寫到[mysqld]後面
另外如果配置文件中還有log_bin的配置,可以將他注釋掉,如下所示
#Binary Logging #log-bin #log_bin="xxx"
10、重啟slave主機(192.168.1.102)的mysql服務,在slave主機(192.168.1.102)的mysql中執行如下命令
關閉slave服務
stop slave;
11、設置slave從機實現復制相關的信息,命令如下
change master to master_host='192.168.1.100', master_user='repl', master_password='123', master_log_file='binlog。000004', master_log_pos=107; Command(s) completed successfully.
各個參數所代表的具體含義如下:
master_host:表示實現復制的主機ip地址
master_user:表示實現復制的登錄遠程主機的用戶
master_password:表示實現復制的登錄遠程主機的密碼
master_log_file:表示實現復制的binlog日志文件
master_log_pos:表示實現復制的binlog日志文件的偏移量
12、繼續在從機執行操作,顯示slave從機的狀況,如下所示
start slave; Command(s) completed successfully.
mysql> SHOW SLAVE STATUS \G; *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.1.100 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog銆?00004 Read_Master_Log_Pos: 107 Relay_Log_File: Steven-PC-relay-bin.000002 Relay_Log_Pos: 4 Relay_Master_Log_File: binlog銆?00004 Slave_IO_Running: No Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 107 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 1236 Last_IO_Error: Got fatal error 1236 from master when reading dat a from binary log: 'Could not find first log file name in binary log index file' Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row in set (0.00 sec) ERROR: No query specified
在上述執行show slave status \G命令中很顯然存在一些問題,問題如下
Last_IO_Errno: 1236 Last_IO_Error: Got fatal error 1236 from master when reading dat a from binary log: 'Could not find first log file name in binary log index file'
下面的步驟可以解決問題,具體步驟如下
1、重啟master(192.168.1.100)主機的mysql服務,執行show master status \G命令
記下File和Position的值,後面slave主機會用到,命令執行如下
SHOW MASTER STATUS;
2、在slave(192.168.1.102)主機上重新設置信息,命令執行如下
stop slave; change master to master_log_file='binlog.000005', master_log_pos=107; start slave; mysql> SHOW SLAVE STATUS \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.100 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000005 Read_Master_Log_Pos: 107 Relay_Log_File: Steven-PC-relay-bin.000002 Relay_Log_Pos: 250 Relay_Master_Log_File: binlog.000005 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 410 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row in set (0.00 sec) ERROR: No query specified
這次正常了,實際上剛才有兩個地方是錯誤的
第一個:在從機的my.ini裡面
[mysql] default-character-set=utf8 #log_bin="C:/MYSQLLOG/binlog" #expire_logs_days=10 #max_binlog_size=100M
在從機的my.ini裡面的mysql配置節下面配置了binlog,實際上這樣做是錯誤的,要配置binlog需要在[mysqld]配置節下
第二個:第一次配置從機的同步的時候本人寫錯了標點符號,.號寫成。號
master_log_file='binlog。000004',
這時候,我們可以在從機上面執行show processlist來查詢從服務器的進程狀態
mysql> show processlist \G *************************** 1. row *************************** Id: 4 User: root Host: localhost:60968 db: information_schema Command: Sleep Time: 3613 State: Info: NULL *************************** 2. row *************************** Id: 5 User: system user Host: db: NULL Command: Connect Time: 3613 State: Waiting for master to send event Info: NULL *************************** 3. row *************************** Id: 6 User: system user Host: db: NULL Command: Connect Time: 2769 State: Slave has read all relay log; waiting for the slave I/O thread to update it Info: NULL *************************** 4. row *************************** Id: 7 User: root Host: localhost:61007 db: NULL Command: Query Time: 0 State: NULL Info: show processlist 4 rows in set (0.04 sec)
結果表明slave已經連接上master,開始接收並執行日志
relay-log.info文件裡面的內容.\Steven-PC-relay-bin.000002 250 binlog.000005 107 7
relay-log.info文件裡面記錄了slave端的relaylog的當前文件名和位置,還有master端的binlog文件名和位置
Windows環境下主從復制測試
1、在master端的mysql環境下,執行下面命令
use test; create table rep_test(data integer); insert into rep_test values(2);
2、在slave端的mysql環境下,查看主機剛才添加的表和數據是否成功同步到從機上
use test; show tables; select * FROM REP_TEST;
測試表明,數據已經成功地同步到slave上,實驗中只是用到了主從同步,在實際生產環境中MYSQL架構可能會用到一主多從的架構
MYSQL主要復制啟動選項
(1)log-slave-updates
log-slave-updates這個參數主要用來配置從服務器的更新是否寫入二進制日志,該選項默認是不打開的,如果這個
從服務器同時也作為其他服務器的主服務器,搭建一個鏈式的復制,那麼就需要開啟這個選項,這樣從服務器才能獲取他
的二進制日志進行同步操作
(2)master-connect-retry
master-connect-retry這個參數用來設置和主服務器連接丟失的時候進行重試的時間間隔,默認是60秒
(3)read-only
read-only是用來限制普通用戶對從數據庫的更新操作,以確保從數據庫的安全性,不過如果是超級用戶依然可以對
從數據庫進行更新操作。如果主數據庫創建了一個普通用戶,在默認情況下,該用戶是可以更新從數據庫的數據的,如果
使用read-only選項啟動從數據庫以後,用戶對從數據庫進行更新時會提示錯誤
在Linux下啟動mysql例子
[root@localhost~]#mysqld_safe -read-only
(4)slave-skip-errors
在復制過程中,從服務器可以會執行BINLOG中的錯誤SQL語句,此時如果不忽略錯誤,從服務器會停止復制進程,等待用戶處理錯誤。
這種錯誤如果不能及時發現,將會對應用或者備份產生影響。slave-skip-errors的作用就是用來定義復制過程中從服務器可以自動
跳過的錯誤號,設置該參數後,mysql會自動跳過所配置的一系列錯誤,直接執行後面的SQL語句,該參數可以定義多個錯誤號,如果
設置成all,則表示跳過所有的錯誤,在my.ini或者my.cnf裡配置如下
slave-skip-errors=1007,1051,1062
如果從數據庫主要作為主庫的備份,那麼就不應該使用這個啟動參數,因為一旦設置不當很可能造成主從庫的數據不同步。
如果從庫僅僅是為了分擔主庫的查詢壓力,並且對數據的完整性要求不高,那麼這個選項可以減輕DBA維護從庫的工作量
查看slave的復制進度
很多情況下,用戶都想知道從服務器復制的進度,從而判斷從服務器上復制數據的完整性,同時判斷是否需要手工來做
主從同步工作。
事實上,用戶可以通過show processlist列表中的Slave_SQL_Running線程的Time值得到,他記錄了從服務器當前執行的SQL時間戳
和系統時間之間的差距,例如下面的例子
Id: 6 User: system user Host: db: NULL Command: Connect Time: 2769 State: Slave has read all relay log; waiting for the slave I/O thread to update it Info: NULL
Time時間說明從服務器最後執行的更新操作大概是主服務器2769秒前的更新操作
日常管理和維護
復制配置完成後,DBA需要進行日常的監控和管理維護工作,以便能夠及時發現問題和解決問題
以保證主從數據庫能夠正常工作。
1、了解服務器的狀態
一般使用show slave status命令來檢查從服務器
在查看服務器信息中,首先要查看下面的兩個進程是否為YES。
Slave_IO_Running: Yes Slave_SQL_Running: Yes
Slave_IO_Running表明此進程是否能夠由從服務器到主服務器上正確地讀取binlog日志,並寫入到從服務器的中繼日志中
Slave_SQL_Running表明此進程能否讀取並執行中繼日志中的binlog信息
2、服務器復制出錯原因
問題一:出現“log event entry exceeded max_allowed_pack”錯誤
如果在應用中使用大的BLOB列或CLOB列或者長字符串,那麼在從服務器上回復時,可能會出現
“log event entry exceeded max_allowed_pack”的錯誤,這是因為含有達文本的記錄無法通過網絡進行傳輸而導致的
解決方法是在主服務器和從服務器上添加max_allowed_packet參數,該參數默認設置為1MB
show variables LIKE '%max_all%' Variable_name Value ------------------ ------- max_allowed_packet 1048576 (1 row(s) affected) set @@global.max_allowed_packet=16777216;
同時在my.ini或my.cnf文件裡設置max_allowed_packet=16M,數據庫重啟之後該參數將有效
問題二:多主復制時的自增長變量沖突問題
大多數情況下使用一台主服務器對一台或者多台從服務器,但是在某些情況下可能會存在多個服務器配置為復制主服務器,
使用auto_increment時應采取特殊步驟以防止鍵值沖突,否則插入時多個主服務器會試圖使用相同的auto_increment值
服務器變量auto_increment_increment和auto_increment_offset可以協調多主服務器復制auto_increment列
在多主服務器復制到從服務器的過程中會發生主鍵沖突問題,可以將不同的主服務器的這兩個參數重新進行設置,將A庫
上設置auto_increment_increment=1,auto_increment_offset=1,此時B庫上設置
auto_increment_increment=1,auto_increment_offset=0
提示:一般不建議使用雙主或多主,因為這樣會帶來意想不到的沖突狀況,就像SQLSERVER的對等復制,雖然有很多沖突檢測措施
但是有時候沖突是不可預料的,出現沖突DBA要排查,維護成本較高,我們生產環境裡是沒有使用雙主和多主,主要使用的是一主多從或一主一從
切換主從服務器
在實際生產環境,如果主機上的主庫發生故障,需要將從機上的從庫切換成主庫,同時需要修改服務器C的配置文件,使程序連接到從機
下面介紹主從切換的步驟
1、首先要確保所有的從庫都已經執行了relay log中的全部更新,看從庫的狀態是否是Has read all relay log,是否更新都已經執行完成
在從庫上執行下面命令
STOP SLAVE IO_THREAD; Command(s) completed successfully. mysql> show processlist \G *************************** 1. row *************************** Id: 4 User: root Host: localhost:60968 db: test Command: Sleep Time: 45 State: Info: NULL *************************** 2. row *************************** Id: 6 User: system user Host: db: NULL Command: Connect Time: 3949 State: Slave has read all relay log; waiting for the slave I/O thread to update it Info: NULL *************************** 3. row *************************** Id: 7 User: root Host: localhost:61007 db: NULL Command: Query Time: 0 State: NULL Info: show processlist 3 rows in set (0.00 sec)
2、在從庫上停止slave服務,然後執行reset master重置成為主庫
STOP SLAVE; Command(s) completed successfully. RESET MASTER; Command(s) completed successfully.
注意:如果從庫上並未開binlog,那麼在執行reset master的時候會報錯:ERROR 1186(HY000):BINLOG CLOSED ,CANNOT RESET MASTER
在切換之後,在從庫的數據目錄會多出master.info文件
master.info文件裡的內容
18 binlog.000005 393 192.168.1.100 repl 123 3306 60 0 0 1800.000 0 0
基本上記錄了主庫的復制用戶、密碼和binlog文件名和位置等
3、在從庫B(192.168.1.102)上添加具有replication權限的用戶repl,查詢主庫狀態,命令如下
GRANT REPLICATION SLAVE ON *.*TO 'repl'@'localhost' identified by '123'; show master status;
4、修改主服務器的my.ini文件裡的server-id為1,從服務器的server-id為2
5、在原來的主庫(192.168.1.100)上配置復制參數
change master TO master_host='192.168.1.102', master_user='repl', master_password='123', master_port=3306, master_log_file='on.000004', master_log_pos=107;
6、在從庫(192.168.1.100)上執行show slave status命令查看從庫是否啟動成功
START SLAVE; mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.102 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: on.000004 Read_Master_Log_Pos: 107 Relay_Log_File: joe-relay-bin.000006 Relay_Log_Pos: 246 Relay_Master_Log_File: on.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 436 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row in set (0.00 sec) ERROR: No query specified
注意:如果在主庫上面(192.168.1.102)的復制用戶repl沒有允許遠程主機從庫的訪問,那麼在執行show slave status的時候就會報錯
Last_IO_Errno: 1130 Last_IO_Error: error connecting to master '[email protected]:3360 retries: 8640006' - retry-time: 60 retries: 86400
這時候,只需要在主庫(192.168.1.102)上面執行下面語句即可
use mysql; select * from user where user='repl'; update user set host = '%' where user ='repl'; flush privileges;
7、在主庫和從庫上面是否成功設置復制功能,首先在主庫(192.168.1.102)上查看test庫中的表
use test; show tables;
查詢從庫中(192.168.1.100)test庫裡表的情況
use test; show tables;
跟主庫一樣
8、在主庫(192.168.1.102)中增加表rep_t ,並插入數據
create table rep_t(data int); insert into rep_t values(1);
9、在從庫(192.168.1.100)上查詢表是否已經創建並復制數據到從庫中
USE test; show variables like '%server%'; show tables; SELECT * FROM rep_t;
至此,主從庫成功切換
如果主機和從機server-id一樣如何解決
通常情況下,master和slave的server-id是不會一樣的,如果一樣的話會出現報錯
出現這種情況,用戶可以使用如下命令來查看服務器的server-id,然後手動進行修改,如下所示
show variables like '%server_id%'; Variable_name Value ------------- ----- server_id 2 (1 row(s) affected) SET global server_id=1
修改完成後,執行slave start命令,查詢slave主機的狀態,查看問題可否解決
從機狀態顯示Last_IO_Error錯誤代碼為2013的原因
有時候會遇到這樣的情況,在執行show slave status \G 命令中 Slave_IO_Running和Slave_SQL_Running的值都是YES
但是Last_IO_Error發生2013錯誤
發生這種問題主要原因是網絡問題,首先要檢查下master主機創建的用戶是否授予遠程連接的權限
GRANT replication slave ON *.*TO repl@'%' IDENTIFIED BY '123';
這裡%表示任何的repl用戶都可以訪問master主機,另外需要查看是否有防火牆設置和網絡的其他故障
MYSQL復制不同步的原因
mysql replication(復制)采用binlog進行網絡傳輸,所以網絡延時是產生mysql主從不同步的主要原因,這會給我們進行讀寫分離帶來
一定困難為了避免這種情況,在配置服務器的時候推薦使用INNODB存儲引擎的表,在主機上可以設置sync_binlog
下面內容摘抄自《MYSQL行調優和架構設計》
“sync_binlog”:這個參數是對於 MySQL 系統來說是至關重要的,他不僅影響到 Binlog 對 MySQL 所
帶來的性能損耗,而且還影響到 MySQL 中數據的完整性。對於“sync_binlog”參數的各種設置的說明如
下:
● sync_binlog=0,當事務提交之後,MySQL 不做 fsync 之類的磁盤同步指令刷新 binlog_cache 中
的信息到磁盤,而讓 Filesystem 自行決定什麼時候來做同步,或者 cache 滿了之後才同步到磁
盤。
● sync_binlog=n,當每進行 n 次事務提交之後,MySQL 將進行一次 fsync 之類的磁盤同步指令來
將 binlog_cache 中的數據強制寫入磁盤。
在 MySQL 中系統默認的設置是 sync_binlog=0,也就是不做任何強制性的磁盤刷新指令,這時候的性
能是最好的,但是風險也是最大的。因為一旦系統 Crash,在 binlog_cache 中的所有 binlog 信息都會被
丟失。而當設置為“1”的時候,是最安全但是性能損耗最大的設置。因為當設置為 1 的時候,即使系統
Crash,也最多丟失 binlog_cache 中未完成的一個事務,對實際數據沒有任何實質性影響。從以往經驗
和相關測試來看,對於高並發事務的系統來說,“sync_binlog”設置為 0 和設置為 1 的系統寫入性能差
距可能高達 5 倍甚至更多。
如果master主機上的max_allowed_packet比較大,但是從機上沒有配置該值的話,該參數還是使用默認值1MB
此時很有可能導致同步失敗,建議主從兩台機器都設為5MB比較合適