日志文件 | 选项 | 文件名 | 程序 |
---|---|---|---|
错误日志 | --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的意思,即为返回前面多少条的数据;