diff --git a/acc_backup.sh b/acc_backup.sh index be7384c..5640ef2 100755 --- a/acc_backup.sh +++ b/acc_backup.sh @@ -10,6 +10,12 @@ MONTHS=3 # backup them MONTHS_BACK=6 +# archive tables older than $ARCHIVE_MONTHS will be dumped to a file, +# gzipped and then dropped afterwards +ARCHIVE_MONTHS=12 +# drop the dump files into $ARCHIVE_DIR +ARCHIVE_DIR=/tmp + # accounting database on proxies (openser) or db1 (accounting) ACC_DB="accounting" # accounting tables on proxies (acc) or db1 (acc acc_backup acc_trash) @@ -28,6 +34,7 @@ DBHOST="localhost" # command shortcut MYSQL="mysql -u${DBUSER} -p${DBPASS} -h${DBHOST} --skip-column-names" +MYSQLDUMP="mysqldump -u${DBUSER} -p${DBPASS} -h${DBHOST} --opt" delete_loop() { DB=$1 @@ -43,6 +50,7 @@ delete_loop() { AND $COL < DATE_ADD('$MSTART', INTERVAL 1 MONTH) LIMIT 1000; SELECT ROW_COUNT()" ) + test $? = 0 || break test "$RC" = 0 && break @@ -53,29 +61,59 @@ delete_loop() { done } -######################################################################## +archive_dump() { + TABLES=$1 + DB=$2 + + for TABLE in $TABLES; do + MONTH=$ARCHIVE_MONTHS + while :; do + MTABLE="${TABLE}_$(date +%Y%m -d "$MONTH months ago")" + STATUS=$($MYSQL $DB -e "SHOW TABLE STATUS LIKE '$MTABLE'") + test -z "$STATUS" && break + MONTH=$(($MONTH + 1)) + TARGET=$ARCHIVE_DIR/$MTABLE.$(date +%Y%m%d%H%M%S).sql + if ! $MYSQLDUMP $DB $MTABLE > $TARGET; then + echo "MySQL DUMP of table $MTABLE into file $TARGET failed" 1>&2 + continue + fi + if ! nice gzip -9 $TARGET; then + echo "Gzipping of dump file $TARGET failed" 1>&2 + rm -f "$TARGET" "$TARGET".gz + continue + fi + $MYSQL $DB -e "DROP TABLE $MTABLE" + done + done +} -PATH="/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin" -for CMONTH in `seq 0 $((MONTHS_BACK-1))`; do +backup_table() { + TABLES=$1 + DB=$2 + COL=$3 - TMONTHS=$((CMONTH+MONTHS)) - TSTAMPL=$(date +%Y-%m -d "${TMONTHS} months ago") - TSTAMP=$(date +%Y%m -d "${TMONTHS} months ago") - MSTART="$TSTAMPL-01 00:00:00" + for CMONTH in `seq 0 $((MONTHS_BACK-1))`; do + TMONTHS=$((CMONTH+MONTHS)) + TSTAMPL=$(date +%Y-%m -d "${TMONTHS} months ago") + TSTAMP=$(date +%Y%m -d "${TMONTHS} months ago") + MSTART="$TSTAMPL-01 00:00:00" - for TABLE in ${ACC_TABLES}; do - MTABLE="${TABLE}_${TSTAMP}" + for TABLE in $TABLES; do + MTABLE="${TABLE}_${TSTAMP}" - $MYSQL $ACC_DB -e "CREATE TABLE IF NOT EXISTS $MTABLE LIKE $TABLE" + $MYSQL $DB -e "CREATE TABLE IF NOT EXISTS $MTABLE LIKE $TABLE" - delete_loop $ACC_DB $TABLE $MTABLE time $MSTART + delete_loop $DB $TABLE $MTABLE $COL $MSTART + done done +} - for TABLE in ${CDR_TABLES}; do - MTABLE="${TABLE}_${TSTAMP}" +######################################################################## - $MYSQL $CDR_DB -e "CREATE TABLE IF NOT EXISTS $MTABLE LIKE $TABLE" +PATH="/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin" - delete_loop $CDR_DB $TABLE $MTABLE start_time $MSTART - done -done +backup_table "$ACC_TABLES" $ACC_DB time +backup_table "$CDR_TABLES" $CDR_DB start_time + +archive_dump "$ACC_TABLES" $ACC_DB +archive_dump "$CDR_TABLES" $CDR_DB