首先使用命令查看配置文件
$ mysql --help
我的配置文件在/etc/mysql/my.cnf
初始状态的配置文件是这个样子的:
General Query Log记录的是sql语句日志。
打开配置文件,添加如下代码:
[mariadb]
log_output=TABLE
general_log
(注意[mariadb]这个一定要有)
然后重启mariadb
现在mariadb下的general_log表中就会有操作数据了
可以查看时间、用户、地址、命令和参数。
[mariadb]
log_output=FILE
general_log
general_log_file=queries.log
如果使用的是相对路径,那么会保存到mysql的安装目录下,如果不清楚的话请直接使用查找命令吧$ find / -name "queries.log"
重启mariadb,然后随便打开一个表刷新数据,再打开queries.log查看是否记录
成功保存到文件。
/var/log/mysql/
是mariadb默认的日志存储目录,默认开启的error_log记录会保存到改目录下,如果要使用这个目录,在配置文件中使用绝对路径即可
[mariadb]
log_output=FILE
general_log
general_log_file=/var/log/mysql/queries.log
如果你想单独存放mariadb的General Query Log,比如说存放到/var/log/mariadb这个目录下
首先在日志文件中这样配置
[mariadb]
log_output=FILE
general_log
general_log_file=/var/log/mariadb_log/mariadb.log
然后新建mariadb目录$ mkdir mariadb_log
然后重启mysql
……
……
……
操作一番后发现,咦 日志文件呢?
进入mariadb,使用命令激活日志记录mariadb > SET GLOBAL general_log=1;
(该命令见官方文档)
报错权限不够
新建的目录没有给mysql权限,所以无法创建日志文件
$ chown -R mysql /var/log/mariadb_log
$ chgrp -R mysql /var/log/mariadb_log
添加权限,重启mariadb
进入数据库随便操作一下,然后查看是否有日志文件:
日志正常记录
戳我跳转官方文档
二进制日志,官方定义是记录对数据库的数据和结构所做的所有修改,二进制日志由一个index文件和一系列log文件组成。
注1:select 和show 这种没有对数据库进行修改的命令不会被记录,这些命令的日志可以在General Query Log里查看。
注2:官方申明mariadb服务启用二进制日志会造成运行效率略微下降。
二进制日志主要用来对数据库进行备份和恢复 (删库跑路的时候要删的东西又多一个)
官方启动Binary Log的方式是: To enable binary logging, start the server with the --log-bin[=name] option.
可是我始终无法通过这种方式启动:
网上的其他文章也没有用这种添加参数启动Binary Log的,如果有了解的小伙伴请留言指点一下。
那么还是通过修改配置文件来启动Binary Log。
修改my.cnf
[mariadb]
……
log_bin='/var/log/mariadb/mysql-bin'
注:文件名不用添加后缀,如果添加了也会被自动忽略
重启mariadb就可以看见该目录下多了几个文件
*.indx 文件是引导文件,里面记录的是二进制文件的地址
*.000001 这样的才是二进制日志,如果直接打开会是这个样子的:
mariadb有专门浏览日志的工具mysqlbinlog (戳我跳转官方文档)
使用mysqlbinlog打开Binary Log文件$ mysqlbinlog mysql-bin.000001
结果报错mysqlbinlog: unknown variable 'default-character-set=utf8mb4'
这是mysqlbinlog无法识别binlog中的配置中的default-character-set=utf8mb4这个指令。
我去查看我的配置文件my.cnf,可是其中并没有default-character-set的配置,
但是有这样两行语句:
这部分代码表示还导入了其他配置文件,将这两行注释掉,只使用my.cnf当作配置文件,然后重启mariadb,mysqlbinlog就没有报错了。
打开二进制日志,内容是这个样子的:
启用二进制日志以后,会不断记录日志,硬盘占用会越来越大,需要定期清理日志文件。
进入mariadb,使用命令mariadb > RESET MASTER;
索引文件和二进制文件都被删除然后重新开始记录。
注:该命令可以携带参数[TO # ]
根据文档,在MariaDB 10.1.6版本以后,携带[TO #]
参数时,新增的二进制文件会编号会从#开始。
戳我跳转官方文档
语法:PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };
第一个参数里,BINARY和MASTER是等效的,填哪个都行。
第二个参数里第一个可选参数TO ‘log_name’ 指定删除某个具体的日志文件
第二个参数里的第二个可选参数 BEFORE ‘datetime_expr’ 指定删除某个具体时间之前的日志文件
官方的栗子如下:
PURGE BINARY LOGS TO 'mariadb-bin.000063';
PURGE BINARY LOGS BEFORE '2013-04-21';
PURGE BINARY LOGS BEFORE '2013-04-22 09:55:22';
戳我跳转官方文档
根据二进制文件对数据库进行回滚操作,Mariadb从10.2.4版本以后开始支持Flashback。
这个功能简直是各种手残的救星!
请容我先把我的mariadb升个级
首先要设置Binary Log存储模式为ROW(存储模式有3种,详见官方文档),请不要忽略这一步骤,存储模式不为ROW,flashback可能无法对增、删进行闪回。
[mariadb]
...
binlog_format=ROW
然后重启mariadb
(建议清空一下二进制日志)
准备测试数据
然后做一下修改
//在mariadb中查看当前使用的是哪个日志文件
mysql > show master logs;
//然后退出mariadb,进入二进制日志目录下,使用mysqlbinlog命令,对象选择正在使用的日志文件
$ mysqlbinlog mysql-bin.000001 -B -T 'user' > flashback.sql
-B
参数表示 flashback
-T
参数表示指定表,'user'
是我指定的表名
> flashback.sql
保存为sql文件
//然后让mariadb运行sql文件进行闪回操作
$ mysql < flashback.sql
被修改的数据就恢复了
flashback还支持时间参数:
--start-datetime
开始时间
--stop-datetime
结束时间
为了更直观,先把这个表添加时间字段,然后每隔1分钟添加一行数据
使用闪回操作撤销15:09:00到15:12:00之间的插入操作。
$ mysqlbinlog mysql-bin.000001 -B -T 'user' --start-datetime '2019-10-08 15:09:00' --stop-datetime '2019-10-08 15:12:00' > flashback.sql
$ mysql < flashback.sql