此页面为机器翻译。请阅读英文原文。 English

IBSurgeon 文库

Gbak备份与恢复快速指南

什么是 gbak?

1. 掌握使用 Gbak 进行备份

1.0 准备工作

1.1 使用 gbak 命令进行最简单的 Firebird 备份

1.2. 在 Windows 上可在线执行的本地 gbak 备份

1.3. 使用 TCP/IP 连接字符串的 gbak 备份

1.4. 使用 Service Manager 的更快 gbak 备份

1.5. 使用 Service Manager 并禁止垃圾回收的最快 gbak 备份

1.6. 备份到网络共享或网络位置

1.7. 从远程服务器简单备份到本地机器

1.8. 使用 Service Manager 从远程服务器更快备份到本地机器

1.9. 使用 Service Manager 将远程服务器上的 Firebird 数据库备份到同一远程服务器

1.10. 使用 Firebird 5(或 HQbird 2.5/3.0/4.0/5.0)将 Firebird 数据库备份速度提升 6 倍

2. 使用 Gbak 工具进行还原

2.1. 最简单的还原命令

2.2. 使用 localhost 连接字符串进行还原

2.3. 在 Windows 上使用 XNET 进行还原

2.4. 使用 Service Manager 更快还原

2.5. 不推荐的开关

2.6. 使用别名还原数据库

2.7. 将本地备份还原到远程服务器

2.8. 使用 Service Manager 将本地备份还原到远程服务器

2.9. 还原超长表

3. 调整和记录备份与还原过程

3.1. 带详细输出的 Gbak

3.2. 在详细输出中添加性能统计信息

3.3. 从备份和/或还原中排除表

3.4. 从文件中获取备份或还原的密码

4. 一步式备份-还原

5. 性能总结

关于虚拟机与 Firebird 备份的常见问题

附录 A. 备份/还原过程中的错误

联系方式

什么是 gbak?

Gbak 是 Firebird 的标准命令行工具(官方文档见此处),用于执行:1) 数据库的完整备份:读取数据库中的每条记录并将其存储到备份文件中;2) 将备份还原到新数据库。

对于有其他 RDBMS 经验的开发人员和管理员来说,“备份”一词可能有些令人困惑,因为 gbak 生成的并不是数据库的精确副本,而是一种非数据库格式的文件,仅包含数据(索引以声明形式存储)。

要从 gbak 备份文件创建数据库,需要执行 gbak 的还原过程。

1. 掌握使用 Gbak 进行备份

1.0. 准备工作

让我们创建文件夹 C:\data 并将某个数据库放入其中。我们将使用来自 Firebird OLTP-EMUL 测试的 5Gb 数据库,当然您也可以使用自己的数据库。

对于 Linux 用户–让我们创建文件夹 /db 并将其所有者更改为“firebird”,然后将数据库复制到那里(确保其所有者也是 firebird)。

Code
mkdir /db
chown firebird -R /db

1.1 使用 gbak 命令进行最简单的 Firebird 备份

Windows

Code
gbak -b c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b /db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

在此示例中,gbak 工具使用本地或嵌入式访问来访问数据库文件。

Firebird 3.0: Firebird 3.0 默认配置中的嵌入式访问(firebird.conf 中参数 ServerMode = SuperServer)将尝试对数据库加排他锁,因此其他连接将无法访问数据库(或者由于活动连接,gbak 尝试将失败)。

Firebird 2.5: 在 Windows 上使用 Firebird 2.5 时,该命令将通过 XNET 协议正常工作(当然,前提是您只运行一个 Firebird 实例)。在 Linux 上,Firebird 将尝试使用嵌入式访问,如果不可用,它将自动(且隐式地)尝试通过 TCP/IP 连接。(如果您不知道 XNET、INET 等的含义,请参阅 Firebird 连接字符串速查表)。

注意 1:此命令以操作系统用户(即您自己)的账户运行,并使用其权限访问备份和数据库文件。

通常,Windows 上的 Firebird 服务以 LocalSystem 账户运行,Linux 上以用户“firebird”运行,但控制台通常以您自己的用户账户运行。

如果该用户账户无权访问数据库路径或备份路径,gbak 将失败并显示错误“无法打开备份文件”(参见附录 A. 错误,示例 #5)。

注意 2:gbak -b 会静默覆盖备份文件。因此,如果您已有 backup1.fbk,它将被覆盖。

注意 3:在 Linux 上,此 gbak 命令创建的备份文件的所有者将是控制台用户。

此命令的备份时间:120 秒

1.2. 在 Windows 上可在线执行的本地 gbak 备份

本节仅适用于 Windows 用户! 通常,我们需要在数据库有活动连接时执行备份,因此与其使用嵌入式连接,不如明确指定本地协议,以避免在 Firebird 3 中 gbak 自身对数据库文件加排他锁,即 XNET。

对于 Firebird 3.0:

Code
gbak -b xnet://c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

对于 Firebird 2.5,我们可以使用本地连接字符串,它也会使用 XNET:

Code
gbak -b c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

在 Linux 上,Firebird 不支持像 Windows 上 XNET 那样的特定本地协议,因此有必要使用 TCP/IP 连接字符串(参见第 1.3 节)。

此外,XNET 仅适用于单个 Firebird 实例,因此如果您在 Windows 上运行多个 Firebird 实例,使用 INET 风格的连接字符串来指定目标服务器实例可能更容易。

备份时间:139 秒

1.3. 使用 TCP/IP 连接字符串的 gbak 备份

这是最通用的 gbak 命令,用于在线执行备份。

Windows

Code
gbak -b localhost:c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b localhost:/db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

在这种情况下,通过在数据库路径开头指定 localhost:,连接通过 Firebird 的网络子系统完成。

它比本地访问稍慢,但在我们有正在运行且接受连接的服务器时,适用于所有情况。

Firebird 的非标准端口

如果您的 Firebird 运行在非标准端口上(例如 3051 而不是 3050),您可以这样进行备份:

Windows

Code
gbak -b localhost/3051:c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b localhost/3051:/db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

备份时间:182 秒

1.4. 使用 Service Manager 通过 gbak 实现更快的备份

我们如何实现 TCP/IP 连接的通用性、支持非标准端口,以及快速的本地备份?让我们使用 Service Manager!简单来说,Service Manager 是通过 Firebird 引擎运行标准工具的方式。请注意,在使用 Service Manager 的情况下,无需在数据库路径中指定服务器名称,只需在 -se 参数中指定即可。

Windows

Code
gbak -b -se localhost:service_mgr c:\Data\test1.fdb  c:\Data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b -se localhost:service_mgr /db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

此命令使用 -service 开关来指定我们想要使用端口 3050 上 Firebird 实例的 Service Manager 来执行备份。

在这种情况下,备份将直接在 Firebird 进程内部执行(它包含 gbak 代码的副本),并且由于进程内通信速度快得多,因此备份速度将显著提高。

如果 Firebird 运行在非标准端口(例如 3051)上,命令可以如下所示:

Code
gbak -b -se localhost/3051:service_mgr c:\Data\test1.fdb  c:\Data\backup1.fbk -user SYSDBA -pass masterkey

注意:Firebird 2.5 和 Firebird 3.0.0-3.0.5(仅在 3.0.6 中移除)存在一个显著限制:命令行(所有参数以及数据库和备份的路径)必须少于 256 个字符。

如果您遇到此限制,例如由于数据库和备份的路径过长,您可以在 databases.conf(3.0 及更高版本)或 aliases.conf(2.5)中为数据库声明一个别名:

Code
mydb1=c:\Data\test1.fdb #Windows

Code
mydb1=/db/test1.fdb  #linux

然后在我们的命令中使用它:

Windows

Code
gbak -b -se localhost:service_mgr mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b -se localhost:service_mgr mydb1 /db/backup1.fbk -user SYSDBA -pass masterkey

备份时间:115 秒

1.5. 通过抑制垃圾回收实现最快的 gbak 备份

为了使备份更快,让我们添加 -g 开关:

Code
 -G(ARBAGE_COLLECT)    禁止垃圾回收

因此,备份命令将如下所示:

Windows

Code
gbak -b -se localhost:service_mgr -g mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b -se localhost:service_mgr -g mydb1 /db/backup1.fbk -user SYSDBA -pass masterkey

-g 开关强制 Firebird 引擎在备份过程中禁用数据库文件中的垃圾回收。

这并不意味着垃圾记录版本会被存储在备份文件中,而是意味着服务器在备份期间不会尝试清理数据库中现有的垃圾,从而使备份更快。

我们强烈建议使用此开关,因为我们相信垃圾回收及相关的清理工作应由 sweep(gfix -sweep 或 autosweep)来完成,因此最好不要将 gbak 视为 sweep 的任何替代方案。

备份时间:105 秒

1.6. 备份到网络共享或网络位置

如果我们需要将备份文件放到网络共享上怎么办?

在 Windows 上

Firebird 新用户经常感到困惑的一点是:手动备份(从命令提示符启动命令)使用简单的 gbak -b 备份到网络共享可以正常工作,但使用 -se localhost:service_mgr 的快速版本 gbak 却无法工作。

原因是 Windows 上的 Firebird 以 LocalSystem 账户运行,该账户无法访问网络位置(除非这些网络共享已为“Everyone”组配置了访问权限,但在当今勒索软件盛行的时代,这是非常非常危险的)。

解决方案是让 Windows 上的 Firebird 服务以具有足够权限访问网络共享的账户运行,同时也要有足够的权限访问本地数据库文件和 C:\ProgramData\Firebird 中的系统文件。此外,在 firebird.conf 中配置 RestrictAccess 参数也是一个好主意。

在 Linux 上

由于 Linux 上的 Firebird 以“firebird”账户运行,请将网络共享挂载并映射到用户“firebird”,这样 Firebird 服务就能像访问本地驱动器一样访问网络位置。

1.7. 从远程服务器简单备份到本地机器

可以将数据库从远程服务器备份到本地机器。

下面的示例命令在 Windows 计算机上启动,访问 Linux 服务器(IP 地址为 192.168.0.108,当然也可以使用服务器的主机名)上的数据库,备份文件存储在 Windows 的 C:\Data 文件夹中:

Code
gbak -b -user SYSDBA -pass masterkey 192.168.0.108:/db/test1.fdb c:\data\remotebackup1.fbk

备份时间:568 秒

此命令通常比本地备份慢得多,因为 gbak 从远程服务器读取数据并通过网络传输记录。

1.8. 使用 Service Manager 从远程服务器更快地备份到本地

下面的命令比 #1.7 中描述的传统远程服务器到本地机器的备份更快:

Code
gbak -b -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey /db/test1.fdb stdout > C:\Data\remoteback1.fbk

它使用 Service Manager 在远程服务器上执行备份,但输出被发送到 stdout 管道,然后重定向到本地文件。

此命令通常比 #1.7(从远程服务器简单备份到本地)快 15%-20%,原因如下:

  1. 它通过远程服务器上的 Service Manager 执行备份,因此所有读取和压缩操作都以最快的方式执行,
  2. 它只通过网络传输最终的备份文件,其大小小于数据库中的数据量

但是,使用此命令无法启用详细模式并将详细输出存储到日志文件中。

_备份时间:473 秒_

1.9. 使用 Service Manager 将远程服务器上的 Firebird 数据库备份到同一远程服务器

使用 Service Manager,可以调用远程服务器上数据库的 gbak 备份,并将其也存储在同一远程服务器上。

Code
gbak -b -se  192.168.0.108:service_mgr -user SYSDBA -pass masterkey /db/test1.fdb /db/back12.fbk

此命令通过 Service Manager 在远程服务器上调用备份,并指示将备份文件也存储在同一网络服务器上。

当然,备份位置必须能被 Firebird 服务访问(在 Linux 上以用户“firebird”运行,在 Windows 上以 LocalSystem 账户运行)。

1.10. 使用 Firebird 5(或 HQbird 2.5/3.0/4.0/5.0)中的多线程备份,将 Firebird 数据库备份速度提升 6 倍

如果您对 Firebird gbak 的备份性能仍不满意,请考虑迁移到 Firebird 5(或使用企业版 Firebird 发行版:HQbird 用于其他版本)。

它支持多线程备份,可使 gbak 备份操作速度提升高达 6 倍。

Code
gbak -b -par 8  -se localhost:service_mgr -g C:\Data\testbigdb1.fdb c:\Data\backup1.fbk -user SYSDBA -pass masterkey

如您所见,新增了一个参数 -par 8,它使 gbak 使用 8 个线程来创建备份。

HQbird 执行维护任务(sweep、备份、恢复)的速度要快得多(下图中的结果当然来自不同的数据库):

2. 使用 Gbak 工具进行恢复

我们有由上述某个命令创建的备份文件 backup1.fbk,需要以快速高效的方式恢复它。

假设该文件在 Windows 下位于 C:\Data\backup1.fbk,或在 Linux 下位于 /db/backup1.fbk。

2.1. 最简单的恢复命令

在 Windows 上

Code
gbak -c C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey

在 Linux 上

Code
gbak -c /db/backup1.fbk /db/new1.fdb -user SYSDBA -pass masterkey

首先请注意,gbak -c 不会覆盖数据库文件,如果存在 C:\data\new1.fdb 或 /db/new1.fdb 文件,gbak 将返回错误,提示数据库已存在。

然后,这个命令在2.5/3.0+以及Windows/Linux上的工作方式实际上有很大不同。

在Linux上,这个命令将使用对已创建数据库的嵌入式访问(当然,前提是您没有在firebird.conf中更改Firebird提供程序的顺序),对于3.0和2.5都是如此。

在Windows上,对于Firebird 3.0,在默认的提供程序顺序下,它将使用嵌入式访问,而对于2.5–则使用XNET。

然后,这个命令创建的文件的所有者是启动gbak的用户,这在Linux上尤其重要–如果您以root身份运行这样的gbak,数据库文件的所有者将是root,而Firebird进程(以“firebird”用户运行)将无法访问恢复后的文件。

给Linux用户的提示

许多人为了“修复”所有权问题,会授予所有人访问恢复后数据库的权限,即类似“chmod 777 database”的操作,但这是非常不安全的,正确的方法是将数据库的所有者更改为firebird,使用以下命令:

Code
chown firebird /db/new1.fdb

总的来说,这个命令对于简单恢复非生产数据库(用于测试或开发)来说已经足够好了。

恢复时间:275秒

2.2. 使用localhost连接字符串进行恢复

最通用但并非最快的恢复选项如下:

Windows

Code
gbak -c C:\Data\backup1.fbk localhost:C:\data\new1.fdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c /db/backup1.fbk localhost:/db/new1.fdb -user SYSDBA -pass masterkey

非标准端口

如果Firebird运行在非标准端口上,例如3051,可以在恢复命令中指定:

Windows

Code
gbak -c C:\Data\backup1.fbk localhost/3051:C:\data\new1.fdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c /db/backup1.fbk localhost/3051:/db/new1.fdb -user SYSDBA -pass masterkey

恢复时间:1225秒

2.3. 在Windows上使用XNET进行恢复

为了使恢复更快一些,在Windows上我们可以使用XNET(适用于Firebird 3.0及更高版本):

Code
gbak -c C:\Data\backup1.fbk xnet://C:\Data\New2.fdb -user SYSDBA -pass masterkey

在Windows上的Firebird 2.5中,使用简单的命令行将使用XNET访问(如果只有一个Firebird实例在运行):

Code
gbak -c C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey

恢复时间:585秒

2.4. 使用服务管理器更快地恢复

而最快的恢复方式是使用服务管理器

Windows

Code
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c -se localhost:service_mgr /db/backup1.fbk localhost:/db/new1.fdb -user SYSDBA -pass masterkey

使用-se开关,我们在localhost地址上调用服务管理器,并指示它在Firebird引擎内部执行恢复代码。

当恢复由服务管理器完成时,创建的数据库文件将由运行中的Firebird实例(进程)的账户所有–在Linux上是“firebird”,在Windows上是LocalSystem。

恢复时间:244秒

2.5. 不推荐的开关

在某些时候,您可能会想使用以下开关:

Code
   -R(ECREATE_DATABASE) [O(VERWRITE)] create (or replace if OVERWRITE used)                               database from backup file (restore)
Code
以便强制用新数据库替换现有数据库。

根据我们的经验,这个开关大大增加了意外覆盖生产数据库的可能性。

我们强烈建议每次恢复时都使用新名称恢复数据库并重命名,同时显式删除旧数据库。

我们甚至不会提供带有此开关的命令示例。

2.6. 使用别名恢复数据库

可以使用在databases.conf(或Firebird 2.5中的aliases.conf)中声明的别名来恢复数据库。

例如,我们有以下声明:

Code
restdb=c:\Data\newrest1.fdb  #Windows

restdb=/db/newrest1.fdb  #Linux

因此,我们可以运行以下命令将备份恢复到别名指定的路径:

Windows

Code
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk restdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c -se localhost:service_mgr /db/backup1.fbk restdb -user SYSDBA -pass masterkey

2.7. 将本地备份恢复到远程服务器

可以将本地备份文件恢复到远程Firebird服务器。

在此示例中,我们将存储在Windows上的备份文件恢复到Linux服务器(其IP地址为102.168.0.108):

Code
gbak  -c C:\Data\backup1.fbk 192.168.0.108:/db/newdb1.fdb -user SYSDBA -pass masterkey

恢复时间:7009秒

您可能注意到,远程恢复过程运行得非常慢,我们能否使用服务管理器来加速它?

2.8. 使用服务管理器将本地备份恢复到远程服务器

要使用服务管理器将本地备份恢复到远程服务器,需要使用stdin输入流的技巧:

Code
gbak -c -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey stdin /db/new3.fdb <  C:\Data\backup1.fbk

此命令在远程服务器上调用恢复,使用标准输入stdin作为备份源–并通过命令中的< C:\Data\backup1.fbk部分提供输入。

看起来有点棘手?但这是将gbak恢复到远程服务器的性能提升10倍的简单方法!

恢复时间:450秒

2.9. 恢复超长表

如果您的数据库非常大,总行数超过20亿,则有必要指定开关-o[ne_at_a_time],以便在单独的事务中恢复每个表,避免某些内部溢出。

Code
gbak -c -se localhost:service_mgr -one C:\Data\backup1.fbk C:\data\new44.fdb -user SYSDBA -pass masterkey

3. 调整和记录备份与恢复过程

3.1. 带详细输出的Gbak

默认情况下,gbak是一个非常安静的工具,成功执行时不会返回任何内容。要使其详细输出,我们可以添加开关 -v[erify]

Code
gbak -b -se localhost/3050:service_mgr -g mydb1  c:\Data\backup1.fbk -v -user SYSDBA -pass masterkey

结果将会有更多详细信息。一个次要但烦人的问题是,将输出打印到控制台可能会使详细备份比静默版本明显变慢,因此一个好主意是将日志保存到带有 - y logfile 开关的文件中:

Code
gbak -b -se localhost/3050:service_mgr -g -v mydb1  c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt

注意:gbak不会覆盖现有的日志文件!如果在此示例中您已经有C:\data\backuplog1.txt,备份将引发错误(请参见附录A中的#3)。

注意2:有一个选项 -verbint 用于控制报告备份或恢复期间已处理记录数的间隔。

3.2. 向详细输出添加性能统计信息

在gbak的备份和恢复详细输出中,我们可以看到类似这样的消息:

Code
gbak:    writing data for table COUNTRY
gbak:16 records written

针对每个表和其他数据库对象。

您一定很想知道哪些表/对象花费了最多的时间,对吧?

为此,需要使用开关 -st(atistics)

Code
 -ST(ATISTICS) TDRW    show statistics:
     T                 time from start
     D                 delta time
     R                 page reads
     W                 page writes
Code
gbak -b -se localhost/3050:service_mgr -g -v mydb1 -st tdrw c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt

应用后,它将在日志中添加以下列:

Code
gbak: time   delta  reads  writes

这样我们就能够看到每一行所花费的时间和IO。

3.3. 从备份和/或恢复中排除表

如果您认为某些表可以从备份中排除(一个很好的例子是非常长的日志表),您可以在参数SK[IP_DATA]中指定它们,使用正则表达式作为参数。

在下面的示例中,我们从备份中排除了表 COUNTRY 和 JOB 的数据:

Code
gbak -b -se localhost/3050:service_mgr -g -v mydb1 -SKIP_D ‘(COUNTRY|JOB)’ c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt

而在下面的示例中,我们从还原中排除了表 CLIENT:

Code
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk C:\data\new33.fdb -user SYSDBA -pass masterkey -SKIP_D "CLIENT"

请注意,SKIP_DATA 的参数必须作为单个参数传递,因此必须用引号括起来!

在 Linux 上,引号应为单引号,在 Windows 上应为双引号。


从备份和/或还原中排除表时的注意事项

我们强烈建议在使用正则表达式条件之前,通过以下查询进行检查–它将返回与过滤条件匹配的表列表(查询中的引号始终为单引号):

Code
SQL> SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE TRIM(RDB$RELATION_NAME) SIMILAR TO '(COUNTRY|JOB)';

RDB$RELATION_NAME
===============================
COUNTRY
JOB

请注意,无论现有的约束(外键)如何,从备份或还原中排除的表都将被排除,因此,如果您没有仔细规划此类排除,在还原过程中很容易收到错误“Cannot commit foreign key index”(无法提交外键索引)。

3.4. 从文件中获取备份或还原的密码

如果您不喜欢将密码暴露给所有看到您命令的人,您会喜欢以下开关:-fetch passwordfile

让我们在 C:\Data\passfile.txt 中创建包含密码的文件并使用它(这里我们使用一个非常简单的嵌入式变体,当然,该开关也适用于 Service Manager):

Code
gbak -b c:\Data\test1.fdb c:\Data\backup5.fbk -user SYSDBA -fetch C:\Data\passfile.txt

有两个实际好处:

  1. 如果我们将密码存储在单个文件中,我们可以确保所有命令文件始终使用实际的密码。
  2. 我们不会在每个命令文件中暴露密码。

4. 一步式备份-还原

通常备份的目标是立即执行还原,以获得新的数据库,例如,为数据库应用新的页面大小,或将现有数据库从 2.5 迁移到 3.0。

在这种情况下,可以使用单个命令执行备份-还原,使用标准输入和输出作为相应命令的源,以绕过创建中间备份文件,减少对可用空间的需求,并加快处理速度。

命令如下:

Code
gbak -b -se localhost:service_mgr -g -user SYSDBA -password masterkey C:\Data\test1.fdb stdout | gbak -c -se localhost:service_mgr -user SYSDBA -password masterkey stdin C:\Data\new10.fdb

本质上,这里我们执行了两个命令,由符号 | 连接,

第一个用于备份到标准输出:

Code
gbak -b -se localhost:service_mgr -g -user SYSDBA -password masterkey C:\Data\test1.fdb stdout

第二个用于从标准输入还原:

Code
gbak -c -se localhost:service_mgr -user SYSDBA -password masterkey stdin C:\Data\new10.fdb

此命令是在同一 Firebird 实例上执行备份-还原的最快方式。

请注意:要使用一步式备份-还原将数据库从 2.5 转换为 3.0,需要使用 2 个 Firebird 实例,详见此处

5. 性能总结

下图包含测试数据库本地备份的不同备份命令速度信息:

如您所见,执行本地备份最快的方式是使用 Service Manager(开关 -se[rvice])并禁止垃圾回收(开关 -ig)。

对于从远程服务器备份到本地机器,Service Manager 也是最佳选择:

还原性能的情况类似:Service Manager 是还原最快的方式。

至于相当罕见的情况,即从本地备份还原到远程服务器,使用带有 stdin 技巧的 Service Manager 是唯一可行的选择:

关于虚拟机和 Firebird 备份的常见问题

当有流行的备份工具承诺可以备份一切时,为什么我应该使用 Firebird 备份工具?

或者,我确实备份了虚拟机的完整镜像,为什么我还要关心 Firebird 数据库的备份?

答案在这里

附录 A. 备份/还原过程中的错误

  1. 尝试在没有参数的情况下运行 gbak,或使用非数据库所有者/非 SYSDBA 用户运行,将导致以下错误:
Code
gbak: ERROR:Unable to perform operation.  You must be either SYSDBA or owner of the database
gbak:Exiting before completion due to errors
  1. 如果指定了错误的密码,将出现以下错误:
Code
gbak: ERROR:Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
gbak:Exiting before completion due to errors
  1. 当现有文件被指定为详细日志目标时发生错误:
Code
gbak: ERROR:cannot open status and error output file C:\data\backuplog1.txt
gbak: ERROR:    Exiting before completion due to errors
gbak:Exiting before completion due to errors
  1. 如果在 gbak 还原命令中指定现有数据库作为目标,则发生错误:
Code
gbak: ERROR:database C:\data\new1.fdb already exists.  To replace it, use the -REP switch
gbak:Exiting before completion due to errors
  1. 当 gbak 尝试写入其没有足够写入权限的位置时发生错误:
Code
gbak: ERROR:cannot open file  /db/test1.fbk
gbak:Exiting before completion due to errors
  1. 当 gbak 尝试访问没有权限的文件时–例如,在 Linux 上该文件的所有者不是用户“firebird”:
Code
gbak: ERROR:no permission for read-write access to database /db/test1.fdb
gbak: ERROR:    IProvider::attachDatabase failed when loading mapping cache
gbak:Exiting before completion due to errors
  1. 尝试使用详细输出:
Code
C:\HQbird\Firebird30>gbak -se 192.168.0.108:service_mgr -v -st tdrw -user SYSDBA -pass masterkey /db/test1.fdb stdout  >
 c:\data\rembackup2.fbk
gbak: ERROR:standard output is not supported when using split operation or in verbose mode
gbak: ERROR:    Exiting before completion due to errors
gbak:Exiting before completion due to errors
  1. 尝试在远程服务器上使用 Service Manager 执行备份,并启用详细输出并存储到日志文件:
Code
C:\HQbird\Firebird30>gbak -se 192.168.0.108:service_mgr -v -st tdrw -y lg1.txt  -user SYSDBA -pass masterkey /db/test1.f
db stdout  > c:\data\rembackup2.fbk
gbak: ERROR:Invalid clumplet buffer structure: string length doesn't match with clumplet
gbak:Exiting before completion due to errors
  1. 一步式备份-还原中,当备份因某种原因失败时出错:
Code
gbak: ERROR:No request from user for stdin data
gbak:Exiting before completion due to errors
  1. 如果您尝试将非备份文件传递给 gbak:
Code
gbak: ERROR:unavailable database
gbak:Exiting before completion due to errors
gbak: ERROR:expected backup description record
gbak:Exiting before completion due to errors
  1. 备份包含错误页面的损坏数据库文件将报告以下错误(当然,编号和数据库文件会有所不同):
Code
gbak: ERROR:database file appears corrupt (E:\DATABASE1.FDB)
gbak: ERROR:    wrong page type
gbak: ERROR:    page 9294588 is of wrong type (expected 8, found 0)
gbak: ERROR:gds_$get_segment failed
gbak:Exiting before completion due to errors
gbak: ERROR:Unexpected I/O error while reading from backup file

gbak:由于错误,在完成之前退出

联系方式

如有任何问题,或报告任何错误或拼写错误,请随时联系我们:[email protected]