複製

来源:http://www.cnblogs.com/wuyuan2011woaini/archive/2016/01/15/5132241.html
-Advertisement-
Play Games

原文鏈接地址:http://www.cnblogs.com/lyhabc/p/3888702.html 最近把大學時候的ORACLE教程書本翻出來看,真的是感觸良多 以前在學校的時候,每次ORACLE測驗和考試都是不合格的,期末的時候靠補考才勉強過關 大家看到下圖的封面應該知道大學教我們ORACLE...


原文鏈接地址:http://www.cnblogs.com/lyhabc/p/3888702.html

最近把大學時候的ORACLE教程書本翻出來看,真的是感觸良多

以前在學校的時候,每次ORACLE測驗和考試都是不合格的,期末的時候靠補考才勉強過關

大家看到下圖的封面應該知道大學教我們ORACLE課程的老師,沒錯,他就是李愛武老師

大家可能對李愛武老師不太熟悉,在ORACLE領域,大家第一時間肯定會想到“蓋國強”

還記得前段時間某個媒體說“蓋國強”是中國第一DBA,但是我在百度裡面搜索“中國第一DBA”並沒有出現“蓋國強”三個字o(∩_∩)o

李愛武老師可能會有一些人認識,他寫了幾本資料庫方面的書,以SQLSERVERORACLE為主

老師的實力是毋容置疑的,老師上課的風格是比較凶的那種,不過老師他很細心,會把ORACLE裡面的知識點講透

因為比較凶,所以很多時候不是很想上他的課,有時候會選擇逃課,但是想不到多年後自己會做了DBA,會研究資料庫

雖然未到教師節,但是還是要感謝李愛武老師和大學里教我電腦知識的其他老師,感謝

不扯了,馬上開始今天的內容。。。

這一篇主要介紹MYSQL的複製

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

View Code

將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比較合適


總結

本文簡單的闡述了MYSQL的複製方面的內容,MYSQL複製是比較重要的技術

文本的主從切換使用手工的方式,當然在真實生產環境一般使用自動切換腳本軟體工具去做自動主從切換,這裡不做介紹了

希望這篇文章對大家有幫助


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS代碼重構的目的我們寫CSS代碼時,不僅僅只是完成頁面設計的效果,還應該讓CSS代碼易於管理,維護。我們對CSS代碼重構主要有兩個目的:1、提高代碼性能2、提高代碼的可維護性提高代碼性能提高CSS代碼性能主要有兩個點:1、提高頁面的載入性能提高頁面的載入性能,簡單說就是減小CSS文件的大小,提高...
  • 一、概述銀聯手機支付控制項(以下簡稱支付控制項),主要為合作商戶的手機客戶端或手機Web網站提供安全、便捷的支付服務。目前支付控制項支持Android和iOS兩個平臺,用戶通過在支付控制項中輸入銀行卡卡號、手機號、密碼(借記卡和預付卡)或者CVN2、有效期(信用卡)、驗證碼等要素完成支付。二、支付流程介紹通...
  • //改變圖片的亮度方法 0--原樣 >0---調亮 <0---調暗 private void changeLight(ImageView imageView, int brightness) { ColorMatrix cMatrix = new ColorMatrix();...
  • 一、什麼是Quartz2DQuartz 2D是⼀個二維繪圖引擎,同時支持iOS和Mac系統Quartz 2D能完成的工作:繪製圖形 : 線條\三角形\矩形\圓\弧等 繪製文字繪製\生成圖片(圖像)讀取\生成PDF 截圖\裁剪圖片 自定義UI控制項二、Quartz2D在iOS開發中的價值為了便於搭建美觀...
  • 1.cell的重用 所謂的cell的重用就是,視圖載入的時候只會創建當前視圖中的cell,或者比當前視圖多一點的cell,當視圖滾動的時候,滾出屏幕的cell會放進緩存中,滾進屏幕的cell會根據Identifier從緩存中獲取cell,如此的迴圈往複,這樣只會創建固定的cell對象,節省了記憶體。下...
  • 前言:我發現我標題取的不好,誰幫我取個承接上下文的標題?評論一下,我改項目需求:在程式開發中,我們需要在某個程式裡面發送一些簡訊驗證(不是接收簡訊驗證,關於簡訊驗證,傳送門:http://www.cnblogs.com/wolfhous/p/5096774.html項目實現:------------...
  • 話說蘋果在iOS7.0之後,很多系統界面都使用了毛玻璃效果,增加了界面的美觀性,比如下圖的通知中心界面;但是其iOS7.0的SDK並沒有提供給開發者實現毛玻璃效果的API,所以很多人都是通過一些別人封裝的框架來實現,後面我也會講到一個;其實在iOS7.0(包括)之前還是有系統的類可以實現毛玻璃效果的...
  • 1、判斷是否為快速點擊 /** 判斷是否是快速點擊 */ private static long lastClickTime; public static boolean isFastDoubleClick() { long time = System.current...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...