bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Help with script - doesn't work properly from cron


From: Bob Proulx
Subject: Re: Help with script - doesn't work properly from cron
Date: Mon, 20 Jul 2009 09:59:37 -0600
User-agent: Mutt/1.5.18 (2008-05-17)

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]