The -X option lets you provide the qdb utility with a program or script to run when it encounters a corrupt database. If the script appears to run correctly, the database server will continue to run; the recovery script 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 above 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