Greg Wooledge wrote: > Erik Olof Wahlstrom wrote: > > /usr/bin/mysqldump -uroot -pHardAsMySql321 "$DB" | bzip2 > > > "$DB"_`date +%Y-%m-%d_%k.%M`".sql.bz2" > > # Long line, probably broken by your mailer. For clarity, I'd > # write it on two lines explicitily: > > mysqldump -uroot -pHardAsMySql321 "$DB" | > bzip2 > "${DB}_$(date +%Y-%m-%d_%k.%M).sql.bz2"
You might want to set umask restrictive so that the backup file created by the redirection isn't world readable. umask 077 I have never liked whitespace in filenames and %k may produce spaces in filenames. Better IMNHO to use %H here and avoid the space. Why use a dot instead of the more common colon in the time? mysqldump -uroot -pHardAsMySql321 "$DB" | bzip2 > "${DB}_$(date +%Y-%m-%d_%H:%M).sql.bz2" > You could also consider writing it this way: > > cd / > rm -rf "$CURRENT_DIR" > mkdir -p "$CURRENT_DIR" > cd "$CURRENT_DIR" || exit 1 > > Then you don't even need to check whether it already exists. Why bother changing directory there at all? :-) mysqldump -uroot -pHardAsMySql321 "$DB" | bzip2 > "$CURRENT_DIR/${DB}_$(date +%Y-%m-%d_%H:%M).sql.bz2" > Bernd Eggink wrote: > > You could replace the whole if-then-else clause by > > > > mkdir -p $CURRENT_DIR > > cd $CURRENT_DIR > > rm -f * > > Another failure to check the results of "cd" before doing "rm *". This > can and will lead to disasters. Doing 'rm *' just makes me extremely nervous even when care is taken to ensure that it is going to work okay. I think it is safer to avoid it. Let me suggest the following: > > CURRENT_DIR=$BACKUP_DIR/`date +%d` > ... > cd "$CURRENT_DIR" || exit 1 > ... > mysqldump -uroot -pHardAsMySql321 "$DB" | > bzip2 > "${DB}_$(date +%Y-%m-%d_%k.%M).sql.bz2" In this case the file name is going to be SOMETHING.sql.bz2. Instead of using 'rm *' it would make me much less nervous to qualify that file glob with 'rm -f *.sql.bz2' at least so that if this were to escape and be invoked elsewhere it would have limited damage potential. cd "$CURRENT_DIR" || exit 1 rm -f *.sql.bz2 > > Is there a better way to clear out last months files before making the > > current backups? Personally I have the following line in my /etc/cron.d/local-mysql crontab. The 'savelog' command with -c7 will save seven days of datestamped backups (sufficient for my case) without further code. That could easily be -c30 to save 30 days worth. The 'savelog' command pretty much handles all of your issues with datestamping and cycling files very easily. 30 3 * * * root umask 077 ; mysqldump --defaults-file=/etc/mysql/debian.cnf --all-databases | gzip > /var/backups/mysql.dump ; savelog -q -d -l -C -c7 /var/backups/mysql.dump Bob