背景

公司近期需要做安全评估,然后要针对数据库进行扫描整改,说需要开启日志功能,并需要留存6个月。然后想的是开启日志的话只需要修改数据库的配置文件就可以了,但是这样的话只会生成一个文件并且处于追加写入。这样的话日志文件前期还好说,内存占用小;但是到了后期日志,文件会占用很多的内存,并且如果需要查看日志文件的话会消耗很多服务器内存、性能等,并且删除超过6个月的文件内容也不是很方便,所以考虑之后选择把日志文件按天分割放入日志文件夹中。

准备工作

  1. Linux系统的定时任务crond
  2. 针对mysql进行配置
  3. 存放日志文件的路径

一、mysql配置工作

需要确定要配置的是哪种日志?
mysql日志文件包含:

  1. 错误日志:记录启动、运行或停止mysqld时出现的问题。
  2. 通用日志:记录建立的客户端连接和执行的语句。
  3. 更新日志:记录更改数据的语句。该日志在MySQL 5.1中已不再使用。
  4. 二进制日志:记录所有更改数据的语句。还用于复制。
  5. 慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询
  6. Innodb日志:innodb redo log

这里以通用日志来演示操作。

创建日志文件、日志文件夹、定时执行脚本
创建日志文件夹:mkdir /home/runtrend/iptv/fresh/log/mysql/mysql_logs
创建日志文件:touch /home/runtrend/iptv/fresh/log/mysql/mysql_logs/mysql_generallog.log
创建定时任务脚本:touch /home/runtrend/iptv/fresh/log/mysql/mysqllog.sh
赋予执行权限
赋予日志文件夹权限:chmod 777 /home/runtrend/iptv/fresh/log/mysql/mysql_logs
赋予定时任务脚本权限:chmod 774 /home/runtrend/iptv/fresh/log/mysql/mysqllog.sh
赋予日志文件权限:chmod 660 /home/runtrend/iptv/fresh/log/mysql/mysql_logs/mysql_generallog.log
开启通用日志
# 查看通用日志状态
MariaDB [softterminal]> show variables like "%general%";
+------------------+---------------------------------------------------------------------+
| Variable_name    | Value                                                               |
+------------------+---------------------------------------------------------------------+
| general_log      | ON                                                                  |# ON是打开状态,默认是OFF关闭状态
| general_log_file | /home/runtrend/iptv/fresh/log/mysql/mysql_logs/mysql_generallog.log |# 日志存放文件路径
2 rows in set (0.003 sec)

----------------------------------------------------我是分隔线---------------------------------------------------

# 查看日志写入类型,写入类型有文件或数据表两种格式,由参数logoutput控制。需要需要写入数据表可以修改成table
# 如果设置log_output=table的话,则日志结果会记录到名为gengera_log的表中,这表的默认引擎是CSV
# 也可以设置成我全都要,及设置log_output参数为“table,file”两种;命令:set global log_output=“file,table”;
# 一般情况下用的最多的就是file文件类型,所以我们这里就不进行修改了。
MariaDB [softterminal]> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.001 sec)

----------------------------------------------------我是分隔线---------------------------------------------------

#开启通用日志
MariaDB [softterminal]> set global general_log="ON";
MariaDB [softterminal]> set global general_log_file="/home/runtrend/iptv/fresh/log/mysql/mysql_logs/mysql_generallog.log";

# 开启通用日志之后就需要退出,进行重启mysql服务
重启mysql服务命令:systemctl reload mysqld.service

# 再次进入mysql数据库,查看通用日志状态
MariaDB [softterminal]> show variables like "%general%";
+------------------+---------------------------------------------------------------------+
| Variable_name    | Value                                                               |
+------------------+---------------------------------------------------------------------+
| general_log      | ON                                                                  |# ON是打开状态,默认是OFF关闭状态
| general_log_file | /home/runtrend/iptv/fresh/log/mysql/mysql_logs/mysql_generallog.log |# 日志存放文件路径
2 rows in set (0.003 sec)

#如果你遇到下面类似问题,这个是因为权限问题导致。也就是没有进行上面的赋予执行权限
MariaDB [softterminal]> set global general_log_file="/home/runtrend/iptv/fresh/log/mysql/mysql_logs/mysql_generallog.log";
ERROR 1231 (42000): Variable 'general_log_file' can't be set to the value of '/home/runtrend/iptv/fresh/log/mysql/mysql_logs/mysql_generallog.log"'

# 关闭通用日志
MariaDB [softterminal]> set global general_log="OFF";
# 关闭之后,退出mysql,重启mysql服务
# 再次进入mysql数据库,查看通用日志状态
MariaDB [softterminal]> show variables like "%general%";
+------------------+---------------------------------------------------------------------+
| Variable_name    | Value                                                               |
+------------------+---------------------------------------------------------------------+
| general_log      | OFF                                                                  |# ON是打开状态,默认是OFF关闭状态
| general_log_file | /home/runtrend/iptv/fresh/log/mysql/mysql_logs/mysql_generallog.log |# 日志存放文件路径
2 rows in set (0.003 sec)

二、创建定时执行脚本

执行定时脚本:vim /home/runtrend/iptv/fresh/log/mysql/mysqllog.sh
根据需要修改自己的日志文件路径

#!/bin/bash

time=`date -d yesterday +"%Y-%m-%d"`  #确定昨天的日期
#time=`date -d yesterday +"%Y-%m-%d-%H-%M"` # 测试使用
host="127.0.0.1" #你的mysql服务地址
user="xxxx" #mysql账号
passwd="xxxx" #mysql密码

# 创建日志存放目录 /home/runtrend/iptv/fresh/log/mysql/mysql_logs/

#移动脚本并重命名昨天的日期
mv /home/runtrend/iptv/fresh/log/mysql/mysql_logs/mysql_generallog.log /home/runtrend/iptv/fresh/log/mysql/mysql_logs/mysql_generallog$time.log

#连接数据库 并使用corntab定时任务每日0点执行,生成新的日志文件
/home/runtrend/iptv/fresh/bin/mysql/bin/mysql -u$user -p$passwd -e "set global general_log_file='/home/runtrend/iptv/fresh/log/mysql/mysql_logs/mysql_generallog.log'"

#删除超过180天的日志文件,留存6个月
find /home/runtrend/iptv/fresh/log/mysql/mysql_logs -mtime +180 -type f -name 'mysql_generallog*.log' -exec rm -f {} \;
#find /home/runtrend/iptv/fresh/log/mysql/mysql_logs -mmin +20 -type f -name 'mysql_generallog*.log' -exec rm -f {} \;

三、创建定时任务

软件包安装
  要使用cron服务,先要安装vixie-cron软件包和crontabs软件包,两个软件包作用如下:
  vixie-cron软件包是cron的主程序。crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
  查看是否安装了cron软件包: rpm -qa|grep vixie-cron
  查看是否安装了crontabs软件包:rpm -qa|grep crontabs
  如果没有安装,则执行如下命令安装软件包(软件包必须存在)
  rpm -ivh vixie-cron-4.1-54.FC5*
  rpm -ivh crontabs*

如果本地没有安装包,在能够连网的情况下可以在线安装
  yum install vixie-cron
  yum install crontabs

查看crond服务是否运行
  pgrep crond 或 /sbin/service crond status 或 ps -elf|grep crond|grep -v "grep"

crond服务操作命令
  /sbin/service crond start //启动服务  
  /sbin/service crond stop //关闭服务  
  /sbin/service crond restart //重启服务  
  /sbin/service crond reload //重新载入配置

查看是否存在crond服务

[root@gd88 mysql]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-12-21 14:12:37 CST; 1 years 2 months ago
 Main PID: 13703 (crond)
   Memory: 40.0K
   CGroup: /system.slice/crond.service
           └─13703 /usr/sbin/crond -n

Dec 24 12:55:01 gd88 crond[13703]: (root) RELOAD (/var/spool/cron/root)
Mar 04 11:01:01 gd88 crond[13703]: (root) RELOAD (/var/spool/cron/root)
Mar 04 11:24:01 gd88 crond[13703]: (root) RELOAD (/var/spool/cron/root)
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

crond执行

执行crond,会进入类似vi编译器的界面:crontab -e
插入脚本内容:0 0 * * * /home/runtrend/iptv/fresh/log/mysql/mysqllog.sh > /dev/null 2>&1
:wq保存退出
查看存在的定时任务:crontab -l

脚本内容:

#每天0点执行脚本
0 0 * * * /home/runtrend/iptv/fresh/log/mysql/mysqllog.sh > /dev/null 2>&1

四、结语

配置都是一样的,如果要使用慢查询日志或者其他日志,只需要修改配置文件内容。后面定时任务,定时脚本都是不需要更改的。

人生如梦,岁月无情!蓦然回首,才发现人活着是一种心情,得也好,失也罢,一切皆是过眼云烟;心情好,一切都好,只要开心就好!
Logo

更多推荐