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++的函数耗时以及代码片段耗时详情

部分代码片段

linux中怎么查看mysql数据库版本

webstorm代码片段的创建

从mysql的片段中加载ListView

python常用代码片段总结