程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 我的MYSQL學習心得(十七) 復制,mysql學習心得復制

我的MYSQL學習心得(十七) 復制,mysql學習心得復制

編輯:MySQL綜合教程

我的MYSQL學習心得(十七) 復制,mysql學習心得復制


我的MYSQL學習心得(十七) 復制

 

我的MYSQL學習心得(一) 簡單語法

我的MYSQL學習心得(二) 數據類型寬度

我的MYSQL學習心得(三) 查看字段長度

我的MYSQL學習心得(四) 數據類型

我的MYSQL學習心得(五) 運算符

我的MYSQL學習心得(六) 函數

我的MYSQL學習心得(七) 查詢

我的MYSQL學習心得(八) 插入 更新 刪除

我的MYSQL學習心得(九) 索引

我的MYSQL學習心得(十) 自定義存儲過程和函數

我的MYSQL學習心得(十一) 視圖

我的MYSQL學習心得(十二) 觸發器

我的MYSQL學習心得(十三) 權限管理

我的MYSQL學習心得(十四) 備份和恢復

我的MYSQL學習心得(十五) 日志

我的MYSQL學習心得(十六) 優化

 

最近把大學時候的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上面了

[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復制是比較重要的技術

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

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

 

如有不對的地方,歡迎大家拍磚o(∩_∩)o 


mysql copy復制拷貝表數據及結構的幾種方式

mysql拷貝表操作我們會常常用到,下面就為您詳細介紹幾種mysql拷貝表的方式,希望對您學習mysql拷貝表方面能夠有所幫助。
假如我們有以下這樣一個表:
id username password
-----------------------------------
1 admin *************
2 sameer *************
3 stewart *************
CREATE TABLE IF NOT EXISTS `admin` ( `id` int(6) unsigned NOT NULL auto_increment, `username` varchar(50) NOT NULL default '', `password` varchar(100) default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
1. 下面這個語句會拷貝表結構到新表newadmin中。 (不會拷貝表中的數據)
CREATE TABLE newadmin LIKE admin
2. 下面這個語句會拷貝數據到新表中。 注意:這個語句其實只是把select語句的結果建一個表。所以newadmin這個表不會有主鍵,索引。
CREATE TABLE newadmin AS ( SELECT * FROM admin )
3. 如果你要真正的復制一個表。可以用下面的語句。
CREATE TABLE newadmin LIKE admin; INSERT INTO newadmin SELECT * FROM admin;
4. 我們可以操作不同的數據庫。
CREATE TABLE newadmin LIKE shop.admin; CREATE TABLE newshop.newadmin LIKE shop.admin;
5. 我們也可以拷貝一個表中其中的一些字段。
CREATE TABLE newadmin AS ( SELECT username, password FROM admin )
6. 我們也可以講新建的表的字段改名。
CREATE TABLE newadmin AS ( SELECT id, username AS uname, password AS pass FROM admin )
7. 我們也可以拷貝一部分數據。
CREATE TABLE newadmin AS ( SELECT * FROM admin WHERE LEFT(username,1) = 's' )
8. 我們也可以在創建表的同時定義表中的字段信息。
 

初識mysql,我應該學習對於它的什內容?

MySQL的學習資源:官方手冊 目前MySQL提供的官方手冊中,英文版本包括以下系列: MySQL 5.5 參考手冊 MySQL 5.4 參考手冊 MySQL 5.1 參考手冊 MySQL 5.0 參考手冊 MySQL 3.23/4.0/4.1參考手冊 中文版本為5.1在線參考手冊,URL參考擴展閱讀 前言 這是關於5.1版至5.1.2-alpha版MySQL數據庫系統的參考手冊。該手冊不適用於舊版本MySQL軟件,這是因為在MySQL 5.1和以前的版本存在很多功能性差異和其他差異。如果正在使用MySQL軟件的較舊版本,請參閱MySQL 5.0參考手冊,該手冊涵蓋了MySQL 5.0,或參閱MySQL 4.1參考手冊,該手冊涵蓋了MySQL 4.1以及MySQL的所有早期版本。在手冊的文本中,通過引用發布版本號(5.1.x),注明了MySQL 5.1的二級版本。 這是MySQL參考手冊的翻譯版本,關於MySQL參考手冊,請訪問dev.mysql.com。 原始參考手冊為英文版,與英文版參考手冊相比,本翻譯版可能不是最新的。

初學MySQL哪些需要你知道
一、連接MYSQL
格式: mysql -h主機地址 -u用戶名 -p用戶密碼 1、例1:連接到本機上的MYSQL。 首先在打開DOS窗口,然後進入目錄 mysqlbin,再鍵入命令mysql -uroot -p,回車後提示你輸密碼,如果剛安裝好MYSQL,超級用戶root是沒有密碼的,故直接回車即可進入到MYSQL中了,MYSQL的提示符是:mysql> 2、例2:連接到遠程主機上的MYSQL。假設遠程主機的IP為:110.110.110.110,用戶名為root,密碼為abcd123。則鍵入以下命令: mysql -h110.110.110.110 -uroot -pabcd123 (注:u與root可以不用加空格,其它也一樣) 3、退出MYSQL命令: exit (回車) 注意:想要成功連接到遠程主機,需要在遠程主機打開MySQL遠程訪問權限 方法如下: 在遠程主機中以管理員伙身份進入 輸入如下命令 mysql>GRANT ALL PRIVILEGES ON *.* TO 'agui'@%'IDENTIFIED BY '123' WITH GRANT OPTION; FLUSH PRIVILEGES; //賦予任何主機訪問數據的權限 mysql>FLUSH PRIVILEGES //修改生效 agui為我們使用的用戶名 密碼為123 即:在遠程主機上作好設置,我們即可通過mysql -h110.110.110.110 -uagui -p123連接進遠程主機
二、修改密碼
格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼 1、例1:給root加個密碼ab12。首先在DOS下進入目錄mysqlbin,然後鍵入以下命令 mysqladmin -uroot -password ab12 注:因為開始時root沒有密碼,所以-p舊密碼一項就可以省略了。 2、例2:再將root的密碼改為djg345。 mysqladmin -uroot -pab12 password djg345
三、增加新用戶
(注意:和上面不同,下面的因......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved