操作系統:22.04.1-Ubuntu
mysql 版本:8.033
binlog 介紹
binlog 是mysql 二進制日志 binary log的簡稱,可以簡單理解為數據的修改記錄。
需要開啟binlog,才會產生文件,mysql 8.0 默認開啟,開啟后可以在 /var/lib/mysql (這是mysql默認數據存儲路徑,如果用戶自己指定則另說) 目錄下看到一系列 binlog.xxxxxx 的文件
binlog刷新
每次mysql重啟 都會生成一個新的binlog文件,也可以使用命令來刷新binlog
1、進入mysql,使用flush logs,會看到新生成了新的binlog.000011文件
2、mysqladmin -uroot -p flush-logs(這里也需要root賬號密碼)
備份與恢復
以下是官網的關于備份與恢復的翻譯:
完整備份是必要的,但創建它們并不總是很方便。它們會生成大型備份文件,并且需要時間來生成。它們不是最佳的,因為每次連續的完全備份都包括所有數據,即使是自上次完全備份以來沒有更改的部分。先進行初始完全備份,然后進行增量備份會更高效。增量備份更小,生成時間更短。代價是,在恢復時,不能僅通過重新加載完整備份來恢復數據。您還必須處理增量備份以恢復增量更改
官網關于備份恢復的鏈接
簡而言之就是2種方式,完整和增量,優缺點也如上所述,下面描述2種方式的使用
完整備份與恢復
完整備份就是將所有數據以表的形式進行保存
備份
命令
mysqldump --all-databases --master-data --single-transaction > back_20220806_112100.sql
備份的同時刷新binlog文件
mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > back_20220806_112100.sql
mysqldump 指令選項說明
恢復
如何恢復
執行指令
mysql < back_20220806_112100.sql
如果需要密碼則
mysql -uroot -p < back_20220806_112100.sql
該指令相當于執行了備份文件中的sql語句。
可以先可以查看 備份文件,發現里面基本是以下語句:刪除表,創建表,數據的插入,顯然是以表為單位來備份的,恢復時也是以表來恢復的
因此可以得出結論:在利用備份文件進行數據恢復時,會恢復備份前的所有表數據,但不包括備份后新增加的表,新增的表有以下2中情況:
1、同一個數據庫存在相同的表則被則會被覆蓋
2、同一個數據庫存在不同的表則忽略,因為備份文件中不含任何對該表的操作
增量恢復
備份
前面我們已經描述過 binlog是一個數據修改記錄的文件,默認一個binlog文件代表一次運行的所有數據修改記錄,然后也可以使用命令強制生成一個新的binlog文件作為新的起點來記錄數據修改過程,因此增量備份其實是自動的,就是一個個binlog文件
恢復
恢復的前提是要備份,完整備份和增量備份在上面已經描述清楚,因此數據恢復就是利用備份文件+binlog文件來做任意回滾
舉個例子,執行備份指令
mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > back_20220806_153500.sql
生成備份文件以及新的binlog文件,從000005開始的binlog文件都是back_20220806_153500.sql備份文件的增量文件
在上面的基礎上(生成了back_20220806_153500.sql 以及新的binlog.000005),現在做一個簡單測試來驗證數據恢復,分為幾個步驟
- 步驟1、新增一個數據庫incrementTestDatabase,再添加一個表incrementTestTable,包含了id、test字段,以及一條數據(1,“test1”)
- 步驟2、刷新binlog日志
- 步驟3、刪除incrementTestTable,在創建一個incrementTestTable表包含了id、test字段,以及一條數據(2,“test2”)
- 步驟4、恢復成1中的數據(1,“test1”)
- 步驟5、恢復成3中的數據(2,“test2”)
開始測試
執行步驟1,2效果
執行步驟3后
現在我們開始執行步驟4
顯然我們知道
binlog.000005中包含了數據(1,“test1”)的新建
binlog.000006中包含了表的刪除及(2,“test2”)的新建
因此要恢復到步驟1,只需要back_20220806_153500.sql + binlog.000005
先恢復備份
mysql -uroot -p < back_20220806_153500.sql
備份基礎上恢復修改記錄
mysqlbinlog binlog.000005 | mysql -uroot -p
結果如下,與預料中的一樣
現在我們開始執行步驟5,在步驟4的基礎上,恢復binlog.000006
mysqlbinlog binlog.000006 | mysql -uroot -p
結果如下,與預料中的一樣