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;