文章目录
- 1 在windows上先预编译
- 2 Centos上进入项目文件夹进行编译
- 2.0 `最终的编译指令`
- 2.1 redefine相关的问题-OCCI模块测试时候加上的,这里要去除
- 2.2 找不到对应的函数undefined reference to `oracle::occi::Environment::createEnvironment(std::__
- 2.3 中文字符和英文字符的问题
- 2.4 秘钥协商失败 ORA-02291: integrity constraint (SECMNG.SECMNG_SECKEYNODE_SERVERID_FK) violated - parent key not found
- 2.5 秘钥协商失败 ORA-01756: quoted string not properly terminated
- 2.6 秘钥协商失败 ORA-24550 : signal received : [si_signo=11] [si_errno=0] [si_code=50] [si_adr =2020202020202020] killed
- 客户端和服务端秘钥协商成功
1 在windows上先预编译
除了找不到库和目录的问题,其他的都应该在windows上解决。
这个时候客户端代码在widows上编译,除了protobuf
和occi.h
找不到,其他的基本没有什么问题。
- 然后打开虚拟机,项目文件已经在/home/projects目录下了
2 Centos上进入项目文件夹进行编译
2.0 最终的编译指令
g++ *.cpp *.cc -lpthread -ljsoncpp -lprotobuf -lcrypto -locci -lclntsh -std=c++11
2.1 redefine相关的问题-OCCI模块测试时候加上的,这里要去除
问题的产生
OCCI 测试的时候我引入了 -D_GLIBCXX_USE_CXX11_ABI=0
,强行使用旧版C++进行编译。
但是本工程项目编译时已经设置使用新版C++11.
因此需要去除这一行声明
问题解决
2.2 找不到对应的函数undefined reference to `oracle::occi::Environment::createEnvironment(std::__
问题的产生
这条提示应该是说找不到对应函数,但是怎么会找不到…
*** 这个问题很奇葩,可能是前几天搭建OCCI的时候使用的是root用户,导致普通用户编译程序的时候找不到库文件。
Openssl数据安全传输平台014:OCCI环境搭建和使用:Centos8-Oracle19c代码跑通 + Window代码没跑通(不影响本项目)
问题解决
这个问题我在重新搭建环境的时候弄清楚了,主要原因还是Centos8上用的gcc8,编译OCCI的时候会不兼容。换成Centos7,使用gcc4.8.5来编译这个工厂就没有问题了。
2.3 中文字符和英文字符的问题
问题产生
这个问题很奇葩,因为我不小心在中文输入法输入了一个字符 - ,导致了找不到对应的库。
问题解决
修改对应的字符,在英文输入法状态下输入小横杠。
2.4 秘钥协商失败 ORA-02291: integrity constraint (SECMNG.SECMNG_SECKEYNODE_SERVERID_FK) violated - parent key not found
问题产生
这里是因为写代码的时候无脑跟着老师写的他的Server和Client ID,导致了在启动客户端的时候查不到相应的数据。
问题解决
把json文件的服务端ID修改成了0001,客户端ID修改成了1111.
2.5 秘钥协商失败 ORA-01756: quoted string not properly terminated
问题产生
说是括号引用不对.
Insert Into SECMNG.SECKEYINFO(clientid, serverid, keyid, createtime, state, seckey) values ('1111', '0001', 1, to_date('2023-10-31 18:04:01', 'yyyy-mm-dd hh24:mi:ss') , 1, 'v^'I8+p6S&~Y4(Iy')
我把生成的语句放到navicate里,也是提示不对
问题解决
秘钥进行base64转换的时候,中间生成
了一个单引号…
好无语…
这个是算法的问题,只能是重新协商秘钥。
2.6 秘钥协商失败 ORA-24550 : signal received : [si_signo=11] [si_errno=0] [si_code=50] [si_adr =2020202020202020] killed
问题产生
在使用occi多线程访问oralce服务器的时候, 会出现ORA-24550 错误, 错误信息如下:
ORA-24550 : signal received : [si_signo=11] [si_errno=0] [si_code=50] [si_adr =
2020202020202020] killed
问题解决
该错误会导致进程终止, 修改方案如下:
- 使用find命令所有oracle服务器端的
sqlnet.ora
文件, 在文件中添加下配置项:
/home/oracle_11/app/oracle/product/11.2.0/db_1/network/admin/samples/sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
DIAG_ADR_ENABLED=OFF
DIAG_SIGHANDLER_ENABLED=FALSE
DIAG_DDE_ENABLED=FALSE
- 如果该问题还未解决, 在调用
OCCI
接口的客户端对应oracle目录中, 例如, 我的客户端对用的oralce目录为
/opt/instantclient_11_2
, 在该目录下的network/admin
中添加文件sqlnet.ora
, 内容如下:
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
DIAG_ADR_ENABLED=OFF
DIAG_SIGHANDLER_ENABLED=FALSE
DIAG_DDE_ENABLED=FALSE