Blog do Léo

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

Ao logar em um catálogo do RMAN para registrar um novo banco de dados no catálogo, a seguinte mensagem é retornada:

PL/SQL package RMAN.DBMS_BA version 12.02.00.01.0 in RCVCAT database is too old

A correção é simples, basta fazer o upgrade do catálogo em 2 passos:

RMAN> upgrade catalog;
recovery catalog owner is RMAN
enter UPGRADE CATALOG command again to confirm catalog upgrade

E incluir o mesmo comando novamente para confirmar o upgrade:

RMAN> UPGRADE CATALOG;

recovery catalog upgraded to version 12.02.00.01
DBMS_RCVMAN package upgraded to version 12.02.00.01
DBMS_RCVCAT package upgraded to version 12.02.00.01.

RMAN>

Após fazer o upgrade, basta continuar a operação:

[oracle@serverprod ~]$ rman target / catalog rman@anvsrepository
Recovery Manager: Release 12.2.0.1.0 - Production on Thu Apr 18 16:11:25 2019
Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.
connected to target database: PROD (DBID=197120132014)
recovery catalog database Password:
connected to recovery catalog database

RMAN> register database;

database registered in recovery catalog
starting full resync of recovery catalog
full resync complete

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.

O erro ORA-22297: warning: Open LOBs exist at transaction commit time ocorre quando o usuário faz alguma manipulações colunas do tipo CLOB ou BLOB e por algum motivo não fechou o LOB conforme deveria antes de fazer o commit.

Abaixo segue um exemplo simples que poderia ter evitado o problema:

DBMS_LOB.CLOSE(myFile);
DBMS_LOB.CLOSE(myBlob);
COMMIT;

Para solucionar o problema precisei fazer um rebuild no CLOB e na PK da tabela em questão. O primeiro passo foi listar os índices da tabela:

desc DBUSER.TB_CLOB
select * from dba_indexes where table_name = 'TB_CLOB' and owner='DBCLOB';

Após verificar os índices, fiz o move no CLOB e o rebuild na PK:

ALTER TABLE DBUSER.TB_CLOB MOVE LOB (CLOB_ARQUIVO) STORE AS (TABLESPACE TD_USER);
alter index DBUSER.PK_CLOB rebuild;

Após realizar esse procedimento conseguimos executar o processo sem retornar o erro:

ORA-22297: warning: Open LOBs exist at transaction commit time

Em alguns blogs e sites de referência, a maioria das pessoas disseram que essa mensagem é apenas informativa, porém só consegui rodar o processo após o reubild no CLOB e na PK da tabela.

Fica a dica.

As colunas que armazenam datas e horas no Oracle, pode default retornam apenas a DATA no formato DD/MM/YYYY, sendo que DD = Dia, MM = Mês e YYYY = Ano!

No exemplo abaixo temos um select que retorna a data do sistema:

SELECT TO_CHAR(SYSDATE) FROM DUAL;
14/10/18

Para extrair a data e hora desse campo, é preciso usar a função TO_CHAR passando o parâmetro de data e hora, conforme comando abaixo:

SELECT TO_CHAR(SYSDATE,'DD/MM/YYYY HH:MI:SS') FROM DUAL;
14/10/2018 11:19:32

E se preferir o formato de 24 horas, basta ajustar conforme abaixo:

SELECT TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MI:SS') FROM DUAL;
14/10/2018 23:19:49

Sabendo como funciona o TO_CHAR, você consegue aplicar esse comando em qualquer coluna de data nas suas tabelas, basta trocar o SYSDATE pelo nome da coluna na tabela e executar o comando.

Algumas operações de tecnologias podem ser paralelizadas utilizando mais CPUs para processar determinadas tarefas, e no banco de dados não é diferente. A opção PARALLEL X, onde X é a quantidade de cores a ser utilizada permite dividir a consulta em pequenos pedaços fazendo com que cada processador execute parte da query.

No exemplo abaixo estou paralelizando a consulta entre 20 cpus com o comando PARALLEL 20 e suspendi a geração de REDO LOG com o NOLLOGGING. Essa operação é lenta, pois está comprimindo uma tabela de 500GB e movendo para outra tablespace, a TD_MOVELOB:

ALTER TABLE GALOMG.TB_LOG COMPRESS FOR OLTP;
ALTER TABLE GALOMG.TB_LOG MOVE TABLESPACE TD_MOVELOB NOLOGGING PARALLEL 20;

Para checar se a consulta está paralelizada, basta executar o select abaixo na LONGOPS que trará uma linha para cada processo dividido:

SELECT inst_id,sid, serial#, opname, username,start_time,last_update_time,
round(time_remaining/60,2) "REMAIN MINS", round(elapsed_seconds/60,2) "ELAPSED MINS", round((time_remaining+elapsed_seconds)/60,2) "TOTAL MINS", 
ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE", message
FROM gv$session_longops 
WHERE TOTALWORK != 0 AND sofar<>totalwork AND time_remaining > 0;

Abaixo o resultado da query, onde msotra que cada pedaço da query possui um SID diferente, mesmo que a tabela seja a mesma: GALOMG.TB_LOG !

Basta executar a query várias vezes para consultar o tempo que cada pedaço da query está sendo executado.

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 !

Esse erro comum ocorre quando você tenta executar uma operação em uma tabela que foi alterada e a transação ainda está pendente. No nosso caso, estávamos tentando truncar uma tabela de B.I. e o erro era retornado instantaneamente: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired !

O select abaixo ajudou a identificar a causa raiz, ele lista quais sessões estão aguardando commit ou roolback. No meu caso foi uma transação aberta há mais de 30 dias e, alinhando com a área, matamos a sessão:

SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME,
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT 
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S, 
V$PROCESS P, V$SQL SQ 
WHERE L.OBJECT_ID = O.OBJECT_ID 
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR 
AND S.SQL_ADDRESS = SQ.ADDRESS;

Dica: Em ambiente Oracle RAC troque o V$ por GV$ !

Faça bom uso do script.