Handling corrupt databases

Updated: May 06, 2022

The -X option lets you provide the qdb utility with a program to run when it encounters a corrupt database. If the program appears to run correctly, the database server will continue to run; the recovery program is responsible for stopping and restarting the qdb service if necessary.

The following is a sample qdb startup command with the -X option:

# qdb -X /usr/bin/recover_db.sh

Below is a sample script that can be launched by qdb when it encounters a corrupt database. You can copy the code and save it as recover_db.sh to use in the startup command.

#!/bin/ksh
# Corrupt database recovery script

# Set up some variables.
# Database (DB) name comes from argv[1], or $1.
# There is no way to automatically get the PPS object name from the
# DB name so the database PPS object name is made up of a path
# set by the system integrator and the DB name.
QDBPPSPATH=/pps/qnx/qdb/

DBNAME=$1
DBPPSCOBJ=${QDBPPSPATH}/config/${DBNAME}
DBPPSSOBJ=${QDBPPSPATH}/status/${DBNAME}
DBFILENAME=$(grep "^Filename\:\:" "${DBPPSCOBJ}" | cut -f3- -d \:)
BACKUPDIRS_STR=$(grep "^BackupDir\:\:" "${DBPPSCOBJ}" | cut -f3- -d \:)
IFS=","
set -A BACKUPDIRS_ARR -- ${BACKUPDIRS_STR}
PPSCOBJCONTENT=$(cat "${DBPPSCOBJ}" | grep -v "^@${DBNAME}\$")

# Delete the PPS object, then wait for the status object to go.
# The script waits for 2.5 seconds but continues even if the
# status object is still there; the script logs an error in this case.
DBPPSSOBJ_DELETED=0
rm ${DBPPSCOBJ}
for i in 1 2 3 4 5; do
  if [ ! -e ${DBPPSSOBJ} ]; then
    DBPPSSOBJ_DELETED=1
    break;
  fi
  sleep 0.5
done

if [ "${DBPPSSOBJ_DELETED}" -eq "0" ]; then
  echo "Status object \"${DBPPSSOBJ}\" still exists; continuing anyway."
fi

# Delete the database file and any backups. The backup deletion should 
# be customized by the integrator to delete only the appropriate backup
# filenames (for example DBNAME.gz).
# NOTE: This example doesn't consider auto-attached databases.
#       If you are using auto-attached databases or any other advanced
#       configuration, you may need to do some special handling.
rm ${DBFILENAME}
for dir in ${BACKUPDIRS_ARR[@]}; do
  rm -f ${dir}/${DBNAME} ${dir}/${DBNAME}.*
done

# Re-create the PPS configuration object.
echo "${PPSCOBJCONTENT}" > ${DBPPSCOBJ}

# EOF
Note: