[MySQL Reference Manual] 18 複製

来源:http://www.cnblogs.com/Amaranthus/archive/2016/05/05/5462188.html
-Advertisement-
Play Games

18 複製 18 複製... 1 18.1 複製配置... 3 18.1.1 基於Binary Log的資料庫複製配置... 3 18.1.2 配置基於Binary log的複製... 3 18.1.2.1 設置複製master的配置... 3 18.1.2.2 創建複製要用的用戶... 4 18. ...


18 複製

18 複製... 1

18.1 複製配置... 3

18.1.1 基於Binary Log的資料庫複製配置... 3

18.1.2 配置基於Binary log的複製... 3

18.1.2.1 設置複製master的配置... 3

18.1.2.2 創建複製要用的用戶... 4

18.1.2.3 獲取複製Binary Log坐標... 4

18.1.2.4 選擇同步數據快照的方法... 4

18.1.2.5配置Slave. 5

18.1.2.6 為複製環境增加一個slave. 6

18.1.3 基於全局事務標示符的複製... 7

18.1.3.1 GTID概述... 7

18.1.3.2 使用GTID配置複製... 10

18.1.3.3 使用GTID故障轉移或者擴展... 11

18.1.3.4 使用GTID複製的限制... 13

18.1.4 多主複製... 14

18.1.4.1 MySQL多主複製概述... 14

18.1.4.2多主複製教程... 14

18.1.4.3 多主複製監控... 15

18.1.4.4 多主複製錯誤信息... 16

18.1.5 修改線上服務的複製模式... 17

18.1.5.1 複製模型概述... 17

18.1.5.2 線上啟動GTID事務... 18

18.1.5.3 線上關閉GTID事務... 19

18.1.5.4 驗證複製的匿名事務... 19

18.1.6 複製和Binary log選項和變數... 20

18.1.7 通常的管理任務... 20

18.1.7.1檢查複製狀態... 20

18.1.7.2 暫停Slave上的複製... 22

18.2 複製的實現... 22

18.2.1 複製格式... 22

18.2.1.1 基於語句和基於行複製的好處和壞處... 23

18.2.1.2 基於行複製的用處... 24

18.2.1.3 確定binary log中安全和非安全語句... 25

18.2.2 複製實現細節... 26

18.2.3 複製渠道... 27

18.2.3.1 單個渠道的命令和選項... 27

18.2.3.2 版本相容... 28

18.2.3.3 複製渠道啟動選項... 28

18.2.3.4 複製渠道命名協定... 28

18.2.4 複製 Relay日誌和狀態日誌... 28

18.2.4.1 Slave Relay Log. 28

18.2.4.2 Slave狀態日誌... 29

18.2.5 服務如何評估複製過濾規則... 29

18.2.5.1 評估資料庫級別複製和bianry log選項... 30

18.2.5.2 評估表複製選項... 31

18.2.5.3 複製規則應用... 33

18.3 複製解決方案... 33

18.3.1 使用複製備份... 33

18.3.1.1 使用mysqldump備份slave. 34

18.3.1.2 備份原生數據... 34

18.3.1.3 標記為只讀備份master或者slave. 34

18.3.2 複製MasterSlave不同引擎... 35

18.3.3使用複製的橫向擴展... 35

18.3.4 不同的slave複製不同的資料庫... 36

18.3.5 提高複製性能... 36

18.3.6 在錯誤的時候切換Master37

18.3.7 使用安全連接配置複製... 39

18.3.8 半同步複製... 41

18.3.8.1 半同步複製管理介面... 42

18.3.8.2 半同步複製安裝和配置... 42

18.3.8.3 半同步複製監控... 43

18.3.9 延遲複製... 44

18.4 複製註意和提示... 44

 

複製是一個MySQL服務master,複製到另外一個服務slave。複製預設是非同步的。Slave不需要一直連接到slave獲取master的更新。根據配置,你可以複製所有的資料庫,或者指定資料庫,或者資料庫內的幾個表。

MySQL複製的有點:

1.可以分散負荷到多個slave來提高性能。在這個環節,所有的寫必須在master執行,讀可以在slave上執行。這個模式可以提高些性能。也提高讀性能。

2.數據安全,因為數據被覆制到slaveslave可以暫停複製進場,可以執行備份,不會損壞master上的數據。

3.分析,live數據可以在master上創建,分析行為可以在slave上執行,不會影響master

4.長距離數據分佈,你可以使用在本地創建遠程數據的副本,不需要訪問master

MySQL 5.7支持不同的複製方法。傳榮的方法是基於masterbinlog,根據log文件的positions來同步。新的方法是基於全局事務標示(GTIDs)是事務標示因此不需要log文件和位置,簡化了很多複製任務。複製使用GTIDs保證了masterslave 的一致性,只要在master上提交的事務也會在slave 上提交。關於使用GTIDs複製具體看: Section 18.1.3, “Replication with Global Transaction Identifiers”

MySQL中的複製支持不同類型的同步。通常是單路非同步的同步,一個服務作為master,多個作為slave。在MySQL5.7,半同步複製也被支持,擴展了非同步複製。使用半同步複製,在事務提交回覆session之前,保證至少有一個slave接受到通知並且接受並且記錄了事務的日誌。MySQL也支持延遲複製比如slave至少延遲指定時間的日誌。

2個核心類型的複製,基於語句的複製,語句行的複製。也可以使用混合複製類型。

複製通過一些列的選項和變數控制。

當你使用複製來解決各種不同問題,包括性能,支持不同資料庫的備份。和一些列解決方案來緩解系統錯誤。

18.1 複製配置

18.1.1 基於Binary Log的資料庫複製配置

根據資料庫的配置,Binary log的格式不同。Slave配置讀取masterbinary log並且執行。

沒個slave複製整個binary logSlave負責哪個語句要被執行。除非你執行了,否則搜有binary log 都會被執行到slave。你可以配置slave指定只執行那些資料庫或者表的binary log

每個slave都保留了一個binary log 的相關記錄,記錄已經從master傳過來的文件名和文件中的位置。也就是說多個slave 可以連接到master並且執行不同的binary log部分。因為slave控制了這些進程,獨立的slave可以連接或者不連接到服務,不會對master操作影響。也是因為每個slave記錄了當前Binary log 的位置,可以讓slave斷開之後重新連接。

Master和每個slave必須配置一個唯一的idserver-id,另外每個slave必須配置關於master的一些信息,具體可以看change master to的參數。

18.1.2 配置基於Binary log的複製

大致步驟如下:

1.master,啟動binary log配置server id。可能需要重啟服務。

2.每個slave想要連接的master,必須配置server id,可能需要重啟服務。

3.可選,創建一個獨立的用戶來驗證,讀取binary log

4.在創建數據快照或者複製進程之前,在master上需要記錄當前binary log 的位置。你需要配置slave這樣slave知道從哪裡開始執行事件。

5.如果你已經有了數據在master上,想要使用它來同步到slave,你需要創建一個數據快照,並且複製到slave。存儲引擎會影響創建快照的方式,當你使用MyISAM你必須停止語句獲取READ-LOCK,獲取當前的binary log並且導出數據。在允許master繼續執行語句之前。如果你沒有停止服務導出數據,master 的狀態信息就不匹配,導致slave的資料庫損壞或者不一致。如果你使用innodb,不需要使用read-lock

6.配置slave連接到master 的信息比如hostloginbinary log文件名和位置。

18.1.2.1 設置複製master的配置

為了配置master使用binarylog文件,你必須啟動binary log並且設置server id。如果沒有被設置,需要重啟服務。

Binary Log必須被啟動,因為binary log是傳輸修改的基礎。如果binary log 沒有啟動,那麼就不能配置複製。

在複製組內的每個服務必須配置唯一的server id。這個ID用來表示唯一的服務,必須是12^32-1中的一個值。

配置binary logserver id選項,關閉MySQL服務並且修改my.cnfmysqld的配置下設置log-binserver-id選項。如果已經存在那個根據需要來修改。例如:

[mysqld]
log-bin=mysql-bin
server-id=

修改之後需要重啟。

18.1.2.2 創建複製要用的用戶

每個slave連接到master使用MySQL用戶名和密碼,所以必須有個用戶賬號在masterslave可以用來連接。任何賬號可以使用這個操作,必須要有REPLICATION SLAVE許可權。你可以根據選擇為不同的slave創建不同的賬號,或者使用相同的賬號連接到master

儘管你沒有創建指定的用戶用於複製,要註意複製用戶名密碼是明文保存在碼,master信息表或者文件中。

使用create user來創建用戶。授予複製需要的許可權。如果你創建賬號是為了複製,只需要REPLICATION SLAVE許可權就可以了。

mysql> CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com';

18.1.2.3 獲取複製Binary Log坐標

為了配置 slave啟動複製進程你需要master 當前binary log的坐標。如果master已經運行但是沒有啟動binary log那麼SHOW MASTER STATUSmysqldump –master-data是空的。這個時候只要指定文件為空,位置為4.

如果master已經設置了binary log,使用以下過程來獲取:

1.啟動會話連接到master,以只讀模式刷新所有的表,flush tables with read lock

2.在其他會話中,使用SHOW MASTER STATUS語句回去binary log的位置和文件。

18.1.2.4 選擇同步數據快照的方法

如果master資料庫包含的數據需要複製到所有的slave。有2個複製數據的方法:

1.使用mysqldump導出數據

2.如果是binary portable文件你可以複製原生的數據文件。比mysqldump可能要有效的多。

18.1.2.4.1 使用mysqldump創建快照

shell> mysqldump --all-databases --master-data > dbdump.db

使用--master-data會自動生成change master語句。

18.1.2.4.2 使用原生數據文件創建數據快照

可以使用企業版的備份工具mysqlbackup備份,也可以使用xtrabackup進行備份。

18.1.2.5配置Slave

配置slave前,確保以下步驟:

1.配置MySQL Master

2.獲取master狀態信息

3.master上釋放讀鎖

18.1.2.5.1 設置Slave配置

每個複製slave必須有一個唯一的server id。重啟服務生效。

如果slave server id已經沒有被設置,或當前值server idmaster的沖入,需要重新設置一個server id。如果有多個slave每個slave 都要有一個唯一的server idslave上沒必要啟動binary log。但是如果你在slave 上啟動了binary log,你可以使用slavebinary log備份和恢復。也可以把slave作為複雜拓撲的一部分。比如這個slave對於其他slavemaster

18.1.2.5.2 slave設置master

為了slave可以和master交互,需要配置master的連接信息。使用如下語句:

mysql> CHANGE MASTER TO

->     MASTER_HOST='master_host_name',

->     MASTER_USER='replication_user_name',

->     MASTER_PASSWORD='replication_password',

->     MASTER_LOG_FILE='recorded_log_file_name',

    ->     MASTER_LOG_POS=recorded_log_position;

Change master to語句也有其他選項比如使用SSLChange master to的所有選項可以查看:Section 13.4.2.1, “CHANGE MASTER TO Syntax”.

如果master有數據可以導入到slave中,導入方法如下:

1.如果有一個快照資料庫導入,查看: Section 18.1.2.5.3, “Setting Up Replication between a New Master and Slaves”.

2.如果你沒有快照資料庫導入可以看:Section 18.1.2.5.3, “Setting Up Replication between a New Master and Slaves”.

18.1.2.5.3 在新的masterslave配置複製

當沒有快照導入,為新的master配置slave。在所有slave都要執行

1.啟動MySQL Slave並且連接

2.執行change master to配置master replication server

這個方法也可以使用在設置一個新的master,已經有了數據dump要導入的master上。

如果配置複製環境使用了其他伺服器的數據來配置新master,可以dump文件來生成型的服務。資料庫更新會自動傳播到slave

18.1.2.5.4 使用已經存在數據來配置複製

當配置複製但是已經有數據了,在複製啟動錢,把快照從master傳輸到slave。步驟如下:

1.啟動slave,但是使用—skip-slave-start,不啟動slave

2.導入dump文件

如果使用raw data創建了快照:

1.把數據文件解壓倒slave數據目錄

2.啟動slave--skip-slave-start

3.使用master的相關信息來配置slave。獲取change master to要的信息。

4.啟動slave

你已經處理了過程,slave連接到master並且複製master上所有的更新。

1.如果master忘記了設置server-idslave不能連接

2.如果slave忘記了server-id,slaveerror日誌就會有以下錯誤

Warning: You should set server-id to a non-0 value if master_host is set; we will force server id to 2, but this MySQL server will not act as a slave.

slave使用的信息存放在master info中,跟蹤了已經處理了多少masterbinary log。這個數據可以是文件或者表的方式,有—master-info-repository來決定。當參數為file,你可以在數據文件中找到2個文件master.inforelay-log.info。如果為table那麼信息保存在mysql下的master_slave_info表中。如果刪除表或者文件master信息就會丟失。

18.1.2.6 為複製環境增加一個slave

可以在不停止master的情況下為複製環境增加一個slave。為新的slave配置一個server-id

1.關閉存在的slave

2.複製數據目錄到新的slave。你可以使用tar打包,也可以直接cp或者rsync

當心的複製slave加入,往往會發生以下常見錯誤:

071118 16:44:10 [Warning] Neither --relay-log nor --relay-log-index were used; so

replication may break when this MySQL server acts as a slave and has his hostname

changed!! Please use '--relay-log=new_slave_hostname-relay-bin' to avoid this problem.

071118 16:44:10 [ERROR] Failed to open the relay log './old_slave_hostname-relay-bin.003525'

(relay_log_pos 22940879)

071118 16:44:10 [ERROR] Could not find target log during relay log initialization

071118 16:44:10 [ERROR] Failed to initialize the master info structure

這個錯誤是因為—relay-log沒有指定導致的,relay log文件以host名字開頭,有一個index文件,--relay-log-index文件控制。

為了避免這個問題使用,--relay-log使用和老的slave一樣的值。如果選項沒有被顯示設置使用hostname-relay-bin。設置--relay-log-index和老的slave一樣。如果沒有顯示設置預設為hostname-relay-bin.index。如果你已經設置了relay log也是有以上的錯誤:

a.如果沒有設置relay log設置,在新的slave上關閉slavestop slave。如果來的slave也啟動了,老的slave也需要關閉。

b.複製老的slave中的relay log index文件內容到新的slave relay log index文件中。

c.執行重命名

3.複製master信息和relay log信息內容到新的slave

4.啟動已經存在的slave

5.在新的slave 上給一個新的server-id

6.啟動新的slave,使用master信息的內容來啟動。

18.1.3 基於全局事務標示符的複製

18.1.3.1 GTID概述

GTID是事務的唯一標示。並不是對某一個服務來說是唯一標示,是所有服務內都是唯一的。

GTID2部分組成,有冒號分隔如下:

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

-Advertisement-
Play Games
更多相關文章
  • 前言 上一篇[關係資料庫常用SQL語句語法大全][2]主要是關係型資料庫大體結構,本文細說一下關係型資料庫查詢的SQL語法。 ![SQL數據查詢][1] 語法回顧 SQL查詢語句的順序:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。SELECT、FROM是必須 ...
  • 現在使用資料庫來寫存儲過程,動不動參數就會用到xml ,當然羅,優勢也很明顯,參數相對固定,而且靈活,如果要修改或者什麼的,中間介面層也不需要做變化,只需要修改封裝的存儲過程以及程式傳參就ok了。 隨著時間慢慢過,有時候就有一個存儲過程,一個xml 來應對整個表的新增,修改,刪除的情況了。而對於這個 ...
  • T-SQL解析json字元串函數及其使用示例 參考博文:http://www.cnblogs.com/huangtailang/p/4277809.html 1、解析json字元串函數,返回表變數 2、存儲過程調用示例 ... ...
  • 1. Upgrading to MySQL 5.7, focusing on temporal types 在MySQL 5.6.4中,對TIME, TIMESTAMP and DATETIME三種時間類型進行了擴充,支持了微秒,並且DATETIME的存儲由之前的8個位元組縮小到5個位元組。 如果從My ...
  • 對於設計和創建資料庫完全是個新手?沒關係,Joe Celko,世界上讀者數量最多的SQL作者之一,會告訴你這些基礎。和往常一樣,即使是最專業的資料庫老手,也會給他們帶來驚喜。Joe是DMBS雜誌是多年來最受讀者喜愛的作者。他在美國、英國,北歐,南美及非洲傳授SQL知識。他在ANSI / ISO SQ ...
  • 1 數據表結構的設計與性能優化 1.1 、數據表的存儲原理 SQL Server每次讀取1個存儲塊,每個存儲塊大小為8KB,每讀取1個存儲塊計算為1個邏輯讀。 問題:如果數據內容非常大,像我們系統中的Feeling欄位非常大,就會導致每個存儲塊存放的數據行數會非常少,這樣當我們讀取數據時,要讀取許多 ...
  • MySQL資料庫伺服器的架設 MySQL資料庫伺服器的架設 MySQL資料庫伺服器的架設 導讀 MySQL資料庫是Linux操作系統上用得最多的資料庫系統,它可以非常方便的與其它伺服器集成在一起,如Apache、Vsftpd、Postfix等。下麵介紹RHEL 6平臺MySQL資料庫伺服器的安裝方法 ...
  • SQLServer 2012 Always on是針對高可用性和災難恢復的新解決方案。可以配置一個或多個輔助副本以支持對輔助資料庫進行只讀訪問,並且可以將任何輔助副本配置為允許對輔助資料庫進行備份。 這樣就提供了硬體的使用效率。 “可用性組”針對一組離散的用戶資料庫(稱為“可用性資料庫”,它們共同實 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...