根據 MySQL 官方文檔的介紹,開啟 binlog 之后,大概會有 1% 的性能損耗,不過這還是可以接受的,一般來說,binlog 有兩個重要的使用場景:
MySQL主從復制時:在主機上開啟 binlog,主機將 binlog 同步給從機,從機通過 binlog 來同步數據,進而實現主機和從機的數據同步。
MySQL 數據恢復,通過使用 mysqlbinlog 工具再結合 binlog 文件,可以將數據恢復到過去的某一時刻。
我將使用docker演示,配置和配置位置都是一樣的,沒啥區別。
(1)配置/etc/mysql/mysql.conf.d/mysqld.cnf ,編輯以下參數:
[mysqld]server-id = 1log_bin = /var/log/mysql/mysql-bin.log
在其中,server-id 是服務器的唯一標識符,log_bin 是binlog文件的路徑和名稱。你可以根據需要更改這些值。
(2)保存更改后的配置文件,并重新啟動MySQL服務,使更改生效。
(3)確認binlog已經成功開啟,可以使用以下命令登錄MySQL并執行:
SHOW MASTER STATUS;
如果輸出類似如下信息,則表示binlog已經成功開啟:
+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000001 | 107 | test | |+------------------+----------+--------------+------------
或者以下命令:可以看到log_bin的狀態是ON。
show variables like 'log_bin%';
mysql> show variables like 'log_bin%';+---------------------------------+--------------------------------+| Variable_name | Value |+---------------------------------+--------------------------------+| log_bin | ON || log_bin_basename | /var/lib/mysql/mysql-bin || log_bin_index | /var/lib/mysql/mysql-bin.index || log_bin_trust_function_creators | OFF || log_bin_use_v1_row_events | OFF |+---------------------------------+--------------------------------+5 rows in set (0.00 sec)
#這個參數用來啟用binlog,并指定了binlog的文件名前綴。在這個例子中,binlog文件會以 dx_logbin 開頭命名。binlog文件記錄了數據庫的所有更改操作,包括增刪改等。log-bin=adx_logbin#這個參數指定了單個binlog文件的最大大小,單位是字節。當binlog文件大小達到這個值時,MySQL會自動創建一個新的binlog文件來繼續記錄日志。max_binlog_size=104857600#這個參數指定了binlog文件的過期時間,單位是天。超過指定天數的binlog文件會被自動刪除。這個設置有助于控制磁盤空間的使用。expire_logs_days=7#這個參數用來指定需要記錄binlog的數據庫名稱。在這個例子中,adx_db 是需要記錄binlog的數據庫,#binlog-do-db=adx_db#這個參數用來指定不需要記錄binlog的數據庫名稱。在這個例子中,javaboy_no_db 是不需要記錄binlog的數據庫,但是由于前面有#注釋了,所以實際上是被注釋掉了,不會生效。#binlog-ignore-db=javaboy_no_db#這個參數用來控制binlog的寫入方式。當設置為0時,表示不強制立即將binlog日志寫入磁盤。這樣會提高性能,但在數據庫宕機時可能會丟失一部分數據。sync_binlog=0#這個參數指定了MySQL服務器的唯一標識符。在復制和多主模式下,每個服務器都需要有一個唯一的ID來標識自己。server-id=1
配置完成后,執行如下命令重啟 mysql 容器(mysql是你的容器名稱)。
docker restart mysql
在看一下是否開啟binlog。
圖片
其中我們還要關注兩個屬性。
log_bin_basename: /var/lib/mysql/adx_logbin這個配置指定了二進制日志文件的基本名字為adx_logbin,不包括文件擴展名。實際的二進制日志文件會以這個基本名字開頭,后面緊跟一個數字標識,再加上文件擴展名(通常是.log)。例如,可能生成的二進制日志文件包括adx_logbin.000001、adx_logbin.000002等。這個設置意味著生成的二進制日志文件將以adx_logbin作為基本名字。log_bin_index: /var/lib/mysql/adx_logbin.index這個配置指定了二進制日志索引文件的名字為二進制日志索引文件記錄了所有的二進制日志文件名字及其對應的位置信息,通常以.index作為文件擴展名。通過這個索引文件,MySQL可以快速地定位到各個二進制日志文件,并進行相應的操作,比如數據庫恢復、復制等。
查看一下現在的 adx_logbin.index 文件:
圖片
show master logs;
圖片
用于查看當前主服務器的二進制日志(binlog)信息。執行這個命令可以獲取以下信息,File:當前正在寫入的二進制日志文件名,Position:在當前二進制日志文件中的位置,即已經寫入的字節數。
show master status;
圖片
用于關閉當前的二進制日志文件,將當前的日志文件重命名為一個舊的日志文件,例如通過添加一個序號或時間戳。并創建一個新的空的二進制日志文件,用于接收后續的二進制日志事件。
flush logs
這個命令在進行數據庫備份時特別有用,因為它可以確保備份操作可以在一個一致的時間點開始,并且不會受到正在寫入的二進制日志的影響。另外,當你希望重新開始二進制日志的記錄時,也可以使用這個命令來關閉當前的日志文件并開啟一個新的日志文件。
圖片
需要注意的是,執行 FLUSH LOGS; 會導致當前的二進制日志文件被關閉,這可能會影響到主從復制的正常運行。因此,在執行這個命令之前,需要謹慎考慮是否會對數據庫的其他操作產生影響。
reset master
reset master 可以重置 binlog 日志文件,讓日志重新從 000001 開始記錄,不過如果當前主機有一個或者多個從機在運行,那么該命令就運行不了(因為從機是通過 binlog 來實現數據庫同步的,主機把 binlog 清空了,從機會報找不到 binlog 的錯誤)。
執行 RESET MASTER; 可以確保清除所有的舊的日志文件,防止日志文件過多占用磁盤空間,并從頭開始記錄新的二進制日志事件。
圖片
show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
該命令用于顯示指定二進制日志文件中的二進制日志事件。這個命令可以提供對二進制日志中存儲的操作和更改的詳細信息。
下面是各參數的含義:
IN 'log_name': 可選參數,指定要查看的特定二進制日志文件名。
FROM pos: 可選參數,指定從日志文件中的特定位置開始顯示日志事件。
LIMIT [offset,] row_count: 可選參數,限制要顯示的日志事件的數量,并可以設置偏移量。
show binlog events in 'adx_logbin.000001';
圖片
通過這個工具就能查看你執行過什么sql,例如327行我執行了創建庫操作,586行我執行了創建表操作。
通常數據庫會做定時備份,假設每天凌晨1:00點定時備份全量數據庫,如果第二天數據丟失了,可以先通過備份,先將數據恢復到當天的凌晨1:00的數據,再基于binlog恢復凌晨一點到數據丟失的那一刻的數據,這樣就完全找回數據了。
備份命令:
mysqldump -uroot -p --flush-logs --lock-tables -B student2>/root/student2.bak.sql
mysqldump: 這是用于備份數據庫的命令。-uroot: 表示使用 root 用戶身份連接到數據庫進行備份。-p: 是一個選項,表示在輸入密碼之前會提示用戶輸入密碼。--flush-logs: 這個選項表示在備份完成后將刷新日志文件,確保備份過程中的日志都被記錄下來。--lock-tables: 這個選項表示在備份時對數據庫表進行鎖定,以確保備份的一致性。-B student2: 表示備份名為 student2 的數據庫。> /root/student2.sql: 這部分表示將備份內容導出到 /root 目錄下的 student2.sql 文件中。
圖片
可以通過cat命令查看導出的sql,老鐵沒毛病。
圖片
假設我現在刪除了student2這張表。
圖片
如何恢復?先查詢最新的binlog(最后一個binlog)。
圖片
show binlog events in 'adx_logbin.000002';
圖片
可以看到,在 1403-1507 這個 Pos 中發生了刪庫跑路事件,那么我們只需要回放該文件將數據恢復到 1403 這個位置即可。
由于 adx_logbin.000002 文件是在當前凌晨1:00備份之后產生的新文件,因此這個文件從起始到 1403 這個 Pos 之間的操作,就是凌晨1:00到刪庫之前的操作了。
那么我們來看下通過 binlog 來恢復數據的命令:(沒有這個student2庫的話先手動建立一個)
mysqlbinlog /var/lib/mysql/adx_logbin.000002 --stop-positinotallow=1403 --database=student2 | mysql -uroot -p
命令解釋:
mysqlbinlog: 是用于解析 MySQL 二進制日志文件的工具。通過這個命令,你可以查看和分析二進制日志中的內容。/var/lib/mysql/adx_logbin.000002: 這是指定的二進制日志文件路徑,即要解析的二進制日志文件。--stop-positinotallow=1403: 這個選項指定了解析二進制日志文件時要停止的位置。在這種情況下,命令會解析從文件開頭到指定位置(1403)之間的內容。--database=student2: 這個選項指定了只解析屬于數據庫 'student2' 的相關操作。這意味著命令只會處理涉及 'student2' 數據庫的內容。|: 這是管道符號,用于將 mysqlbinlog 命令的輸出傳遞給后面的 mysql 命令。mysql -uroot -p: 這是執行實際恢復操作的部分。它使用 mysql 命令以 root 用戶身份連接到 MySQL 數據庫,并執行從 mysqlbinlog 命令得到的結果。mysqlbinlog: 是用于解析 MySQL 二進制日志文件的工具。通過這個命令,你可以查看和分析二進制日志中的內容。/var/lib/mysql/adx_logbin.000002: 這是指定的二進制日志文件路徑,即要解析的二進制日志文件。--stop-positinotallow=1403: 這個選項指定了解析二進制日志文件時要停止的位置。在這種情況下,命令會解析從文件開頭到指定位置(1403)之間的內容。--database=student2: 這個選項指定了只解析屬于數據庫 'student2' 的相關操作。這意味著命令只會處理涉及 'student2' 數據庫的內容。|: 這是管道符號,用于將 mysqlbinlog 命令的輸出傳遞給后面的 mysql 命令。mysql -uroot -p: 這是執行實際恢復操作的部分。它使用 mysql 命令以 root 用戶身份連接到 MySQL 數據庫,并執行從 mysqlbinlog 命令得到的結果。
圖片
圖片
本文鏈接:http://www.www897cc.com/showinfo-26-80521-0.htmlBinlog數據恢復實戰,刪庫不跑路
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com