Banco de Dados Oracle (Linux)

Escrito por Hitfy

Template: Template_Oracle_Standalone | Template_Oracle_No_RAC | Template_Oracle_RAC

As coletas de dados são feitas via ODBC e agente de monitoramento.


1. Instalação do ODBC no sistema do Proxy

Os procedimentos a seguir devem ser executados no servidor do Proxy Zabbix, apenas no primeiro monitoramento do Oracle.


1.1 Instalação do Driver ODBC

yum install -y unixODBC unixODBC-devel


1.2 Instalação do Oracle Instant Client

Caso o Zabbix Proxy não esteja instalado diretamente em um servidor Oracle, é necessário instalar o Oracle Instant Client.


CentOS 7 (64 bits):

wget https://download.oracle.com/otn_software/linux/instantclient/11204/oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/11204/oracle-instantclient11.2-odbc-11.2.0.4.0-1.x86_64.rpm


CentOS 7 (32 bits):

wget https://download.oracle.com/otn_software/linux/instantclient/11204/oracle-instantclient11.2-basic-11.2.0.4.0-1.i386.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/11204/oracle-instantclient11.2-odbc-11.2.0.4.0-1.i386.rpm


CentOS 8 (64 bits):

wget https://download.oracle.com/otn_software/linux/instantclient/195000/oracle-instantclient19.5-basic-19.5.0.0.0-1.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/195000/oracle-instantclient19.5-odbc-19.5.0.0.0-1.x86_64.rpm


1.3 Instalação do Oracle Instant Client


CentOS 7 (64 bits):

rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
rpm -ivh oracle-instantclient11.2-odbc-11.2.0.4.0-1.x86_64.rpm


CentOS 7 (32 bits):

rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.i386.rpm
rpm -ivh oracle-instantclient11.2-odbc-11.2.0.4.0-1.i386.rpm


CentOS 8 (64 bits):

rpm -ivh oracle-instantclient19.5-basic-19.5.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient19.5-odbc-19.5.0.0.0-1.x86_64.rpm


2. Configuração do Oracle ODBC Driver

2.1 Criar Diretório de Configuração

mkdir -p /etc/oracle


2.2 Configuração das Variáveis de Ambiente


CentOS 7:

cat << 'EOF' > /etc/sysconfig/zabbix-proxy
ORACLE_HOME=/usr/lib/oracle/11.2/client64
LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:/usr/lib64
TNS_ADMIN=/etc/oracle
NLS_LANG="AMERICAN_AMERICA.WE8ISO8859P1"
export ORACLE_HOME
export LD_LIBRARY_PATH
export TNS_ADMIN
export NLS_LANG
EOF


CentOS 8:

cat << 'EOF' > /etc/sysconfig/zabbix-proxy
ORACLE_HOME=/usr/lib/oracle/19.5/client64
LD_LIBRARY_PATH=/usr/lib/oracle/19.5/client64/lib:/usr/lib64
TNS_ADMIN=/etc/oracle
NLS_LANG="AMERICAN_AMERICA.WE8ISO8859P1"
export ORACLE_HOME
export LD_LIBRARY_PATH
export TNS_ADMIN
export NLS_LANG
EOF


2.3 Configuração do Oracle Environment (oracleenv.sh)


CentOS 7:

cat << 'EOF' > /etc/oracle/oracleenv.sh
#!/bin/sh
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib64
export TNS_ADMIN=/etc/oracle
export NLS_LANG="AMERICAN_AMERICA.WE8ISO8859P1"
EOF


CentOS 8:

cat << 'EOF' > /etc/oracle/oracleenv.sh
#!/bin/sh
export ORACLE_HOME=/usr/lib/oracle/19.5/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib64
export TNS_ADMIN=/etc/oracle
export NLS_LANG="AMERICAN_AMERICA.WE8ISO8859P1"
EOF

Obs.: Caso o proxy esteja na própria máquina do banco de dados, sem Oracle InstantClient, mudar a variável ORACLE_HOME para o local da instalação dos binários do OracleDB.


2.4 Arquivo de driver

Validar se o arquivo de driver existe e está no caminho informado, executando o comando:


CentOS 7:

find / -name libsqora.so.11.1 


CentOS 8:

find / -name libsqora.so.19.1


2.5 Configurar o arquivo do pacote unixODBC

Configurar o arquivo do pacote UnixODBC para carregar a biblioteca ODBC do Oracle InstantClient:


Abrir o arquivo de configuração:

vi /etc/odbcinst.ini


Adicionar as entradas ao arquivo:


Centos 6 e 7:

[OracleODBC]
Description = Oracle ODBC driver for Oracle
Driver =/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
FileUsage = 1 


Centos 8:

[OracleODBC]
Description = Oracle ODBC driver for Oracle
Driver =/usr/lib/oracle/19.5/client64/lib/libsqora.so.19.1
FileUsage = 1


2. Configuração do servidor do Banco de Dados

Realizar os procedimentos abaixo no servidor do banco de dados


2.1. Identificar o ORACLE_HOME

2.1.1. Acessar com usuário oracle

su - oracle


2.1.2. Verificar os nomes das instâncias:

ps -ef | grep pmon


2.1.3. Escolher o banco de dados, utilizando o comando:

. oraenv


*Informar o ORACLE_SID (nome da instância identificada no passo 2.1.2)

Ex: oradb


2.1.4. Identificar o "ORACLE_HOME":

echo $ORACLE_HOME

Copiar o retorno do comando pois será utilizado no script "oratest"


2.2. Criar usuário de monitoramento

2.2.1. Acessar o banco de dados com SQL Plus:

sqlplus / as sysdba


2.2.2. Criar o usuário para monitoramento:

CREATE PROFILE "MONITORHIT"
LIMIT
COMPOSITE_LIMIT DEFAULT
SESSIONS_PER_USER DEFAULT
CPU_PER_SESSION DEFAULT
CPU_PER_CALL DEFAULT
LOGICAL_READS_PER_SESSION DEFAULT
LOGICAL_READS_PER_CALL DEFAULT
IDLE_TIME DEFAULT
CONNECT_TIME DEFAULT
PRIVATE_SGA DEFAULT
FAILED_LOGIN_ATTEMPTS UNLIMITED
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_REUSE_TIME DEFAULT
PASSWORD_REUSE_MAX DEFAULT
PASSWORD_VERIFY_FUNCTION NULL
PASSWORD_LOCK_TIME DEFAULT
PASSWORD_GRACE_TIME DEFAULT;
 
CREATE USER MONITORHIT IDENTIFIED BY m0nit0rvS PROFILE MONITORHIT;
 
GRANT CREATE SESSION TO MONITORHIT;
GRANT CREATE PROCEDURE TO MONITORHIT;
GRANT SELECT_CATALOG_ROLE TO MONITORHIT;
GRANT SELECT ON GV_$SORT_SEGMENT TO MONITORHIT;
GRANT SELECT ON SYS.TS$ TO MONITORHIT;
GRANT SELECT ANY DICTIONARY TO MONITORHIT;
GRANT SELECT ON SYSTEM.CTL_STB TO MONITORHIT;
GRANT ALTER TABLESPACE TO "MONITORHIT";
GRANT ALTER DATABASE TO "MONITORHIT";


2.2.3. Sair do banco de dados:

quit


2.2.4. Sair do usuário "oracle", utilizando o comando:

exit


2.3. Criação do script do oratest

Copiar as linhas abaixo e inserir no terminal do Linux para executar o comando e criar o arquivo do script.

Substituir o caminho do "ORACLE_HOME" pelo valor copiado no passo 2.1.4.


cat << 'EOF' > /etc/zabbix/oratest.sh
#!/bin/sh
export ORACLE_HOME=/u01/app/oracle/product/11.2.0.4/dbhome_1
export TNS_ADMIN=/etc/zabbix/oracle
echo "EXIT SUCCESS;" | $ORACLE_HOME/bin/sqlplus -S -L $1/$2@$3 > /dev/null && echo 1 || echo 0
EOF


2.3.1. Dar permissão ao arquivo criado:

chmod 777 /etc/zabbix/oratest.sh


2.4. Criar arquivo de userparameter

Copiar as linhas abaixo e inserir no terminal do para executar o comando e criar o arquivo:

cat << 'EOF' > /etc/zabbix/zabbix_agentd.d/userparameter_oratest.conf
UserParameter=oratest[*],/etc/zabbix/oratest.sh $1 $2 $3
EOF


2.5. Criar arquivo do TNS

2.5.1. Encontrar o arquivo de TNS:

find . / -name tnsnames.ora

Copiar o retorno do comando (camnho do arquivo TNS), pois será utilizado posteriormente.

Obs.: Mais de um caminho pode ser encontrado. Portanto, deve-se verificar qual deles contem as entradas.


2.5.2. Criar o diretório:

mkdir /etc/zabbix/oracle


2.5.3. Copiar arquivo TNS

Copiar o arquivo TNS (passo 5.1) para o diretório criado

cp CAMINHO_TNS /etc/zabbix/oracle/


Exemplo:

cp /u01/app/oracle/product/12.1.0.2/dbhome_1/network/admin/tnsnames.ora /etc/zabbix/oracle


2.5.4. Dar permissão ao arquivo TNS copiado

chmod 777 /etc/zabbix/oracle/tnsnames.ora


2.6. Reiniciar o serviço do Zabbix Agent:

service zabbix-agent restart


2.7. Adicionar o usuário Zabbix ao oinstall:

2.7.1. Abrir o arquivo de agrupamento

vi /etc/group


2.7.2. Editar oinstall

Procurar pela linha "oinstall" e adicionar "zabbix".

Caso exista algo como "oracle" na frente do número após o "oinstall", mantê-la e só acrescentar o usuário zabbix.


Exemplo:

oinstall:x:500:oracle,zabbix


2.7.3. Salvar e sair do arquivo:

:wq


2.7.4. Adicionar usuário ao grupo:

usermod -a -G oinstall zabbix


2.8. Teste de conexão


2.8.1. Exibir conteúdo do oratest:

cat /etc/zabbix/oratest.sh


Retornará algo como:

#!/bin/sh
export ORACLE_HOME=/oracle/db11204
export TNS_ADMIN=/etc/zabbix/oracle
echo "EXIT SUCCESS;" | $ORACLE_HOME/bin/sqlplus -S -L $1/$2@$3 > /dev/null && echo 1 || echo 0


2.8.2. Exportar variáveis

Executar os comandos para exportar as variáveis, conforme EXEMPLO abaixo:

Utilizar as linhas retornadas no passo anterior, pois o ORACLE_HOME, pode variar.


Exemplo:

export ORACLE_HOME=/oracle/db11204
export TNS_ADMIN=/etc/zabbix/oracle


2.8.3. Conectar ao Banco de Dados com SQL Plus

Executar o comando sqlplus, conforme abaixo:

$ORACLE_HOME/bin/sqlplus


As credenciais serão solicitadas, basta preencher as informações conforme exemplo abaixo:

Enter user-name: MONITORHIT@BANCO
Enter password: m0nit0rvS


Se retornar conforme abaixo, a conexão foi estabelecida:

Conectado a:
Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
With the Automatic Storage Management option
SQL>


Caso ocorra o erro:

ORA-12154: TNS:could not resolve the connect identifier specified

Deve-se revisar o arquivo "/etc/zabbix/oracle/tnsnames.ora", verificando se a entrada referente ao banco, está correta


Exemplo:

NOME_DA_INSTÂNCIA =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = IP_DO_NÓ )(PORT = 1521))
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SID = NOME_DO_NÓ)
   )
 )  


3. Configuração do servidor do Proxy

Realizar os procedimentos abaixo na máquina do Proxy.


3.1. Arquivo odbc.ini

Editar o arquivo "/etc/odbc.ini" para incluir uma entrada para cada base de dados monitorada.

Veja o exemplo abaixo contendo duas entradas de conexões.


Acessar o arquivo:

vi /etc/odbc.ini


Adicione as entradas ao arquivo que foi criado.

Exemplo:

[banco]
Description = myoracledb database
Driver = OracleODBC
ServerName = BANCO

[banco1]
Description = myoracledb database
Driver = OracleODBC
ServerName = BANCO1


Definição de cada conexão do arquivo "/etc/odbc.ini":

  • Entrada é o valor que deve ser informado na macro {$ORA_DSN} em cada host, como será detalhado mais à frente.
  • O parâmetro ServerName de cada conexão é o valor da string de conexão configurada no arquivo "/etc/oracle/tnsnames.ora" (passo 3.2).


3.2. Arquivo tnsnames.ora

Editar o arquivo "tnsnames.ora" para ter uma entrada para cada banco de dados monitorado.

Obs.: No caso de cluster, criar uma entrada para o cluster e uma para cada nó.


Acessar o arquivo:

vi /etc/oracle/tnsnames.ora


Adicione as entradas ao arquivo (substituindo os dados).

As informações são iguais ao arquivo TNS do servidor do banco dados (passo 5.3) 

NOME_DO_BANCO (Escrever todo em maiúsculo) =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = IP_DO_SERVIDOR_DO_NÓ_1)(PORT = 1521))
   (ADDRESS = (PROTOCOL = TCP)(HOST = IP_DO_SERVIDOR_DO_NÓ_2)(PORT = 1521))
   (LOAD_BALANCE = yes)
   (FAILOVER = ON)
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = nome_do_banco)
     (FAILOVER_MODE =
       (TYPE = select)
       (METHOD = basic)
     )
   )
 )


Obs.: Caso sejam NÓS, criar suas respectivas entradas:

NOME_DO_NÓ_1 =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = IP_DO_SERVIDOR_DO_NÓ_1)(PORT = 1521))
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = nome_do_banco)
     (INSTANCE_NAME = nome_do_nó_1)
   )
 ) 

NOME_DO_NÓ_2 =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = IP_DO_SERVIDOR_DO_NÓ_2)(PORT = 1521))
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = nome_do_banco)
     (INSTANCE_NAME = nome_do_nó_2)
   )
 ) 

Manter os números 1 e 2 após "nome_do_nó", conforme verificado através do comando "ps -ef | grep pmon" (passo 2.1.2).


3.3. Teste de conexão

Para validar se as configurações estão funcionando, executar os comandos no terminal do servidor de proxy.

Caso usuário/senha para o monitoramento sejam diferentes de MONITORHIT/m0nit0rvS, basta substituí-los).


Utilizar o comando abaixo para configurar o script/ambiente:

. /etc/oracle/oracleenv.sh


Utilizar o comando para testar a conexão:

isql banco MONITORHIT m0nit0rvS -v


Caso conecte, o retorno será conforme o abaixo:

+-------------------------+
| Connected!              |
|                         |
| sql-statement           |
| help [tablename]        |
| quit                    |
|                         |
+-------------------------+
SQL>


Utilizar o comando para fechar a conexão:

quit


Caso exista algum erro, verificar se as libs dos drivers estão corretas conforme os procedimentos (proxy).


4. Configurar host na plataforma

Criar o template e host seguindo o procedimento já padronizado e configurar as macros:

{$ORA_DSN} = <DSN criado no arquivo /etc/odbc.ini>

{$ORA_USERNAME} = <usuário de monitoramento>

{$ORA_PASSWORD} = <senha do usuário de monitoramento>


5. Ajustes

5.1. Ajustes e correções do unixODBC

Caso no ambiente não tenha os arquivos da versão 2 do Driver ODBC (arquivos libodbcinst.so.2 e libodbcinst.so.2.0.0), é necessário forçar a instalação de um pacote unixODBC mais recente, que possua a versão 2 do Driver ODBC.


Para isso, faça o download do pacote no formato RPM:

64bits:

wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/swida/RedHat_RHEL-5/x86_64/unixODBC-2.2.14-15.2.x86_64.rpm


32bits:

wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/swida/RedHat_RHEL-5/i386/unixODBC-2.2.14-15.2.i386.rpm


Fazer a instalação execute o comando abaixo:

64bits:

rpm -ivh --replacepkgs --replacefiles unixODBC-2.2.14-15.2.x86_64.rpm


32bits:

rpm -ivh --replacepkgs --replacefiles unixODBC-2.2.14-15.2.i386.rpm


Caso esteja instalado o pacote unixODBC versão 2.2.xx, é necessário fazer uma mudança em um arquivo de link para apontar um arquivo de biblioteca mais atualizado.

Para verificar a versão do unixODBC execute o seguinte comando:

odbcinst -j


Retorno:

unixODBC 2.2.11
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8


Caso seja a versão 2.2.xx, é necessário fazer o seguinte procedimento:

cd /usr/lib64
ls lib*odbcinst* -lahs


Retorno:

0 lrwxrwxrwx 1 root root  20 Jun 25 14:12 libodbcinst.so.1 -> libodbcinst.so.1.0.0
84K -rwxr-xr-x 1 root root 77K Jun 6 2007 libodbcinst.so.1.0.0
0 lrwxrwxrwx 1 root root  20 Jun 25 14:12 libodbcinst.so.2 -> libodbcinst.so.2.0.0
84K -rwxr-xr-x 1 root root 77K Jun 6 2007 libodbcinst.so.2.0.0


Sublinhado está o link que deverá ser modificado para apontar para a biblioteca mais nova:

mv libodbcinst.so.1 libodbcinst.so.1.ORIGINAL
ln -s libodbcinst.so.2.0.0 libodbcinst.so.1
ls lib*odbcinst* -lahs


Retorno:

0 lrwxrwxrwx 1 root root  20 Jun 25 14:12 libodbcinst.so.1.ORIGINAL -> libodbcinst.so.1.0.0
0 lrwxrwxrwx 1 root root  20 Jun 25 14:12 libodbcinst.so.1 -> libodbcinst.so.2.0.0
84K -rwxr-xr-x 1 root root 77K Jun 6 2007 libodbcinst.so.1.0.0
0 lrwxrwxrwx 1 root root  20 Jun 25 14:12 libodbcinst.so.2 -> libodbcinst.so.2.0.0
84K -rwxr-xr-x 1 root root 77K Jun 6 2007 libodbcinst.so.2.0.0


Se abrir o prompt conforme o exemplo anterior, o teste deu certo!


Caso aconteça o erro abaixo:

# isql -v banco
[01000][unixODBC][Driver Manager]Can't open lib '/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1' : file not found
[ISQL]ERROR: Could not SQLConnect


E o arquivo do driver ODBC Oracle se encontra corretamente no caminho, é porque existe alguma dependência desse arquivo que não existe. Execute o comando abaixo para encontrar a dependência que está gerando essa falha:

ldd /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1


Retorno:

ldd: warning: you do not have execution permission for `/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1'
       linux-vdso.so.1 => (0x00007fff947ff000)
       libdl.so.2 => /lib64/libdl.so.2 (0x00007f654d53c000)
       libm.so.6 => /lib64/libm.so.6 (0x00007f654d2b7000)
       libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f654d09a000)
       libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f654ce81000) = se estiver not found instalar rpm
       libclntsh.so.11.1 => /usr/lib/oracle/11.2/client64/lib/libclntsh.so.11.1 (0x00007f654a511000)
       libodbcinst.so.1 => not found
       libc.so.6 => /lib64/libc.so.6 (0x00007f6549f6c000)
       /lib64/ld-linux-x86-64.so.2 (0x0000003661c00000)
       libnnz11.so => /usr/lib/oracle/11.2/client64/lib/libnnz11.so (0x00007f6549b9e000)
       libaio.so.1 => /lib64/libaio.so.1 (0x00007f654999d000)
       libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x00007f6549794000)


Normalmente o retorno do comando vai apontar a falta do arquivo libodbcinst.so.1, caso isso ocorra, basta criar um link apontando para a biblioteca existente. Veja os procedimentos abaixo:

cd /usr/lib64
ls -lahs *odbcins*


 0 lrwxrwxrwx. 1 root root 20 May 14 16:02 libodbcinst.so -> libodbcinst.so.2.0.0
 0 lrwxrwxrwx. 1 root root 20 May 14 16:02 libodbcinst.so.2 -> libodbcinst.so.2.0.0
72K -rwxr-xr-x. 1 root root 70K Aug 16 2014 libodbcinst.so.2.0.0 


Criar o link:

ln -s libodbcinst.so.2.0.0 libodbcinst.so.1


# ls -lahs *odbcins*
 0 lrwxrwxrwx. 1 root root 20 May 14 16:02 libodbcinst.so -> libodbcinst.so.2.0.0
 0 lrwxrwxrwx. 1 root root 20 Jun 26 16:54 libodbcinst.so.1 -> libodbcinst.so.2.0.0
 0 lrwxrwxrwx. 1 root root 20 May 14 16:02 libodbcinst.so.2 -> libodbcinst.so.2.0.0
72K -rwxr-xr-x. 1 root root 70K Aug 16 2014 libodbcinst.so.2.0.0


# ldd /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
ldd: warning: you do not have execution permission for `/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1'
       linux-vdso.so.1 => (0x00007fff947ff000)
       libdl.so.2 => /lib64/libdl.so.2 (0x00007f654d53c000)
       libm.so.6 => /lib64/libm.so.6 (0x00007f654d2b7000)
       libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f654d09a000)
       libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f654ce81000)
       libclntsh.so.11.1 => /usr/lib/oracle/11.2/client64/lib/libclntsh.so.11.1 (0x00007f654a511000)
       libodbcinst.so.1 => /usr/lib64/libodbcinst.so.1 (0x00007f654a300000)
       libc.so.6 => /lib64/libc.so.6 (0x00007f6549f6c000)
       /lib64/ld-linux-x86-64.so.2 (0x0000003661c00000)
       libnnz11.so => /usr/lib/oracle/11.2/client64/lib/libnnz11.so (0x00007f6549b9e000)
       libaio.so.1 => /lib64/libaio.so.1 (0x00007f654999d000)
       libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x00007f6549794000)