MySQL 複製

来源:http://www.cnblogs.com/chenmh/archive/2016/01/05/5089919.html
-Advertisement-
Play Games

標簽:主從概述本篇文章主要介紹mysql主從的搭建過程和中間涉及的一些概念知識,希望能最全面的將mysql主從所涉及到的知識都概況進來;環境已經安裝好了mysql,這裡就不介紹mysql的安裝方法。測試環境:主:mysql(5.6.21),linux:redhat 6.0,ip:192.168.1....


標簽:主從

概述  

本篇文章主要介紹mysql主從的搭建過程和中間涉及的一些概念知識,希望能最全面的將mysql主從所涉及到的知識都概況進來;環境已經安裝好了mysql,這裡就不介紹mysql的安裝方法。

測試環境:

主:mysql(5.6.21),linux:redhat 6.0,ip:192.168.1.6

從:mysql(5.6.21),linux:redhat 6.0,ip:192.168.1.7

原理和概念

主從複製原理

1)主庫在事務提交時會把變更作為事件記錄(Events)到二進位文件(Binlog)當中

2)主庫將二進位文件中的事件推送到從庫的中繼日誌文件中(Relay-bin),從庫根據中繼日誌中事件做變更操作。

線程

 Binlog Dump線程:該線程運行在主庫上,當主從都配置好後,從庫運行START SLAVE啟動複製後,會在主庫上生成一個                                                                        Binlog Dump線程,該線程的主要作用就是讀取主庫Binlog事件發送到從庫(從庫的I/O線程)。

 I/O線程:該線程運行在從庫上,I/O線程的作用是向主資料庫要數據並且將主庫發送過來的變更事件寫入到從庫的中繼日誌中。

 SQL線程:該線程運行在從庫上,該線程的主要作用是讀取中繼日誌中的變更事件並更新從庫。

 

 該圖來自深入淺出mysql資料庫開發這本書中。

 

步驟

主庫

在這裡主庫是運行的,主庫的配置文件也是已經配置好了的。

1.配置my.cnf

 

server-id=6
log-bin=/var/lib/mysql/mysql-bin
max_binlog_size = 100M
sync_binlog=0
binlog-format=MIXED
binlog-ignore-db=test
replicate-ignore-db=test

server-id必須是唯一的,預設設置當前IP主機

log-bin是開啟binlog且配置路徑,預設是不開啟的

max_binlog_size設置binlog文件的最大值,這裡設置最大為100M,當達到這個值會自動生成一個新的binlog文件,當然生成環境會設置的比這個大一點。

sync_binlog:配置是否每次事務提交都需要刷新binlog到磁碟,預設0是不每次刷新,有文件系統自己控制,如果設置為1預設每次事務提交都會刷新binlog到磁碟,這樣的好處是當系統突然down掉了系統損傷的會少一點,因為binlog也有緩存,預設事務提交是先寫緩存這樣當系統突然down掉了就有可能會丟失緩存中的記錄,但是如果每次事務提交都寫磁碟會對性能造成影響,可以通過半同步複製解決因系統突然down掉導致binlog緩存數據丟失的問題。

binlog-format:二進位日誌記錄的方法,有三種方式:row(記錄每一行的變更操作,優點:對複製的相容性高,缺點:日誌記錄量大,對IO的影響也很大,也不容易用來做分析),STATEMENT(記錄操作的sql語句,這也是預設的格式,優點:日誌量小,便於用來做分析,IO影響小,缺點:可能會導致複製出錯例如有時候使用的某些函數),MIXED(混合了上面兩種格式,預設採用STATEMENT記錄,當出現不確定函數時就採取row記錄例如curret_user(),now()等)

binlog-ignore-db:不記錄指定資料庫的binlog,如果指定多個資料庫可以在配置文件中重覆多行。反過來如果配置了binglog-do-db那麼久只記錄指定的這一關資料庫的binlog其它的資料庫都不記錄。

replicate-ignore-db:不複製指定的資料庫的binlog

2.創建複製用戶

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.7' IDENTIFIED BY 'repl';

在主庫上執行,授予192.168.1.7伺服器使用用戶repl的REPLICATION SLAVE許可權。

3.刷新表並設置資料庫只讀

FLUSH TABLES WITH READ LOCK;

當前主庫只能讀不允許更新操作

4.記錄主庫二進位文件名和偏移量

SHOW MASTER STATUS;

記錄日誌名和便宜量的目的是為了後面從庫用的

 5.備份主庫

停止主庫服務,需要將主庫的資料庫備份還原到從庫中去

service mysql stop

備份的方法有很多種:1.如果主庫是線上不能停止服務,可以通過熱備份方式,使用dump、ibbackup、xtrabackup等熱備份工具備份資料庫然後到從庫還原

2.如果主庫允許停止服務那麼可以直接cp主庫數據目錄下的所有文件到從庫的路徑下,可以使用xftp工具比較方便。

做好了這步就可以重啟主庫服務了。

從庫

這裡從庫的服務是停止的。

1.配置my.cnf

log-bin=/var/lib/mysql/mysql-bin
server-id=7
max_binlog_size = 100M
sync_binlog=0
binlog-format=MIXED
binlog-ignore-db=test
replicate-ignore-db=test

註意server-id不能和主相同

2.使用--skip-slave-start方式啟動從庫服務

使用--skip-slave-start啟動的目的是為了不立即啟動從伺服器上面的複製進程,方便對後面的配置操作。

mysqld_safe --skip-slave-start &

3.登入mysql

mysql -uroot -p123456

登入mysql後執行以下操作

change master to  
master_host = '192.168.1.6',  
master_user = 'repl',  
master_password = 'repl',  
master_log_file = 'mysql-bin.000046',  
master_log_pos = 211991;

 啟動從庫slave線程

start slave

4.檢查

 在從庫上執行

show processlist\G;

 表明已經連接上面了master

 

測試

在主庫上執行

#在主庫上創建repltest資料庫併在資料庫下創建test表插入數據
create database repltest;

use repltest
create table test(id int);
insert into test() values(1),(2);

#測試在已有的test資料庫下創建norepl表並插入數據
use test
create table norepl(id int);
insert into norepl() values(1);

在從庫執行

select * from repltest.test;

select * from test.norepl;

結果除了test資料庫的操作不會被覆制以外其他的數據操作都會被覆制到從庫。這也正符合前面的設置。

 

補充

 從伺服器啟動參數

–read_only
該選項讓從伺服器只允許來自從伺服器線程或具有SUPER許可權的用戶的更新。可以確保從伺服器不接受來自客戶的更新。

–replicate_do_db=db_name
告訴從伺服器只做預設資料庫(由USE所選擇)為db_name的語句的複製。要指定多個資料庫,應多次使用該選項,每個資料庫使用一次。請註意不複製跨資料庫的語句

–replicate_do_table=db_name.tbl_name
告訴從伺服器線程只做對指定表的複製。要指定多個表,應多次使用該選項,每個表使用一次。同–replicate-do-db對比,允許跨資料庫更新。

–replicate_ignore_db=db_name
告訴從伺服器不要複製預設資料庫(由USE所選擇)為db_name的語句。要想忽略多個資料庫,應多次使用該選項,每個資料庫使用一次。

–replicate-ignore-table=db_name.tbl_name
告訴從伺服器線程不要複製更新指定表的任何語句(即使該語句可能更新其它的表)。要想忽略多個表,應多次使用該選項,每個表使用一次。

–replicate_wild_do_table=db_name.tbl_name
告訴從伺服器線程限制複製更新的表匹配指定的資料庫和表名模式的語句。模式可以包含‘%'和‘_'通配符,與LIKE模式匹配操作符具有相同的含義。要指定多個表,應多次使用該選項,每個表使用一次。該選項可以跨資料庫進行更新。

–replicate_wild_ignore_table=db_name.tbl_name
告訴從伺服器線程不要複製表匹配給出的通配符模式的語句。要想忽略多個表,應多次使用該選項,每個表使用一次。該選項可以跨資料庫進行更新。

–replicate_rewrite_db=from_name->to_name
告訴從伺服器如果預設資料庫(由USE所選擇)為主伺服器上的from_name,則翻譯為to_name。隻影響含有表的語句

–report_host=slave_name
從伺服器註冊過程中報告給主伺服器的主機名或IP地址。該值出現在主伺服器上SHOW SLAVE HOSTS的輸出中。如果不想讓從伺服器自己在主伺服器上註冊,則不設置該值。

–report_port=slave_port
連接從伺服器的TCP/IP埠號,從伺服器註冊過程中報告給主伺服器。

–skip_slave_start
告訴從伺服器當伺服器啟動時不啟動從伺服器線程。使用START SLAVE語句在以後啟動線程。

–slave_skip_errors=[err_code1,err_code2,… | all]
通常情況,當出現錯誤時複製停止,這樣給你一個機會手動解決數據中的不一致性問題。該選項告訴從伺服器SQL線程當語句返回任何選項值中所列的錯誤時繼續複製

 

複製線程狀態

通過show processlist \G可以查看複製線程狀態。常見的線程狀態有:
(1)主伺服器Binlog Dump線程
Has sent all binlog to slave; waiting for binlog to be updated
線程已經從二進位日誌讀取所有主要的更新並已經發送到了從伺服器。線程現在正空閑,等待由主伺服器上新的更新導致的出現在二進位日誌中的新事件。

(2)從伺服器I/O線程狀態
Waiting for master to send event
線程已經連接上主伺服器,正等待二進位日誌事件到達。如果主伺服器正空閑,會持續較長的時間。如果等待持續slave_read_timeout秒,則發生超時。此時,線程認為連接被中斷並企圖重新連接。

(3)從伺服器SQL線程狀態
Reading event from the relay log
線程已經從中繼日誌讀取一個事件,可以對事件進行處理了。
Has read all relay log; waiting for the slave I/O thread to update it
線程已經處理了中繼日誌文件中的所有事件,現在正等待I/O線程將新事件寫入中繼日誌。

 

文件

在從庫的資料庫路徑下會發現生成了三個文件:master.info,relay-log.info,relay-bin

master.info:用來記錄從庫的I/O線程當前讀取到主庫的binglog的位置。

relay-log.info:用來記錄從庫的SQL線程當前讀取到中繼日誌(relay-bin)的位置。

relay-bin:中繼日誌,中繼日誌記錄的格式和主庫的二進位日誌是一樣的,但是中繼日誌在SQL線程執行完當前中繼日誌中的事件之後會刪除中繼日誌中的內容。

 

從庫複製狀態

可以在從庫上通過show slave status \G查看

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.6
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000047
          Read_Master_Log_Pos: 763952
               Relay_Log_File: localhost-relay-bin.000003
                Relay_Log_Pos: 764115
        Relay_Master_Log_File: mysql-bin.000047
             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: 763952
              Relay_Log_Space: 764455
              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: 6
                  Master_UUID: d58e2793-8534-11e5-b224-000c2908cc04
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0

 

Slave_IO_State: 線程已經連接上主伺服器,正等待二進位日誌事件到達
Master_Host: 主伺服器ip
Master_User: 連接主伺服器使用的用戶
Master_Port: 主伺服器的埠
Connect_Retry: 當重新建立主從連接時,如果連接建立失敗,間隔多久後重試,預設60s。
Master_Log_File: I/O線程當前正在讀取的主伺服器二進位日誌文件的名稱
Read_Master_Log_Pos: 在當前的主伺服器二進位日誌中,I/O線程已經讀取的位置。
Relay_Log_File: SQL線程當前正在讀取和執行的中繼日誌文件的名稱
Relay_Log_Pos: SQL線程在當前的中繼日誌中已讀取和執行的位置。
Relay_Master_Log_File: SQL線程執行的主伺服器二進位文件
Slave_IO_Running: I/O線程是否運行併成功地連接到主伺服器上。
Slave_SQL_Running: SQL線程是否運行。
Replicate_Do_DB:用於複製的資料庫,必須在配置文件中配置了
Replicate_Ignore_DB:不用來複制的資料庫
Replicate_Do_Table:複製表
Replicate_Ignore_Table:不複製的表
Replicate_Wild_Do_Table: 限制複製更新的表匹配指定的資料庫和表名模式的語句
Replicate_Wild_Ignore_Table: 不要複製表匹配給出的通配符模式的語句
Last_Errno:錯誤代碼
Last_Error:錯誤信息
Skip_Counter: SQL_SLAVE_SKIP_COUNTER的值
Exec_Master_Log_Pos: 主伺服器上一個被執行的位置
Relay_Log_Space: 中繼日誌文件大小
Until_Condition: 在START SLAVE語句的UNTIL子句中指定的值
Until_Log_File: 用於指示日誌文件名
Until_Log_Pos: 位置值
Master_SSL_Allowed: 如果允許對主伺服器進行SSL連接,則值為Yes
否則NO
Master_SSL_CA_File:下麵的這些都是SSL連接的一些信息
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 本欄位是從屬伺服器落後多少的一個指示(這個狀態是一個很重要的性能指標,正常為0,如果從伺服器的I/O線程無法連接主伺服器顯示null)
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 最近的IO線程錯誤代碼,其中2003代表I/o線程無法連接主伺服器
Last_IO_Error: 最近的IO線程錯誤信息(例如:error reconnecting to master '[email protected]:3306' - retry-time: 60  retries: 3)
Last_SQL_Errno: 最近的SQL線程錯誤代碼
Last_SQL_Error: 最近的SQL線程錯誤信息
Replicate_Ignore_Server_Ids:
Master_Server_Id: 主伺服器的伺服器ID
Master_UUID: 主伺服器的UUID值
Master_Info_File: 從伺服器的master.info文件路徑
SQL_Delay: 正數表明slave有延遲了
SQL_Remaining_Delay: 整數表明延遲時間
Slave_SQL_Running_State: SQL線程運行狀態(SQL線程已經處理了中繼日誌文件中的所有事件,現在正等待I/O線程將新事件寫入中繼日誌。
)
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:最近的I/O線程錯誤時間
Last_SQL_Error_Timestamp:最近的SQL線程報錯時間
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0

其中需要註意比較重要的狀態:Slave_SQL_Running之前的這十幾個狀態再加上Last_IO_Errno,Last_IO_Error,Last_SQL_Errno,Last_SQL_Error,SQL_Delay,SQL_Remaining_Delay,Slave_SQL_Running_State,Last_IO_Error_Timestamp,Last_SQL_Error_Timestamp

總結

在企業的環境中主從複製是最基礎也是非常普遍的一種形式,相對來說配置管理也比較簡單。上面講的是一主一從,在這基礎上只要再添加從伺服器就可以做到一主多從的結構,但是這種結構對於主伺服器的可靠性要求很高,這就又有了主主複製,後面會花點時間寫一篇關於主主複製的文章,歡迎關註。

 

 

 

備註:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》

 

---恢復內容結束---


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

-Advertisement-
Play Games
更多相關文章
  • update aset a.StepCode=b.StepCode,a.StepName=b.StepName,a.allowtime=b.allowtime,a.ActionTypeID=b.ActionTypeID,a.YesStep=b.YesStep,a.NoStep=b.NoStep,a....
  • 01.簡述資料庫完整性及其作用?解析:數據的準確性,保證數據中數據的準確性。 02.基本操作語句(DML DDL DCL)有哪些?語法是?DML(data manipulation language):自動提交的資料庫操作語言它們是SELECT、UPDATE、INSERT、DELETE,就象它的名....
  • 本文通過java代碼使用jdbc連接hive,詳細解釋了其操作步驟與問題,適用於hive1.2版本
  • 今天Linux伺服器機子重啟了下,Oracle啟動不起來,提示:解決ORA-00824: cannot set sga_target due to existing看了很多解決方法,發現下麵這個特別好,特別簡單轉:http://blog.chinaunix.net/uid-22448653-id-3...
  • 統計分析中Type I Error與Type II Error的區別 ============== 在統計分析中,經常提到Type I Error和Type II Error。他們的基本概念是什麼?有什麼區別? 下麵的表格顯示 between truth/falseness of the null ...
  • 實體類:using MongoDB.Bson;namespace WindowsFormsApp{ class User { //public ObjectId _id; //BsonType.ObjectId 這個對應了 MongoDB.Bson.ObjectId ...
  • 一、業務場景我們在實際生產環境中遇到了這樣一種需求,即需要檢索一個父子關係的子樹數據估計大家也遇到過類似的場景,最典型的就是省市數據,其中path欄位是按層級關係生成的行政區路徑:如果我們已知某市名,想查出同級和高一級的省名,如保定市同級和上級河北省,那麼我們有什麼實現方式呢給大家10秒鐘,快速搶答...
  • SQL Server無法收縮日誌文件 2 因為邏輯日誌文件的總數不能少於 2問題最近伺服器執行收縮日誌文件大小的job老是報錯我所用的一個批量收縮日誌腳本USE [master]GO/****** Object: StoredProcedure [dbo].[ShrinkUser_DATABASE....
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...