Conteúdo voltado para banco de dados Oracle e SQL Server

oracle Archive

Olá pessoal,
no post de hoje vamos falar sobre MULTIPATH! O Multipath nada mais é do que um simples recurso para implementar múltiplos caminhos para a LUN. Essa LUN é apresentada ao servidor através das controladoras do storage. Alguns recursos interessantes são possíveis através do multipath, tais como:

  • balanceamento de carga: um dos caminhos somente envia dados e outro só recebe
  • round robin
  • alta disponibilidade: stand by ou ativo ativo

Uma explicação bem técnica é feita pela Red Hat: “O Mapeador de Dispositivo Multipath (DM-Multipath) permite que você configure diversos caminhos de E/S entre os nós do servidor e matrizes de armazenamento em um único dispositivo. Estes caminhos de E/S são conexões SAN físicas que podem incluir cabos separados, opções e controladores. O Multipath agrega os caminhos de E/S, criando um novo dispositivo que consiste de caminhos agregados.” Fonte: https://access.redhat.com/documentation/pt-br/red_hat_enterprise_linux/6/html/dm_multipath/mpio_overview

Para configurar o multipath no linux precisamos executar as seguintes etapas:


# yum search multipathd

Loaded plugins: ulninfo =============================== Matched: multipathd ================================== 
device-mapper-multipath.x86_64 : Tools to manage multipath devices using device-mapper

De posse do nome do pacote, faremos a instalação do utilitário com o comando yum install:

# yum install device-mapper-multipath -y

Loaded plugins: ulninfo
Resolving Dependencies
Running transaction check
Package device-mapper-multipath.x86_64 0:0.4.9-123.el7 will be installed
Processing Dependency: kpartx = 0.4.9-123.el7 for package: device-mapper-multipath-0.4.9-123.el7.x86_64
Processing Dependency: device-mapper-multipath-libs = 0.4.9-123.el7 for package: device-mapper-multipath-0.4.9-123.el7.x86_64
Processing Dependency: libmpathcmd.so.0()(64bit) for package: device-mapper-multipath-0.4.9-123.el7.x86_64
Processing Dependency: libmpathpersist.so.0()(64bit) for package: device-mapper-multipath-0.4.9-123.el7.x86_64
Processing Dependency: libmultipath.so.0()(64bit) for package: device-mapper-multipath-0.4.9-123.el7.x86_64
Running transaction check

Package device-mapper-multipath-libs.x86_64 0:0.4.9-123.el7 will be installed
Package kpartx.x86_64 0:0.4.9-111.el7 will be updated
Package kpartx.x86_64 0:0.4.9-123.el7 will be an update
Finished Dependency Resolution
Total                                                                                                                                                                        82 kB/s | 469 kB  00:00:05

Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : device-mapper-multipath-libs-0.4.9-123.el7.x86_64                                                                                                                                        1/4

  Updating   : kpartx-0.4.9-123.el7.x86_64                                                                                                                                                              2/4

  Installing : device-mapper-multipath-0.4.9-123.el7.x86_64                                                                                                                                             3/4

  Cleanup    : kpartx-0.4.9-111.el7.x86_64                                                                                                                                                              4/4

  Verifying  : kpartx-0.4.9-123.el7.x86_64                                                                                                                                                              1/4

  Verifying  : device-mapper-multipath-libs-0.4.9-123.el7.x86_64                                                                                                                                        2/4

  Verifying  : device-mapper-multipath-0.4.9-123.el7.x86_64                                                                                                                                             3/4

  Verifying  : kpartx-0.4.9-111.el7.x86_64                                                                                                                                                              4/4
Installed:

  device-mapper-multipath.x86_64 0:0.4.9-123.el7
Dependency Installed:
  device-mapper-multipath-libs.x86_64 0:0.4.9-123.el7
Dependency Updated:
  kpartx.x86_64 0:0.4.9-123.el7
Complete!

Após instalar o pacote, vamos executar a configuração básica de failover e iniciar o multipatd no S.O com apenas um comando:

# mpathconf --enable --with_multipathd y

Feito isso, sua configuração está setada com os itens básicos. Para checar os status do serviço, proceda com o comando mpatchconf:

# mpathconf
 
multipath is enabled
find_multipaths is enabled
user_friendly_names is enabled
dm_multipath module is loaded
multipathd is running

Se precisar editar alguma configuração diretamente no arquivo multipath.conf ou adicionar alguma LUN

# vim /etc/multipath.conf

Para subir e parar o serviço, use o comando systemctl:

# systemctl enable multipathd
# systemctl restart multipathd

Por hoje é só! O objetivo desse post foi passar uma idéia básica do que é o multipath e como configurá-lo!

Bom uso.

Olá pessoal,
hoje vou passar algumas dicas para desligar corretamente seu ambiente do Oracle RAC. Precisei fazer uma manutenção em apenas 1 dos nós e as vezes temos dúvidas de qual procedimento usar, qual é melhor, mais rápido, etc.

Há duas maneiras legais de para uma instância que são utilizando os comando SRVCTL (servercontrol) ou o CRSCTL (clustercontrol). A diferença básica de um para o outro é que o ClusterControl vai parar a instância do ASM automaticamente e deve ser executado como ROOT.

Maos á obra !

Utilizando o SRVCTL teremos as seguintes opções:

srvctl stop instance -d database -i instancia -o abort
srvctl start instance -d database -i instance
srvctl status database -d database

srvctl stop asm -node hostname -stopoption IMMEDIATE
srvctl start asm -node hostname
srvctl status asm

Utilizando o CRSCTL teremos as seguintes opções:

crsctl stop crs
crsctl start crs
crsctl stat res -t init
crsstat

Com esses comandos acima você consegue facilmente parar e subir os serviços do Oracle

Um recurso pouco utilizado, porém muito útil no Oracle Database é setar informações da aplicação nas views de sistema V$SESSION / GV$SESSION. É comum alguma consulta estar impactando o ambiente e as informações contidas nas views de sistema e as informações não serem tão precisas a ponto de ir direto no problema. É possível, por exemplo, colocar o nome da aplicação ou da etapa do processo em que está sendo executado, e com isso você saberia se o processo que está impactando é o início ou o fim do processo.

Mãos á obra ..

Abra uma query no Oracle e execute a query abaixo. Nesse caso, eu estou informando que minha aplicação é o controle de estoque e que o procedimento que está sendo executado é a baixa de produtos devolvidos:


exec dbms_application_info.set_module(module_name => 'Controle de Estoque',action_name => 'Baixa dos produtos devolvidos');

PL/SQL procedure successfully completed.

Após execução do pacote acima, a query na v$session será populada com os dados:


select osuser, module, action from v$session where action is not null

noraldino <strong>Controle de Estoque Baixa dos produtos devolvidos</strong>


As informações contidas no pacote podem ser customizadas de acordo com sua necessidade. É recomendado que esse procedimento seja repassado ao time de desenvolvimento para que seja incluído esse pacote antes das execuções de procedimentos, pois na hora do troubleshooting essas informações podem ser muito úteis e poupar muito tempo dos envolvidos.

Enjoy !

Há poucos dias atrás precisei instalar os agentes do Oracle Cloud Control 13c em 3 servidores de produção, porém ele dava o erro em que a porta xxx estava sendo usada. Verifiquei que já haviam outros agentes rodando nas máquinas e eram referentes á versões anteriores, para que os novos agentes fossem instalados, esse antigos deveriam ser removidos.

Mãos á obra:

Localize o agent_home da instalação anterior e exporta a variável AGENT_HOME. No meu caso ela estava em /u01/app/oracle/agent12c/core/12.1.0.4.0:


export AGENT_HOME=/u01/app/oracle/agent12c/core/12.1.0.4.0

Em seguida execute o comando abaixo para remoção do agente:


$perl $AGENT_HOME/sysman/install/AgentDeinstall.pl -agentHome $AGENT_HOME

Após executar o código acima, a mensagem abaixo informará na tela o progresso da desinstalação:

** Esse processo só retira o agente do servidor, para retirar do Oracle Cloud Control deverá ser feita uma operação á parte.
Agent Oracle Home: /u01/app/oracle/agent12c/core/12.1.0.4.0

agentHome = /u01/app/oracle/agent12c/core/12.1.0.4.0

NOTE: The agent base directory: /u01/app/oracle/agent12c will be removed after successful deinstallation of agent home.

DetachHome Command executed:/u01/app/oracle/agent12c/core/12.1.0.4.0/oui/bin/runInstaller -detachHome -force -depHomesOnly -silent ORACLE_HOME=/u01/app/oracle/agent12c/core/12.1.0.4.0 -waitForCompletion -invPtrLoc /u01/app/oracle/agent12c/core/12.1.0.4.0/oraInst.loc
Iniciando Oracle Universal Installer…

Verificando espaço de swap: deve ser superior a 500 MB. 99999 MB Reais Passado
The inventory pointer is located at /u01/app/oracle/agent12c/core/12.1.0.4.0/oraInst.loc
‘DetachHome’ bem-sucedido.
Iniciando Oracle Universal Installer…

Verificando espaço de swap: deve ser superior a 500 MB. 99999 MB Reais Passado
The inventory pointer is located at /u01/app/oracle/agent12c/core/12.1.0.4.0/oraInst.loc
Não foi possível atualizar o Oracle home ‘/u01/app/oracle/agent12c/sbin’ pois ele não existe.

Deinstall Command executed:/u01/app/oracle/agent12c/core/12.1.0.4.0/oui/bin/runInstaller -deinstall -silent “REMOVE_HOMES={/u01/app/oracle/agent12c/core/12.1.0.4.0}” -waitForCompletion -removeAllFiles -invPtrLoc /u01/app/oracle/agent12c/core/12.1.0.4.0/oraInst.loc
Iniciando Oracle Universal Installer…

Verificando espaço de swap: deve ser superior a 500 MB. 99999 MB Reais Passado
Preparando para iniciar o Oracle Universal Installer de /tmp/OraInstall2018-06-28_10-38-07AM. Aguarde …Oracle Universal Installer, Versão 11.1.0.12.0 Produção
Copyright (C) 1999, 2014, Oracle. Todos os direitos reservados.

Iniciando desinstalação

Desinstalação em andamento (Quinta-feira, 28 de Junho de 2018 10h38min12s BRT)
O assistente de configuração “Agent Deinstall Assistant” foi bem-sucedido
……………………………………………………… 100% Concluído.

Desinstalação bem-sucedida

Fim das fases de instalação.(Quinta-feira, 28 de Junho de 2018 10h38min20s BRT)
Fim das desinstalações
Verifique “/u01/app/oraInventory/logs/silentInstall2018-06-28_10-38-07AM.log” para obter mais detalhes.
cannot fetch initial working directory: Arquivo ou diretório não encontrado at /u01/app/oracle/agent12c/core/12.1.0.4.0/sysman/install/AgentDeinstall.pl line 303
cannot fetch initial working directory: Arquivo ou diretório não encontrado at /u01/app/oracle/agent12c/core/12.1.0.4.0/sysman/install/AgentDeinstall.pl line 303
cannot fetch initial working directory: Arquivo ou diretório não encontrado at /u01/app/oracle/agent12c/core/12.1.0.4.0/sysman/install/AgentDeinstall.pl line 303

NOTE: The targets monitored by this Management Agent will not be deleted in the Enterprise Manager Repository by this deinstall script. Make sure to delete the targets manually from the Cloud Control Console for a successful deinstallation.

Tarefa comum e corriqueira de um DBA é criar novos hosts para testes, ambientes de produção, desenvolvimento e homologação. Há poucos dias atrás precisei criar um servidor para instalação do Oracle Cloud Control 13c e fui surpreendido com a facilidade em alterar o nome de um servidor.

Nas versões anteriores era preciso alterar o arquivo /etc/hosts e reiniciar o S.O., porém na versão 7 basta digitar os comandos abaixo:

1 º – Checar o nome do servidor:

[root@localhost ~]# hostnamectl status
Static hostname: localhost.localdomain
Icon name: computer-vm
Chassis: vm
Machine ID: 5e2ea38c44ec49a497be3d6919cd9e96
Boot ID: 1996d9bfa13b48978e6cf411711a5e21
Virtualization: xen
Operating System: Oracle Linux Server 7.4
CPE OS Name: cpe:/o:oracle:linux:7:4:server
Kernel: Linux 4.1.12-94.3.9.el7uek.x86_64
Architecture: x86-64

2 º – Alterar o nome do servidor:

[root@localhost ~]# hostnamectl set-hostname SERVER002

3º – Checar o nome do servidor

[root@localhost ~]# hostnamectl status
Static hostname: SERVER002.localdomain
Icon name: computer-vm
Chassis: vm
Virtualization: xen
Operating System: Oracle Linux Server 7.4
CPE OS Name: cpe:/o:oracle:linux:7:4:server
Kernel: Linux 4.1.12-94.3.9.el7uek.x86_64
Architecture: x86-64

Foi só executar o passo 2 que o servidor já teve seu nome alterado, nem foi preciso reiniciar o S.O. para atingir tal objetivo.

Um erro muito comum em empresas que possuem equipes distintas de DBA, AD e Desenvolvimento é criar as estruturas de banco sem o devido cuidado em indexar as FK’s. Sistemas e melhorias são feitos diariamente e isso pode incluir novos dados, colunas, constraints e demais objetos no banco dedados.

Um script que costumo rodar semanalmente é o que verifica se as FK’s estão indexadas, pois dependendo do uso da tabela, podemso ter um aumento do wait TM CONTENTION. NO meu caso, todos os schemas começam com DB, portanto eu ajustei em 2 lugares para trazer somente os dados referente á esses schemas:

  AND a.owner LIKE 'DB%' 
  WHERE  c.index_owner LIKE 'DB%' 

Basta adaptar o script ás suas necessidades, ou se preferir não filtrar nada, retira esse trecho do código e execute-o.

O script é simples mas de grande utilidade, conforme pode ser visualizado abaixo:

SELECT CASE 
         WHEN b.table_name IS NULL THEN 'unindexed' 
         ELSE 'indexed' 
       END               AS status, 
       a.owner, 
       a.table_name      AS table_name, 
       a.constraint_name AS fk_name, 
       a.fk_columns      AS fk_columns, 
       b.index_name      AS index_name, 
       b.index_columns   AS index_columns 
FROM   (SELECT a.owner, 
               a.table_name, 
               a.constraint_name, 
               Listagg(a.column_name, ',') 
                 within GROUP (ORDER BY a.position) fk_columns 
        FROM   dba_cons_columns a, 
               dba_constraints b 
        WHERE  a.constraint_name = b.constraint_name 
               AND b.constraint_type = 'R' 
               AND a.owner LIKE 'DB%' 
               AND a.owner = b.owner 
        GROUP  BY a.owner, 
                  a.table_name, 
                  a.constraint_name) a, 
       (SELECT table_name, 
               index_name, 
               Listagg(c.column_name, ',') 
                 within GROUP (ORDER BY c.column_position) index_columns 
        FROM   dba_ind_columns c 
        WHERE  c.index_owner LIKE 'DB%' 
        GROUP  BY table_name, 
                  index_name) b 
WHERE  a.table_name = b.table_name(+) 
       AND b.index_columns(+) LIKE a.fk_columns 
                                   || '%' 
ORDER  BY 1 DESC, 
          2; 

Uma simples maneira de limpar o arquivo de log do listener (Listener.log) é escrevendo nele mesmo um valor simbólico.

Abaixo vamos aprender como limpar de maneira rapida o log do listener. É recomendável que você compacte e guarde em algum lugar para consultas futuras.

Ao listar
-rw-r—–   1 oracle dba   15G Jul 21 19:05 listener.log

Execute o comando:
# cat /dev/null > listener.log

E verifique que o arquivo foi sobrescrito:
-rw-r—–   1 oracle dba  1,1K Jul 21 19:09 listener.log

 

 

Em algumas situações a tablespace UNDO é preciso ser trocada, e apesar de parecer uma tarefa difícil, dada a importancia dessa tablespace, o procedimento é bem simples.

O parâmetro que controla a tablespace UNDO em uso é o: undo_tablespace, que pode ser verificado no sqlplus através do show parameter:

# show parameter undo_tablespace;

No nosso caso, a tablespace em uso é a UNDOTBS1. Para trocar a tablespace é preciso realizar os seguintes passos utilizando o SQLPLUS:

1º – Criar uma nova tablespace de UNDO:

# CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE ‘+DATA_ASM_DG’ SIZE 2G AUTOEXTEND ON NEXT 1G;

 

2º – Alterar o parâmetro UNDO_TABLESPACE para o nome dessa nova tablespace criada no passo anterior:

# ALTER SYSTEM SET UNDO_TABLESPACE = UNDOTBS2 SCOPE=SPFILE;

*Muitos DBA’s já alteram a tablespace com o SCOPE=BOTH, pois ela já realiza a alteração no SPFILE e em memória. Nesse caso a alteração já entra em vigor no momento da alteração e  é persistida no SPFILE após o restart da instância. Eu particularmente prefiro realizar o procedimento em um horário acordado com a gerência e já fazer o restart da instância alterando apenas no SPFILE.

 

3º – Monitorar o uso da tablespace UNDO anterior. O select abaixo informa se ainda há alguma transação na UNDO. Quando o count(*) trouxer o resultado igual zero é porque você já pode dropar a tablespace anterior:

SELECT count(*)
FROM v$rollname a,v$rollstat b
WHERE a.usn = b.usn
AND a.name IN (
SELECT segment_name
FROM dba_segments
WHERE tablespace_name = 'UNDOTBS1'
);

*o nome a ser incluído aqui é o da tablespace original

 

4º – Por fim remova a tablespace para reutilizar o espaço do ASM:

# DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES;

 

5º – Ao final do processo, basta verificar no SQLPlus a tablespace que está em uso:

# show parameter undo_tablespace;

 

Esse é o procedimento para trocar a tablespace de UNDO. Vale lembrar que para o ambiente RAC você vai encontrar uma UNDO diferente para cada instância do cluster.

Nós profissionais de T.I. estamos acostumados a trabalhar com ferramentas em inglês. Alguns programas traduzem termos ao pé da letra e fica complicado administrar o banco de dados com determinadas ferramentas.

O SQL Developer por default vem no idioma do S.O. do usuário, na maioria das vezes em Português. Para alterar o idioma basta seguir alguns simples passos:

1º – Entrar na pasta do SQL Developer e acessar o arquivo: \ide\bin\ide.conf 

Se você não souber onde está a pasta do SQL Developer, basta clicar com o botão direito no Ícone dele, ir em Propriedades e logo após clicar em Abrir

 

2º – Abrir o arquivo ide.conf com algum editor de texto (notepad, notepad++ e afins) e adicionar a linha AddVMOption -Duser.language=en no arquivo:

As linguagens disponíveis no SQL Developer podem ser vistas no arquivo ide.boot, item: oracle.translated.locales. São elas:

de = Alemão
es = Espanhol
fr = Francês
it = Italiano
ja = Japonês
ko = Coreano
pt_BR = Português
zh_CN = Chinês Simplificado
zh_TW = Chinês Tradicional

 

3º – Depois de ter editado o arquivo, basta salvar o arquivo e abrir novamente o SQL Developer através do atalho e ver que a interface mudou:

 

Feito isso basta usufruir do SQL Developer na linguagem preferida.