背景:
我将闪亮的应用程序部署到Linux Ubuntu 16.04上的闪亮服务器。我的应用程序需要连接到Oracle DB,所以我使用ODBC从我的Ubuntu服务器进行访问。
问题:
当我在浏览器中打开我的应用程序时,它显示“与服务器断开连接”
因此,我检查了我的日志文件/var/log/shiny-server/*.log
。错误消息如下所示:
警告:错误:nanodbc / nanodbc.cpp:950:01000:[unixODBC] [驱动程序管理器]无法打开lib'/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1' :找不到文件58:匿名
执行停止
信息
我不知道它是怎么出错的,所以我尝试列出有关该错误的信息。请告诉我是否还有其他提示,以便您更轻松地为我提供帮助。
以下是我在应用程序中连接到oracle db的方式
# ui.r
library(shiny)
shinyUI(
absolutePanel(
tableOutput( "table" )
)
)
# server.r
library(shiny)
library(DBI)
library(odbc)
con <- DBI::dbConnect(odbc::odbc(),
"MES_CY" , # data source name
UID = "xxx",
PWD = "xxx"
)
shinyServer(function(input, output) {
output$table <- renderTable(
dbGetQuery(con,'
select * from MyTable
')
)
})
由于该应用程序在本地运行良好,我怀疑我的服务器可能无法连接到数据库。
因此,我采用相同的代码在闪亮的服务器中使用R连接到DB
con <- DBI::dbConnect(odbc::odbc(),
"MES_CY" , # my data source name
UID = "xxx",
PWD = "xxx"
)
dbGetQuery(con,'
select * from MyTable
')
它可以工作,我可以获取数据。
然后我检查是否可以使用isql
访问oracle,这很好,我可以从数据库中查询数据。
chaosheng@Shiny-Srv:~$ isql -v MES_CY
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
我还检查是否使用以下命令安装了所有依赖项
ldd /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
linux-vdso.so.1 => (0x00007ffe103d1000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f832bdcc000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f832bac3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f832b8a6000)
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f832b68c000)
libclntsh.so.11.1 => /usr/lib/oracle/11.2/client64/lib/libclntsh.so.11.1 (0x00007f8328d1d000)
libodbcinst.so.1 => /usr/lib/x86_64-linux-gnu/libodbcinst.so.1 (0x00007f8328b0b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8328740000)
/lib64/ld-linux-x86-64.so.2 (0x0000556d2817c000)
libnnz11.so => /usr/lib/oracle/11.2/client64/lib/libnnz11.so (0x00007f8328373000)
libaio.so.1 => /lib/x86_64-linux-gnu/libaio.so.1 (0x00007f8328171000)
libltdl.so.7 => /usr/lib/x86_64-linux-gnu/libltdl.so.7 (0x00007f8327f66000)
以下是我对odbcinst.ini
和odbc.ini
的配置
#odbcinst.ini
[Oracle 11g ODBC driver]
Description = Oracle ODBC driver for Oracle 11g
Driver = /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
Setup =
FileUsage =
CPTimeout =
CPReuse =
Driver Logging = 7
#odbc.ini
Description = OracleSQL
Driver = Oracle 11g ODBC driver
Trace = No
TraceFile = /tmp/oracleodbc.log
Database = MES_PROD
Servername = MES
UserID = xxx
Password = xxx
Port = 1521
ReadOnly = No
以下是我在$HOME/.bashrc
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export TNS_ADMIN=$ORACLE_HOME/network/admin:$TNS_ADMIN
这是我当前的环境
XDG_SESSION_ID=1707
TERM=xterm
SHELL=/bin/bash
SSH_CLIENT=xx.xxx.xx.xx xxxxx xx
OLDPWD=/usr/lib/oracle/11.2/client64/lib
SSH_TTY=/dev/pts/0
USER=chaosheng
LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:/usr/lib/oracle/11.2/client64/lib:
TNS_ADMIN=/usr/lib/oracle/11.2/client64/network/admin:
MAIL=/var/mail/chaosheng
PATH=/usr/lib/oracle/11.2/client64/bin:/home/chaosheng/bin:/home/chaosheng/.local/bin:/usr/lib/oracle/11.2/client64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/oracle/11.2/client64/bin
PWD=/home/chaosheng
LANG=en_HK.UTF-8
SHLVL=1
HOME=/home/chaosheng
LANGUAGE=en_HK:en
LOGNAME=chaosheng
SSH_CONNECTION=xx.xxx.xx.xx xxxxx xx.xxx.xx.xx xx
LESSOPEN=| /usr/bin/lesspipe %s
XDG_RUNTIME_DIR=/run/user/1000
ORACLE_HOME=/usr/lib/oracle/11.2/client64
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/env
答案 0 :(得分:0)
正如一些社区成员建议的那样,我的问题与这个问题非常相似:Can't open lib '/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1 when create "Database Monitor" item in zabbix。
尽管两个问题的原因实际上是相同的,但解决方案可能略有不同。
因此,我仍然发布解决问题的方法。
首先,我在配置文件中几乎没有设置错误。
首先,我需要在$HOME/.profile
(/home/MyName/.profile
)中设置环境变量。
不过,我只在$HOME/.bashrc
(/home/MyName/.bashrc
)
第二,我首先使用/etc/shiny-server/shiny-server.conf
中的默认设置。
run_as shiny;
preserve_logs true;
server {
listen 3838;
location / {
# Host the directory of Shiny Apps stored in this directory
site_dir /srv/shiny-server;
# Log all Shiny output to files in this directory
log_dir /var/log/shiny-server;
# When a user visits the base URL rather than a particular application,
# an index of the applications available in this directory will be shown.
directory_index on;
}
}
显然,以上设置无效。
由于我将环境变量的设置放在/home/MyName/.profile
中,因此我需要指定run_as MyName
,以便/home/MyName/.profile
中定义的所有env变量都可用于R进程。
preserve_logs true;
server {
listen 3838;
location / {
run_as MyName;
# Host the directory of Shiny Apps stored in this directory
site_dir /srv/shiny-server;
# Log all Shiny output to files in this directory
log_dir /var/log/shiny-server;
# When a user visits the base URL rather than a particular application,
# an index of the applications available in this directory will be shown.
directory_index on;
}
}
我对linux系统的知识非常有限。
也许以上内容并不是问题的全部,但仅仅是解决了问题。