mysql二進制日誌

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;
相關文章
相關標籤/搜索