shell监控数据库脚本
一个基本的shell脚本,监控数据库中的某个表是否有数据增长,并在没有增长时触发报警。
#!/bin/bash
# 数据库连接信息
DB_HOST="your_database_host"
DB_PORT="your_database_port"
DB_USER="your_database_username"
DB_PASSWORD="your_database_password"
DB_NAME="your_database_name"
TABLE_NAME="your_table_name"
# 报警邮件接收者信息
ALERT_EMAIL="your_alert_email_address"
# 查询数据库表记录数
last_count=$(mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASSWORD -D $DB_NAME -e "SELECT COUNT(*) FROM $TABLE_NAME;" | tail -n 1)
# 循环监控
while true; do
# 等待时间(单位:秒)
sleep 3600
# 查询数据库表记录数
current_count=$(mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASSWORD -D $DB_NAME -e "SELECT COUNT(*) FROM $TABLE_NAME;" | tail -n 1)
# 检查记录数是否增长
if [ $current_count -eq $last_count ]; then
# 发送报警邮件
echo "No data growth detected in $TABLE_NAME. Please investigate." | mail -s "Data Growth Alert" $ALERT_EMAIL
fi
# 更新记录数为最新值
last_count=$current_count
done
更近一步的,继续监控Oracle数据库中的表并在没有数据增长时触发报警。脚本还会将上次运行的时间保存在一个文件中。
#!/bin/bash
# 数据库连接信息
DB_HOST="your_database_host"
DB_PORT="your_database_port"
DB_USER="your_database_username"
DB_PASSWORD="your_database_password"
DB_SERVICE="your_database_service_name"
TABLE_NAME="your_table_name"
# 报警邮件接收者信息
ALERT_EMAIL="your_alert_email_address"
# 文件路径用于存储上次运行的时间
LAST_RUN_FILE="/path/to/last_run.txt"
# 获取上次运行的时间
last_run=$(cat "$LAST_RUN_FILE")
# 获取当前时间
current_time=$(date +"%Y-%m-%d %H:%M:%S")
# 查询数据库表记录数
last_count=$(sqlplus -S "$DB_USER/$DB_PASSWORD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$DB_HOST)(PORT=$DB_PORT))(CONNECT_DATA=(SERVICE_NAME=$DB_SERVICE)))" <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT COUNT(*) FROM $TABLE_NAME;
EXIT;
EOF
)
# 移除上次运行时间文件(在首次运行时,如果文件存在的话)
rm -f "$LAST_RUN_FILE"
# 将当前时间写入文件
echo "$current_time" > "$LAST_RUN_FILE"
# 循环监控
while true; do
# 等待时间(单位:秒)
sleep 3600
# 查询数据库表记录数
current_count=$(sqlplus -S "$DB_USER/$DB_PASSWORD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$DB_HOST)(PORT=$DB_PORT))(CONNECT_DATA=(SERVICE_NAME=$DB_SERVICE)))" <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT COUNT(*) FROM $TABLE_NAME;
EXIT;
EOF
)
# 检查记录数是否增长
if [ "$current_count" -eq "$last_count" ]; then
# 发送报警邮件
echo "No data growth detected in $TABLE_NAME. Please investigate." | mail -s "Data Growth Alert" $ALERT_EMAIL
fi
# 更新记录数和上次运行时间为最新值
last_count="$current_count"
current_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "$current_time" > "$LAST_RUN_FILE"
done
脚本添加到Crontab中,以便定期运行监控任务。例如,可以使用以下命令编辑Crontab文件:
crontab -e
然后添加一行类似于以下内容的条目:
0 * * * * /path/to/your/script.sh
这将使脚本每小时执行一次。可根据需求调整Crontab的设置。
如果想要将脚本的运行时间和监控的表作为配置文件,可以将它们存储在一个单独的配置文件中,并在脚本中读取该文件的值。以下是修改后的脚本示例:
#!/bin/bash
# 读取配置文件中的值
source config.cfg
# 报警邮件接收者信息
ALERT_EMAIL="your_alert_email_address"
# 文件路径用于存储上次运行的时间
LAST_RUN_FILE="/path/to/last_run.txt"
# 获取上次运行的时间
last_run=$(cat "$LAST_RUN_FILE")
# 获取当前时间
current_time=$(date +"%Y-%m-%d %H:%M:%S")
# 查询数据库表记录数
last_count=$(sqlplus -S "$DB_USER/$DB_PASSWORD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$DB_HOST)(PORT=$DB_PORT))(CONNECT_DATA=(SERVICE_NAME=$DB_SERVICE)))" <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT COUNT(*) FROM $TABLE_NAME;
EXIT;
EOF
)
# 移除上次运行时间文件(在首次运行时,如果文件存在的话)
rm -f "$LAST_RUN_FILE"
# 将当前时间写入文件
echo "$current_time" > "$LAST_RUN_FILE"
# 循环监控
while true; do
# 等待时间(单位:秒)
sleep $WAIT_TIME
# 查询数据库表记录数
current_count=$(sqlplus -S "$DB_USER/$DB_PASSWORD@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$DB_HOST)(PORT=$DB_PORT))(CONNECT_DATA=(SERVICE_NAME=$DB_SERVICE)))" <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT COUNT(*) FROM $TABLE_NAME;
EXIT;
EOF
)
# 检查记录数是否增长
if [ "$current_count" -eq "$last_count" ]; then
# 发送报警邮件
echo "No data growth detected in $TABLE_NAME. Please investigate." | mail -s "Data Growth Alert" $ALERT_EMAIL
fi
# 更新记录数和上次运行时间为最新值
last_count="$current_count"
current_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "$current_time" > "$LAST_RUN_FILE"
done
创建了一个名为config.cfg
的配置文件,内容如下:
# 配置文件 config.cfg
# 数据库连接信息
DB_HOST="your_database_host"
DB_PORT="your_database_port"
DB_USER="your_database_username"
DB_PASSWORD="your_database_password"
DB_SERVICE="your_database_service_name"
# 监控表信息
TABLE_NAME="your_table_name"
# 等待时间(单位:秒)
WAIT_TIME=3600
可以通过修改配置文件而不是修改脚本本身来更改运行时间和监控的表,更灵活也更便于维护。