1.錯誤日誌html
錯誤日誌做用: 記錄MySQL的啓動、中止信息以及在MySQL運行過程當中的錯誤信息。 參數log_error(默認開啓) 修改後重啓生效mysql log_error=[path/[file_name]],若是不指定文件名,則默認hostname.err.sql 查看錯誤日誌路徑:shell mysql> show variables like '%log_error%';數據庫 刪除錯誤日誌後:安全 <5.5.7版本時,flush logs會將filename.err命名爲filename.err_old服務器 >5.5.7版本則只是會重建錯誤日誌,也就是除非錯誤日誌被刪除了,會重建一個; 不然不會對線上錯誤日誌有影響。網絡 注意:刪除錯誤日誌後,不會自動重建。須要flush logs或者重啓數據庫。session
mysqladmin -u root -p flush-logs 或者 mysql>flush logs;從新後生成錯誤日誌(同名).分佈式 |
2.MySQL general日誌(默認關閉)
做用:會記錄全部的mysql內執行的sql語句(注意是全部語句,包括查詢語句).通常不開啓,由於要記錄全部的語句,因此IO壓力比較大. 當統計某些sql的執行頻率,寫腳本過濾一些sql.是用到. 查看general日誌路徑:mysql> show variables like '%general_log%'; general_log(默認關閉){0-關閉,1-開啓} 能夠在線打開和關閉; set global general_log='ON’; general_log_file=file_name, 不指定文件名只指定路徑則爲hostname.log (例如主機名爲master,則爲master.log) |
3.MySQL慢查詢日誌(默認關閉)
做用:記錄慢sql,執行比較慢的sql. 路徑: mysql> show variables like '%slow_query_log%'; MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄在 MySQL中響應時間超過閥值的語句。(默認關閉) 注意:慢查詢日誌不會計算語句在開始執行以前等待鎖的時間 (initial slow query),mysqld只會從語句等待的鎖釋放掉,並開始執行開始計算時間(執行開始後的鎖定時間會記錄)。因此慢查詢日誌中的語句順序和語句的發出順序或者general log的順序不一樣。 相關參數: slow_query_log =1/0 ---開啓關閉慢查詢 long_query_time = 1 2 3 ---慢查詢閥值.(單位是s) log_queries_not_using_indexes:記錄沒有用索引的查詢 參數:log_throttle_queries_not_using_indexes:#設定每分鐘記錄到日誌的未使用索引的語句數目,超過這個數目後只記錄語句數量和花費的總時間 參數:min_examined_row_limit:要檢查的行數大於等於N時 才記錄爲慢查詢,前提是必須知足long_query_time和 log-queries-not-using-indexes約束。 參數:log_slow_admin_statements:管理語句是否記錄 參數:log_slow_slave_statements:從庫的語句執行是否記錄. 慢日誌信息例子: # Time: 2018-10-18T21:56:45.731545+08:00 # User@Host: root[root] @ localhost [] Id: 5 # Query_time: 3.059106 Lock_time: 0.000208 Rows_sent: 1048576 Rows_examined: 1048576 SET timestamp=1539871005; select * from lbg; 分析: Time:---sql執行完時間。 root[root] @ localhost ---用戶、發出sql的ip Query_time: ----sql執行時間 Lock_time: ---查詢等待鎖的時間 Rows_sent -----結果集大小 Rows_examined ---掃描行數 SET timestamp ----發出sql的時間 慢日誌分析工具: MySQLdumpSlow工具 -s, 是表示按照何種方式排序,c、t、l、r分別是按照記錄次數、時間、查詢時間、返回 的記錄數來排序, ac、at、al、ar,表示相應的倒敘; -t, 是top n的意思,即爲返回前面多少條的數據; -g, 後邊能夠寫一個正則匹配模式,大小寫不敏感的; 好比: 統計用時最長的10條sql mysqldumpslow -s t -t 10 mysql-slow.log 執行頻率最高的10條sql mysqldumpslow -s c -t 10 mysql-slow.log 例子: [root@lbg logs]# mysqldumpslow -s t -t 10 mysql-slow.log Reading mysql slow query log from mysql-slow.log Count: 1 Time=18.34s (18s) Lock=0.00s (0s) Rows=1048576.0 (1048576), []@[] throttle: N 'S' warning(s) suppressed. Count: 1 Time=3.06s (3s) Lock=0.00s (0s) Rows=1048576.0 (1048576), root[root]@localhost select * from lbg Count: 4 Time=0.01s (0s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost insert into lbg select * from lbg Died at /usr/local/mysql/bin/mysqldumpslow line 161, <> chunk 6. |
4.binlog
做用: binlog實際上是(binary log)是MySQL的二進制日誌,以二進制的形式記錄了對於數據庫的變動操做,記錄全部的mysql的變化狀況(不包括select show 等查詢語句),其左右有: 1.用來查看mysql變動 2.mysql的備份恢復 3.mysql的主從複製 查看bin_log路徑: mysql> show variables like '%log_bin_basename%'; [root@lbg mysql3306]# ll mysql-bin* -rw-r----- 1 mysql mysql 154 Oct 18 22:07 mysql-bin.000001 -rw-r----- 1 mysql mysql 43 Oct 18 22:07 mysql-bin.index 說明: mysql-bin.000001,數字慢慢增大,剛生成的binlog大小爲154. 其中mysql-bin.index 裏記錄的就是bin-log文件的位置。 [root@lbg mysql3306]# cat mysql-bin.index /home/mysql3306/mysql3306/mysql-bin.000001 |
2.bin-log生成方式
1.mysql在啓動時候,會生成新的binlog. 2.flush logs ----從新生成錯誤日誌,也會從新生成bin-log 3.當達到單個binlog 文件的閥值的時候 mysql> show variables like '%max_binlog%'; Variable_name Value max_binlog_cache_size 8589934592 max_binlog_size 1073741824 max_binlog_stmt_cache_size 18446744073709547520 注意:當超過1GB文件的時候,會自動切到新的binlog,執行某些大事務,爲了事務的完整性,binlog要等事務執行完成後切換,因此binlog可能大於1GB.
|
3.bin-log相關參數
binlog_cache_size 內存分配,線程級別的內存分配,要給每個線程單獨的分配binlog cache 總binlog的cache大小=binlog_cache_size*線程數(這也是buffer-pool爲最大爲內存75%的緣由之一,要留一部份內存給binlog和操做系統用) max_binlog_cache_size,全局參數,全部的binlogcache size總和不超過該值,超過該值,報下面錯: Multi-statement transaction required more than 'max_binlog_cache_size' bytes ofstorage」 max_binlog_size:設置 binlog文件的最大值,默認和最大是1GB,並不能嚴格限定二進制文件的大小 binlog_do_db: 此參數表示只記錄指定數據庫的二進制日誌 binlog_ignore_db: 此參數表示不記錄指定的數據庫的二進制日誌 binlog_checksum 爲 {CRC32|NONE} 寫binlog時,會將內容生成校驗位,以後存儲在binlog中。默認狀況下,服務器記錄事件的長度以及事件自己,並使用它來驗證事件是否正確寫入。也能夠經過設置binlog_checksum系統變量來使服務器爲事件寫入校驗和。 log_bin與log_bin_basename:決定了msyql 的binlog的名字,生成的binlog名字爲mysql-bin.000001 binlog_format: 規定binlog的格式,binlog有三種格式statement,row以及mixed,默認使用statement,建議使用row格式 expire_logs_days :過時時間(單位是天) sync_binlog: 值爲0或1或n, 在提交n次事務後,進行binlog的落盤,0爲不進行強行的刷新操做,而是由文件系統控制刷新日誌文件. 若是是在線交易和賬有關的數據建議設置成1, 若是是其它數據能夠保持爲0便可。(雙1配置參數之一.) 0 每1s落盤一次 1 每次commit落盤一次 n 每n個事務落盤一次 sql_log_bin --關閉當前session的binlog (導入大量數據時,不但願記錄binlog時.導完再開啓參數) |
4.清理binlog
在開啓mysql的主從後,會產生大量的binlog日誌文件,可能佔用大量的磁盤空間, 1.手工刪除binlog mysql> reset master; //刪除master的binlog ---會刪除全部的binlog文件,重置爲1個,很是危險. ###reset master後,會形成slave沒法找到master的嚴重後果 mysql> reset slave; //刪除slave的中繼日誌 mysql> purge master logs before '2012-03-30 17:20:00'; //刪除指定日期之前的日誌索引中binlog日誌文件 mysql> purge master logs to 'binlog.000002'; //刪除指定日誌文件的日誌索引中binlog日誌文件 或者直接用操做系統命令直接刪除:直接rm(mysql-bin日誌,刪除索引信息mysql-bin.index裏對應信息.)注意:不能刪除正在使用的binlog(1.編號最大的binlog 2.從庫尚未同步完成的binlog,) 這種方法儘可能不用. 2.自動刪除binlog(經過參數expire_logs_days ) 經過binlog參數(expire_logs_days ,設置binlog的過時參數)來實現mysql自動刪除binlog show binary logs; show variables like 'expire_logs_days'; set global expire_logs_days=7; |
5.binlog格式
binlog格式由參數binlog_format定義.分三種: statement , row,mixed 格式. statement格式: 特色:記錄每一條數據的SQL語句,將執行的每一條SQL記錄在binlog中. 優勢:減小日誌量,節省IO,提升性能。 缺點:某些SQL中的函數沒法使用,好比SYSDATE(),在同步過程當中會出現沒法同步的問題。 row格式: 特色:修改以前和修改以後的行的信息. binlog中僅僅記錄哪一條記錄被修改,不記錄sql語句,會詳細記錄每一row的更改細節,不會出現沒法複製的問題。 優勢:安全,通常線上使用row格式。 缺點:由於要記錄每一條修改記錄的日誌, 數據比較大,可能對數據網絡壓力 IO壓力形成影響大量佔用磁盤IO和大量使用硬盤空間。 mixed格式: 特色:結合了上面兩種方式,通常的語句使用SQL語句來記錄,遇到特殊的語句使用row格式來記錄,保證數據的一致性和複製的準確性。 注意:上面三種都是針對DML語句, DDL無論在哪一個格式,都只記錄語句.如 drop table test1; 查看binlog格式: mysql> show variables like '%binlog_format%'; 修改binlog格式: mysql> set global binlog_format='row'; 顯示存在的binlog: mysql> show binary logs; 查看binlog文件內容: mysql> show binlog events; 通常咱們咱們如何在binlog裏面定位一個事務? 文件名:mysql-bin.000001. 加上position點能夠定位一個事務. position:就是寫入binlog的字節數.(從154開啓,前面是無心義信息.開始文件就是154) xid :是儲存引擎內部分佈式事務編號。 |
6.查看binlog文件
在數據庫裏查看:mysql> show binlog events;(這是通過被解析後的結果,其實文件底層是二進制) 查看binlog文件: [root@lbg1 mysql3306]# mysqlbinlog mysql-bin.000003 -vv >/tmp/lbg.bin --vv的做用:第一個v,顯示sql,第二個v,顯示sql的字段類型和其餘信息. [root@lbg1 mysql3306]# cat /tmp/lbg.bin @1指表的第1個字段。@2表示第2個字段。底下藍色的###段落是其上面對應亂碼翻譯後的解釋。
注意:mysqlbinlog命令文件是否是安裝目錄下的bin文件裏(which mysqlbinlog),由於可能系統安裝過mysql,那麼可能讀取的是/usr/bin/mysqlbinlog,低版本解析有問題。 mysqlbinlog使用方法: 截取pos點範圍或者時間範圍的binlog:start-datetime stop-datetime 或者start-position和stop-position 。 使用mysqlbinlog查看binlog: /usr/local/mysql/bin/mysqlbinlog /home/mysql3306/mysql3306/mysql-bin.000001 > /tmp/mysql_binlog.sql 根據時間查看binlog: /usr/local/mysql/bin/mysqlbinlog --start-date="2017-04-20 9:00:00" --stop-date="2017-07-20 18:00:00" /home/mysql3306/mysql3306/mysql-bin.000001 > /tmp/mysql_binlog.sql start和stop的範圍是 [start, stop) 根據pos點查看binlog: /usr/local/mysql/bin/mysqlbinlog bin.000017 --start-position=1959 --stop-position=2057 -vv > /tmp/a.sql 解析row格式的mysqlbinlog爲SQL格式: mysqlbinlog mysql-bin.000001 --base64-output=DECODE-ROWS -vv > /tmp/all.bin --base64-output=DECODE-ROWS 是爲了適應mysql, server設置binlog_format=row。 注意:若用於恢復數據,則必定不能帶--base64-output=DECODE-ROWS選項,不然會恢復有問題。 |
7.導入多個binlog的注意事項
binlog恢復: 注意,若是有多個 binlog文件想要恢復, 不要一個一個恢復 shell> mysqlbinlog binlog.000001 | mysql -u root -p shell> mysqlbinlog binlog.000002 | mysql -u root -p 上面這種恢復方式是錯誤的,若是 binlog.000001 中建立了一個臨時表(CREATE TEMPORARY TABLE),而 binlog.000002 中要使用這個臨時表,可是 第一個線程(binlog.000001) 在釋放的時候會刪除臨時表,此時第二個線程(binlog.000002) 就沒法使用這個臨時表了. 正確的作法以下: shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p ## 或者 shell> mysqlbinlog binlog.000001 > /tmp/statements.sql shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql 或者 shell> mysqlbinlog binlog.00000[1-2] > /tmp/statements.sql shell> mysql -u root -p -e "source /tmp/statements.sql" |
Binlog:二進制日誌是一種邏輯日誌,可能只記錄了對應的SQL語句。 Innodb存儲引擎的的redo日誌記錄的是數據頁被修改的的物理格式日誌, 兩種日誌的寫入時間也不同,binlog只在事務提交的時候寫入,redo須要在事務過程當中不斷的寫入。 |
9.MyFlash的使用
該工具注意事項 1.binlog格式必須爲row,且binlog_row_image=full 2.僅支持5.6與5.7 3.只能回滾DML(增、刪、改) 使用美團工具以下: [root@lbg1 MyFlash-master]# unzip MyFlash.zip [root@lbg1 MyFlash-master]# ls binary binlog_output_base.flashback build.sh doc README.md source testbinlog 安裝依賴並編譯: yum -y install glib2* gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback 完成上面操做後: [root@lbg1 MyFlash-master]# cd binary/ [root@lbg1 binary]# ls flashback mysqlbinlog20160408 ---實際此文件在編譯前就有。 其中要使用的就是flashback工具。 使用命令: 1.回滾整個文件: ./flashback --binlogFileNames=haha.000041 mysqlbinlog binlog_output_base.flashback | mysql -h -u -p 2.回滾該文件中的全部deldte語句 ./flashback --sqlTypes='DELETE' --binlogFileNames=haha.000041 mysqlbinlog binlog_output_base.flashback | mysql -h -u -p 說明:使用flashback後會生成當前路徑下生成新的二進制binlog文件。想查看的話可msyqlbinlog 文件名 > /tmp/lbg.bin,再查看/tmp/lbg.bin便可,想恢復數據直接source /tmp/lbg.bin便可。 3.根據position點恢復數據 [root@lbg1 soft]# /soft/MyFlash-master/binary/flashback --start-position=801 --stop-position=1591 --sqlTypes='DELETE' --binlogFileNames=/home/mysql3306/mysql3306/mysql-bin.000001 注意:查找start-position時需是begin字段前的position點,stop-position的值是commit後的position點。 4.回滾大文件: 回滾 ./flashback --binlogFileNames=haha.000042 切割⼤文件 ./flashback --maxSplitSize=1 --binlogFileNames=binlog_output_base.flashback 應⽤ mysqlbinlog binlog_output_base.flashback.000001 | mysql -h -u -p ... mysqlbinlog binlog_output_base.flashback. | mysql -h -u -p |
10.binlog實時遠程備份命令
[root@lbg2 lbg]# mysqlbinlog --read-from-remote-server --raw --host=192.168.88.8 --port=3306 --user=root --password=root --stop-never mysql-bin.000001 ----生成的binlog在本地。 不足:這個方式有個問題,對於常規的主從複製來講,若是主從直接的鏈接斷開了,則從會自動再次鏈接,而對於mysqlbinlog,若是斷開了,並不會自動鏈接。可經過腳原本彌補上述不足。實際上定義了一個死循環,若是備份失敗,則10s後從新鏈接。 |