第八章· MySQL日誌管理

  • 一.MySQL日誌簡介
  • 二.錯誤日誌
  • 三.通常查詢日誌
  • 四.二進制日誌
  • 五.慢查詢日誌
  • 一.MySQL日誌簡介

    css

    二.錯誤日誌

    做用:
    記錄mysql數據庫的通常狀態信息及報錯信息,是咱們對於數據庫常規報錯處理的經常使用日誌。html

    默認位置:
    $MYSQL_HOME/data/mysql

    開啓方式:(MySQL安裝完後默認開啓)git

    #編輯配置文件 [root@db01 ~]# vim /etc/my.cnf [mysqld] log_error=/application/mysql/data/$hostname.err #查看方式 mysql> show variables like 'log_error'; 

    三.通常查詢日誌

    做用:
    記錄mysql全部執行成功的SQL語句信息,能夠作審計用,可是咱們不多開啓。github

    默認位置:
    $MYSQL_HOME/data/web

    開啓方式:(MySQL安裝完以後默認不開啓)sql

    #編輯配置文件 [root@db01 ~]# vim /etc/my.cnf [mysqld] general_log=on general_log_file=/application/mysql/data/$hostnamel.log #查看方式 mysql> show variables like '%gen%'; 

    四.二進制日誌

    數據庫

    做用:
    記錄已提交的DML事務語句,並拆分爲多個事件(event)來進行記錄
    記錄全部DDL、DCL等語句
    總之,二進制日誌會記錄全部對數據庫發生修改的操做vim

    二進制日誌模式:
    statement:語句模式,上圖中將update語句進行記錄(默認模式)。
    row:行模式,即數據行的變化過程,上圖中Age=19修改爲Age=20的過程事件。
    mixed:以上二者的混合模式。
    企業推薦使用row模式ruby

    優缺點:

    statement模式:

    優勢:簡單明瞭,容易被看懂,就是sql語句,記錄時不須要太多的磁盤空間。
    缺點:記錄不夠嚴謹。

    row模式:

    優勢:記錄更加嚴謹。
    缺點:有可能會須要更多的磁盤空間,不太容易被讀懂。

    binlog的做用:
    1)若是我擁有數據庫搭建開始全部的二進制日誌,那麼我能夠把數據恢復到任意時刻
    2)數據的備份恢復
    3)數據的複製

    二進制日誌的管理操做實戰

    開啓方式

    [root@db01 data]# vim /etc/my.cnf [mysqld] log-bin=mysql-bin binlog_format=row 

    注意:在mysql5.7中開啓binlog必需要加上server-id。

    [root@db01 data]# vim /etc/my.cnf [mysqld] log-bin=mysql-bin binlog_format=row server_id=1 

    二進制日誌的操做

    #物理查看 [root@db01 data]# ll /application/mysql/data/ -rw-rw---- 1 mysql mysql 285 Mar 6 2017 mysql-bin.000001 #命令行查看 mysql> show binary logs; mysql> show master status; #查看binlog事件 mysql> show binlog events in 'mysql-bin.000007'; 

    事件介紹

    1)在binlog中最小的記錄單元爲event
    2)一個事務會被拆分紅多個事件(event)

    事件(event)特性

    1)每一個event都有一個開始位置(start position)和結束位置(stop position)。
    2)所謂的位置就是event對整個二進制的文件的相對位置。
    3)對於一個二進制日誌中,前120個position是文件格式信息預留空間。
    4)MySQL第一個記錄的事件,都是從120開始的。

    row模式下二進制日誌分析及數據恢復

    #查看binlog信息 mysql> show master status; #建立一個binlog庫 mysql> create database binlog; #使用binlog庫 mysql> use binlog #建立binglog_table表 mysql> create table binlog_table(id int); #查看binlog信息 mysql> show master status; #插入數據1 mysql> insert into binlog_table values(1); #查看binlog信息 mysql> show master status; #提交 mysql> commit; #查看binlog信息 mysql> show master status; #插入數據2 mysql> insert into binlog_table values(2); #插入數據3 mysql> insert into binlog_table values(3); #查看binlog信息 mysql> show master status; #提交 mysql> commit; #刪除數據1 mysql> delete from binlog_table where id=1; #查看binlog信息 mysql> show master status; #提交 mysql> commit; #更改數據2爲22 mysql> update binlog_table set id=22 where id=2; #查看binlog mysql> show master status; #提交 mysql> commit; #查看binlog信息 mysql> show master status; #查看數據 mysql> select * from binlog_table; #刪表 mysql> drop table binlog_table; #刪庫 mysql> drop database binlog; 

    工做中作完以上操做,接下來,該怎麼作呢?給你們推薦一個網站,專業解決刪庫問題:

     

    單機此處,打開專業網站

     


    恢復數據到delete以前

    #查看binlog事件 mysql> show binlog events in 'mysql-bin.000013'; #使用mysqlbinlog來查看 [root@db01 data]# mysqlbinlog /application/mysql/data/mysql-bin.000013 [root@db01 data]# mysqlbinlog /application/mysql/data/mysql-bin.000013|grep -v SET [root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000013 ### UPDATE `binlog`.`binlog_table` ### WHERE ### @1=2 /* INT meta=0 nullable=1 is_null=0 */ ### SET ### @1=22 /* INT meta=0 nullable=1 is_null=0 */ #分析 update binlog.binlog_table set @1=22 --------->@1表示binlog_table中的第一列,集合表結構就是id=22 where @1=2 --------->@1表示binlog_table中的第一列,集合表結構就是id=2 #結果 update binlog.binlog_table set id=22 where id=2; #截取二進制日誌 查看二進制日誌後,發現delete語句開始位置是858 [root@db01 data]# mysqlbinlog --start-position=120 --stop-position=858 /application/mysql/data/mysql-bin.000013 #臨時關閉binlog mysql> set sql_log_bin=0; #執行sql文件 mysql> source /tmp/binlog.sql #查看刪除的庫 mysql> show databases; #進binlog庫 mysql> use binlog #查看刪除的表 mysql> show tables; #查看錶中內容 mysql> select * from binlog_table; 

    思考,存在問題:

    數據庫或表被誤刪除的是好久以前建立的(一年前)
    若是基於binlog全量恢復,成本很高
    1)能夠用備份恢復+短期內二進制日誌,恢復到故障以前
    2)非官方方法,binlog2sql,binlog取反,相似於Oracle的flushback
    3)延時從庫

     

    若是同一時間內和故障庫無關的數據庫都有操做,在截取binlog時都會被截取到
    想一個辦法過濾出來?
    1)grep?
    其餘過濾方案?
    1)-d 參數接庫名

    模擬數據

    #爲了讓你們更清晰看到新的操做 #刷新一個新的binlog mysql> flush logs; #建立db一、db2兩個庫 mysql> create database db1; mysql> create database db2; #庫db1操做 mysql> use db1 #建立t1表 mysql> create table t1(id int); #插入5條數據 mysql> insert into t1 values(1),(2),(3),(4),(5); #提交 mysql> commit; #庫db2操做 mysql> use db2 #建立t2表 mysql> create table t2(id int); #插入3條數據 mysql> insert into t2 values(1),(2),(3); #提交 mysql> commit; #查看binlog事件 mysql> show binlog events in 'mysql-bin.000014'; #查看db1的操做 [root@db01 data]# mysqlbinlog -d db1 --base64-output=decode-rows -vvv /application/mysql/data/mysql-bin.000014 

    刪除、刷新binlog

    刷新binlog日誌
    1)flush logs;
    2)重啓數據庫時會刷新
    3)二進制日誌上限(max_binlog_size)


    刪除二進制日誌
    1)原則
    在存儲能力範圍內,能多保留則多保留
    基於上一次全備前的能夠選擇刪除


    刪除方式

    • 1.根據存在時間刪除日誌
    #臨時生效 SET GLOBAL expire_logs_days = 7; #永久生效 [root@db01 data]# vim /etc/my.cnf [mysqld] expire_logs_days = 7 
    • 2.使用purge命令刪除
    PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day; 
    • 3.根據文件名刪除
    PURGE BINARY LOGS TO 'mysql-bin.000010'; 
    • 4.使用reset master
    mysql> reset master; 

    五.慢查詢日誌

    做用:
    1)是將mysql服務器中影響數據庫性能的相關SQL語句記錄到日誌文件
    2)經過對這些特殊的SQL語句分析,改進以達到提升數據庫性能的目的

    默認位置:
    $MYSQL_HOME/data/$hostname-slow.log

    開啓方式(默認沒有開啓):

    [root@db01 ~]# vim /etc/my.cnf [mysqld] #指定是否開啓慢查詢日誌 slow_query_log = 1 #指定慢日誌文件存放位置(默認在data) slow_query_log_file=/application/mysql/data/slow.log #設定慢查詢的閥值(默認10s) long_query_time=0.05 #不使用索引的慢查詢日誌是否記錄到索引 log_queries_not_using_indexes #查詢檢查返回少於該參數指定行的SQL不被記錄到慢查詢日誌 min_examined_row_limit=100(雞肋) 

    模擬慢查詢語句

    #進入world庫 mysql> use world #查看錶 mysql> show tables #將city表中全部內容加到t1表中 mysql> create table t1 select * from city; #查看t1的表結構 mysql> desc t1; #將t1表全部內容插入到t1表中(多插入幾回) mysql> insert into t1 select * from t1; mysql> insert into t1 select * from t1; mysql> insert into t1 select * from t1; mysql> insert into t1 select * from t1; #提交 mysql> commit; #刪除t1表中id>2000的數據 mysql> delete from t1 where id>2000; #查看慢日誌 [root@db01 ~]# cat /application/mysql/data/mysql-db01 

    使用mysqldumpslow命令來分析慢查詢日誌

    #輸出記錄次數最多的10條SQL語句
$PATH/mysqldumpslow -s c -t 10 /database/mysql/slow-log 

    參數說明:
    -s:
    是表示按照何種方式排序,c、t、l、r分別是按照記錄次數、時間、查詢時間、返回的記錄數來排序,ac、at、al、ar,表示相應的倒敘;
    -t:
    是top n的意思,即爲返回前面多少條的數據;
    -g:
    後邊能夠寫一個正則匹配模式,大小寫不敏感的;

    例:

    #獲得返回記錄集最多的10個查詢 $PATH/mysqldumpslow -s r -t 10 /database/mysql/slow-log
#獲得按照時間排序的前10條裏面含有左鏈接的查詢語句
$PATH/mysqldumpslow -s t -t 10 -g 「left join」/database/mysql/slow-log 

    第三方推薦(擴展):

    yum install -y percona-toolkit-3.0.11-1.el6.x86_64.rpm 

    使用percona公司提供的pt-query-digest工具分析慢查詢日誌

    [root@mysql-db01 ~]# pt-query-digest /application/mysql/data/slow.log 

    有能力的能夠作成可視化界面:
    Anemometer基於pt-query-digest將MySQL慢查詢可視化
    httpss://www.percona.com/downloads/percona-toolkit/LATEST/ 慢日誌分析工具下載
    httpss://github.com/box/Anemometer 可視化代碼下載

相關文章
相關標籤/搜索