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)