mysql日誌管理

mysql日誌管理

1.mysql日誌分類

日誌文件 選項 文件名 程序
錯誤日誌 --log-error host_name.err N/A
常規日誌 --general_log general_log、host_name.log N/A
慢速查詢日誌 --slow_query_log、--long_query_time host_name-slow. log、slow_log mysqldumpslow
二進制日誌 --log-bin、--expire-logs-days host_name-bin.000001 mysqlbinlog
審計日誌 --audit_log、--audit_log_file audit.log N/A

2.mysql錯語日誌配置

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

[mysqld]
log-error=/data/mysql/mysql.log

查看配置方式:sql

mysql> show variables like '%log%error%';

3.mysql常規日誌

做用:記錄mysql全部執行成功的SQL語句信息,能夠作審計用,可是咱們不多開啓
配置方法數據庫

[mysqld]
general_log=on
general_log_file=/data/mysql/server2.log

查看配置方式:緩存

show variables like '%gen%';

4.二進制日誌

二進制日誌主要記錄已提交的數據記錄,以event的形式記錄到二進制文件中
二進制記錄格式:
  row:行模式,即數據行的變化過程,上圖中Age=19修改爲 Age=20的過程事件。
  statement:語句模式,上圖中將update語句進行記錄。
  mixed:以上二者的混合模式
binlog的做用:用於備份、恢復與複製服務器

4.1 二進制日誌管理

一、開啓二進制日誌session

set sql_log_bin=0    #在會話級別修改成臨時關閉
vi /etc/my.cnf
log-bin=/data/mysql/mysql-bin  #在全局打開binlog
binlog_format=row #設置二進制日誌記錄格式爲row
sync_binlog=1     #sync_binlog參數來控制數據庫的binlog刷到磁盤上去。sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系統本身控制它的緩存的刷新。這時候的性能是最好的,可是風險也是最大的。由於一旦系統Crash,在binlog_cache中的全部binlog信息都會被丟失。

二、設置二進制日誌記錄格式(建議是ROW):app

配置文件中修改:
binlog-format=ROW
命令行修改
mysql> SET GLOBAL binlog_format = 'STATEMENT';
mysql> SET GLOBAL binlog_format = 'ROW';
mysql> SET GLOBAL binlog_format = 'MIXED';

三、查看binlog設置性能

show variables like '%binlog%';

四、查看二進制文件數量this

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      1473 |
| mysql-bin.000002 |       143 |
| mysql-bin.000003 |       143 |
| mysql-bin.000004 |       143 |
| mysql-bin.000005 |       143 |
| mysql-bin.000006 |       120 |
+------------------+-----------+
6 rows in set (0.00 sec)

五、查看正在使用的二進制日誌文件命令行

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000006 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

六、查看二進制日誌文件內容

[root@db02 mysql]# mysqlbinlog  --base64-output=decode-rows -v mysql-bin.000006
在數據庫上查看
mysql> show binlog events in 'mysql-bin.000002';
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| mysql-bin.000002 |   4 | Format_desc |         1 |         120 | Server ver: 5.6.42-log, Binlog ver: 4 |
| mysql-bin.000002 | 120 | Stop        |         1 |         143 |                                       |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
2 rows in set (0.00 sec)

七、刷新二進制日誌

mysql> flush logs;

八、截取二進制日誌用作恢復數據

mysqlbinlog --start-position=xx  --stop-position=xx >a.sql
例子:經過截取binlog恢復損壞數據
建立數據庫
mysql> create database oldboy;
Query OK, 1 row affected (0.00 sec)
mysql> use oldboy
Database changed
建立表
mysql> create table t1(id int,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
插入內容
mysql> insert into t1 values(1,'zhang');
Query OK, 1 row affected (0.01 sec)
刪除數據庫
mysql> drop database oldboy;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
| world              |
+--------------------+
6 rows in set (0.00 sec)
查看二進制文件,找出需工截取的部分
[root@db02 mysql]# mysqlbinlog  --base64-output=decode-rows -v mysql-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#190425 13:59:25 server id 1  end_log_pos 120 CRC32 0xc3b4c8bc     Start: binlog v 4, server v 5.6.42-log creat
ed 190425 13:59:25 at startup# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
# at 120  ============>能夠今後處進行截取
#190425 13:59:25 server id 1  end_log_pos 220 CRC32 0x5b44b064     Query    thread_id=4    exec_time=746    erro
r_code=0SET TIMESTAMP=1556171965/*!*/;
SET @@session.pseudo_thread_id=4/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autoc
ommit=1/*!*/;SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create database oldboy
/*!*/;
# at 220
#190425 13:59:25 server id 1  end_log_pos 338 CRC32 0xd98d520a     Query    thread_id=4    exec_time=772    erro
r_code=0use `oldboy`/*!*/;
SET TIMESTAMP=1556171965/*!*/;
create table t1(id int,name varchar(20))
/*!*/;
# at 338
#190425 13:59:25 server id 1  end_log_pos 412 CRC32 0x269d55e6     Query    thread_id=4    exec_time=790    erro
r_code=0SET TIMESTAMP=1556171965/*!*/;
BEGIN
/*!*/;
# at 412
#190425 13:59:25 server id 1  end_log_pos 462 CRC32 0xe9e307c9     Table_map: `oldboy`.`t1` mapped to number 71
# at 462
#190425 13:59:25 server id 1  end_log_pos 508 CRC32 0x05abce7f     Write_rows: table id 71 flags: STMT_END_F
### INSERT INTO `oldboy`.`t1`
### SET
###   @1=1
###   @2='zhang'
# at 508
#190425 13:59:25 server id 1  end_log_pos 539 CRC32 0xee83af99     Xid = 116
COMMIT/*!*/;   ==================>到此結束
# at 539
#190425 13:59:25 server id 1  end_log_pos 637 CRC32 0xd3a1140b     Query    thread_id=4    exec_time=846    erro
r_code=0SET TIMESTAMP=1556171965/*!*/;
drop database oldboy
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
將截取的內容寫入到mysql.sql中
[root@db02 mysql]# mysqlbinlog  --start-position=120 --stop-position=539 mysql-bin.000001 > /tmp/mysql.sql
進行恢復
mysql> source /tmp/mysql.sql
此時發現數據已經恢復過來
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| oldboy             |
| performance_schema |
| test               |
| testdb             |
| world              |
+--------------------+
7 rows in set (0.00 sec)

9.二進制日誌文件刪除
默認狀況下,不會刪除舊的日誌文件

根據存在時間刪除日誌
SET GLOBAL expire_logs_days = 7;
或者
PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
根據文件名刪除日誌:
PURGE BINARY LOGS TO 'mysql-bin.000010';

5.慢日誌管理

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

5.1 慢日誌配置

long_query_time:  設定慢查詢的閥值,超出次設定值的SQL即被記錄到慢查詢日誌,缺省值爲10s
slow_query_log :  指定是否開啓慢查詢日誌
slow_query_log_file:  指定慢日誌文件存放位置,能夠爲空,系統會給一個缺省的文件host_name-slow.log
min_examined_row_limit:查詢檢查返回少於該參數指定行的SQL不被記錄到慢查詢日誌
log_queries_not_using_indexes: 不使用索引的慢查詢日誌是否記錄到索引
配置案例:
在配置文件裏添加,注意:slow_query_log_file路徑必定要先建立好,而後給mysql用戶權限,再重啓mysql服務便可生效
[mysqld]
slow_query_log=1
slow_query_log_file=/data/slow/slow.log
long_query_time=0.5
log_queries_not_using_indexes

5.2 處理慢日誌

mysqldumpslow命令
mysqldumpslow -s c -t 10 /data/slow/slow.log  這會輸出記錄次數最多的10條SQL語句,其中:
-s:是表示按照何種方式排序
c、t、l、r:分別是按照記錄次數、時間、查詢時間、返回的記錄數來排序
ac、at、al、ar:表示相應的倒敘;
-t:是top n的意思,即爲返回前面多少條的數據;
相關文章
相關標籤/搜索