MySQL 日志
Posted 拨云见日
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 日志相关的知识,希望对你有一定的参考价值。
错误日志(Error log)
# 错误日志默认是关闭的
# 默认路径是 $datadir/,默认的名字是‘主机名.err‘
# 配置方式
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
skip-name-resolve
log_err=/usr/local/mysql/data/mysql.err
[mysql]
socket=/tmp/mysql.sock
# 查看方式
[root@db02 ~]# mysql -e "show variables like ‘%log_err%‘"
+---------------------+---------------------------------+
| Variable_name | Value |
+---------------------+---------------------------------+
| log_error | /usr/local/mysql/data/mysql.err |
+---------------------+---------------------------------+
一般日志(General log)
开启 General log 将所有到达 MySQL Server 的 SQL语句 记录下来 。
一般不会开启开功能,因为日志的量会非常庞大,个别情况下可能会临时的开一会 General log 以供排障使用 。
# 默认是关闭的
# 默认路径是 $datadir/,默认的名字是‘主机名.log‘
# 配置方式
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
log_err=/usr/local/mysql/data/mysql.err
general_log=on
general_log_file=/usr/local/mysql/data/db02.log
[mysql]
socket=/tmp/mysql.sock
# 查看方式
mysql> show variables like ‘%general%‘;
+------------------+--------------------------------+
| Variable_name | Value |
+------------------+--------------------------------+
| general_log | OFF |
| general_log_file | /usr/local/mysql/data/db02.log |
+------------------+--------------------------------+
2 rows in set (0.00 sec)
二进制日志(Binlog)
Binlog 的配置
# 注意:
1)binlog生成默认大小是120
2)binlog的大小也是 binlog 的当前位置点
# 二进制日志默认是关闭的
# 默认路径是 $datadir/,以‘mysql-bin.000001...N 保存
# 配置方式
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
server_id # mysql5.7必须配置 server_id
log_bin=/usr/local/mysql/data/mysql-bin
# 查看方式
mysql> show variables like ‘%log_bin%‘;
Binlog 中的事件
# 什么是事件(event)
1)在binlog中最小的记录单元为event
2)一个事务会被拆分成多个事件(event)
# 事件(event)的特性
1)每个event都有一个开始位置(start position)和结束位置(stop position)。
2)所谓的位置就是event对整个二进制的文件的相对位置。
3)对于一个二进制日志中,前120个position是文件格式信息预留空间。
4)MySQL第一个记录的事件,都是从120开始的。
刷新 Binlog
# 刷新 binlog 命令
mysql> flush logs;
# 重启数据库时会刷新
# 二进制日志上限,默认1G(配置 max_binlog_size)
删除 Binlog
注意:绝对不能使用 rm 命令删除 Binlog 日志
1.根据存在时间删除日志
# 临时生效
SET GLOBAL expire_logs_days = 7;
# 永久生效
[root@db01 data]# vim /etc/my.cnf
[mysqld]
expire_logs_days = 7
# 使用purge命令删除
mysql> PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
# 根据文件名删除
mysql> PURGE BINARY LOGS TO ‘mysql-bin.000010‘;
# 危险:会影响主从复制
mysql> reset master;
二进制日志作用
1.记录已提交的 DML 事务语句,并拆分为多个事件(event)来进行记录
2.记录所有 DDL、DCL、DML 等语句,总之,二进制日志会记录所有对数据库发生修改的操作
3.如果我拥有数据库搭建开始所有的二进制日志,那么我可以把数据恢复到任意时刻
4.数据的备份与恢复
5.数据的复制
数据库的备份与恢复
添加数据:
# 添加数据
mysql> create database binlog;
Query OK, 1 row affected (0.00 sec)
mysql> use binlog
Database changed
mysql> create table binlog(id int);
Query OK, 0 rows affected (0.02 sec)
mysql> insert binlog values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> insert binlog values(4);
Query OK, 1 row affected (0.00 sec)
mysql> insert binlog values(5);
Query OK, 1 row affected (0.00 sec)
删除数据:
# 误删除两条数据
mysql> delete from binlog where id=5;
Query OK, 1 row affected (0.00 sec)
mysql> delete from binlog where id=4;
Query OK, 1 row affected (0.00 sec)
想要恢复被删除的数据:
# 通过 Binlog 恢复数据
# 查看二进制日志找到位置点
[root@db02 data]# mysqlbinlog mysql-bin.000002
# 将位置点之间的数据取出
[root@db02 data]# mysqlbinlog --start-position=631 --stop-position=978 mysql-bin.000002 > /tmp/recovery.sql
# 将数据导入回去
[root@db02 data]# mysql < /tmp/recovery.sql
数据库的升级
# 准备一台新的数据库,版本为5.6.38
# 旧数据库备份数据
[root@db03 ~]# mysqldump -uroot -p123 --triggers -R --master-data=2 -B ku linux9 myisam qiudao qiudaodsb tmp world xiangqing >/tmp/full.sql
# 将备份的数据库传到新数据库
[root@db03 ~]# scp /tmp/full.sql 172.16.1.52:/tmp/
# 修改sql中的存储引擎
[root@db02 data]# sed -i ‘s#MyISAM#InnoDB#g‘ /tmp/full.sql
# 将修改后的sql文件导入新数据
[root@db02 data]# mysql < /tmp/full.sql
# 将代码中的数据库地址修改为新的数据库地址
# 通过 binlog 将数据迁移过程中新生成的数据取出
[root@db03 data]# mysqlbinlog -uroot -p123 --start-position=120 --stop-position=465 mysql-bin.000014 > /tmp/recovery.sql
[root@db03 data]# scp /tmp/bu.sql 172.16.1.52:/tmp/
# 将新数据导入新库
[root@db02 data]# mysql < /tmp/recovery.sql
以上是关于MySQL 日志的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情