MySQL備份與主備配置

来源:https://www.cnblogs.com/jxtxzzw/archive/2019/05/10/10844462.html
-Advertisement-
Play Games

MySQL備份與主備配置 數據備份類型 全量備份:備份整個資料庫 增量備份:備份自上一次備份以來(增量或完全)以來變化的數據 差異備份:備份自上一次完全備份以來變化的數據 全量備份 全量備份的方法有 2 種,一種是利用資料庫管理工具提供的備份恢復和導入導出功能。例如:如果使用 Navicat、PHP ...


MySQL備份與主備配置

數據備份類型

  • 全量備份:備份整個資料庫
  • 增量備份:備份自上一次備份以來(增量或完全)以來變化的數據
  • 差異備份:備份自上一次完全備份以來變化的數據

    全量備份

    全量備份的方法有 2 種,一種是利用資料庫管理工具提供的備份恢復和導入導出功能。
    例如:如果使用 Navicat、PHPMyAdmin 之類的可視化工具,可以直接點擊轉儲 SQL 文件,或者導出 SQL 文件之類的功能。
    另一種是利用 mysqldump。
    導出:
    sudo mysqldump -u root -p student > dir/student_backup.sql
    
    導入:
    sudo mysqldump-u root -p student < dir/student_backup.sql
    source student_backup.sql #要在資料庫操作 use student 之後
    

    增量備份

    增量備份的 binlog 是一個二進位格式的文件,用於記錄用戶對資料庫更新的 SQL 語句信息,例如更改資料庫表和更改內容的 SQL 語句都會記錄到 binlog 里,但是對庫表等內容的查詢不會記錄。
    在配置文件中,修改配置打開 binlog。通過 show variables like '%log_bin%'; 查看 binlog 是否打開。
    1557456890317
    可以看到預設是沒有打開的。
    預設的配置文件可能在 /etc/mysql/my.cnf,如果是使用 XAMPP 等一鍵安裝的,也可能在 /opt/lampp/etc/my.cnf 等位置。
    在配置文件找到 log_bin 所在的位置,取消這一行的註釋。
    1557458584111
    重啟服務以後,可以看到啟用了 binlog。
    1557458635561
    binlog 的使用格式
    show binary logs;
    show binlog events in 'mysql-bin.000001';
    
    1557458736273
    1557458749349
    GTID 的全稱是Global Transaction Identifier,也就是全局事務ID,是一個事務在提交的時候生成的,是這個事務的唯一標識。它由兩部分組成,格式是:`gtid=server-uuid:gno
    server_uuid 是一個實例第一次啟動時自動生成的,是一個全局唯一的值。
    gno 是一個整數,初始值是 1,每次提交事務的時候分配給這個事務,並加 1。
    在 GTID 模式下,每個事務都會跟一個 GTID 一一對應。
    這樣,每個MySQL 實例都維護了一個GTID 集合,用來對應“這個實例執行過的所有事務”。
    下麵來測試一下 binlog。
    1557458853180
    先導入測試數據,然後執行以下語句。
    update student set birth = 2019 where id = '100';
    insert into student values(200, 'jxtxzzw', '男', 2019, '電腦系', '上海');
    delete from student where id = 200;
    
    查看 binlog。
    1557458950530
    通過以下兩條語句可以生成新的 binlog。
    flush logs;
    show binary logs;
    
    除了 flush logs;,重啟 MySQL 服務以及 mysqlbinlog 也可以生成新的 binlog。

    通過 binlog 恢複數據

    構造場景:
    insert into student values(907,'李七','男',1991,'電腦系','上海');
    insert into student values(908,'李八','男',1992,'音樂系','上海');
    delete from student where id=907;//誤刪
    delete from student where id=908;//誤刪
    
    如何通過 binlog 恢復這兩條數據?
    通過查看 binlog 找到了誤刪的兩條數據。
    1557459125508
    mysqlbinlog --start-position=4183 --stop-position=4592 /opt/lampp/var/mysql/mysql-bin.000001 | mysql -u root -p
    
    在上面這條語句中,首先是設置了起點為 4183、終點為 4592,並指定了 binlog 的文件為 mysql-bin.000001。
    1557459226725
    1557459678141
    輸入管理員密碼之後,可以重新打開資料庫看一下是不是成功。
    1557459751519
    可以看到恢覆成功。
    如果想要刪除 binlog,刪除 binlog 的方法是:
  1. 關閉 MYSQL 主從,關閉 binlog。
  2. 開啟 MYSQL 主從,設置 expire_logs_days。
  3. 手動清除 binlog 文件,PURGE MASTER LOGS to ‘mysqld-bin.00001’;(before ‘date’)。
  4. reset master。

    練習 1

  5. 刪掉 student 庫,通過全量備份和 binlog 對其進行恢復。
  6. 嘗試瞭解 binlog 的三種格式。
    刪掉 student 庫的過程非常簡單,而通過全量備份恢復只需要導入即可,從略。
    下麵重點說一下從 binlog 恢復的過程。
    1557459828077
    需要特別說明的是,命令行下可能不允許使用 delete,這時候可以用 drop table 替換。
    刪除所有數據以後再次打開資料庫,看到表已經是空的了。
    1557459890412
    然後打開 binlog 看一眼,找到 start position 和 stop position。
    1557461599133
    然後從起點位置到結束位置執行一次恢復。
    1557461570784
    可以看到數據已經恢復了。
    1557461639511
    binlog 的三種格式:
    直接轉載 卜算 的《使用mysql的binlog恢復誤操作(update|delete)的數據》(https://blog.csdn.net/Aeroleo/article/details/77929917)中的內容:

    MYSQL binlog複製主要有三種方式:基於SQL語句的複製(statement-based replication, SBR),基於行的複製(row-based replication, RBR),混合模式複製(mixed-based replication, MBR)。對應的,binlog的格式也有三種:STATEMENT,ROW,MIXED。

    STATEMENT模式(SBR)

    每一條會修改數據的sql語句會記錄到binlog中。優點是並不需要記錄每一條sql語句和每一行的數據變化,減少了binlog日誌量,節約IO,提高性能。缺點是在某些情況下會導致master-slave中的數據不一致(如sleep()函數, last_insert_id(),以及user-defined functions(udf)等會出現問題)

    ROW模式(RBR)

    不記錄每條sql語句的上下文信息,僅需記錄哪條數據被修改了,修改成什麼樣了。而且不會出現某些特定情況下的存儲過程、或function、或trigger的調用和觸發無法被正確複製的問題。缺點是會產生大量的日誌,尤其是alter table的時候會讓日誌暴漲。

    MIXED模式(MBR)

    以上兩種模式的混合使用,一般的複製使用STATEMENT模式保存binlog,對於STATEMENT模式無法複製的操作使用ROW模式保存binlog,MySQL會根據執行的SQL語句選擇日誌保存方式。

    MySQL 主備配置

    在主庫上創建用戶 repl,並給他許可權。

    CREATE USER repl;
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '123456';
    

    1557463740318
    檢查在主庫 my.cnf 中配置 server-id。發現已經配置了。
    1557463809046
    然後進配置文件把所有 bind-address=127.0.0.1 的配置行註釋掉。
    1557464115585
    在主庫執行 show master status; 記錄 binlog 和 pos。
    1557464220695
    打開 Ubuntu-Server(從庫),修改配置文件(/opt/lampp/etc/my.cnf)中的 server-id 為 2,重啟 MySQL 服務。
    1557464381264
    進入資料庫,執行:

    change master to master_host='主庫IP(這裡是192.168.23.129)', master_user='主庫用戶(這裡是repl)', master_password='主庫用戶密碼(這裡是123456)', master_log_file="主庫的binlog(這裡是mysql-bin.000003)", master_log_pos=主庫的binlog的pos(這裡是327);
    start slave;
    show slave status\G;
    

    1557464651425
    然後在 status 可以看到 slave 的狀態是 YES。
    1557466491120
    1557466508070
    測試主備。在主庫添加一條記錄,然後在從庫看一下是不是有這條記錄。
    1557464970121
    1557464987238
    主庫成功添加了這條記錄。
    從庫也出現了這條記錄。
    特別需要指出的是,從庫和主庫的同步只能是從同步開始設置的那一刻之後的操作才能同步。
    舉個例子,主庫有 100、200、300 這三個用戶,從庫有 200、300、500 這三個用戶:

  • 在主庫添加 400 號用戶,則從庫自動添加 400 號用戶
  • 在主庫刪除 300 號用戶,則從庫自動刪除 300 號用戶
  • 在主庫將 200 號用戶的編號修改為 233 號,則從庫自動將 200 號用戶的編號設置為 233。
  • 在主庫修改 100 號用戶的編號修改為 101,從庫沒有響應。
  • 在主庫修改 100 號用戶的編號修改為 500,進一步修改姓名為張三,由於在第一步操作之後,主庫的 100 號用戶的編號已經修改為 500 了,之後如果用主鍵來判斷修改了哪一條記錄,那麼將會是“把 500 號用戶的姓名修改為張三”,於是,這一修改會體現在從庫上,從庫的 500 號用戶也被改成了張三。
    因此,需要說明的是,如果從庫一開始就沒有 student 這個庫,或者沒有表,那麼,主從備份是不會起作用的。
    1557467029314

    MySQL 雙主結構

    目的:A 和 B 雙向同步。
    剛纔的是主從備份,只有主機的修改會被同步到從機,從機的修改不會被同步到主機。
    1557467095234
    修改兩邊的配置文件。
    在 A 和 B 重覆上面主從備份的時候創建 repl 用戶的過程,並賦予許可權。
    create user repl;
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@‘%' IDENTIFIED BY '123456';
    FLUSH PRIVILEGES;
    
    測試是否可以連接。
    1557467728717
    1557467761322
    自己連自己、自己連對方,都可以正常訪問。
    之後的步驟與主從備份是類似的,只是相當於對兩台主機都做了一次主從備份,互相做對方的從機。
    於是,需要先查看 binlog 的 index 和 pos。
    這是在 A 查到的結果,A 的 IP 是 192.168.23.129。
    1557467898254
    這是在 B 查到的結果, B 的 IP 是 192.168.23.128。
    1557468134222
    註意這個操作需要在 root 許可權下運行,repl 運行不了。
    然後在 A 執行:
    change master to master_host='192.168.23.128', master_user='repl', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=313;
    
    類似的,在 B 運行:
    change master to master_host='192.168.23.129', master_user='repl', master_password='123456', master_log_file='mysql-bin.000005', master_log_pos=327;
    
    1557468531570
    之後分別在 A 和 B 上通過 start slave 來運行。
    通過 show slave status 可以看到 IO 和 SQL 都是 Running 的。
    1557468640189
    1557468671526
    測試。
    INSERT INTO `student` (`id`, `name`, `sex`, `birth`, `department`, `address`) VALUES ('11', 'Added From Desktop', NULL, NULL, NULL, NULL);
    
    之後可以看到 Server 版的資料庫出現了這一記錄。
    1557468735519
    在 Server 版修改。
    UPDATE `student` SET `address` = 'Modified From Server' WHERE `student`.`id` = 11;
    
    可以看到雙向同步了。
    1557468786687

    主備延遲

    最後需要說明的是,主備之間存在一個延遲。
  • 主庫 A 執行完成一個事務,寫入 binlog,我們把這個時間記為 T1。
  • 之後傳給備庫 B,我們把備庫 B 接收完這個 binlog 的時刻記為 T2。
  • 備庫 B 執行完成這個事務,我們把這個時刻記為 T3。
    主備延遲即 T3 - T1 的差。
    可以在備庫上執行 show slave status 查看 seconds_behind_master
    1557468868124
    但是在我們的測試中,幾乎所有的主備延遲都是 0。
    這是因為,主備延遲的來源有:
  1. 備庫的性能更差
  2. 備庫壓力較大
  3. 大事務 必須執行完才會寫入 binlog,然後傳給備庫
    在試驗中並沒有遇到這樣的情況。
    當然可以手動構造大量的數據來做個測試。

    練習 2

    嘗試配置MySQL一主一備及雙主結構。
    上文已詳述。

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

-Advertisement-
Play Games
更多相關文章
  • 眾所周知,在sqlserver中,表變數最大的特性之一就是沒有統計信息,無法較為準備預估其數據分佈情況,因此不適合參與較為複雜的SQL運算。當SQL相對簡單的時候,使用表變數,在某些場景下,即便是對錶變數的預估沒有產生偏差的情況下,仍舊會有問題。sqlserver的優化引擎對於表變數的支持十分不友好 ...
  • 一篇瞭解大數據架構及Hadoop生態圈 閱讀建議,有一定基礎的閱讀順序為1,2,3,4節,沒有基礎的閱讀順序為2,3,4,1節。 第一節 集群規劃 大數據集群規劃(以CDH集群為例),參考鏈接: https://www.cloudera.com/documentation/enterprise/la ...
  • Oracle Database 介紹 Oracle Database又名Oracle RDBMS簡稱Oracle是甲骨文公司的一款關係資料庫管理系統。 Oracle網站地址。 ...
  • redis簡介,redis數據結構中字元串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)的基礎命令 ...
  • --資料庫、模式、表名 "identities"."Test"."tab_test" --修改欄位名 ALTER TABLE "identities"."Test"."tab_test" RENAME "u_name" to realname ; --添加欄位 ALTER TABLE "identi... ...
  • Mysql 索引精講 開門見山,直接上圖,下麵的思維導圖即是現在要講的內容,可以先有個印象~ 常見索引類型(實現層面) 索引種類(應用層面) 聚簇索引與非聚簇索引 覆蓋索引 最佳索引使用策略 1.常見索引類型(實現層面) 首先不談Mysql怎麼實現索引的,先馬後炮一下,如果讓我們來設計資料庫的索引, ...
  • [20190510]rman備份的疑問8.txt--//上午測試rman備份多個文件,探究input memory buffer 的問題.--//補充測試5個文件的情況.--//http://blog.itpub.net/267265/viewspace-2148246/=>[20171204]關於 ...
  • 一、問題 linux下的mysql5.7忘記密碼 二、解決 第一步:打開mysql5.7的配置文件my.cnf,併在裡面增加一行:skip-grant-tables 保存並退出(:wq) 第二步:重啟mysql 第三步:登錄mysql並且修改密碼 用root賬號登錄: [root@iz09a32x1 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...