mysql
記錄mysql數據庫的通常狀態信息及報錯信息,是咱們對於數據庫常規報錯處理的經常使用日誌。git
$MYSQL_HOME/data/github
#編輯配置文件 [root@db01 ~]# vim /etc/my.cnf [mysqld] log_error=/application/mysql/data/$hostname.err #查看方式 mysql> show variables like 'log_error';
記錄mysql全部執行成功的SQL語句信息,能夠作審計用,可是咱們不多開啓。sql
$MYSQL_HOME/data/數據庫
#編輯配置文件 [root@db01 ~]# vim /etc/my.cnf [mysqld] general_log=on general_log_file=/application/mysql/data/$hostnamel.log #查看方式 mysql> show variables like '%gen%';
vim
記錄已提交的DML事務語句,並拆分爲多個事件(event)來進行記錄
記錄全部DDL、DCL等語句
總之,二進制日誌會記錄全部對數據庫發生修改的操做服務器
statement:語句模式,上圖中將update語句進行記錄(默認模式)。
row:行模式,即數據行的變化過程,上圖中Age=19修改爲Age=20的過程事件。
mixed:以上二者的混合模式。
企業推薦使用row模式app
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)
1)每一個event都有一個開始位置(start position)和結束位置(stop position)。 2)所謂的位置就是event對整個二進制的文件的相對位置。 3)對於一個二進制日誌中,前120個position是文件格式信息預留空間。 4)MySQL第一個記錄的事件,都是從120開始的。
#查看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;
#查看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日誌
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
#輸出記錄次數最多的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/mysql-db01-slow.log
有能力的能夠作成可視化界面:
Anemometer基於pt-query-digest將MySQL慢查詢可視化
httpss://www.percona.com/downloads/percona-toolkit/LATEST/ 慢日誌分析工具下載
httpss://github.com/box/Anemometer 可視化代碼下載