meta data for this page
gbak caveats
The following is a brief list of gotchas and funnies that I have detected in my own use of gbak. Some of these are mentioned above, others may not be. By collecting them all here in one place, you should be able to find out what's happening if you have problems.
gbak default mode
If you do not specify a mode switch such as -b[ackup] or -c[reate] etc., then gbak will perform a backup as if the -b[ackup] switch had been specified - provided that the other switches specified are correct for a backup.
Warning: This detection of whether you are attempting a backup or a restore means that if you use the -z command line switch to view gbak information, then you will create a backup - and overwrite the backup file you supply - if the command line also has a database name and a backup file name present. This assumes that there is a way for gbak to deteremine the username and password to be used - either as command-line parameters or via defined environment variables.
Normal versus privileged users
Only a SYSDBA or the owner of a database can take a backup of the database, however, any authenticated user can restore a database backup using the -c[reate] switch. This means that you must make sure you prevent your backup files from falling into the wrong hands because there is nothing then to stop unauthorised people from seeing your data by the simple process of restoring your backups onto their server.
The database restore will fail, of course, if the user carrying it out is not the database owner and a database with the same filename already exists.
Silent running?
The -y suppress_output switch is supposed to cause all output to be suppressed. Similar in fact to running with -v[erify] not specified. However, all it seems to do is cause the output (according to the -v[erify] switch setting) to be written to a file called suppress_output, however, this only works once because the next run of gbak with -y suppress_output will fail because the file, suppress_output, already exists.
It is possible that this problem was introduced at version 2 for Firebird, because both 2.0 and 2.1 versions actually use the -y suppress switch rather then -y suppress_output. Using this (shorter) option does work as intended and the output is indeed suppressed.
gbak log file cannot be overwritten
If you specify a log file name with the -y <log file> switch, and the file already exists, then even though the firebird user owns the file, and has write permissions to it, gbak cannot overwrite it. You must always specify the name of a log file that doesn't exist. On Linux systems, the following might help:
tux> # Generate unique dump and logfile name. tux> FILENAME=employee_`date "+%Y%m%d_%H%M%S"` tux> # Shut down and Backup the database tux> gfix -shut -tran 60 employee tux> gbak -backup employee /backups/${FILENAME}.fbk -y /logs/${FILENAME}.log -v
The above is quite useful in as much as it prevents you from overwriting previous backups that may be required. The downside is that you now need to introduce a housekeeping system to tidy away old, unwanted backups to prevent your backup area filling up.
Use of stdin or stdout file names
gbak recognizes the literal strings stdin and stdout as source or destination filenames. In POSIX systems, when the standard input and/or standard output channels are used, it is not permitted to execute seek operations on these channels. Using stdin or stdout as file names with gbak will force gbak to use processing that will not seek on the input or output channels, making them suitable for use in pipes - as per the examples in the recipes section above.
These file names, while they appear to be POSIX names, are definitely not synonyms for /dev/stdin or /dev/stdout, they are simply literals that gbak checks for while processing its parameters. Do not attempt to use names /dev/stdin or /dev/stdout in a piped process as it will most likely fail.
If you wish to create a dump file actually named either stdin or stdout, then you should specify the filename as a full, or relative, path name such as ./stdin or ./stdout, which causes gbak to treat them as a literal file name rather than a special file name that causes different to normal processing during the dump or restore process.