logrotate切割mysql 日志

本文介绍了如何使用logrotate工具管理和切割MySQL的日志文件,包括配置日志转储频率、压缩、权限设置及使用mysqladmin执行flush-logs操作确保安全切割。详细步骤包括创建logrotate脚本文件和配置定时任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

/data/pitp/mysql/data/KYMYSQL.err { #指定日志文件
    daily                  #指定所有的日志文件每天转储一次
    missingok              #如果日志不存在, 则忽略该警告信息
    rotate 30              #保留文件个数
    compress               #压缩日志文件的所有非当前版本
    delaycompress          #压缩除了当前和最近之外的日志文件的所有版本
    notifempty             #空文件则不进行切割生成
    create 644 mysql mysql # 创建属组权限文件
    sharedscripts          #只为整个日志组运行一次的脚本
    dateext                #轮换的日志后缀为-YYYYMMDD格式
    dateformat -%Y-%m-%d   #具体的格式化,配合dateext使用
    postrotate
        /data/pitp/mysql/bin/mysqladmin flush-logs  -uroot -pabcd.1234 -S /tmp/mysql.sock
    endscript
}
配置文件的postrotate和endscript部分,我们使用了mysqladmin命令来执行MySQL的flush-logs操作。
这个操作可以强制MySQL将当前的日志文件切换为一个新的日志文件,以便logrotate可以安全地对旧的日志文件进行切割。

部署操作



1 配置定时任务

root操作
crontab -e

59 23 * * * /usr/sbin/logrotate -f mysql-log-rotate

2 创建logrotate脚本文件

cd /etc/logrotate.d/

vi mysql-log-rotate

/data/pitp/mysql/data/KYMYSQL.err {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 644 mysql mysql
    sharedscripts
    dateext 
    dateformat -%Y-%m-%d 
    postrotate
        /data/pitp/mysql/bin/mysqladmin flush-logs  -uroot -pabcd.1234 -S /tmp/mysql.sock
    endscript
}


3 切割后的日志


-rw-r--r-- 1 mysql mysql     177184  5月 22 11:54  KYMYSQL.err
-rw-r----- 1 mysql mysql    6647945  5月 22 10:51  KYMYSQL.err-2024-05-22

<think>嗯,用户遇到了MySQL错误日志循环覆盖的问题,可能是配置或存储相关的。我需要先理解错误日志循环覆盖的具体表现是什么。通常来说,日志循环覆盖可能是指日志文件没有正确轮转,导致文件过大或者旧日志被覆盖,无法保留历史记录。MySQL本身支持日志轮转,但可能需要配置或者外部工具如logrotate来实现。 首先,查看用户提供的引用内容。引用[1]提到手动删除error.log导致MySQL无法启动,因为找不到日志文件。引用[2]中权限问题导致无法写入日志,解决方法涉及SELinux设置。引用[3]讨论了MySQL的配置文件结构,特别是log_error的设置。引用[4]是关于日志库缺失的问题,可能与当前问题无关,但需要注意依赖项。 接下来,用户的问题是关于错误日志的循环覆盖,可能涉及配置或存储。需要检查MySQL的错误日志配置,包括log_error和是否启用了日志轮转。在Linux系统中,通常使用logrotate来管理日志轮转,但MySQL自身也可能有相关配置。 需要确认用户是否配置了logrotate,或者是否依赖MySQL自身的机制。例如,在MySQL中,可以通过FLUSH LOGS命令来轮转日志,但需要配合正确的配置。另外,检查文件权限和SELinux设置,确保MySQL有权限写入日志文件,避免因权限问题导致轮转失败。 可能的解决步骤包括:检查log_error配置路径是否正确,确认日志目录权限,设置logrotate配置文件,并测试是否生效。同时,注意SELinux可能阻止MySQL写入日志文件,需要临时禁用或调整策略。 另外,用户可能需要手动创建日志文件并赋予正确权限,或者修改配置文件指定日志路径。如果使用systemd,可能需要调整日志服务配置。此外,确保磁盘空间足够,避免因空间不足导致日志无法写入。 需要生成相关问题,帮助用户深入理解,比如如何配置logrotate,如何手动轮转日志,如何处理权限问题,以及如何验证日志配置是否生效等。</think>### MySQL错误日志循环覆盖问题解决方案 #### 一、核心问题分析 MySQL错误日志循环覆盖问题通常由以下原因导致: 1. **未启用日志轮转机制**:默认配置可能不会自动切割日志文件 2. **文件系统权限限制**:MySQL进程无权限创建新日志文件[^2] 3. **SELinux安全策略限制**:强制访问控制阻止日志文件操作[^2] 4. **存储空间不足**:磁盘空间占满导致无法生成新日志 #### 二、配置解决方案 ##### 方法1:使用Linux logrotate(推荐) 1. 创建配置文件 ```bash sudo vi /etc/logrotate.d/mysql-error ``` 2. 添加配置内容: ``` /var/log/mysql/error.log { daily missingok rotate 7 compress delaycompress notifempty create 640 mysql adm sharedscripts postrotate /usr/bin/mysqladmin flush-logs endscript } ``` 3. 测试配置有效性: ```bash logrotate -d /etc/logrotate.d/mysql-error ``` ##### 方法2:MySQL内置配置 1. 修改my.cnf配置文件: ```ini [mysqld] log_error=/var/log/mysql/mysql-error.log expire_logs_days=7 max_binlog_size=100M ``` 2. 执行权限设置: ```bash chown mysql:mysql /var/log/mysql/ chmod 755 /var/log/mysql ``` #### 三、关键验证步骤 1. 强制触发日志轮转: ```bash mysqladmin -u root -p flush-logs ``` 2. 检查日志文件序列: ```bash ls -lh /var/log/mysql/error.log* ``` 3. 验证SELinux状态: ```bash sestatus | grep "Current mode" ``` #### 四、常见错误处理 1. **权限问题修复**: ```bash sudo semanage fcontext -a -t mysqld_log_t "/var/log/mysql(/.*)?" sudo restorecon -Rv /var/log/mysql ``` 2. **手动创建日志文件**: ```bash sudo touch /var/log/mysql/error.log sudo chown mysql:mysql /var/log/mysql/error.log ``` 3. **临时关闭SELinux**: ```bash setenforce 0 # 临时关闭 getenforce # 验证状态 ``` #### 五、监控建议 使用以下命令监控日志状态: ```bash watch -n 60 "du -sh /var/log/mysql/error.log; ls -lth /var/log/mysql | head" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值