Db open mode
#!/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"
# Clear log files
> $LOGFILE
> $EMAIL_BODY
# Find running Oracle instances (excluding ASM and APX)
ps -ef | grep pmon | grep -v grep | grep -Ev "(\+ASM|APX)" | awk -F'_' '{print $3}' | while read -r ORACLE_SID
do
if [[ -n "$ORACLE_SID" ]]; then
echo "Processing database: $ORACLE_SID" | tee -a $LOGFILE
# Set Oracle environment
export ORACLE_SID=$ORACLE_SID
export ORAENV_ASK=NO
. oraenv > /dev/null 2>&1
# Run SQL query to check OPEN_MODE and days in that mode
SQL_OUTPUT=$(sqlplus -s / as sysdba <<EOF
SET HEADING OFF;
SET FEEDBACK OFF;
SET PAGESIZE 0;
SELECT '$ORACLE_SID' AS DATABASE_NAME, OPEN_MODE,
ROUND(SYSDATE - STARTUP_TIME) AS DAYS_IN_MODE
FROM V\$DATABASE, V\$INSTANCE;
EXIT;
EOF
)
# Process SQL output
DB_NAME=$(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" "$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 is in mode: $OPEN_MODE (Not READ ONLY)" >> $EMAIL_BODY
fi
fi
done
# If any database is NOT in READ ONLY mode, send email
if [[ -s $EMAIL_BODY ]]; then
mail -s "$SUBJECT" $EMAIL_RECIPIENT < $EMAIL_BODY
fi
******
DB_NAME=$(echo "$SQL_OUTPUT" | awk '{print $1}')
OPEN_MODE=$(echo "$SQL_OUTPUT" | awk '{for (i=2; i<=NF-1; i++) printf $i " "; print ""}')
DAYS_IN_MODE=$(echo "$SQL_OUTPUT" | awk '{print $NF}')
***
DB_NAME=$(echo "$SQL_OUTPUT" | awk '{print $1}')
MODE_TYPE=$(echo "$SQL_OUTPUT" | awk '{print $(NF-1)}') # Extracts second last word (ONLY, WRITE, MOUNTED)
DAYS_IN_MODE=$(echo "$SQL_OUTPUT" | awk '{print $NF}') # Last column is days in mode
****
Comments
Post a Comment