迁移Firebird数据库至Debian11时存储过程编译报错求助
Firebird迁移后UDF依赖缺失导致存储过程编译失败排查方案
报错信息
Invalid token.
invalid request BLR at offset 588.
function SHASH_HMAC is not defined.
module name or entrypoint could not be found.
Error while parsing procedure X_SYS_GET_USERINFO's BLR.
服务器与Firebird版本信息
旧服务器
- 系统:Debian 8.11 (jessie)
- Firebird版本:
Server version: LI-V2.5.7.27050 Firebird 2.5 Server implementation: Firebird/linux AMD64
新服务器
- 系统:Debian 11 (bullseye)
- Firebird版本:
Server version: LI-V2.5.9.27139 Firebird 2.5 Server implementation: Firebird/linux AMD64
- 运行方式:xinetd
UDF库依赖检测结果
新服务器(执行ldd /opt/firebird/UDF/fb_shash)
ldd /opt/firebird/UDF/fb_shash linux-vdso.so.1 (0x00007ffed7be6000) libib_util.so => not found libcrypto.so.1.0.0 => not found
旧服务器(执行ldd /opt/firebird/UDF/fb_shash)
ldd /opt/firebird/UDF/fb_shash linux-vdso.so.1 (0x00007ffda771f000) libib_util.so => /usr/lib/x86_64-linux-gnu/libib_util.so (0x00007f6682710000) libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f6682313000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6682008000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6681d07000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6681af1000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6681746000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6681542000) /lib64/ld-linux-x86-64.so.2 (0x00007f6682b15000)
排查与解决步骤
1. 修复缺失的依赖库
解决libib_util.so缺失
- 从旧服务器复制
/usr/lib/x86_64-linux-gnu/libib_util.so到新服务器相同路径,或复制至Firebird的lib目录(如/opt/firebird/lib) - 若复制到Firebird lib目录,需配置环境变量确保加载:
echo "export LD_LIBRARY_PATH=/opt/firebird/lib:\$LD_LIBRARY_PATH" >> /etc/profile source /etc/profile systemctl restart xinetd
解决libcrypto.so.1.0.0缺失
Debian 11默认使用OpenSSL 1.1.x,无该版本库,可通过以下方式解决:
- 从旧服务器Debian 8的
/usr/lib/x86_64-linux-gnu/复制libcrypto.so.1.0.0和libssl.so.1.0.0到新服务器相同路径 - 复制完成后更新库缓存:
ldconfig
2. 验证UDF库权限
- 确保Firebird运行用户(通常为
firebird)拥有UDF目录及文件的读权限:chown -R firebird:firebird /opt/firebird/UDF chmod -R 755 /opt/firebird/UDF
3. 检查Firebird UDF配置
- 编辑
/opt/firebird/firebird.conf,确认UDF访问权限配置:UDFAccess = Restrict UDF - 修改后重启xinetd服务:
systemctl restart xinetd
4. 重新编译存储过程
- 登录Firebird数据库,重新编译报错的存储过程:
ALTER PROCEDURE X_SYS_GET_USERINFO COMPILE; - 批量处理多个报错存储过程时,可执行以下查询生成编译脚本:
将查询结果导出为SQL脚本执行即可SELECT 'ALTER PROCEDURE ' || RDB$PROCEDURE_NAME || ' COMPILE;' FROM RDB$PROCEDURES WHERE RDB$SYSTEM_FLAG = 0;
内容的提问来源于stack exchange,提问作者MarekOadmin
相关产品推荐
相关产品推荐

