Db open mode v2
#!/bin/bash
LOGFILE="/tmp/database_mode.log"
EMAIL_RECIPIENT="your_email@example.com"
SUBJECT="Databases Not in READ ONLY Mode"
EMAIL_BODY="/tmp/email_body.txt"
DB_LIST="/path/to/db_list.txt" # File containing list of database names
IDNAME="your_idname" # Replace with your actual username
# Clear log files
> $LOGFILE
> $EMAIL_BODY
# Check if database list file exists
if [[ ! -f $DB_LIST ]]; then
echo "Database list file $DB_LIST not found!" | tee -a $LOGFILE
exit 1
fi
# Read each database name from the file
while read -r DB_NAME
do
if [[ -n "$DB_NAME" ]]; then
echo "Processing database: $DB_NAME" | tee -a $LOGFILE
# Run SQL query to check OPEN_MODE and days in that mode using idnam@dbname
SQL_OUTPUT=$(sqlplus -s "$IDNAME@$DB_NAME" <<EOF
SET HEADING OFF;
SET FEEDBACK OFF;
SET PAGESIZE 0;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
SELECT '$DB_NAME' AS DATABASE_NAME, OPEN_MODE,
ROUND(SYSDATE - STARTUP_TIME) AS DAYS_IN_MODE
FROM V\$DATABASE, V\$INSTANCE;
EXIT;
EOF
)
# Check if SQL command was successful
if [[ $? -ne 0 ]]; then
echo "Failed to connect to $DB_NAME or execute SQL command!" | tee -a $LOGFILE
echo "Database: $DB_NAME - Connection Failed" >> $EMAIL_BODY
continue
fi
# Process SQL output
DB_NAME_FROM_SQL=$(echo "$SQL_OUTPUT" | awk '{print $1}')
OPEN_MODE=$(echo "$SQL_OUTPUT" | awk '{print $2, $3}')
DAYS_IN_MODE=$(echo "$SQL_OUTPUT" | awk '{print $4}')
# Log results
printf "%-20s %-15s %-5s days\n" "$DB_NAME_FROM_SQL" "$OPEN_MODE" "$DAYS_IN_MODE" | tee -a $LOGFILE
# If database is NOT in READ ONLY mode, add to email body
if [[ "$OPEN_MODE" != "READ ONLY" ]]; then
echo "Database: $DB_NAME_FROM_SQL is in mode: $OPEN_MODE (Not READ ONLY)" >> $EMAIL_BODY
fi
fi
done < "$DB_LIST"
# If any database is NOT in READ ONLY mode or connection failed, send email
if [[ -s $EMAIL_BODY ]]; then
mail -s "$SUBJECT" $EMAIL_RECIPIENT < $EMAIL_BODY
fi
Comments
Post a Comment