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

IBSurgeon 文库

快速将Firebird 2.5数据库转换为Firebird 3.0

Basil Sidorov, 02-APR-2019, (c) IBSurgeon

每个Firebird版本都有自己的数据库格式 - O(n)D(isk)S(tructure)(磁盘结构)。直到2.5版本,数据库引擎可以处理前一版本的ODS,但Firebird 3引擎只能处理自己的ODS(版本12.0)。

要将数据库从Firebird 2.5升级到3.0,需要使用gbak工具在2.5中备份数据库文件,然后在3.0中恢复它。

当然,数据库需要为转换做好准备–需要检查元数据和查询与Firebird 3.0的兼容性,并且在Firebird 3中恢复后,所有带有BLR的对象(触发器、存储过程等)必须重新编译。

如果我们使用标准方法,需要在2.5上制作数据库备份,然后安装Firebird 3并恢复备份文件。

如果您有足够的时间,这是可以的。但当您的数据库很大,或者您有数十个数据库需要迁移,并且时间有限时,您可以使用流式转换,速度会快25-30%。

思路是使用管道:

gbak -b … db25 stdout | gbak -c … stdin db30

2.5的gbak -b顺序写入备份并将其定向到stdout流,该流立即被3.0的gbak从stdin读取并创建新数据库。

此管道需要使用本地数据库访问(嵌入式),因为网络传输数据(即使是localhost)也会显著减慢过程。

下面我们考虑如何在Windows和Linux上执行流式备份。

Windows

最好为Windows制作一套特殊的Firebird文件。我们需要获取Firebird 2.5嵌入式归档,将fbembed.dll重命名为fbclient.dll,并添加gbak.exe和可选的isql.exe。

对于Firebird 3.0,我们将使用标准归档。

最小文件集(不需要VS2008/VS2010运行时)包含以下文件:

Code
25/gbak.exe
25/fbclient.dll
25/firebird.conf
25/firebird.log
25/firebird.msg
25/ib_util.dll
25/icudt30.dll
25/icuin30.dll
25/icuuc30.dll
25/Microsoft.VC80.CRT.manifest
25/msvcp80.dll
25/msvcr80.dll
30/fbclient.dll
30/firebird.conf
30/firebird.msg
30/gbak.exe
30/ib_util.dll
30/icudt52.dll
30/icudt52l.dat
30/icuin52.dll
30/icuuc52.dll
30/msvcp100.dll
30/msvcr100.dll
30/intl/fbintl.conf
30/intl/fbintl.dll
30/plugins/engine12.dll

有经验的管理员/开发人员可能会注意到25/intl/fbintl.dll和25/intl/fbintl.conf未包含在内。这是正确的,因为gbak不使用连接字符集,也不在字符集之间转换数据。但是,在接收端,Firebird 3.0需要icu*文件,因为在创建索引(备份/恢复的最后步骤)时会使用字符集。

建议在Firebird 3的firebird.conf中添加两行:

Code
MaxUnflushedWrites = -1
MaxUnflushedWriteTime = -1

此外,最好为Firebird 2.5和Firebird 3.0设置不同的IpcName参数名称。

其他参数,如果您愿意,可以根据数据库转换期间Firebird 2.5读取数据、Firebird 3写入数据并创建索引的情况进行更改。

为了加快索引创建速度,我们建议将TempCacheLimit参数增加到可用RAM的约40%(如果这是专用计算机或服务器)。

例如,如果您有16GB内存,可以设置

Code
TempCacheLimit=6G

当然,只有在使用64位Firebird 3时才能设置此值,因为任何32位进程都无法分配超过2GB的内存。

您不需要为2.5更改此参数,因为它不影响备份速度,而且Firebird 2.5本身即使64位版本也无法为此参数使用超过2GB的内存。

另外,在开始之前,请检查数据库头页中的"page buffers"值是否为0(gstat -h databasename)。

如果在数据库头中设置了"page buffers"参数,它将覆盖firebird.conf设置,如果值很大,可能会导致巨大的内存消耗和转换过程的性能下降。

然后,将准备好的文件集复制到目标系统。

请注意,在转换之前需要停止Firebird 2.5的常规服务。

然后,以提升权限启动命令提示符(以管理员身份运行):

Code
set ISC_USER=<指定您的数据库所有者或sysdba>
set ISC_PASSWORD=password
"25/gbak" -z -b -g -v -st t -y 25.log db25 stdout|^
"30/gbak" -z -c -v -st t -y 30.log stdin db30

这里完整命令行用双引号括起来,符号|用于连接,符号^用于转义换行符(在长命令行的情况下很有用)。

选项-st(atus)在Firebird 2.5.8中引入,允许将更多关于备份过程的信息写入日志文件。

Linux

Firebird 3在Linux上依赖于tommath库。在CentOS(RHEL)上,此库位于epel仓库中,在Ubuntu(Debian)上位于系统仓库中。

在CentOS上,您需要先启用EPEL仓库,然后才能运行« yum install libtommath»。

在Ubuntu上,您不需要添加额外的仓库,但Ubuntu 16和Ubuntu 18有不同的软件包版本 - 分别是libtommath0和libtommath1。

Firebird 3查找tommath.so.0,对于Ubuntu 18,您需要从tommath.so.0创建到tommath.so.1的符号链接。为此,首先需要找到tommath.so.1。Ubuntu上的通常路径是_/usr/lib/x86.64-_ linux -gnu/,但在其他基于Debian的发行版中可能不同。

另一个问题是,直到Firebird 3.0.1(含),没有简单的方法安装两个不同的服务器版本。这里不考虑"使用前缀从源代码编译"的选项。

Firebird 3.0.2有CORE‑5204修复:使用-enable-binreloc构建(http://tracker.firebirdsql.org/browse/CORE-5204),以及单独的安装程序选项-path。

因此,如果tommath库以及必要的tommath.so.0符号链接已安装,您可以使用以下命令将最新的Firebird 3.0.4发行版安装到/opt/fb3:./install.sh -path /opt/fb3

之后,您可以停止现有的Firebird 2.5并运行流式转换。

如果您使用Firebird 2.5 Classic,请记住Classic通常由xinetd运行–因此,您需要为xinetd禁用firebird服务或完全停止xinetd。

您不需要在Firebird 3的firebird.conf中设置MaxUnflushed*参数(因为它们只在Windows上有效),也不需要更改Firebird 2.5中的任何内容。

Firebird 2.5在Linux上的嵌入式访问与Windows不同–Firebird 2.5将在gbak进程内工作(没有网络部分),但访问权限将使用用户数据库进行检查,因此不仅需要指定数据库所有者用户名,还需要指定密码:

Code
export ISC_USER=username ISC_PASSWORD=password
/opt/firebird/bin/gbak -b … db25 stdout\
|/opt/fb3/bin/gbak -c … stdin db30

成功转换后,您需要移除Firebird 3的"临时实例",然后卸载原始的2.5,只有在那之后才能执行Firebird 3的全新安装。

最好从tar.gz安装Firebird 3,而不是从仓库安装,因为tar.gz将所有内容安装到方便的位置/opt/ firebird ,而且仓库中的Firebird版本通常比tar.gz中的旧。

转换完成并安装Firebird 3后,您需要检查"firebird"用户是否是数据库文件的所有者。

如果不是,您需要修复它:

Code
chown firebird.firebird databasename

总结

流式转换比标准方法(gbak -b,然后gbak -c)更快,因为它跳过了中间的"写入备份"操作–结果是,流式转换时间约为"备份时间加10-15%“加上"创建索引的时间”。

在我们的实践中,流式转换至少比传统的"顺序"备份和恢复快25-30%。

除了节省时间和减少对可用磁盘空间的需求外,流式转换还有一个优势–它不需要移除现有的Firebird 2.5,这允许您在转换过程中出错时快速回退到2.5。

联系方式

请将反馈和咨询发送至 IBSurgeon 支持团队