数据库运维中,每日巡检是保障系统稳定的关键。手动巡检耗时且易遗漏,而通过Crontab定时任务配合Shell脚本,可实现:
Crontab是Linux系统的定时任务守护进程,可精确到分钟级调度任务。任务配置存储在/var/spool/cron/
目录,每个用户独立文件(如root用户的文件为/var/spool/cron/root
)。
* * * * *
分 时 日 月 周
*
:匹配所有值(如*
在“分”字段表示每分钟),
:指定多个时间点(如0,30
表示0分和30分)-
:范围(如1-5
表示1到5点)/
:间隔(如*/10
表示每10分钟)# 编辑当前用户的定时任务(核心命令)
crontab -e
# 查看已配置的任务
crontab -l
# 删除所有任务(慎用!)
crontab -r
# 指定用户(如为mysql用户配置任务)
crontab -u mysql -e
注意:首次使用crontab -e
时会提示选择编辑器,建议选nano
或vim
。
# 进入运维专用目录
mkdir -p /opt/dba/scripts
cd /opt/dba/scripts
# 创建巡检脚本(以Oracle为例)
vim db_check.sh
#!/bin/bash
# 定义日志路径
LOG_DIR="/opt/dba/logs"
LOG_FILE="$LOG_DIR/db_check_$(date +\%Y\%m\%d).log"
# 1. 检查数据库实例状态
echo"====== 数据库实例状态 ======" >> $LOG_FILE
sqlplus -S / as sysdba <<EOF
SELECT instance_name, status, TO_CHAR(startup_time, 'YYYY-MM-DD HH24:MI:SS')
FROM v\$instance;
EOF >> $LOG_FILE
# 2. 检查表空间使用率
echo"====== 表空间使用率 ======" >> $LOG_FILE
sqlplus -S / as sysdba <<EOF
SELECT tablespace_name,
ROUND(used_space/(1024*1024),2) "已用(GB)",
ROUND(free_space/(1024*1024),2) "剩余(GB)",
ROUND(used_percent,2) "使用率%"
FROM dba_tablespace_usage_metrics;
EOF >> $LOG_FILE
# 3. 发送邮件(需配置邮件服务)
mail -s "每日数据库巡检报告" dba-team@company.com < $LOG_FILE
关键点说明:
sqlplus -S
:静默模式执行SQLdate +\%Y\%m\%d
:%
在Crontab中需转义chmod +x db_check.sh
crontab -e
# 每天2:00执行,日志按日期保存
0 2 * * * /opt/dba/scripts/db_check.sh >> /opt/dba/logs/cron.log 2>&1
参数解析:
0 2 * * *
:每天2:00>> /opt/dba/logs/cron.log
:追加输出到日志2>&1
:将错误输出重定向到标准输出# 每小时检查一次连接数
0 * * * * /opt/dba/scripts/check_connections.sh
# 随机延迟0-300秒执行
0 3 * * * sleep $((RANDOM\%300)) && /opt/dba/scripts/db_check.sh
# 直接运行脚本
sh /opt/dba/scripts/db_check.sh
# 查看日志
tail -f /opt/dba/logs/db_check_20250428.log
# 使用env -i清除环境变量
env -i /bin/bash /opt/dba/scripts/db_check.sh
注意:Crontab执行环境可能与终端不同,需在脚本中设置ORACLE_HOME
等变量。
tail -f /var/log/cron
日志示例:
Apr2802:00:01 aimalinux CROND[1234]: (root) CMD (/opt/dba/scripts/db_check.sh)
crond
服务是否运行:systemctl status crond
# 安装mailx
yum install mailx -y
# 编辑配置文件
vim /etc/mail.rc
# 添加以下内容
set from=dba@aimalinux.com
set smtp=smtp://smtp.company.com
set smtp-auth-user=dba
set smtp-auth-password=your_password
# 同步时间(安装ntp)
yum install ntp -y
systemctl start ntpd
ntpdate pool.ntp.org
SELECT sql_id, executions, elapsed_time
FROM v\$sql
WHERE elapsed_time >1000000;
# 保留30天日志
find /opt/dba/logs -name "*.log" -mtime +30 -execrm {} \;
通过Crontab+Shell脚本,DBA可轻松实现自动化巡检。本文从零开始详解每一步操作,助你掌握这一运维利器。如有疑问,欢迎留言交流!