bin log
bin log的格式
- statement:記錄原生SQL;
- row:記錄所屬表(Table_map)和操作行為(如刪除為Delete_rows,在操作行為中有操作的數據所有信息)。
- mixed:MySQL根據自己的情況來選擇用哪個。
在某些情況下,如果用row會記錄很多很多的日志,但是對于statement只是一條SQL。但是statement的SQL語句會出現索引選擇錯誤的情況,比如帶有索引的limit 1這種,選擇哪個索引最終出現的數據完全不一樣。
但是row這種方式記錄的卻是絕對準確的,它是根據這條數據的ID來的。所以,一般都建議使用row這種方式。
格式狀態的設置和查看:
查看:SHOW VARIABLES LIKE '%binlog_format%';
設置:set GLOBAL BINLOG_FORMAT ='MIXED';
在客戶端需要另開窗口就可以看見了。
bin log的查看
查看bin log里記錄的內容
show binlog events in 'binlog.000001';
其中binlog.000001
是bin log的日志文件名。在該命令下會看到bin log的起止位置,如下面的8900,2738,2973都是在bin log中的位置。
在row模式下,上面的語句是看不到row內部執行的。所以需要執行下面的語句:
mysqlbinlog -vv data/master.000001 --start-position=8900;
下面是用bin log來恢復數據:
mysqlbinlog master.000001 --start-position=2738 --stop-position=2973 | mysql -h127.0.0.1 -P13000 -u$user -p$pwd;
雙一設置
雙一設置有很高的安全保障,但是插入的速度也慢了。
show VARIABLES like 'innodb_flush_log_at_trx_commit';
show VARIABLES like 'sync_binlog';
switch(innodb_flush_log_at_trx_commit){
case 0:
log buffer將每秒一次地寫入log file,并且log file的flush(刷到磁盤)操作同時進行.該模式下,在事務提交的時候,不會主動觸發寫入磁盤的操作。
break;
case 1:
每次事務提交時MySQL都會把log buffer的數據寫入log file,并且flush(刷到磁盤)中去;
break;
case 2:
每次事務提交時MySQL都會把log buffer的數據寫入log file.但是flush(刷到磁盤)操作并不會同時進行。該模式下,MySQL會每秒執行一次 flush(刷到磁盤)操作。
}
當sync_binlog =N (N>0) ,MySQL 在每寫 N次 二進制日志binary log時,會使用fdatasync()函數將它的寫二進制日志binary log同步到磁盤中去。
如果啟用了autocommit,那么每一個語句statement就會有一次寫操作;否則每個事務對應一個寫操作。