Malformed string firebird error

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:Malfor...

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:

  1. gfix -user SYSDBA -password masterkey f:dbb.db -shut -force 0
  2. gfix -v -full -user SYSDBA -password masterkey f:dbb.db
  3. gbak -v -t -g -ig -user SYSDBA -Y F:backup.log -password «masterkey» f:dbb.db F:dbb1.db
  4. 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:

  1. backup the metatable
  2. restore the metatable on a new database
  3. 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?

Mark Rotteveel's user avatar

asked Nov 27, 2012 at 17:22

RBA's user avatar

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

Mark Rotteveel's user avatar

answered Nov 27, 2012 at 20:28

Hugues Van Landeghem's user avatar

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

RBA's user avatar

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

ChernyEV's user avatar

Придется начать издалека.

Была база с БЛОБ полем:

Код: Выделить всё

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 running gbak.
If the file name is specified as stdin, 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 the tables, indices etc but none of the data.

-PAS[SWORD] <password>

Supplies the password for the username specified above.
This need not be supplied if ISC_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 if ISC_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 for gbak 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 of gbak 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 the echo 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 and ISC_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 cause gbak to exit with an error code of 1 on Linux and Windows.

2.2. Backup Switches

When running gbak, if the first filename is a database name, or database alias then gbak will default to taking a backup of the database in transportable format.
The backup file will be named as per the second file name supplied on the command line.

You may, if you wish, send the output to standard output rather than a backup file.
In this case, you must specify stdout as the dump file name.
This is not really of much use, unless you wish to pipe the dump through a tool to modify it in some way.
You can pipe the output directly to a gbak restore operation to clone a database without needing an intermediate dump file.
An example is given later in this manual.

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.
Normally gbak 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 text service_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 gbak command, if the first filename is a database backup file name then gbak will default to running a recovery of the database provided that you specify one of -c[create database], -rep[lace_database] or -r[ecreate_database] in order to make your intentions clear.
The database will be restored to whatever file name is specified as the second file name on the command line.

You may, if you wish, read the dump data directly from standard input rather than a backup file.
In this case, you must specify stdin as the dump file name.
You could pipe a gbak dump operation directly to a gbak restore operation to clone a database without needing an intermediate dump file.
An example is given later in this manual.

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 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.

-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 if o[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 the o[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 text service_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 where full uses 100% of each page and reserve reserves some space for subsequent updates.
See the gfix 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 gbak supplied with the running database server.

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 gbak command can be written as follows, leaving out the -b[ackup] switch as gbak defaults to running a backup when no other suitable switches are specified:

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 gbak supplied with the database server you wish to run the (new) database under.
However, gbak from Firebird 2.1 can be used to restore a database onto any version of Firebird.

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 isql in the above examples as gstat -h seems to get confused about how many shadows there are on a database.
It reports zero when there are two, eventually it catches up and reports that there are two, then, if you kill a shadow, it reports that there are now three!

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 -user sysdba and -password whatever parameters on the command lines have been replaced by {…​}.
When executing these commands, any remote gbak commands will require to have them specified unless the firebird user on the remote database(s) has ISC_USER and ISC_PASSWORD defined in the .profile or `.bashrc `(or equivalent) login files.
However, that is a seriously bad idea and incredibly insecure.

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 -z command line switch to view gbak information, then you will create a backup — and overwrite the backup file you supply — if the command line also has a database name and a backup file name present.
This assumes that there is a way for gbak to determine the username and password to be used — either as command line parameters or via defined environment variables.

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 -y Suppress_output plus corrected the formatting of various screen dumps.
They had been reformatted as text at some point.

1.3

24 Jun 2010

ND

Added a bit more details to the -o[ne_at_a_time] restore option to explain transactions.

1.4

09 Aug 2010

ND

Noted that gbak defaults to running a backup or recover according to the first file name parameter supplied.

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 -z option to indicate that it does carry out a backup.

1.6

11 Oct 2011

ND

Updated to cover Firebird 2.5 changes.

Corrected description of -g[arbage_collect] switch.

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.
An additional section was also added to show how, using the above in conjunction with SSH, backup and/or restore operations could be carried out on databases where one or both of the databases in question, are remote.

1.8

14 Jan 2013

ND

Further updates to document the use of the stdin and stdout file names in backups and restores.
A section has been added to Gbak Caveats giving more in depth detail about these two special file names.

1.9

11 Apr 2013

ND

A section has been added to explain how to speedup your backups.
A note has been added to the -service option to explain that it’s use is not restriced to remote databases.
Syntax errors in some examples corrected.

1.10

1 May 2013

ND

Slight update to the -use_[all_space] command line switch, to explain how it works in a more understandable manner.

1.11

1 May 2013

ND

A correction to the above change to the -use_[all_space] command line switch — it affects all subsequent pages as well as the ones created during the restore.

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)

Источник

Понравилась статья? Поделить с друзьями:
  • Makemigrations django error
  • Makehuman как изменить позу
  • Makefile win error
  • Makefile ignore error
  • Makefile error exit