日誌文件 | 選項 | 文件名 | 程序 |
---|---|---|---|
錯誤日誌 | --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 |
做用:記錄mysql數據庫的通常狀態信息及報錯信息,是咱們對於數據庫常規報錯處理的經常使用日誌
配置方法:mysql
[mysqld] log-error=/data/mysql/mysql.log
查看配置方式:sql
mysql> show variables like '%log%error%';
做用:記錄mysql全部執行成功的SQL語句信息,能夠作審計用,可是咱們不多開啓
配置方法數據庫
[mysqld] general_log=on general_log_file=/data/mysql/server2.log
查看配置方式:緩存
show variables like '%gen%';
二進制日誌主要記錄已提交的數據記錄,以event的形式記錄到二進制文件中
二進制記錄格式:
row:行模式,即數據行的變化過程,上圖中Age=19修改爲 Age=20的過程事件。
statement:語句模式,上圖中將update語句進行記錄。
mixed:以上二者的混合模式
binlog的做用:用於備份、恢復與複製服務器
一、開啓二進制日誌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';
慢日誌是將mysql服務器中影響數據庫性能的相關SQL語句記錄到日誌文件
經過對這些特殊的SQL語句分析,改進以達到提升數據庫性能的目的 I
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
mysqldumpslow命令 mysqldumpslow -s c -t 10 /data/slow/slow.log 這會輸出記錄次數最多的10條SQL語句,其中: -s:是表示按照何種方式排序 c、t、l、r:分別是按照記錄次數、時間、查詢時間、返回的記錄數來排序 ac、at、al、ar:表示相應的倒敘; -t:是top n的意思,即爲返回前面多少條的數據;