1.啟動和設定二進制日志
默認情況下,二進制日志是關閉的,可以通過修改MySQL的組態檔來啟動和設定二進制日志
![]()
- log-bin 定義開啟二進制日志;后面引數為path[/filename],如果不指定path ,默認為datadir,如果不指定filename,默認為主機名稱會生成filename.0000001,filename.000002等,還有一個filename.index檔案,檔案內容為所有日志的清單
- expire_logs_days 定義了MySQL清除過期日志的時間,即二進制日志自動洗掉的天數,默認值為0,表示不自動洗掉,當MySQL啟動或重繪二進制日志時可能洗掉該檔案,
- max_binlog_size 定義了單個檔案的大小限制,如果二進制日志寫入的內容大小超出給定值,日志就會發生回滾(關閉當前檔案,重新打開一個新的日志檔案),默認1GB, 不能大于1GB或小于4096B
添加完畢后,重啟MySQL,即可打開二進制日志
使用show master status 查看當前的二進制檔案名稱
![]()
使用show binary logs;查看二進制日志檔案個數即檔案名
![]()
使用show variables like 'log_bin%';查看二進制日志配置資訊
![]()
到這里啟動算是完了,但是我同樣的配置,在linux環境下卻一直啟動不了報錯,
Starting MySQL...The server quit without updating PID file (/usr/local/lnmp/mysql/data/ljstu.pid).[失敗]
最后查mysql錯誤日志,發現了這行錯誤
You have enabled the binary log, but you haven't provided the mandatory server-id. Please refer to the proper server start-up parameters documentatio
在MySQL官方檔案下找到了server-id的說明,MySQL5.7如果開啟了二進制日志,則server-id必須指定,否則會不允許服務啟動,而8.0只會有個提示,server-id是干什么用的以后再說,這里不做討論
5.7:![]()
8.0:![]()
本地mysql是8.0,linux服務器mysql是5.7,所以才出了這個問題,
解決辦法修改組態檔 vim /etc/my.cnf 添加server-id=100 (隨便一個唯一值)
2.查看二進制日志
使用mysqlbinlog查看二進制日志(先使用show master status查看當前正在使用二進制檔案),
mysqlbinlog /var/log/mysql/mybinlog.000001
mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8' # 使用已下命令即可,
mysqlbinlog --no-defaults /var/log/mysql/mybinlog.000001
舉個例子,先進資料庫對任意一張表添加一行資料 ,然后使用上面說到的命令查看日志
![]()
![]()
通過日志可以看到15:53的時候操作了`ljstu`.`user`,但具體干了啥,還是很難看懂,這時候就要談到二進制的記錄格式了
MySQL有三種日志記錄格式:
-
-
基于陳述句的日志記錄:MySQL中的復制功能最扯訓于SQL陳述句主服務器到從服務器的傳播,配置binlog-format=STATEMENT
-
基于行的日志記錄,主服務器將事件寫入二進制日志日志,該事件指示如何影響各個表行,因此,表始終使用主鍵以確保行可以有效的標識,配置binlog-format=ROW
-
混合日志記錄:默認情況下使用基于陳述句的日志記錄,但在某些情況下,日志記錄模式會基于行,配置binlog-format=MIXED
修改組態檔 vim /etc/my.cnf ,添加配置 binlog-format=statement ,重啟mysql,我們再在`ljstu`.`user`里面插入一行資料,然后查看當前使用的日志檔案是哪一個,
最后在使用mysqlbinlog查看,現在就可以看到執行的sql陳述句了
![]()
3.洗掉二進制日志
MySQL的二進制檔案可以配置自動洗掉,同時MySQL也提供了安全的手動洗掉方法
RESET MASTER:洗掉所有二進制日志檔案,并重新創建二進制檔案,擴展名從000001開始
PURGE MASTER LOGS:洗掉指定二進制檔案
purge {master | binary} logs to 'log_name' 洗掉檔案名編號比指定檔案名編號小所有日志檔案
purge {master | binary} logs before 'date' 洗掉指定日期以前的所有日志檔案
例子:先查看當前的日志(因為linux上都是今天的,所以拿本地的做測驗)
洗掉今天之前的日志檔案
purge master logs before '2019-12-18';
洗掉指定的日志檔案
purge master logs to 'mybinlog.000010'
![]()
![]()
![]()
4.使用二進制日志恢復資料
如果開啟了二進制日志,在資料庫出現意外丟失資料時,可以使用mysqlbinlog工具從指定的時間點(例如最后一次備份)到現在,或另一個指定的時間點的日志中恢復資料,(使用二進制日志是進行時間點增量恢復)
mysqlbinlog [option] filename | mysql -uuser -ppass
option為可選引數,filename是日志檔案名,常用的option引數有 --start-date(開始時間),--stop-date(結束時間),--start-position(開始位置),--stop-position(結束位置)
先在資料庫表中添加3行記錄,更新其中一行
然后查看日志檔案,可以看到剛剛的update陳述句
![]()
最后使用mysqlbinlog工具恢復資料,發現報錯了,而且是主鍵沖突,為什么會出現這個問題?
MySQL官方檔案指出,時間點恢復將服務器從完全備份時逐步更新到最近的時間,如果沒有指定開始時間的話,mysql會把日志檔案的sql都執行一遍,所以執行到前面的insert的時候就報錯了,這里,我們需要指定一個開始時間,
![]()
找到插入資料的時間,然后執行命令,因為我這里是一次性添加的3行資料,所以我把三行資料都洗掉了,然后使用mysqlbinlog工具恢復
5.暫停二進制日志功能
暫停:set sql_log_bin = 0;
啟動:set sql_log_bin = 1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/94441.html
標籤:MySQL
上一篇:資料庫連接和資料庫池
下一篇:MySQL資料庫