I have an old database and I want to convert it to Firebird 2.5. A problem occurs when restoring the data on tables which contains blob text fields with the well know issue «gbak: ERROR:Malformed string gbak:Invalid data detected»
Steps performed:
- gfix -user SYSDBA -password masterkey f:dbb.db -shut -force 0
- gfix -v -full -user SYSDBA -password masterkey f:dbb.db
- gbak -v -t -g -ig -user SYSDBA -Y F:backup.log -password «masterkey» f:dbb.db F:dbb1.db
- gbak -r -v -o -p 16384 -Y F:log.txt -user SYSDBA -password masterkey «f:dbb1.db» «f:new.db» -fix_fss_data win1251 -rep
replacing the character set with win1252,utf8 or unicode_fss does not solve the problem.
I have also tried to migrate the data by using InterBase Data Pump version 3.4.
Steps:
- backup the metatable
- restore the metatable on a new database
- migrate the data by using InterBase Data Pump
Errors encountered «Malformed string».
All the tables on which the error occur have a field of type «BLOB SUB_TYPE 1 SEGMENT SIZE 80»
I suspect that at the beginning the database had the charset WIN1252. After that someone changed the charset to UTF8 and changed all the fields definition for charset and collate from WIN1252 to UTF8. Otherwise I do not understand why I get these malformed string errors. Also, I understood that this problem is common to FireBird 2.0 to FireBird 2.5 migrations.
Does anybody have an idea on how to solve this?
asked Nov 27, 2012 at 17:22
2
Malformed string error can come from data and you can correct this with switch -fix_fss_d but it can also come from metadata and you have to use the switch -fix_fss_m
-FIX_FSS_D[ATA]
This switch forces gbak to fix malformed UNICODE_FSS character data
during a restore.This switch, and the following one, should not be required under
normal circumstances. However, if a restore operation fails with a
«malformed string» error, the message output from gbak will refer the
user to one or both of these switches to fix the malformed UNICODE_FSS
data or meta data as appropriate.-FIX_FSS_M[ETADATA]
This switch forces gbak to fix malformed UNICODE_FSS metadata during a
restore.This switch, and the preceding one, should not be required under
normal circumstances. However, if a restore operation fails with a
«malformed string» error, the message output from gbak will refer the
user to one or both of these switches to fix the malformed UNICODE_FSS
data or meta data as appropriate.
link to firebird gbak utility
answered Nov 27, 2012 at 20:28
1
even it sounds stupid, I fixed it in this way:
backup the metatable
create an restore to a new database file
extract the data from old table by using IBExpert into a script
run the script to add data the new database
None of the combinations of -fix_fss_D or fix_fss_m with different charsets did not import all the data into the new database. Tried all the free and shareware tools without results.
answered Nov 28, 2012 at 16:10
RBARBA
12.2k16 gold badges77 silver badges125 bronze badges
Use -fix_fss_metadata WIN1252 at end. That help me to fix this.
For example:
gbak -c -r -v -user SYSDBA -password masterkey C:backupExample.bkp C:TEST7.fdb -fix_fss_metadata WIN1252
answered Aug 5, 2019 at 10:47
Придется начать издалека.
Была база с БЛОБ полем:
Код: Выделить всё
CREATE DATABASE 'd:GBAK_IssueData.fdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET NONE;
CREATE TABLE DMG (
DMG_ID BIGINT NOT NULL,
REASONSHALTED BLOB SUB_TYPE 1);
И понадобилось сделать по этому полю case insensitive поиск который был реализован путем конвертации поля в character set UTF8 COLLATE UNICODE_CI вот таким скриптом:
Код: Выделить всё
CONNECT 'd:GBAK_IssueData.fdb' USER 'SYSDBA' PASSWORD 'masterkey';
ALTER TABLE DMG ADD TEMP_REASONSHALTED BLOB SUB_TYPE 1 character set UTF8 COLLATE UNICODE_CI;
UPDATE DMG SET TEMP_REASONSHALTED = REASONSHALTED;
ALTER TABLE DMG DROP REASONSHALTED;
ALTER TABLE DMG ADD REASONSHALTED BLOB SUB_TYPE 1 character set UTF8 COLLATE UNICODE_CI;
UPDATE DMG SET REASONSHALTED = TEMP_REASONSHALTED;
ALTER TABLE DMG DROP TEMP_REASONSHALTED;
COMMIT WORK;
Вроде все сделано правильно и все работает уже давно и без проблем.
Да вот только оказалось что пользователи могу вводить в это поле данные из раширенной таблицы символов — вроде ‘ и ’ и тд.
Программа на D2009 и все это вводится и работает на ура, единственно что поиск пришлось подкрутить и добавить
Код: Выделить всё
REASONSHALTED LIKE CAST(:REASONSHALTED AS VARCHAR(1024) CHARACTER SET UTF8)
вместо
тк когда пользователи туда вводили эти самые ‘ и ’ запрос падал с ошибкой Malformed string.
Засада началась когда выяснилось что бэкап невозможно восстановить — если попадаются такие символы gbak просто пропускает эти записи (а их много).
Как это чинить не понятно, ну разве что в живой базе поменять проблемные символы на пробелы и сделать backup&restore (что не решает на самом деле ничего).
Или в самом бэкапе редактором поправить если база померла (страшно даже представить сколько времени это может занять).
И самое главное не понятно как же такое вообще могло произойти.
Я думал что вот при таком присваении:
Код: Выделить всё
UPDATE DMG SET TEMP_REASONSHALTED = REASONSHALTED; // BLOB SUB_TYPE 1 character set UTF8 COLLATE UNICODE_CI присваевается BLOB SUB_TYPE 1
Будет либо ошибка либо явная конвертация но этого не произошло.
Я кинул ниже пошаговый пример с базой с одной таблицей & записью.
http://clevercomponents.com/store/alex/GBAK_Issue.zip
Как вообще с этим боротся и глaвное где я допустил косяк?
Спасибо!
1. Introduction
Gbak
is one of the database backup and restore utilities supplied with Firebird.
In Firebird 1.5 it is the only supplied utility of this kind while Firebird 2.x also has the nbackup
utility which is described in another document.
In this manual, we will discuss:
-
Command-line options for
gbak
. -
gbak
commands and their parameters. -
Running
gbak
in backup or restore modes. -
Some caveats, gotchas and foibles of
gbak
.
2. Command-line Options
2.1. Common Options
When running gbak
in backup or restore mode, there are a number of options which apply to either mode.
These are:
-?
-
This switch displays the command line options and switches.
It replaces the old method in which you had to supply an invalid switch (see-help
below) in order to see the list of valid ones. -FE[TCH_PASSWORD] <password file name> | stdin | /dev/tty
-
This switch causes the password for the appropriate user to be read from a file as opposed to being specified on the command line.
The file name supplied is not in quotes and must be readable by the user runninggbak
.
If the file name is specified asstdin
, then the user will be prompted for a password.
On POSIX systems, the file name/dev/tty
will also result in a prompt for the password. -M[ETA_DATA]
-
This switch causes your data to be ignored and not backed up or restored.
In a backup, only the database meta data are backed up.
When used in a restore, any data in the dump file will not be restored.
This switch can be used when creating database clones which are required to contain only thetables
,indices
etc but none of the data. -PAS[SWORD] <password>
-
Supplies the password for the username specified above.
This need not be supplied ifISC_PASSWORD
environment variable exists and has the correct value. -RO[LE] <SQL role name>
-
Allows the specification of the role to be used by the connecting user.
Not of much practical use and is not normally used in practice. -U[SER] <username>
-
Allows the username of the SYSDBA or database owner user to be specified if the database is to be backed up, or, in the case of a restore (with the
-c[reate]
switch specified), any valid username can be specified.
This need not be supplied ifISC_USER
environment variable exists and has a correct value for the username.Databases can only be backed up by SYSDBA or the database owner.
A restore can also be carried out by SYSDBA or the database owner, however, if the-c(reate)
switch is used, any validated username can create a new database from a backup file. -V[ERIFY]
-
Normally
gbak
operates quietly with no information written to the display.
This switch reverses that situation and causes lots of information to be displayed.
The default is to display the output to the screen, but you can redirect the output to a log file using the-y
switch. -Y <filename> or the text "suppress"
-
Used in conjunction with the
-v[erify]
switch to redirect status messages to a file or device, rather than the screen, or to suppress them altogether.If
-y suppress
is used, then no information will be written to screen regardless of whether-v[erify]
is specified.If a filename is given and the
-v[erify]
switch is specified, the file will be written to record progress, errors etc.All known documentation on this switch mentions that the text should be
"suppress_output"
rather than"suppress"
.
This is an error in the documentation as the source code forgbak
shows that the switch must be"suppress"
.The log file must not exist.
If it does, the backup or recovery operation will fail:tux> rm employee.log tux> gbak -backup employee.fdb employee.fbk -y employee.log -v tux> ls -l employee.log -rw-r--r-- 1 firebird firebird 21610 2010-08-04 10:22 employee.log tux> gbak -backup employee.fdb employee.fbk -y employee.log -v gbak:cannot open status and error output file employee.log
-Z
-
This option displays some information about the version of
gbak
being used, and optionally, a database.
To obtain the version ofgbak
only, run the command as follows:tux> gbak -z gbak:gbak version LI-V2.5.0.26074 Firebird 2.5 gbak: ERROR:requires both input and output filenames gbak:Exiting before completion due to errors tux> echo $? 1
This displays the current version of
gbak
, and after displaying a couple of error messages, exits with an error code of 1 as shown above by theecho
command.
This method does not attempt to backup any databases and does not require a username and password to be defined or supplied.If you wish to display the version number of the
gbak
utility and also details of database, you must supply a valid database name and backup filename, as follows:tux> gbak -z employee employee.fbk -user sysdba -password secret gbak:gbak version LI-V2.1.3.18185 Firebird 2.1 gbak: Version(s) for database employee Firebird/linux (access method),version LI-V2.1.3.18185 Firebird 2.1 Firebird/linux (remote server),version LI-V2.1.3.18185 Firebird 2.1/tcp (tux)/P11 Firebird/linux (remote interface), version LI-V2.1.3.18185 Firebird 2.1/tcp (tux)/P11 on disk structure version 11.1 tux> echo $? 0
You will note from the above that a valid username and password must be defined on the command line, or by the use of environment variables
ISC_USER
andISC_PASSWORD
.
This version of the command will exit with a error code of zero.This method of calling
gbak
will make a backup of the database.
If your database is large, this can take some time to complete and the backup file specified will be overwritten if it already exists.
Beware.The output above has been slightly abbreviated to allow it to fit the page width for a pdf. -help
-
Help is actually not a valid option, but can be used to display the following screen of information as output from
gbak
in Firebird 2.0:gbak:legal switches are: -B[ACKUP_DATABASE] backup database to file -BU[FFERS] override page buffers default -C[REATE_DATABASE] create database from backup file -CO[NVERT] backup external files as tables -E[XPAND] no data compression -FA[CTOR] blocking factor -G[ARBAGE_COLLECT) inhibit garbage collection -I[NACTIVE] deactivate indexes during restore -IG[NORE] ignore bad checksums -K[ILL] restore without creating shadows -L[IMBO] ignore transactions in limbo -M[ETA_DATA] backup metadata only -MO[DE] <access> "read_only" or "read_write" access -N[O_VALIDITY] do not restore database validity conditions -NOD[BTRIGGERS] do not run database triggers -NT Non-Transportable backup file format -O[NE_AT_A_TIME] restore one table at a time -OL[D_DESCRIPTIONS] save old style metadata descriptions -P[AGE_SIZE] override default page size -PAS[SWORD] Firebird password -R[ECREATE_DATABASE] [O[VERWRITE]] create (replace if O[VERWRITE] used) database from backup file -REP[LACE_DATABASE] replace database from backup file -RO[LE] Firebird SQL role -SE[RVICE] use services manager -T[RANSPORTABLE] transportable backup -- data in XDR format -USE_[ALL_SPACE] do not reserve space for record versions -USER Firebird user name -V[ERIFY] report each action taken -Y <path> redirect/suppress status message output -Z print version number
The explanation of the
-m[eta_data]
switch implies that it is useful in a backup situation only.
This is not the case as it can also be used on a restore.From Firebird 2.5 onwards, there is a new
-?
switch to display the list of valid options.
The output has slightly different layout and a couple of new options have been added:gbak:legal switches are: -B(ACKUP_DATABASE) backup database to file -C(REATE_DATABASE) create database from backup file (restore) -R(ECREATE_DATABASE) [O(VERWRITE)] create (or replace if OVERWRITE used) database from backup file (restore) -REP(LACE_DATABASE) replace database from backup file (restore) gbak:backup options are: -CO(NVERT) backup external files as tables -E(XPAND) no data compression -FA(CTOR) blocking factor -G(ARBAGE_COLLECT) inhibit garbage collection -IG(NORE) ignore bad checksums -L(IMBO) ignore transactions in limbo -NOD(BTRIGGERS) do not run database triggers -NT Non-Transportable backup file format -OL(D_DESCRIPTIONS) save old style metadata descriptions -T(RANSPORTABLE) transportable backup -- data in XDR format gbak:restore options are: -BU(FFERS) override page buffers default -FIX_FSS_D(ATA) fix malformed UNICODE_FSS data -FIX_FSS_M(ETADATA) fix malformed UNICODE_FSS metadata -I(NACTIVE) deactivate indexes during restore -K(ILL) restore without creating shadows -MO(DE) <access> "read_only" or "read_write" access -N(O_VALIDITY) do not restore database validity conditions -O(NE_AT_A_TIME) restore one table at a time -P(AGE_SIZE) override default page size -USE_(ALL_SPACE) do not reserve space for record versions gbak:general options are: -FE(TCH_PASSWORD) fetch password from file -M(ETA_DATA) backup or restore metadata only -PAS(SWORD) Firebird password -RO(LE) Firebird SQL role -SE(RVICE) use services manager -USER Firebird user name -V(ERIFY) report each action taken -Y <path> redirect/suppress status message output -Z print version number
The parentheses shown in the above indicates how much of the switch name you need to use in order to avoid ambiguity.
Once you have specified the absolute minimum — the part before the opening ‘[‘ — you can use as much of what follows as you wish.
For example, to use the-b[ackup_database]
switch the minimum you must supply on the command line is-b
but anything between-b
and-backup_database
will be accepted.Using the
-help
switch like this, or any other invalid switch, will causegbak
to exit with an error code of 1 on Linux and Windows.
2.2. Backup Switches
When running |
You may, if you wish, send the output to standard output rather than a backup file. |
When carrying out a backup of a database, the following switches, in addition to the common ones above, will be of use:
-B[ACKUP_DATABASE]
-
This switch is used whenever you wish to take a backup of a database.
-CO[NVERT]
-
This switch causes any tables, defined as
external
, to be backed up as if they were normal (non-external) tables.
When this dump file is used to restore a database, the tables that were external in the original database will no longer be external. -E[XPAND]
-
Normally,
gbak
will compress the output file.
This switch prevents that compression from taking place. -FA[CTOR] <block size>
-
If backing up to a physical tape device, this switch lets you specify the tape’s blocking factor.
-G[ARBAGE_COLLECT]
-
The use of this switch prevents Firebird’s garbage collection from taking place while
gbak
is running.
Normallygbak
connects to the database as any other connection would and garbage collection runs normally.
Using this switch prevents garbage collection from running during the course of the backup.
This can help speed up the backup. -IG[NORE]
-
This switch causes gbak to ignore bad checksums in the database.
This can be used to attempt to backup a database that failed due to checksum errors.
There is no guarantee that the data will be usable though, so it is best to take other precautions to preserve your data. -L[IMBO]
-
If you have a two-phase transaction (across two different databases) that failed because a server died before the commit, but after the changes were made, you have a limbo transaction.
This switch forces the backup to ignore data from such broken transactions.
It should not be used for normal backups and only used, like the-ig[nore]
switch to attempt to recover from a failure. -M[ETA_DATA]
-
See above.
-NT
-
This switch turns off the
-t[ransportable]
switch (which is on by default) and causes the dump file to be created using platform dependent formats.
If you use this switch to create a backup then you can only restore the backup on a similar platform.
You cannot, for example, take a dump file from Linux over to a Windows server. -OL[D_DESCRIPTIONS]
-
This switch is unlikely to be used.
It has been deprecated.
Its purpose is to force the backup to be made using the older InterBase versions’ format of meta data descriptions. -PAS[SWORD] <password>
-
See above.
-RO[LE] <role name>
-
See above.
-SE[RVICE] <servicename>
-
This switch causes
gbak
to backup a remote database via the service manager.
This causes the backup file to be created on the remote server, so the path format and filename must be valid on the remote server.
The servicename is currently always the textservice_mgr
.You can use this option to connect to a locally hosted database as well.
If you do, taking a backup using this option can run quicker than accessing the database directly.
See the section below on speeding up backups. -T[RANSPORTABLE]
-
The default dump file format is transportable.
Transportable backup files are written in a format known as external data representation (XDR) format and it is this format which allows a dump taken on a server of one type to be successfully restored on a server of another type. -USER <username>
-
See above.
-V[ERIFY]
-
See above.
-Y <full name of log file> or the text "suppress"
-
See above.
2.3. Restore Switches
When running a |
You may, if you wish, read the dump data directly from standard input rather than a backup file. |
When carrying out a restore or replacement of a database, the following switches, in addition to the common ones above, will be of use:
-BU[FFERS] <number of buffers>
-
This switch sets the default database cache size (in number of database pages) for the database being restored.
If a database is being overwritten then this setting will overwrite the previous setting for the cache size. -C[REATE_DATABASE]
-
This switch causes a new database to be created from the backup file.
The database file must not exist or the restore will fail.
Either this switch or-rep[lace_database]
or-r[ecreate_database]
must be specified. -FIX_FSS_D[ATA]
-
This switch forces
gbak
to fix malformed UNICODE_FSS character data during a restore.This switch, and the following one, should not be required under normal circumstances.
However, if a restore operation fails with a «malformed string» error, the message output fromgbak
will refer the user to one or both of these switches to fix the malformed UNICODE_FSS data or meta data as appropriate. -FIX_FSS_M[ETADATA]
-
This switch forces
gbak
to fix malformed UNICODE_FSS metadata during a restore.This switch, and the preceding one, should not be required under normal circumstances.
However, if a restore operation fails with a «malformed string» error, the message output fromgbak
will refer the user to one or both of these switches to fix the malformed UNICODE_FSS data or meta data as appropriate. -I[NACTIVE]
-
This switch can be used to restore a database when a previous restore attempt failed due to index errors.
All indexes in the restored database will be inactive. -K[ILL]
-
This switch restores the database but doesn’t recreate any shadow files that existed previously.
-M[ETA_DATA]
-
See above.
-MO[DE] <access>
-
This switch allows the database being restored to be set to the given access mode when opened.
By default, the mode is taken from the database that was dumped. -N[O_VALIDITY]
-
This switch is similar to the
-i[nactive]
switch above, except, it disabled all check constraints in the restored database. -NOD[BTRIGGERS]
-
New switch from Firebird 2.1 which prevents the database triggers from firing on a restore.
Database triggers are a new feature in Firebird 2.0 onwards and are different from table triggers which will continue to fire. -O[NE_AT_A_TIME]
-
This switch causes the restore to restore one table at a time.
This can be useful when a previous restore failed due to data errors.
Normally, a restore takes place in a single transaction with a single commit at the end of the restore.
If the restore is interrupted for any reason, an empty database is the end result.
Using the-o[ne_at_a_time]
option uses a transaction for each table and commits after each table has been restored. -P[AGE_SIZE] <new page size>
-
Use this switch to change the default database page size.
By default, the database is restored using a page size the same as the one that was in use when the database was dumped. -PAS[SWORD] <password>
-
See above.
-R[ECREATE_DATABASE] [O[VERWRITE]]
-
New from Firebird 2.x.
Create (or replace ifo[verwrite]
is used) the named database from the backup file.
The database filename should not already exist or an error will occur.
This is not the case if theo[verwrite]
option is also used.This is a new switch and is deliberately abbreviated to
-r
to try to prevent unsuspecting DBAs from overwriting an existing database thinking that the-r
was abbreviated from-restore
.
Now, it takes special effort to manage this especially as-restore
was never actually a valid switch;-r
was in fact an abbreviation of-replace_database
and it did this by first deleting the existing database file and then recreating it from the backup.Using
-r[ecreate_database] o[verwrite]
is effectively the same as using-rep[lace_database]
. -REP[LACE_DATABASE]
-
Replace database from backup file.
This switch used to be abbreviated to-r
in previous (to Firebird 2.x) versions.
This switch will be removed in a version of Firebird later than 2.1.3 (where it still exists).
You are advised to use the-r[ecreate_database] o[verwrite]
switch instead. -SE[RVICE] <servicename>
-
Use the services manager on a remote database to restore a remote database.
The servicename is currently always the textservice_mgr
.You can use this option to connect to a locally hosted database as well.
If you do, restoring a backup using this option can run quicker than accessing the database directly.
See the section below on speeding up restores. -USE_[ALL_SPACE]
-
This switch forces the restore to use 100% of each database page and thus not leave any room for changes.
If you omit this switch, some space will be kept free for subsequent changes.
Using this switch is likely to be only of practical use where the database is created and used in read-only mode and no updates to existing data are required.Once a database has been restored with this option specified, all database pages will be filled to 100% and no free space will be left for updates.
Use of this switch set a flag in the database header page to signal that all pages are to be filled to 100% — this applies to any new pages created after the restore.You can override this setting, using
gfix -use full | reserve database_name
wherefull
uses 100% of each page andreserve
reserves some space for subsequent updates.
See thegfix
manual for more details. -USER <username>
-
See above.
-V[ERIFY]
-
See above.
-Y <name of log file>
-
See above.
3. Backup Mode
Before you consider using other tools to take a backup of your Firebird database, make sure that you know what the tools do and how a running database will be affected by them.
For example, if you use Winzip to create a compressed copy of a database and you do it when users are accessing the system, the chances of a successful restore of that database are slim.
You must either always use the gbak
or nbackup
tools which know how the database works, or, use gfix
to shut the database down completely before you even attempt to backup the database file(s).
Gbak
creates a consistent backup of the database by starting a transaction that spans the backup period.
When the backup is complete, the transaction is ended and this means that the backup process can be run while users are working in the database.
However, any transactions started after the backup process begins will not have any of the changed data written to the backup file.
The backup will represent a copy of the entire database at the moment the backup began.
The dump file created by a default gbak
backup is cross platform (transportable) so a backup taken on a Windows server can be used to recreate the same database on a Linux server, or on any other platform supported by Firebird.
This is not true of the copies of your database taken (while the database was closed!) with tools such as Winzip etc.
Those copies should only ever be used to restore a database on the same platform as the one copied.
Always backup the database with the version of |
And one final thought on backups, regardless of the fact that the backup finished with no errors, exited with an error code of zero and all appears to be well, how do you actually know that the backup file created is usable? The short answer is, you don’t.
Whenever you have a valuable database — and they all should be — you are strongly advised to take your backup files and use them to create a test restore of a database either on the same server or even better, on a different one.
Only by doing this can you be certain of a successful backup.
The following example shows a backup being taken on a server named linux and used to create a clone of the database on another Linux server named tux to make sure that all was well.
First of all, the backup on linux:
linux> gbak -backup -verify -y backup.log employee employee.fbk linux> gzip -9 employee.fbk
Note that the above linux> gbak -verify -y backup.log employee employee.fbk |
Then, on the tux server:
tux> scp [email protected]:employee.fbk.gz ./ Using keyboard-interactive authentication. Password: employee.fbk.gz | 19 kB | 19.3 kB/s | ETA: 00:00:00 | 100% tux> gunzip employee.fbk.gz tux> gbak -replace -verify -y restore.log employee.fbk employee.restore.test
At this point, the restore has worked and has overwritten the previous database known as employee.restore.test
.
The actual location of the database for the database employee.restore.test
is defined in the aliases.conf
file in /opt/firebird
on the server.
In this test, it resolves to /opt/firebird/databases/employee.restore.fdb
.
For further proof of reliability, the application may be tested against this clone of the live database to ensure all is well.
3.1. Speeding up the Backup
There are a couple of tricks you can use to speed up the backup.
The first is to prevent the garbage collection from being carried out while the backup is running.
Garbage collection clears out old record versions that are no longer required and this is usually covered by a sweep — manual or automatic — or by a full table scan of any affected table.
As gbak
accesses all the rows in the tables being backed up, it too will trigger the garbage collection and, if there have been a large number of updates, can slow down the backup.
To prevent garbage collection during the backup, use the -g[arbage_collect]
option.
tux> gbak -backup -garbage_collect employee /backups/employee.fbk
The second option is to backup the database using the -se[rvice]
option.
Although this is used to perform remote backups, it can be used locally as well.
Using this option can help speed up your backups.
It simply avoids the data being copied over the TCP network which can slow down the actions of the backup.
tux> gbak -backup -service tux:service_mgr employee /backups/employee.fbk
The example above backs up the employee database, on the tux server, «remotely» using the service manager.
The tux server is, of course, where the command is running, so it isn’t really running remotely at all.
You can, of course, combine the -g[arbage_collect]
and -se[rvice]
options.
4. Restore Mode
Backups taken with the gbak
application from one version of Firebird — or InterBase — can be used by later versions of Firebird to restore the database, however, while this may result in an upgrade to the On Disc Structure (ODS) for the database in question, the SQL Dialect will never be changed.
If you backup an InterBase dialect 1 database and then use the dump file to recreate it under Firebird 2.1, for example, the ODS will be updated to 11.1 but the SQL Dialect will remain as 1.
Always restore the database with the version of |
You can, if you wish, change the SQL Dialect using gfix
.
Under normal circumstances, restoring a database takes place as a single transaction.
If the restore is successful, a commit at the end makes the data permanent, if not, the database will be empty at the end.
The restore option -o[ne_at_a_time]
will use a transaction for each table and if the table is restored with no errors, a commit is executed rendering that table permanent regardless of what happens with subsequent tables.
4.1. Restore Or Recreate?
Should a database be restored or replaced?
Restoring a database is the process by which you take the existing file and delete prior to replacing it on disc with a backup copy.
Gbak does this when you specify the -r[ecreate_database] o[verwrite]
switch or the -rep[lace_database]
switch.
What is the difference?
If a database exists on disc and you ask gbak
to restore it using one of the two switches above, you might corrupt the database especially if the database is in use and has not been shut down using gfix
.
In addition, if you have only partially completed the restore of a database, and some users decide to see if they can login, the database may well be corrupted.
Finally, if the restore process discovers that the dump file is corrupt, the restore will fail and your previously working database will be gone forever.
It can be seen that restoring a database can be a fraught experience.
For security, always recreate the database with a new name — a clone — and update the aliases.conf
to reflect the new name.
This way, your users will always refer to the database by the alias regardless of the actual filename on the server.
4.2. Malformed String Errors During Restores
During a restore operation, most likely when restoring a backup taken using an older gbak
version, it is possible to see failure messages, in gbak
‘s output, indicating malformed Unicode strings.
The reason that these may occur is as explained by Helen Borrie:
The source text of stored procedures (and several other types of object, such as CHECK constraints) is stored in a blob, as is the «compiled» BLR code.
When you restore a database, the BLR is not recreated: the same BLR is used until next time you recreate or alter the object.Historically, the engine did not do the right thing regarding the transliteration of strings embedded in the source and the BLR.
In v.2.1 and 2.5 a lot of work was done to address the international language issues, as you probably know.
A side effect of this was that everything that was read from data and meta data became subject to «well-formedness» checks.
Hence, on restoring, those previously stored source and BLR objects are throwing «malformed string» errors when gbak tries to read and write the data in these system table records.
This very old bug affects user blobs, too, if they have been stored using character set NONE and the client is configured to read a specified character set to which the stored data could not be transliterated.In v.2.1 there were scripts in ../misc that you could run to repair the meta data blobs and also use as a template for repairing the similar errors in blobs in your user data.
The repair switches were added to the gbak restore code in v.2.5 to do the same corrections to meta data and data, respectively, during the process of restoring a database for upgrade.
4.3. Speeding up the Restore
The restoration of a database, from a backup, can be made to execute quicker if the -se[rvice]
option is used.
Although this is used to perform remote restores, it can be used locally as well.
It simply avoids the data being copied over the TCP network which can slow down the actions of the restore.
tux> gbak -replace -service tux:service_mgr /backups/employee.fbk employee
The example above backs up the employee database, on the tux server, «remotely» using the service manager.
The tux server is, of course, where the command is running, so it isn’t really running remotely at all.
You can, of course, combine the -g[arbage_collect]
and -se[rvice]
options.
5. Security Of Backups
As you have seen above anyone, with a valid username and password, can restore a gbak
database dump file provided that they are not overwriting an existing database.
This means that your precious data can be stolen and used by nefarious characters on their own servers, to create a copy of your database and see what your sales figures, for example, are like.
To try and prevent this from happening, you are advised to take precautions.
You should also try and prevent backups from being accidentally overwritten before they have expired.
Some precautions you can take are:
-
Always set the dump file to be read-only after the backup is complete. This helps prevent the file from being overwritten.
-
Alternatively, incorporate the date (and time?) in your backup filenames.
-
Keep backups in a safe location on the server. Storing backups in a location with restricted access helps reduce the chances of your backup files ‘escaping’ into the wild.
-
Keep tape copies of your backups very secure. A locked safe or off-site location with good security is advisable. The off-site location will also be of use after a total disaster as the backups are stored in a separate location to the server they are required on.
-
Backup to a partition or disc that has encryption enabled.
-
Make sure that only authorised staff have access to areas where backups are kept.
-
Always test your backups by cloning a database from a recent backup.
In Firebird 2.1, there is an additional security feature built into gbak
and all the other command-line utilities.
This new feature automatically hides the password if it is supplied on the command line using the -password
switch.
Gbak
replaces the password with spaces — one for each character in the password.
This prevents other users on the system, who could run the ps
command and view your command line and parameters, from viewing any supplied password.
In this manner, unauthorised users are unable to obtain the supplied password.
tux> gbak -b -user SYSDBA -passw secret employee /backups/employee.fbk
tux> ps efx| grep -i gba[k] 20724 ... gbak -backup -user SYSDBA -passw employee employee.fbk ... (lots more data here)
You can see from the above that the password doesn’t show up under Firebird 2.1 as each character is replaced by a single space.
This does mean that it is possible for someone to work out how long the password could be and that might be enough of a clue to a dedicated cracker.
Knowing the length of the required password does make things a little easier, so for best results use a random number of spaces between -passw
and the actual password.
The more difficult you make things for the bad people on your network, the better.
6. Backup & Restore Recipes
The following recipes show examples of backup and restore tasks using gbak
.
These are probably the commonest cases that you will encounter as a DBA.
All the examples use the employee
database supplied with Firebird and the actual location is correctly configured in aliases.conf
.
Each of the following recipes is run with the assumption that the environment variables ISC_USER
and ISC_PASSWORD
have been given suitable values.
6.1. Backup & Restore Prerequisites
If you replace an open and running database, there is a good chance that you will corrupt it.
For best results and minimal chance of corrupting a database, you should close it before replacing it.
To close a database, use gfix
as follows:
tux> gfix -shut -tran 60 employee
The example above prevents any new transaction from being started which prevents new queries being executed or new sessions connecting to the database.
It will wait for up to 60 seconds for everyone to logout and for all current transactions to complete before shutting down the database.
If any long running transactions have not completed by the end of 60 seconds, the shutdown will timeout and the database will remain open.
After the restore of the database has completed, the database will automatically be opened again for use. |
6.2. A Simple Backup & Restore
This example takes a backup, then immediately overwrites the original database using the new backup.
This is not normally a good idea as the first action of a restore is to wipe out the database.
tux> # Backup the database. tux> gbak -backup employee /backups/employee.fbk tux> # Restore the database. tux> gfix -shut -tran 60 employee tux> gbak -replace /backups/employee.fbk employee
6.3. Metadata Only
It is possible to use gbak
to recreate an empty database containing only the various domains, tables, indices and so on, of the original database but none of the data.
This can be useful when you have finished testing your application in a test environment and wish to migrate the system to a production environment, for example, but starting afresh with none of your test data.
tux> #Backup only the database metadata. tux> gfix -shut -tran 60 employee tux> gbak -backup -meta_data employee employee.meta.fbk
When the above dump file is restored on the production server, only the metadata will be present.
There is another way to create a database with no data and only the metadata.
Simply restore from an existing dump which contains the data and supply the -m[eta_data]
switch to the restore command line.
The database will be restored but none of the original data will be present.
tux> #Restore only the database metadata. tux> gbak -create employee.fbk mytest.fdb -meta_data
The -m[eta_data]
switch can be used on either a backup or a restore to facilitate the creation of a clone database (or overwrite an existing one) with no actual data.
6.4. Splitting The Backup
The gsplit
filter application, documented in its own manual, doesn’t actually work anymore.
This filter was supplied with old versions of InterBase and Firebird to allow large database backups to be split over a number of files so that file system limits could be met.
Such limits could be the size of a CD, the 2GB limit on individual file sizes on a DVD, where some Unix file systems have a 2 GB limit and so on.
Gbak
allows the dump files to be split into various sizes (with a minimum of 2048 bytes) and will only create files it needs.
tux> # Backup the database to multiple files. tux> gbak -backup employee /backups/emp.a.fbk 600m /backups/emp.b.fbk 600m
The sizes after each filename indicate how large that particular file is allowed to be.
The default size is bytes, but you can specify a suffix of k
, m
or g
to use units of kilo, mega or gigabytes.
If the dump completes before writing to some files, then those files are not created.
A dump file is only ever created when it must be.
The size of the final dump file will be quietly ignored if the database has grown too large to allow a truncated backup to complete.
If, in the example above, the backup needs a total of 1500M, then the last file would be written to a final size of 900m rather than the 600m specified.
To restore such a multi-file backup requires that you specify all of the filenames in the dump and in the correct order.
The following example shows the employee database above being restored from the two files dumped above:
tux> # Restore the database from multiple files. tux> gfix -shut -tran 60 employee tux> gbak -replace /backups/employee.a.fbk /backups/employee.b.fbk employee
6.5. Change The ODS
Normally the ODS used is the one in force by the version of Firebird used to restore the database.
So, the examples above will actually change the ODS when the database is restored.
The backup should be taken using the gbak
utility supplied by the old ODS version of InterBase or Firebird.
The restore should be carried out using gbak
from the newer version of Firebird.
tux> setenv_firebird 2.0 Firebird environment set for version 2.0. tux> # Check current ODS version (as root user!) tux> gstat -h employee|grep ODS ODS version 11.0 tux> # Backup the (old) database. tux> gbak -backup employee /backups/employee.2_0.fbk tux> setenv_firebird 2.1 Firebird environment set for version 2.1. tux> # Recreate the database and upgrade the ODS. tux> gfix -shut -tran 60 employee tux> gbak -replace /backups/employee.2_0.fbk employee tux> # Check new ODS version (as root user!) tux> gstat -h employee|grep ODS ODS version 11.1
After the above, the old 2.0 Firebird database will have been recreated — wiping out the old database — as a Firebird 2.1 database with the corresponding upgrade to the ODS from 11.0 to 11.1.
The script setenv_firebird
is not supplied with Firebird and simply sets PATH
etc to use the correct version of Firebird as per the supplied parameter.
6.6. Change The Cache Size
The default database cache is created when the database is created, or subsequently by using gfix
.
Gbak
can restore a database and reset the default cache size as well.
The process is as follows:
tux> # Check current cache size (as root user!) tux> gstat -h employee | grep -i buffer Page buffers 0 tux> # Restore the database & change the cache size. tux> gfix -shut -tran 60 employee tux> gbak -replace -buffer 200 /backups/employee.fbk employee tux> # Check the new cache size (as root user!) tux> gstat -h employee | grep -i buffer Page buffers 200
The default cache size is used when the number of buffers is zero, as in the first example above.
Gbak
allows this to be changed if desired.
Gbak
, however, cannot set the cache size back to zero.
You must use gfix
to do this.
6.7. Change The Page Size
Similar to the example above to change the default database cache size, the database page size can also be changed using gbak
.
tux> # Check current page size (as root user!) tux> gstat -h employee | grep -i "page size" Page size 4096 tux> # Restore the database & change the page size. tux> gfix -shut -tran 60 employee tux> gbak -replace -page_size 8192 /backups/employee.fbk employee tux> # Check the new page size (as root user!) tux> gstat -h employee | grep -i "page size" Page size 8192
6.8. Create A Read-Only Database Clone
Sometimes you do not want your reporting staff running intensive queries against your production database.
To this end, you can quite easily create a clone of your production database on a daily basis, and make it read-only.
This allows the reporting team to run as many intensive reports as they wish with no ill effects on the production database and it prevents them from inadvertently making changes.
The following example shows the production employee database running on Linux server tux, being cloned to the reporting team’s Linux server named tuxrep.
First on the production tux server:
tux> # Backup the production database. tux> gbak -backup employee /backups/employee.fbk
Then on the reporting team’s tuxrep server:
tuxrep> # Scp the dump file from tux. tuxrep> scp [email protected]:/backups/employee.fbk ./ Using keyboard-interactive authentication. Password: employee.fbk | 19 kB | 19.3 kB/s | ETA: 00:00:00 | 100% tuxrep> # Restore the employee database as read-only. tuxrep> gfix -shut -tran 60 employee tuxrep> gbak -replace -mode read_only employee.fbk employee tuxrep> # Check database mode (as root user) tuxrep> gstat -h employee|grep -i attributes Attributes no reserve, read only
6.9. Create a Database Clone Without a Dump File.
You may use gbak
to create a clone of a database, on the same server, without needing to create a potentially large dump file.
To do this, you pipe the output of a gbak
backup directly to the input of a gbak
restore, as follows.
tux> # Clone a test database to the same server, without requiring a dump file. tux> gbak -backup emptest stdout | gbak -replace stdin emptest_2
You will notice that the output file name for the backup is stdout
and the input file name for the restore is stdin
.
This ability to pipe standard output of one process to the standard input of another, is how you can avoid creating an intermediate dump file.
The commands above assume that there are suitable alias names set up for both emptest and emptest_2.
If not, you will need to supply the full path to the two databases rather than the alias.
The -replace
option on the restore process will overwrite the database name specified — as an alias or as a full path — if it exists and will create it anew if it doesn’t.
You may also use the -recreate overwrite
option as an alternative.
Both have the same result.
If you don’t want to overwrite any existing databases, use -create
which will only create a database if it doesn’t already exist, and will exit with an error if it does.
In POSIX compatible systems, the error code in $?
is 1 in this case.
Further examples of backing up and restoring remote databases over ssh, using the stdin and stdout file names, can be seen below.
6.10. Backup & Restore With & Without Shadow Files.
Databases can have shadow files attached in normal use.
Gbak
happily backs up and restores those as well and in normal use, shadow files will be recreated.
Should you wish to restore the database only and ignore the shadows, gbak
can do that for you as the following example shows.
tux> # Check current shadows, use isql as gstat is broken. tux> isql employee Database: employee SQL> show database; Database: employee Owner: SYSDBA Shadow 1: "/opt/firebird/shadows/employee.shd1" manual Shadow 2: "/opt/firebird/shadows/employee.shd2" manual ... SQL> quit; tux> # Restore the database preserving shadow files. tux> gfix -shut -tran 60 employee tux> gbak -replace overwrite /backups/employee.fbk employee tux> # Check shadows again, use isql as gstat is broken. tux> isql employee Database: employee SQL> show database; Database: employee Owner: SYSDBA Shadow 1: "/opt/firebird/shadows/employee.shd1" manual Shadow 2: "/opt/firebird/shadows/employee.shd2" manual ... SQL> quit; tux> # Restore the database killing shadow files. tux> gfix -shut -tran 60 employee tux> gbak -replace overwrite -kill /backups/employee.fbk employee tux> # Check shadows again, use isql as gstat is broken. tux> isql employee Database: employee SQL> show database; Database: employee Owner: SYSDBA ... SQL> quit;
I use |
6.11. Remote Backups & Restores
Firebird’s gbak
utility can make backups of a remote database.
To do this, you need to connect to the service manager running on the remote server, this is normally called service_mgr
.
The following example shows the Firebird employee
database on server tuxrep being backed up from the server tux.
The backup will be written to the remote server, in other words, the backup file will be created on the tuxrep server and not on the tux one.
The network protocol in use is TCP.
tux> # Backup the reporting database on remote server tuxrep. tux> gbak -backup -service tuxrep:service_mgr employee /backups/remote_backup.fbk
The backup file will have the same owner and group as the Firebird database server — on Unix systems at least.
It is also possible to restore a remote database in this manner as well, and gbak
allows this.
tux> # Restore the read-only reporting database on remote server tuxrep. tux> gbak -replace -mode read_only -service tuxrep:service_mgr /backups/remote_backup.fbk employee
The above example uses the handy Unix ability to split a long line over many shorter ones using a back slash as the final character on the line. |
As ever, you are advised to beware of replacing a database in case there are problems during the restore.
The example above recreates the existing database in read-only mode but this need not always be the case.
A remote backup can also be run on the database server itself!
On Windows, this makes no difference, but on Unix systems, this local-remote method of backups and restores reduces network traffic.
The ‘remote’ server, in this case, is not actually remote it is just the method of running the backup — connecting to the service manager — that implies remoteness.
tux> # Backup the employee database on this server, but pseudo-remotely! tux> gbak -backup -service tux:service_mgr employee /backups/remote_backup.fbk
And corresponding restores can also be run ‘remotely’:
tux> # Restore the employee database on this server, but pseudo-remotely! tux> gbak -replace -service tux:service_mgr /backups/remote_backup.fbk employee
The format of the parameter used for the -service
switch is different according to the nature of the network protocol in use:
- TCP
-
When using TCP networks, the parameter separator is a colon, as in
-service server_name:service_mgr
. - Named pipes
-
When using named pipes, the parameter requires two leading back slashes and the separator is another back slash, as in
-service \server_nameservice_mgr
.
6.12. Remote Backups and Restores Using SSH
As shown above, you can use the special file names stdin and stdout to backup and restore a database to a separate database on the same server.
However, you can also use the same tools, over an SSH connection to a remote server, and pass the backup of one database directly to a restoration of a separate one.
The first example copies a local database to a remote server where Firebird is running and the firebird user has its environment set up so that the gbak tool is on $PATH
by default, on login.
In each of the following examples, the |
tux> # Clone a test database to a different server, without requiring a dump file. tux> gbak -backup employee stdout | ssh [email protected] "gbak {...} -replace stdin emptest"
When the above is executed, you will be prompted for a password for the remote firebird user on server tuxrep, assuming that you don’t have a proper SSH key-pair already set up and active.
The command will replace the local database according to the alias name emptest
but you can, if required, supply full path names for the databases.
The following shows an example of the above being executed.
tux> # Clone a test database to a different server, without requiring a dump file. tux> gbak -backup employee stdout | ssh [email protected] "gbak {...} -replace stdin emptest" [email protected]'s password:
As you can see, there’s not much in the way of output, but you can connect remotely and check:
tux> isql {...} tuxrep:emptest Database: tuxrep:emptest SQL> show database; Database: tuxrep:emptest Owner: SYSDBA PAGE_SIZE 4096 ...
The next example, shows a remote database being backed up to a local one, in a similar manner.
tux> ssh [email protected] "gbak -backup {...} emptest stdout" | gbak -create stdin data/tuxrep_emptest.fdb [email protected]'s password: tux> ls data employee.fdb tuxrep_emptest.fdb
You can see that a new tuxrep_emptest.fdb
database has been created.
Does it work?
Checking with isql
shows that it does.
tux> isql data/tuxrep_emptest.fdb Database: data/tuxrep_emptest.fdb SQL> quit;
The final example shows how to backup a remote database on one server, to a remote database on another.
6.13. Using External Tools
Gbak
and nbackup
are the best tools to use when backing up and/or restoring Firebird databases.
They have been extensively tested and know the internals of the database and how it works, so the chances of these tools corrupting your valuable data are very slim.
However, some DBAs still like to use external tools (those not supplied with Firebird) to make backups for whatever reason.
Because it is not possible for external tools to know where a database is to be found, given the alias name, the script writer and/or DBA must explicitly find out the correct location of the database file(s) and supply these to the external tool.
To make this simpler for script writers, my own installation uses a standard in my aliases.conf
file as follows:
-
The database alias must start in column one.
-
There must be a single space before the equals sign (=).
-
There must be a single space after the equals sign (=).
-
Double quotes around the database filename is not permitted — it doesn’t work for the Firebird utilities either.
-
Databases are all single file databases.
The last rule applies to my installation only and means that the following simple backup script will work.
If multiple file databases were used, more coding would be required to take a backup using external tools.
tux> cat /opt/firebird/aliases.conf # --------------------------------------------------------- # WARNING: Backup Standards require that: # The database name starts in column 1. # There is a single space before the equals sign. # There is a single space after the equals sign. # The path has no double quotes (they don't work!) # ---------------------------------------------------------- employee = /opt/firebird/examples/empbuild/employee.fdb
The following shows the use of the gzip
utility on a Linux server to take and compress a backup of a running database.
The following is run as the root user due to the requirement to run gfix
to shut down the database.
tux> # Backup the production employee database using gzip. tux> gfix -shut -tran 60 employee tux> DBFILE=`grep -i "^employee =" /opt/firebird/aliases.conf | cut -d" " -f3` tux> gzip -9 --stdout $DBFILE > /backups/employee.fdb.gz
The restore process for this database would be the reverse of the above.
Again, the following runs as root.
tux> # Restore the production employee database from a gzip backup. tux> gfix -shut -tran 60 employee tux> DBFILE=`grep -i "^employee =" /opt/firebird/aliases.conf | cut -d" " -f3` tux> gunzip --stdout /backups/employee.fdb.gz > $DBFILE tux> # Make sure firebird can see the file. tux> chown firebird:firebird $DBFILE
7. 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.
7.1. 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.
This detection of whether you are attempting a backup or a restore means that if you use the |
7.2. 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.
7.3. 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.
7.4. 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.
7.5. 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.
Appendix A: Document history
Revision History | |||
---|---|---|---|
1.0 |
10 Oct 2009 |
ND |
Created as a chapter in the Command Line Utilities manual. |
1.1 |
20 Oct 2009 |
ND |
More minor updates and converted to a stand alone manual. |
1.2 |
24 Nov 2009 |
ND |
Corrected the section on |
1.3 |
24 Jun 2010 |
ND |
Added a bit more details to the |
1.4 |
09 Aug 2010 |
ND |
Noted that A few minor formatting errors, URLs and some examples were corrected. Also added an example of a meta data only backup and restore. |
1.5 |
31 Mar 2011 |
ND |
Updated the |
1.6 |
11 Oct 2011 |
ND |
Updated to cover Firebird 2.5 changes. Corrected description of Lots of spelling mistakes corrected. |
1.7 |
11 Jan 2013 |
ND |
Updated to document the use of the stdin and stdout file names in backups and restores, which allow backups to be written to or read from standard input and standard output. A section was added on the use of the above to clone databases without requiring an intermediate dump file. |
1.8 |
14 Jan 2013 |
ND |
Further updates to document the use of the stdin and stdout file names in backups and restores. |
1.9 |
11 Apr 2013 |
ND |
A section has been added to explain how to speedup your backups. |
1.10 |
1 May 2013 |
ND |
Slight update to the |
1.11 |
1 May 2013 |
ND |
A correction to the above change to the |
1.12 |
18 Jun 2020 |
MR |
Conversion to AsciiDoc, minor copy-editing |
Appendix B: License notice
The Original Documentation is titled Firebird Backup & Restore Utility.
The Initial Writer of the Original Documentation is: Norman Dunbar.
Copyright © 2009-2013.
All Rights Reserved.
Initial Writer contact: NormanDunbar at users dot sourceforge dot net.
Добрый вечер.
У меня программа на Delphi 2005 (по некоторым причинам прямо сейчас немогу поменять на что то другое)
программа хорошо работает с MS Access + ADO
Сама программа используется в нескольких странах.
Сейчас я портирую ее на Zeos (я читал уже как это называют здесь) + Firebird 2.5
Кстати, Zeos 6.6 официально работает только с Firebird 2.1
Но я сделал следующее:
1. создал базу в Firebird 2.1
2. использую fbclient отFirebird 2.1.
3. реальный же сервер это Firebird 2.5
Все работает отлично.
Я использу 2.5 и не 2.1 т.к. мне нужны некоторые функции 2.5
Но проблема в другом
например, для старой программы Delphi 2005 + ADO + Access
все работает нормально. я могу по русски написать текст в программе и он коректно запишется в базу.
например таблица
COMPANY
companyid: integer
name: varchar(50)
например я вставляю 2 строки
Тестовая компания 1
тестовая компания 2
и затем делаю запрос (из Access)
select * from company where name like ‘%те%’
он возвращает 2 строки (как и должно быть).
но когда я использую Delphi 2005 + Zeos 6.6+ Firebird 2.5 + database UTF8
после попытки запостить русский текст получаю ошибку «malformed string»
т.к. Firebird server не знает как сконвертировать из русского текста (не юникодного) в UTF8
если я создаю базу с Charset NONE тогда я могу записывать в базу русский текст
но приведенный выше пример не работает. он возращает только одну строку.
при этом Firebird-кие функции Lower и Upper не работают, когда Charset NONE для русского текста.
Вопрос как достичь поведения как в Delphi 2005 + ADO + Access
т.е. чтобы collation работал и чтобы я мог вставлять русский текст (ну и тексты на других языках, для представления которы не нужет unicode). т.е. чтобы, например, в Греции человек мог нормально вести базу на греческом, а араб — на арабском
сейчас я использую ZConnection без параметров соединения
я нашел опции типа
character_set_client=utf8
character_set_connection=utf8
character_set_database=utf8
character_set_results=utf8
character_set_server=utf8
character_set_system=utf8
collation_connection=utf8_general_ci
collation_database=utf8_general_ci
collation_server=utf8_general_ci
Codepage=utf8
Charset=UTF8
подставлял разные значения кодировок, то ничего не работает.
хорошая статья про кодировки
http://www.destructor.de/firebird/charsets.htm
идеально мне нужна база данных в utf8 но чтобы приложение было не юникодным (написанным на D2005)
понятно, что в этой цепочке много несуразного: Zeos сам по себе, не юникодный D2005
от всего этого буду уходить, просто хотелось бы более быстрое решение.
буду глубоко признателем любым советам.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
Sql error codes firebird
SQLCODE has been used for many years and should be considered as deprecated now. Support for SQLCODE is likely to be dropped in a future version.
Table B.2. SQLCODE and GDSCODE Error Codes and Message Texts (1)
SQLCODE | GDSCODE | Symbol | Message Text |
---|---|---|---|
101 | 335544366 | Segment | Segment buffer length shorter than expected |
100 | 335544338 | from_no_match | No match for first value expression |
100 | 335544354 | no_record | Invalid database key |
100 | 335544367 | segstr_eof | Attempted retrieval of more segments than exist |
100 | 335544374 | stream_eof | Attempt to fetch past the last record in a record stream |
335741039 | gfix_opt_SQL_dialect | -sql_dialect | set database dialect n | |
335544875 | bad_debug_format | Bad debug info format | |
-84 | 335544554 | nonsql_security_rel | Table/procedure has non-SQL security class defined |
-84 | 335544555 | nonsql_security_fld | Column has non-SQL security class defined |
-84 | 335544668 | dsql_procedure_use_err | Procedure @1 does not return any values |
-85 | 335544747 | usrname_too_long | The username entered is too long. Maximum length is 31 bytes |
-85 | 335544748 | password_too_long | The password specified is too long. Maximum length is @1 bytes |
-85 | 335544749 | usrname_required | A username is required for this operation |
-85 | 335544750 | password_required | A password is required for this operation |
-85 | 335544751 | bad_protocol | The network protocol specified is invalid |
-85 | 335544752 | dup_usrname_found | A duplicate user name was found in the security database |
-85 | 335544753 | usrname_not_found | The user name specified was not found in the security database |
-85 | 335544754 | error_adding_sec_record | An error occurred while attempting to add the user |
-85 | 335544755 | error_modifying_sec_record | An error occurred while attempting to modify the user record |
-85 | 335544756 | error_deleting_sec_record | An error occurred while attempting to delete the user record |
-85 | 335544757 | error_updating_sec_db | An error occurred while updating the security database |
-103 | 335544571 | dsql_constant_err | Data type for constant unknown |
-104 | 336003075 | dsql_transitional_numeric | Precision 10 to 18 changed from DOUBLE PRECISION in SQL dialect 1 to 64-bit scaled integer in SQL dialect 3 |
-104 | 336003077 | sql_db_dialect_dtype_unsupport | Database SQL dialect @1 does not support reference to @2 datatype |
-104 | 336003087 | dsql_invalid_label | Label @1 @2 in the current scope |
-104 | 336003088 | dsql_datatypes_not_comparable | Datatypes @1are not comparable in expression @2 |
-104 | 335544343 | invalid_blr | Invalid request BLR at offset @1 |
-104 | 335544390 | syntaxerr | BLR syntax error: expected @1 at offset @2, encountered @3 |
-104 | 335544425 | ctxinuse | Context already in use (BLR error) |
-104 | 335544426 | ctxnotdef | Context not defined (BLR error) |
-104 | 335544429 | badparnum | Bad parameter number |
-104 | 335544440 | bad_msg_vec | — |
-104 | 335544456 | invalid_sdl | Invalid slice description language at offset @1 |
-104 | 335544570 | dsql_command_err | Invalid command |
-104 | 335544579 | dsql_internal_err | Internal error |
-104 | 335544590 | dsql_dup_option | Option specified more than once |
-104 | 335544591 | dsql_tran_err | Unknown transaction option |
-104 | 335544592 | dsql_invalid_array | Invalid array reference |
-104 | 335544608 | command_end_err | Unexpected end of command |
-104 | 335544612 | token_err | Token unknown |
-104 | 335544634 | dsql_token_unk_err | Token unknown — line @1, column @2 |
-104 | 335544709 | dsql_agg_ref_err | Invalid aggregate reference |
-104 | 335544714 | invalid_array_id | Invalid blob id |
-104 | 335544730 | cse_not_supported | Client/Server Express not supported in this release |
-104 | 335544743 | token_too_long | Token size exceeds limit |
-104 | 335544763 | invalid_string_constant | A string constant is delimited by double quotes |
-104 | 335544764 | transitional_date | DATE must be changed to TIMESTAMP |
-104 | 335544796 | sql_dialect_datatype_unsupport | Client SQL dialect @1 does not support reference to @2 datatype |
-104 | 335544798 | depend_on_uncommitted_rel | You created an indirect dependency on uncommitted metadata. You must roll back the current transaction |
-104 | 335544821 | dsql_column_pos_err | Invalid column position used in the @1 clause |
-104 | 335544822 | dsql_agg_where_err | Cannot use an aggregate function in a WHERE clause, use HAVING instead |
-104 | 335544823 | dsql_agg_group_err | Cannot use an aggregate function in a GROUP BY clause |
-104 | 335544824 | dsql_agg_column_err | Invalid expression in the @1 (not contained in either an aggregate function or the GROUP BY clause) |
-104 | 335544825 | dsql_agg_having_err | Invalid expression in the @1 (neither an aggregate function nor a part of the GROUP BY clause) |
-104 | 335544826 | dsql_agg_nested_err | Nested aggregate functions are not allowed |
-104 | 335544849 | malformed_string | Malformed string |
-104 | 335544851 | command_end_err2 | Unexpected end of command- line @1, column @2 |
-104 | 336397215 | dsql_max_sort_items | Cannot sort on more than 255 items |
-104 | 336397216 | dsql_max_group_items | Cannot group on more than 255 items |
-104 | 336397217 | dsql_conflicting_sort_field | Cannot include the same field (@[email protected]) twice in the ORDER BY clause with conflicting sorting options |
-104 | 336397218 | dsql_derived_table_more_columns | Column list from derived table @1 has more columns than the number of items in its SELECT statement |
-104 | 336397219 | dsql_derived_table_less_columns | Column list from derived table @1 has less columns than the number of items in its SELECT statement |
-104 | 336397220 | dsql_derived_field_unnamed | No column name specified for column number @1 in derived table @2 |
-104 | 336397221 | dsql_derived_field_dup_name | Column @1 was specified multiple times for derived table @2 |
-104 | 336397222 | dsql_derived_alias_select | Internal dsql error: alias type expected by pass1_expand_select_node |
-104 | 336397223 | dsql_derived_alias_field | Internal dsql error: alias type expected by pass1_field |
-104 | 336397224 | dsql_auto_field_bad_pos | Internal dsql error: column position out of range in pass1_union_auto_cast |
-104 | 336397225 | dsql_cte_wrong_reference | Recursive CTE member (@1) can refer itself only in FROM clause |
-104 | 336397226 | dsql_cte_cycle | CTE ‘@1’ has cyclic dependencies |
-104 | 336397227 | dsql_cte_outer_join | Recursive member of CTE can’t be member of an outer join |
-104 | 336397228 | dsql_cte_mult_references | Recursive member of CTE can’t reference itself more than once |
-104 | 336397229 | dsql_cte_not_a_union | Recursive CTE (@1) must be an UNION |
-104 | 336397230 | dsql_cte_nonrecurs_after_recurs | CTE ‘@1’ defined non-recursive member after recursive |
-104 | 336397231 | dsql_cte_wrong_clause | Recursive member of CTE ‘@1’ has @2 clause |
-104 | 336397232 | dsql_cte_union_all | Recursive members of CTE (@1) must be linked with another members via UNION ALL |
-104 | 336397233 | dsql_cte_miss_nonrecursive | Non-recursive member is missing in CTE ‘@1’ |
-104 | 336397234 | dsql_cte_nested_with | WITH clause can’t be nested |
-104 | 336397235 | dsql_col_more_than_once_using | Column @1 appears more than once in USING clause |
-104 | 336397237 | dsql_cte_not_used | CTE «@1» is not used in query |
-105 | 335544702 | like_escape_invalid | Invalid ESCAPE sequence |
-105 | 335544789 | extract_input_mismatch | Specified EXTRACT part does not exist in input datatype |
-150 | 335544360 | read_only_rel | Attempted update of read-only table |
-150 | 335544362 | read_only_view | Cannot update read-only view @1 |
-150 | 335544446 | non_updatable | Not updatable |
-150 | 335544546 | constaint_on_view | Cannot define constraints on views |
-151 | 335544359 | read_only_field | Attempted update of read — only column |
-155 | 335544658 | dsql_base_table | @1 is not a valid base table of the specified view |
-157 | 335544598 | specify_field_err | Must specify column name for view select expression |
-158 | 335544599 | num_field_err | Number of columns does not match select list |
-162 | 335544685 | no_dbkey | Dbkey not available for multi — table views |
-170 | 335544512 | prcmismat | Input parameter mismatch for procedure @1 |
-170 | 335544619 | extern_func_err | External functions cannot have morethan 10 parametrs |
-170 | 335544850 | prc_out_param_mismatch | Output parameter mismatch for procedure @1 |
-171 | 335544439 | funmismat | Function @1 could not be matched |
-171 | 335544458 | invalid_dimension | Column not array or invalid dimensions (expected @1, encountered @2) |
-171 | 335544618 | return_mode_err | Return mode by value not allowed for this data type |
-171 | 335544873 | array_max_dimensions | Array data type can use up to @1 dimensions |
-172 | 335544438 | funnotdef | Function @1 is not defined |
-203 | 335544708 | dyn_fld_ambiguous | Ambiguous column reference |
-204 | 336003085 | dsql_ambiguous_field_name | Ambiguous field name between @1 and @2 |
-204 | 335544463 | gennotdef | Generator @1 is not defined |
-204 | 335544502 | stream_not_defined | Reference to invalid stream number |
-204 | 335544509 | charset_not_found | CHARACTER SET @1 is not defined |
-204 | 335544511 | prcnotdef | Procedure @1 is not defined |
-204 | 335544515 | codnotdef | Status code @1 unknown |
-204 | 335544516 | xcpnotdef | Exception @1 not defined |
-204 | 335544532 | ref_cnstrnt_notfound | Name of Referential Constraint not defined in constraints table |
-204 | 335544551 | grant_obj_notfound | Could not find table/procedure for GRANT |
-204 | 335544568 | text_subtype | Implementation of text subtype @1 not located |
-204 | 335544573 | dsql_datatype_err | Data type unknown |
-204 | 335544580 | dsql_relation_err | Table unknown |
-204 | 335544581 | dsql_procedure_err | Procedure unknown |
-204 | 335544588 | collation_not_found | COLLATION @1 for CHARACTER SET @2 is not defined |
-204 | 335544589 | collation_not_for_charset | COLLATION @1 is not valid for specified CHARACTER SET |
-204 | 335544595 | dsql_trigger_err | Trigger unknown |
-204 | 335544620 | alias_conflict_err | Alias @1 conflicts with an alias in the same statement |
-204 | 335544621 | procedure_conflict_error | Alias @1 conflicts with a procedure in the same statement |
-204 | 335544622 | relation_conflict_err | Alias @1 conflicts with a table in the same statement |
-204 | 335544635 | dsql_no_relation_alias | There is no alias or table named @1 at this scope level |
-204 | 335544636 | indexname | There is no index @1 for table @2 |
-204 | 335544640 | collation_requires_text | Invalid use of CHARACTER SET or COLLATE |
-204 | 335544662 | dsql_blob_type_unknown | BLOB SUB_TYPE @1 is not defined |
-204 | 335544759 | bad_default_value | Can not define a not null column with NULL as default value |
-204 | 335544760 | invalid_clause | Invalid clause — ‘@1’ |
-204 | 335544800 | too_many_contexts | Too many Contexts of Relation/Procedure/Views. Maximum allowed is 255 |
-204 | 335544817 | bad_limit_param | Invalid parameter to FIRST.Only integers >= 0 are allowed |
-204 | 335544818 | bad_skip_param | Invalid parameter to SKIP. Only integers >= 0 are allowed |
-204 | 335544837 | bad_substring_offset | Invalid offset parameter @1 to SUBSTRING. Only positive integers are allowed |
-204 | 335544853 | bad_substring_length | Invalid length parameter @1 to SUBSTRING. Negative integers are not allowed |
-204 | 335544854 | charset_not_installed | CHARACTER SET @1 is not installed |
-204 | 335544855 | collation_not_installed | COLLATION @1 for CHARACTER SET @2 is not installed |
-204 | 335544867 | subtype_for_internal_use | Blob sub_types bigger than 1 (text) are for internal use only |
-205 | 335544396 | fldnotdef | Column @1 is not defined in table @2 |
-205 | 335544552 | grant_fld_notfound | Could not find column for GRANT |
-205 | 335544883 | fldnotdef2 | Column @1 is not defined in procedure @2 |
-206 | 335544578 | dsql_field_err | Column unknown |
-206 | 335544587 | dsql_blob_err | Column is not a BLOB |
-206 | 335544596 | dsql_subselect_err | Subselect illegal in this context |
-206 | 336397208 | dsql_line_col_error | At line @1, column @2 |
-206 | 336397209 | dsql_unknown_pos | At unknown line and column |
-206 | 336397210 | dsql_no_dup_name | Column @1 cannot be repeated in @2 statement |
-208 | 335544617 | order_by_err | Invalid ORDER BY clause |
-219 | 335544395 | relnotdef | Table @1 is not defined |
-219 | 335544872 | domnotdef | Domain @1 is not defined |
-230 | 335544487 | walw_err | WAL Writer error |
-231 | 335544488 | logh_small | Log file header of @1 too small |
-232 | 335544489 | logh_inv_version | Invalid version of log file @1 |
-233 | 335544490 | logh_open_flag | Log file @1 not latest in the chain but open flag still set |
-234 | 335544491 | logh_open_flag2 | Log file @1 not closed properly; database recovery may be required |
-235 | 335544492 | logh_diff_dbname | Database name in the log file @1 is different |
-236 | 335544493 | logf_unexpected_eof | Unexpected end of log file @1 at offset @2 |
-237 | 335544494 | logr_incomplete | Incomplete log record at offset @1 in log file @2 |
-238 | 335544495 | logr_header_small2 | Log record header too small at offset @1 in log file @ |
-239 | 335544496 | logb_small | Log block too small at offset @1 in log file @2 |
-239 | 335544691 | cache_too_small | Insufficient memory to allocate page buffer cache |
-239 | 335544693 | log_too_small | Log size too small |
-239 | 335544694 | partition_too_small | Log partition size too small |
-243 | 335544500 | no_wal | Database does not use Write-ahead Log |
-257 | 335544566 | start_cm_for_wal | WAL defined; Cache Manager must be started first |
-260 | 335544690 | cache_redef | Cache redefined |
-260 | 335544692 | log_redef | Log redefined |
-261 | 335544695 | partition_not_supp | Partitions not supported in series of log file specification |
-261 | 335544696 | log_length_spec | Total length of a partitioned log must be specified |
-281 | 335544637 | no_stream_plan | Table @1 is not referenced in plan |
-282 | 335544638 | stream_twice | Table @1 is referenced more than once in plan; use aliases to distinguish |
-282 | 335544643 | dsql_self_join | The table @1 is referenced twice; use aliases to differentiate |
-282 | 335544659 | duplicate_base_table | Table @1 is referenced twice in view; use an alias to distinguish |
-282 | 335544660 | view_alias | View @1 has more than one base table; use aliases to distinguish |
-282 | 335544710 | complex_view | Navigational stream @1 references a view with more than one base table |
-283 | 335544639 | stream_not_found | Table @1 is referenced in the plan but not the from list |
-284 | 335544642 | index_unused | Index @1 cannot be used in the specified plan |
-291 | 335544531 | primary_key_notnull | Column used in a PRIMARY constraint must be NOT NULL |
-292 | 335544534 | ref_cnstrnt_update | Cannot update constraints (RDB$REF_CONSTRAINTS) |
-293 | 335544535 | check_cnstrnt_update | Cannot update constraints (RDB$CHECK_CONSTRAINTS) |
-294 | 335544536 | check_cnstrnt_del | Cannot delete CHECK constraint entry (RDB$CHECK_CONSTRAINTS) |
-295 | 335544545 | rel_cnstrnt_update | Cannot update constraints (RDB$RELATION_CONSTRAINTS) |
-296 | 335544547 | invld_cnstrnt_type | Internal gds software consistency check (invalid RDB$CONSTRAINT_TYPE) |
-297 | 335544558 | check_constraint | Operation violates check constraint @1 on view or table @2 |
-313 | 336003099 | upd_ins_doesnt_match_pk | UPDATE OR INSERT field list does not match primary key of table @1 |
-313 | 336003100 | upd_ins_doesnt_ match _matching | UPDATE OR INSERT field list does not match MATCHING clause |
-313 | 335544669 | dsql_count_mismatch | Count of column list and variable list do not match |
-314 | 335544565 | transliteration_failed | Cannot transliterate character between character sets |
-315 | 336068815 | dyn_dtype_invalid | Cannot change datatype for column @1.Changing datatype is not supported for BLOB or ARRAY columns |
-383 | 336068814 | dyn_dependency_exists | Column @1 from table @2 is referenced in @3 |
-401 | 335544647 | invalid_operator | Invalid comparison operator for find operation |
-402 | 335544368 | segstr_no_op | Attempted invalid operation on a BLOB |
-402 | 335544414 | blobnotsup | BLOB and array data types are not supported for @1 operation |
-402 | 335544427 | datnotsup | Data operation not supported |
-406 | 335544457 | out_of_bounds | Subscript out of bounds |
-407 | 335544435 | nullsegkey | Null segment of UNIQUE KEY |
-413 | 335544334 | convert_error | Conversion error from string «@1» |
Table B.3. SQLCODE and GDSCODE Error Codes and Message Texts (2)
SQLCODE | GDSCODE | Symbol | Message Text |
---|---|---|---|
-413 | 335544454 | nofilter | Filter not found to convert type @1 to type @2 |
-413 | 335544860 | blob_convert_error | Unsupported conversion to target type BLOB (subtype @1) |
-413 | 335544861 | array_convert_error | Unsupported conversion to target type ARRAY |
-501 | 335544577 | dsql_cursor_close_err | Attempt to reclose a closed cursor |
-502 | 336003090 | dsql_cursor_redefined | Statement already has a cursor @1 assigned |
-502 | 336003091 | dsql_cursor_not_found | Cursor @1 is not found in the current context |
-502 | 336003092 | dsql_cursor_exists | Cursor @1 already exists in the current context |
-502 | 336003093 | dsql_cursor_rel_ambiguous | Relation @1 is ambiguous in cursor @2 |
-502 | 336003094 | dsql_cursor_rel_not_found | Relation @1 is not found in cursor @2 |
-502 | 336003095 | dsql_cursor_not_open | Cursor is not open |
-502 | 335544574 | dsql_decl_err | Invalid cursor declaration |
-502 | 335544576 | dsql_cursor_open_err | Attempt to reopen an open cursor |
-504 | 336003089 | dsql_cursor_invalid | Empty cursor name is not allowed |
-504 | 335544572 | dsql_cursor_err | Invalid cursor reference |
-508 | 335544348 | no_cur_rec | No current record for fetch operation |
-510 | 335544575 | dsql_cursor_update_err | Cursor @1 is not updatable |
-518 | 335544582 | dsql_request_err | Request unknown |
-519 | 335544688 | dsql_open_cursor_request | The prepare statement identifies a prepare statement with an open cursor |
-530 | 335544466 | foreign_key | Violation of FOREIGN KEY constraint «@1» on table «@2» |
-530 | 335544838 | foreign_key_target_doesnt_exist | Foreign key reference target does not exist |
-530 | 335544839 | foreign_key_references_present | Foreign key references are present for the record |
-531 | 335544597 | dsql_crdb_prepare_err | Cannot prepare a CREATE DATABASE/SCHEMA statement |
-532 | 335544469 | trans_invalid | Transaction marked invalid by I/O error |
-551 | 335544352 | no_priv | No permission for @1 access to @2 @3 |
-551 | 335544790 | insufficient_svc_privileges | Service @1 requires SYSDBA permissions. Reattach to the Service Manager using the SYSDBA account |
-552 | 335544550 | not_rel_owner | Only the owner of a table may reassign ownership |
-552 | 335544553 | grant_nopriv | User does not have GRANT privileges for operation |
-552 | 335544707 | grant_nopriv_on_base | User does not have GRANT privileges on base table/view for operation |
-553 | 335544529 | existing_priv_mod | Cannot modify an existing user privilege |
-595 | 335544645 | stream_crack | The current position is on a crack |
-596 | 335544644 | stream_bof | Illegal operation when at beginning of stream |
-597 | 335544632 | dsql_file_length_err | Preceding file did not specify length, so @1 must include starting page number |
-598 | 335544633 | dsql_shadow_number_err | Shadow number must be a positive integer |
-599 | 335544607 | node_err | Gen.c: node not supported |
-599 | 335544625 | node_name_err | A node name is not permitted in a secondary, shadow, cache or log file name |
-600 | 335544680 | crrp_data_err | Sort error: corruption in data structure |
-601 | 335544646 | db_or_file_exists | Database or file exists |
-604 | 335544593 | dsql_max_arr_dim_exceeded | Array declared with too many dimensions |
-604 | 335544594 | dsql_arr_range_error | Illegal array dimension range |
-605 | 335544682 | dsql_field_ref | Inappropriate self-reference of column |
-607 | 336003074 | dsql_dbkey_from_non_table | Cannot SELECT RDB$DB_KEY from a stored procedure |
-607 | 336003086 | dsql_udf_return_pos_err | External function should have return position between 1 and @1 |
-607 | 336003096 | dsql_type_not_supp_ext_tab | Data type @1 is not supported for EXTERNAL TABLES. Relation ‘@2’, field ‘@3’ |
-607 | 335544351 | no_meta_update | Unsuccessful metadata update |
-607 | 335544549 | systrig_update | Cannot modify or erase a system trigger |
-607 | 335544657 | dsql_no_blob_array | Array/BLOB/DATE data types not allowed in arithmetic |
-607 | 335544746 | reftable_requires_pk | «REFERENCES table» without «(column)» requires PRIMARY KEY on referenced table |
-607 | 335544815 | generator_name | GENERATOR @1 |
-607 | 335544816 | udf_name | UDF @1 |
-607 | 335544858 | must_have_phys_field | Can’t have relation with only computed fields or constraints |
-607 | 336397206 | dsql_table_not_found | Table @1 does not exist |
-607 | 336397207 | dsql_view_not_found | View @1 does not exist |
-607 | 336397212 | dsql_no_array_computed | Array and BLOB data types not allowed in computed field |
-607 | 336397214 | dsql_only_can_subscript_array | Scalar operator used on field @1 which is not an array |
-612 | 336068812 | dyn_domain_name_exists | Cannot rename domain @1 to @2. A domain with that name already exists |
-612 | 336068813 | dyn_field_name_exists | Cannot rename column @1 to @2.A column with that name already exists in table @3 |
-615 | 335544475 | relation_lock | Lock on table @1 conflicts with existing lock |
-615 | 335544476 | record_lock | Requested record lock conflicts with existing lock |
-615 | 335544507 | range_in_use | Refresh range number @1 already in use |
-616 | 335544530 | primary_key_ref | Cannot delete PRIMARY KEY being used in FOREIGN KEY definition |
-616 | 335544539 | integ_index_del | Cannot delete index used by an Integrity Constraint |
-616 | 335544540 | integ_index_mod | Cannot modify index used by an Integrity Constraint |
-616 | 335544541 | check_trig_del | Cannot delete trigger used by a CHECK Constraint |
-616 | 335544543 | cnstrnt_fld_del | Cannot delete column being used in an Integrity Constraint |
-616 | 335544630 | dependency | There are @1 dependencies |
-616 | 335544674 | del_last_field | Last column in a table cannot be deleted |
-616 | 335544728 | integ_index_deactivate | Cannot deactivate index used by an integrity constraint |
-616 | 335544729 | integ_deactivate_primary | Cannot deactivate index used by a PRIMARY/UNIQUE constraint |
-617 | 335544542 | check_trig_update | Cannot update trigger used by a CHECK Constraint |
-617 | 335544544 | cnstrnt_fld_rename | Cannot rename column being used in an Integrity Constraint |
-618 | 335544537 | integ_index_seg_del | Cannot delete index segment used by an Integrity Constraint |
-618 | 335544538 | integ_index_seg_mod | Cannot update index segment used by an Integrity Constraint |
-625 | 335544347 | not_valid | Validation error for column @1, value «@2» |
-625 | 335544879 | not_valid_for_var | Validation error for variable @1, value «@2» |
-625 | 335544880 | not_valid_for | Validation error for @1, value «@2» |
-637 | 335544664 | dsql_duplicate_spec | Duplicate specification of @1- not supported |
-637 | 336397213 | dsql_implicit_domain_name | Implicit domain name @1 not allowed in user created domain |
-660 | 336003098 | primary_key_required | Primary key required on table @1 |
-660 | 335544533 | foreign_key_notfound | Non-existent PRIMARY or UNIQUE KEY specified for FOREIGN KEY |
-660 | 335544628 | idx_create_err | Cannot create index @1 |
-663 | 335544624 | idx_seg_err | Segment count of 0 defined for index @1 |
-663 | 335544631 | idx_key_err | Too many keys defined for index @1 |
-663 | 335544672 | key_field_err | Too few key columns found for index @1 (incorrect column name?) |
-664 | 335544434 | keytoobig | Key size exceeds implementation restriction for index «@1» |
-677 | 335544445 | ext_err | @1 extension error |
-685 | 335544465 | bad_segstr_type | Invalid BLOB type for operation |
-685 | 335544670 | blob_idx_err | Attempt to index BLOB column in index @1 |
-685 | 335544671 | array_idx_err | Attempt to index array column in index @1 |
-689 | 335544403 | badpagtyp | Page @1 is of wrong type (expected @2, found @3) |
-689 | 335544650 | page_type_err | Wrong page type |
-690 | 335544679 | no_segments_err | Segments not allowed in expression index @1 |
-691 | 335544681 | rec_size_err | New record size of @1 bytes is too big |
-692 | 335544477 | max_idx | Maximum indexes per table (@1) exceeded |
-693 | 335544663 | req_max_clones_exceeded | Too many concurrent executions of the same request |
-694 | 335544684 | no_field_access | Cannot access column @1 in view @2 |
-802 | 335544321 | arith_except | Arithmetic exception, numeric overflow, or string truncation |
-802 | 335544836 | concat_overflow | Concatenation overflow. Resulting string cannot exceed 32K in length |
-803 | 335544349 | no_dup | Attempt to store duplicate value ( visible to active transactions ) in unique index «@1» |
-803 | 335544665 | unique_key_violation | Violation of PRIMARY or UNIQUE KEY constraint «@1» on table «@2» |
-804 | 336003097 | dsql_feature_not_supported_ods | Feature not supported on ODS version older than @[email protected] |
-804 | 335544380 | wronumarg | Wrong number of arguments on call |
-804 | 335544583 | dsql_sqlda_err | SQLDA missing or incorrect version, or incorrect number/type of variables |
-804 | 335544584 | dsql_var_count_err | Count of read — write columns does not equal count of values |
-804 | 335544586 | dsql_function_err | Function unknown |
-804 | 335544713 | dsql_sqlda_value_err | Incorrect values within SQLDA structure |
-804 | 336397205 | dsql_too_old_ods | ODS versions before [email protected] are not supported |
-806 | 335544600 | col_name_err | Only simple column names permitted for VIEW WITH CHECK OPTION |
-807 | 335544601 | where_err | No WHERE clause for VIEW WITH CHECK OPTION |
-808 | 335544602 | table_view_err | Only one table allowed for VIEW WITH CHECK OPTION |
-809 | 335544603 | distinct_err | DISTINCT, GROUP or HAVING not permitted for VIEW WITH CHECK OPTION |
-810 | 335544605 | subquery_err | No subqueries permitted for VIEW WITH CHECK OPTION |
-811 | 335544652 | sing_select_err | Multiple rows in singleton select |
-816 | 335544651 | ext_readonly_err | Cannot insert because the file is readonly or is on a read only medium |
-816 | 335544715 | extfile_uns_op | Operation not supported for EXTERNAL FILE table @1 |
-817 | 336003079 | isc_sql_dialect_conflict_num | DB dialect @1 and client dialect @2 conflict with respect to numeric precision @3 |
-817 | 336003101 | upd_ins_with_complex_view | UPDATE OR INSERT without MATCHING could not be used with views based on more than one table |
-817 | 336003102 | dsql_incompatible_trigger_type | Incompatible trigger type |
-817 | 336003103 | dsql_db_trigger_type_cant_change | Database trigger type can’t be changed |
-817 | 335544361 | read_only_trans | Attempted update during read — only transaction |
-817 | 335544371 | segstr_no_write | Attempted write to read-only BLOB |
-817 | 335544444 | read_only | Operation not supported |
-817 | 335544765 | read_only_database | Attempted update on read — only database |
-817 | 335544766 | must_be_dialect_2_and_up | SQL dialect @1 is not supported in this database |
-817 | 335544793 | ddl_not_allowed_by_db_sql_dial | Metadata update statement is not allowed by the current database SQL dialect @1 |
-820 | 335544356 | obsolete_metadata | Metadata is obsolete |
-820 | 335544379 | wrong_ods | Unsupported on — disk structure for file @1; found @[email protected], support @[email protected] |
-820 | 335544437 | wrodynver | Wrong DYN version |
-820 | 335544467 | high_minor | Minor version too high found @1 expected @2 |
-820 | 335544881 | need_difference | Difference file name should be set explicitly for database on raw device |
-823 | 335544473 | invalid_bookmark | Invalid bookmark handle |
-824 | 335544474 | bad_lock_level | Invalid lock level @1 |
-825 | 335544519 | bad_lock_handle | Invalid lock handle |
-826 | 335544585 | dsql_stmt_handle | Invalid statement handle |
-827 | 335544655 | invalid_direction | Invalid direction for find operation |
-827 | 335544718 | invalid_key | Invalid key for find operation |
-828 | 335544678 | inval_key_posn | Invalid key position |
-829 | 336068816 | dyn_char_fld_too_small | New size specified for column @1 must be at least @2 characters |
-829 | 336068817 | dyn_invalid_dtype_conversion | Cannot change datatype for @1.Conversion from base type @2 to @3 is not supported |
-829 | 336068818 | dyn_dtype_conv_invalid | Cannot change datatype for column @1 from a character type to a non-character type |
-829 | 336068829 | max_coll_per_charset | Maximum number of collations per character set exceeded |
-829 | 336068830 | invalid_coll_attr | Invalid collation attributes |
-829 | 336068852 | dyn_scale_too_big | New scale specified for column @1 must be at most @2 |
-829 | 336068853 | dyn_precision_too_small | New precision specified for column @1 must be at least @2 |
-829 | 335544616 | field_ref_err | Invalid column reference |
-830 | 335544615 | field_aggregate_err | Column used with aggregate |
-831 | 335544548 | primary_key_exists | Attempt to define a second PRIMARY KEY for the same table |
-832 | 335544604 | key_field_count_err | FOREIGN KEY column count does not match PRIMARY KEY |
-833 | 335544606 | expression_eval_err | Expression evaluation not supported |
-833 | 335544810 | date_range_exceeded | Value exceeds the range for valid dates |
-834 | 335544508 | range_not_found | Refresh range number @1 not found |
-835 | 335544649 | bad_checksum | Bad checksum |
-836 | 335544517 | except | Exception @1 |
-836 | 335544848 | except2 | Exception @1 |
-837 | 335544518 | cache_restart | Restart shared cache manager |
-838 | 335544560 | shutwarn | Database @1 shutdown in @2 seconds |
-841 | 335544677 | version_err | Too many versions |
-842 | 335544697 | precision_err | Precision must be from 1 to 18 |
-842 | 335544698 | scale_nogt | Scale must be between zero and precision |
-842 | 335544699 | expec_short | Short integer expected |
-842 | 335544700 | expec_long | Long integer expected |
-842 | 335544701 | expec_ushort | Unsigned short integer expected |
-842 | 335544712 | expec_positive | Positive value expected |
-901 | 335740929 | gfix_db_name | Database file name (@1) already given |
-901 | 336330753 | gbak_unknown_switch | Found unknown switch |
-901 | 336920577 | gstat_unknown_switch | Found unknown switch |
-901 | 336986113 | fbsvcmgr_bad_am | Wrong value for access mode |
-901 | 335740930 | gfix_invalid_sw | Invalid switch @1 |
-901 | 335544322 | bad_dbkey | Invalid database key |
-901 | 336986114 | fbsvcmgr_bad_wm | Wrong value for write mode |
-901 | 336330754 | gbak_page_size_missing | Page size parameter missing |
-901 | 336920578 | gstat_retry | Please retry, giving a database name |
-901 | 336986115 | fbsvcmgr_bad_rs | Wrong value for reserve space |
-901 | 336920579 | gstat_wrong_ods | Wrong ODS version, expected @1, encountered @2 |
-901 | 336330755 | gbak_page_size_toobig | Page size specified (@1) greater than limit (16384 bytes) |
-901 | 335740932 | gfix_incmp_sw | Incompatible switch combination |
-901 | 336920580 | gstat_unexpected_eof | Unexpected end of database file |
-901 | 336330756 | gbak_redir_ouput_missing | Redirect location for output is not specified |
-901 | 336986116 | fbsvcmgr_info_err | Unknown tag (@1) in info_svr_db_info block after isc_svc_query() |
-901 | 335740933 | gfix_replay_req | Replay log pathname required |
-901 | 336330757 | gbak_switches_conflict | Conflicting switches for backup/restore |
-901 | 336986117 | fbsvcmgr_query_err | Unknown tag (@1) in isc_svc_query() results |
-901 | 335544326 | bad_dpb_form | Unrecognized database parameter block |
-901 | 335740934 | gfix_pgbuf_req | Number of page buffers for cache required |
-901 | 336986118 | fbsvcmgr_switch_unknown | Unknown switch «@1» |
-901 | 336330758 | gbak_unknown_device | Device type @1 not known |
-901 | 335544327 | bad_req_handle | Invalid request handle |
-901 | 335740935 | gfix_val_req | Numeric value required |
-901 | 336330759 | gbak_no_protection | Protection is not there yet |
-901 | 335544328 | bad_segstr_handle | Invalid BLOB handle |
-901 | 335740936 | gfix_pval_req | Positive numeric value required |
-901 | 336330760 | gbak_page_size_not_allowed | Page size is allowed only on restore or create |
Table B.4. SQLCODE and GDSCODE Error Codes and Message Texts (3)
SQLCODE | GDSCODE | Symbol | Message Text |
---|---|---|---|
-901 | 335544329 | bad_segstr_id | Invalid BLOB ID |
-901 | 335740937 | gfix_trn_req | Number of transactions per sweep required |
-901 | 336330761 | gbak_multi_source_dest | Multiple sources or destinations specified |
-901 | 335544330 | bad_tpb_content | Invalid parameter in transaction parameter block |
-901 | 336330762 | gbak_filename_missing | Requires both input and output filenames |
-901 | 335544331 | bad_tpb_form | Invalid format for transaction parameter block |
-901 | 336330763 | gbak_dup_inout_names | Input and output have the same name. Disallowed |
-901 | 335740940 | gfix_full_req | «full» or «reserve» required |
-901 | 335544332 | bad_trans_handle | Invalid transaction handle (expecting explicit transaction start) |
-901 | 336330764 | gbak_inv_page_size | Expected page size, encountered «@1» |
-901 | 335740941 | gfix_usrname_req | User name required |
-901 | 336330765 | gbak_db_specified | REPLACE specified, but the first file @1 is a database |
-901 | 335740942 | gfix_pass_req | Password required |
-901 | 336330766 | gbak_db_exists | Database @1 already exists.To replace it, use the -REP switch |
-901 | 335740943 | gfix_subs_name | Subsystem name |
-901 | 336723983 | gsec_cant_open_db | Unable to open database |
-901 | 336330767 | gbak_unk_device | Device type not specified |
-901 | 336723984 | gsec_switches_error | Error in switch specifications |
-901 | 335740945 | gfix_sec_req | Number of seconds required |
-901 | 335544337 | excess_trans | Attempt to start more than @1 transactions |
-901 | 336723985 | gsec_no_op_spec | No operation specified |
-901 | 335740946 | gfix_nval_req | Numeric value between 0 and 32767 inclusive required |
-901 | 336723986 | gsec_no_usr_name | No user name specified |
-901 | 335740947 | gfix_type_shut | Must specify type of shutdown |
-901 | 335544339 | infinap | Information type inappropriate for object specified |
-901 | 335544340 | infona | No information of this type available for object specified |
-901 | 336723987 | gsec_err_add | Add record error |
-901 | 336723988 | gsec_err_modify | Modify record error |
-901 | 336330772 | gbak_blob_info_failed | Gds_$blob_info failed |
-901 | 335740948 | gfix_retry | Please retry, specifying an option |
-901 | 335544341 | infunk | Unknown information item |
-901 | 336723989 | gsec_err_find_mod | Find / modify record error |
-901 | 336330773 | gbak_unk_blob_item | Do not understand BLOB INFO item @1 |
-901 | 335544342 | integ_fail | Action cancelled by trigger (@1) to preserve data integrity |
-901 | 336330774 | gbak_get_seg_failed | Gds_$get_segment failed |
-901 | 336723990 | gsec_err_rec_not_found | Record not found for user: @1 |
-901 | 336723991 | gsec_err_delete | Delete record error |
-901 | 336330775 | gbak_close_blob_failed | Gds_$close_blob failed |
-901 | 335740951 | gfix_retry_db | Please retry, giving a database name |
-901 | 336330776 | gbak_open_blob_failed | Gds_$open_blob failed |
-901 | 336723992 | gsec_err_find_del | Find / delete record error |
-901 | 335544345 | lock_conflict | Lock conflict on no wait transaction |
-901 | 336330777 | gbak_put_blr_gen_id_failed | Failed in put_blr_gen_id |
-901 | 336330778 | gbak_unk_type | Data type @1 not understood |
-901 | 336330779 | gbak_comp_req_failed | Gds_$compile_request failed |
-901 | 336330780 | gbak_start_req_failed | Gds_$start_request failed |
-901 | 336723996 | gsec_err_find_disp | Find / display record error |
-901 | 336330781 | gbak_rec_failed | gds_$receive failed |
-901 | 336920605 | gstat_open_err | Can’t open database file @1 |
-901 | 336723997 | gsec_inv_param | Invalid parameter, no switch defined |
-901 | 335544350 | no_finish | Program attempted to exit without finishing database |
-901 | 336920606 | gstat_read_err | Can’t read a database page |
-901 | 336330782 | gbak_rel_req_failed | Gds_$release_request failed |
-901 | 336723998 | gsec_op_specified | Operation already specified |
-901 | 336920607 | gstat_sysmemex | System memory exhausted |
-901 | 336330783 | gbak_db_info_failed | gds_$database_info failed |
-901 | 336723999 | gsec_pw_specified | Password already specified |
-901 | 336724000 | gsec_uid_specified | Uid already specified |
-901 | 336330784 | gbak_no_db_desc | Expected database description record |
-901 | 335544353 | no_recon | Transaction is not in limbo |
-901 | 336724001 | gsec_gid_specified | Gid already specified |
-901 | 336330785 | gbak_db_create_failed | Failed to create database @1 |
-901 | 336724002 | gsec_proj_specified | Project already specified |
-901 | 336330786 | gbak_decomp_len_error | RESTORE: decompression length error |
-901 | 335544355 | no_segstr_close | BLOB was not closed |
-901 | 336330787 | gbak_tbl_missing | Cannot find table @1 |
-901 | 336724003 | gsec_org_specified | Organization already specified |
-901 | 336330788 | gbak_blob_col_missing | Cannot find column for BLOB |
-901 | 336724004 | gsec_fname_specified | First name already specified |
-901 | 335544357 | open_trans | Cannot disconnect database with open transactions (@1 active) |
-901 | 336330789 | gbak_create_blob_failed | Gds_$create_blob failed |
-901 | 336724005 | gsec_mname_specified | Middle name already specified |
-901 | 335544358 | port_len | Message length error ( encountered @1, expected @2) |
-901 | 336330790 | gbak_put_seg_failed | Gds_$put_segment failed |
-901 | 336724006 | gsec_lname_specified | Last name already specified |
-901 | 336330791 | gbak_rec_len_exp | Expected record length |
-901 | 336724008 | gsec_inv_switch | Invalid switch specified |
-901 | 336330792 | gbak_inv_rec_len | Wrong length record, expected @1 encountered @2 |
-901 | 336330793 | gbak_exp_data_type | Expected data attribute |
-901 | 336724009 | gsec_amb_switch | Ambiguous switch specified |
-901 | 336330794 | gbak_gen_id_failed | Failed in store_blr_gen_id |
-901 | 336724010 | gsec_no_op_specified | No operation specified for parameters |
-901 | 335544363 | req_no_trans | No transaction for request |
-901 | 336330795 | gbak_unk_rec_type | Do not recognize record type @1 |
-901 | 336724011 | gsec_params_not_allowed | No parameters allowed for this operation |
-901 | 335544364 | req_sync | Request synchronization error |
-901 | 336724012 | gsec_incompat_switch | Incompatible switches specified |
-901 | 336330796 | gbak_inv_bkup_ver | Expected backup version 1..8. Found @1 |
-901 | 335544365 | req_wrong_db | Request referenced an unavailable database |
-901 | 336330797 | gbak_missing_bkup_desc | Expected backup description record |
-901 | 336330798 | gbak_string_trunc | String truncated |
-901 | 336330799 | gbak_cant_rest_record | warning — record could not be restored |
-901 | 336330800 | gbak_send_failed | Gds_$send failed |
-901 | 335544369 | segstr_no_read | Attempted read of a new, open BLOB |
-901 | 336330801 | gbak_no_tbl_name | No table name for data |
-901 | 335544370 | segstr_no_trans | Attempted action on blob outside transaction |
-901 | 336330802 | gbak_unexp_eof | Unexpected end of file on backup file |
-901 | 336330803 | gbak_db_format_too_old | Database format @1 is too old to restore to |
-901 | 335544372 | segstr_wrong_db | Attempted reference to BLOB in unavailable database |
-901 | 336330804 | gbak_inv_array_dim | Array dimension for column @1 is invalid |
-901 | 336330807 | gbak_xdr_len_expected | Expected XDR record length |
-901 | 335544376 | unres_rel | Table @1 was omitted from the transaction reserving list |
-901 | 335544377 | uns_ext | Request includes a DSRI extension not supported in this implementation |
-901 | 335544378 | wish_list | Feature is not supported |
-901 | 335544382 | random | @1 |
-901 | 335544383 | fatal_conflict | Unrecoverable conflict with limbo transaction @1 |
-901 | 335740991 | gfix_exceed_max | Internal block exceeds maximum size |
-901 | 335740992 | gfix_corrupt_pool | Corrupt pool |
-901 | 335740993 | gfix_mem_exhausted | Virtual memory exhausted |
-901 | 336330817 | gbak_open_bkup_error | Cannot open backup file @1 |
-901 | 335740994 | gfix_bad_pool | Bad pool id. |
-901 | 336330818 | gbak_open_error | Cannot open status and error output file @1 |
-901 | 335740995 | gfix_trn_not_valid | Transaction state @1 not in valid range |
-901 | 335544392 | bdbincon | Internal error |
-901 | 336724044 | gsec_inv_username | Invalid user name (maximum 31 bytes allowed) |
-901 | 336724045 | gsec_inv_pw_length | Warning — maximum 8 significant bytes of password used |
-901 | 336724046 | gsec_db_specified | Database already specified |
-901 | 336724047 | gsec_db_admin_specified | Database administrator name already specified |
-901 | 336724048 | gsec_db_admin_pw_specified | Database administrator password already specified |
-901 | 336724049 | gsec_sql_role_specified | SQL role name already specified |
-901 | 335741012 | gfix_unexp_eoi | Unexpected end of input |
-901 | 335544407 | dbbnotzer | Database handle not zero |
-901 | 335544408 | tranotzer | Transaction handle not zero |
-901 | 335741018 | gfix_recon_fail | Failed to reconnect to a transaction in database @1 |
-901 | 335544418 | trainlim | Transaction in limbo |
-901 | 335544419 | notinlim | Transaction not in limbo |
-901 | 335544420 | traoutsta | Transaction outstanding |
-901 | 335544428 | badmsgnum | Undefined message number |
-901 | 335741036 | gfix_trn_unknown | Transaction description item unknown |
-901 | 335741038 | gfix_mode_req | «read_only» or «read_write» required |
-901 | 335544431 | blocking_signal | Blocking signal has been received |
-901 | 335741042 | gfix_pzval_req | Positive or zero numeric value required |
-901 | 335544442 | noargacc_read | Database system cannot read argument @1 |
-901 | 335544443 | noargacc_write | Database system cannot write argument @1 |
-901 | 335544450 | misc_interpreted | @1 |
-901 | 335544468 | tra_state | Transaction @1 is @2 |
-901 | 335544485 | bad_stmt_handle | Invalid statement handle |
-901 | 336330934 | gbak_missing_block_fac | Blocking factor parameter missing |
-901 | 336330935 | gbak_inv_block_fac | Expected blocking factor, encountered «@1» |
-901 | 336330936 | gbak_block_fac_specified | A blocking factor may not be used in conjunction with device CT |
-901 | 336068796 | dyn_role_does_not_exist | SQL role @1 does not exist |
-901 | 336330940 | gbak_missing_username | User name parameter missing |
-901 | 336330941 | gbak_missing_password | Password parameter missing |
-901 | 336068797 | dyn_no_grant_admin_opt | User @1 has no grant admin option on SQL role @2 |
-901 | 335544510 | lock_timeout | Lock time-out on wait transaction |
-901 | 336068798 | dyn_user_not_role_member | User @1 is not a member of SQL role @2 |
-901 | 336068799 | dyn_delete_role_failed | @1 is not the owner of SQL role @2 |
-901 | 336068800 | dyn_grant_role_to_user | @1 is a SQL role and not a user |
-901 | 336068801 | dyn_inv_sql_role_name | User name @1 could not be used for SQL role |
-901 | 336068802 | dyn_dup_sql_role | SQL role @1 already exists |
-901 | 336068803 | dyn_kywd_spec_for_role | Keyword @1 can not be used as a SQL role name |
-901 | 336068804 | dyn_roles_not_supported | SQL roles are not supported in on older versions of the database. A backup and restore of the database is required |
-901 | 336330952 | gbak_missing_skipped_bytes | missing parameter for the number of bytes to be skipped |
-901 | 336330953 | gbak_inv_skipped_bytes | Expected number of bytes to be skipped, encountered «@1» |
-901 | 336068820 | dyn_zero_len_id | Zero length identifiers are not allowed |
-901 | 336330965 | gbak_err_restore_charset | Character set |
-901 | 336330967 | gbak_err_restore_collation | Collation |
-901 | 336330972 | gbak_read_error | Unexpected I/O error while reading from backup file |
-901 | 336330973 | gbak_write_error | Unexpected I/O error while writing to backup file |
-901 | 336068840 | dyn_wrong_gtt_scope | @1 cannot reference @2 |
-901 | 336330985 | gbak_db_in_use | Could not drop database @1 (database might be in use) |
-901 | 336330990 | gbak_sysmemex | System memory exhausted |
-901 | 335544559 | bad_svc_handle | Invalid service handle |
-901 | 335544561 | wrospbver | Wrong version of service parameter block |
-901 | 335544562 | bad_spb_form | Unrecognized service parameter block |
-901 | 335544563 | svcnotdef | Service @1 is not defined |
-901 | 336068856 | dyn_ods_not_supp_feature | Feature ‘@1’ is not supported in ODS @[email protected] |
-901 | 336331002 | gbak_restore_role_failed | SQL role |
-901 | 336331005 | gbak_role_op_missing | SQL role parameter missing |
-901 | 336331010 | gbak_page_buffers_missing | Page buffers parameter missing |
-901 | 336331011 | gbak_page_buffers_wrong_param | Expected page buffers, encountered «@1» |
-901 | 336331012 | gbak_page_buffers_restore | Page buffers is allowed only on restore or create |
-901 | 336331014 | gbak_inv_size | Size specification either missing or incorrect for file @1 |
-901 | 336331015 | gbak_file_outof_sequence | File @1 out of sequence |
-901 | 336331016 | gbak_join_file_missing | Can’t join — one of the files missing |
-901 | 336331017 | gbak_stdin_not_supptd | standard input is not supported when using join operation |
-901 | 336331018 | gbak_stdout_not_supptd | Standard output is not supported when using split operation |
-901 | 336331019 | gbak_bkup_corrupt | Backup file @1 might be corrupt |
-901 | 336331020 | gbak_unk_db_file_spec | Database file specification missing |
-901 | 336331021 | gbak_hdr_write_failed | Can’t write a header record to file @1 |
-901 | 336331022 | gbak_disk_space_ex | Free disk space exhausted |
-901 | 336331023 | gbak_size_lt_min | File size given (@1) is less than minimum allowed (@2) |
-901 | 336331025 | gbak_svc_name_missing | Service name parameter missing |
-901 | 336331026 | gbak_not_ownr | Cannot restore over current database, must be SYSDBA or owner of the existing database |
-901 | 336331031 | gbak_mode_req | «read_only» or «read_write» required |
-901 | 336331033 | gbak_just_data | Just data ignore all constraints etc. |
-901 | 336331034 | gbak_data_only | Restoring data only ignoring foreign key, unique, not null & other constraints |
-901 | 335544609 | index_name | INDEX @1 |
-901 | 335544610 | exception_name | EXCEPTION @1 |
-901 | 335544611 | field_name | COLUMN @1 |
-901 | 335544613 | union_err | Union not supported |
Table B.5. SQLCODE and GDSCODE Error Codes and Message Texts (4)
Источник