1.啟動(dòng)和設(shè)置二進(jìn)制日志
默認(rèn)情況下,二進(jìn)制日志是關(guān)閉的,可以通過(guò)修改MySQL的配置文件來(lái)啟動(dòng)和設(shè)置二進(jìn)制日志
添加完畢后,重啟MySQL,即可打開二進(jìn)制日志
使用show master status 查看當(dāng)前的二進(jìn)制文件名稱
使用show binary logs;查看二進(jìn)制日志文件個(gè)數(shù)即文件名
使用show variables like 'log_bin%';查看二進(jìn)制日志配置信息
到這里啟動(dòng)算是完了,但是我同樣的配置,在linux環(huán)境下卻一直啟動(dòng)不了報(bào)錯(cuò),
Starting MySQL...The server quit without updating PID file (/usr/local/lnmp/mysql/data/ljstu.pid).[失敗]
最后查mysql錯(cuò)誤日志,發(fā)現(xiàn)了這行錯(cuò)誤
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的說(shuō)明,MySQL5.7如果開啟了二進(jìn)制日志,則server-id必須指定,否則會(huì)不允許服務(wù)啟動(dòng),而8.0只會(huì)有個(gè)提示。server-id是干什么用的以后再說(shuō),這里不做討論
5.7:
8.0:
本地mysql是8.0,linux服務(wù)器mysql是5.7,所以才出了這個(gè)問(wèn)題。
解決辦法修改配置文件 vim /etc/my.cnf 添加server-id=100 (隨便一個(gè)唯一值)
2.查看二進(jìn)制日志
使用mysqlbinlog查看二進(jìn)制日志(先使用show master status查看當(dāng)前正在使用二進(jìn)制文件)。
mysqlbinlog /var/log/mysql/mybinlog.000001
mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8' # 使用已下命令即可,
mysqlbinlog --no-defaults /var/log/mysql/mybinlog.000001
舉個(gè)例子,先進(jìn)數(shù)據(jù)庫(kù)對(duì)任意一張表添加一行數(shù)據(jù) ,然后使用上面說(shuō)到的命令查看日志
通過(guò)日志可以看到15:53的時(shí)候操作了`ljstu`.`user`,但具體干了啥,還是很難看懂,這時(shí)候就要談到二進(jìn)制的記錄格式了
MySQL有三種日志記錄格式:
修改配置文件 vim /etc/my.cnf ,添加配置 binlog-format=statement ,重啟mysql。我們?cè)僭赻ljstu`.`user`里面插入一行數(shù)據(jù),然后查看當(dāng)前使用的日志文件是哪一個(gè),
最后在使用mysqlbinlog查看,現(xiàn)在就可以看到執(zhí)行的sql語(yǔ)句了
3.刪除二進(jìn)制日志
MySQL的二進(jìn)制文件可以配置自動(dòng)刪除,同時(shí)MySQL也提供了安全的手動(dòng)刪除方法
RESET MASTER:刪除所有二進(jìn)制日志文件。并重新創(chuàng)建二進(jìn)制文件,擴(kuò)展名從000001開始
PURGE MASTER LOGS:刪除指定二進(jìn)制文件
purge {master | binary} logs to 'log_name' 刪除文件名編號(hào)比指定文件名編號(hào)小所有日志文件
purge {master | binary} logs before 'date' 刪除指定日期以前的所有日志文件
例子:先查看當(dāng)前的日志(因?yàn)閘inux上都是今天的,所以拿本地的做測(cè)試)
刪除今天之前的日志文件
purge master logs before '2019-12-18';
刪除指定的日志文件
purge master logs to 'mybinlog.000010'
4.使用二進(jìn)制日志恢復(fù)數(shù)據(jù)
如果開啟了二進(jìn)制日志,在數(shù)據(jù)庫(kù)出現(xiàn)意外丟失數(shù)據(jù)時(shí),可以使用mysqlbinlog工具從指定的時(shí)間點(diǎn)(例如最后一次備份)到現(xiàn)在,或另一個(gè)指定的時(shí)間點(diǎn)的日志中恢復(fù)數(shù)據(jù),(使用二進(jìn)制日志是進(jìn)行時(shí)間點(diǎn)增量恢復(fù))
mysqlbinlog [option] filename | mysql -uuser -ppass
option為可選參數(shù),filename是日志文件名。常用的option參數(shù)有 --start-date(開始時(shí)間),--stop-date(結(jié)束時(shí)間),--start-position(開始位置),--stop-position(結(jié)束位置)
先在數(shù)據(jù)庫(kù)表中添加3行記錄,更新其中一行
然后查看日志文件,可以看到剛剛的update語(yǔ)句
最后使用mysqlbinlog工具恢復(fù)數(shù)據(jù),發(fā)現(xiàn)報(bào)錯(cuò)了,而且是主鍵沖突,為什么會(huì)出現(xiàn)這個(gè)問(wèn)題?
MySQL官方文檔指出,時(shí)間點(diǎn)恢復(fù)將服務(wù)器從完全備份時(shí)逐步更新到最近的時(shí)間,如果沒有指定開始時(shí)間的話,mysql會(huì)把日志文件的sql都執(zhí)行一遍,所以執(zhí)行到前面的insert的時(shí)候就報(bào)錯(cuò)了。這里,我們需要指定一個(gè)開始時(shí)間。
找到插入數(shù)據(jù)的時(shí)間,然后執(zhí)行命令,因?yàn)槲疫@里是一次性添加的3行數(shù)據(jù),所以我把三行數(shù)據(jù)都刪除了,然后使用mysqlbinlog工具恢復(fù)
5.暫停二進(jìn)制日志功能
暫停:set sql_log_bin = 0;
啟動(dòng):set sql_log_bin = 1;
|
|