domingo, 21 de outubro de 2012

Como remover a tablespace de UNDO com os segmentos ativos


Neste artigo vou descrever como podemos remover a tablespace de UNDO, caso os segmentos de UNDO estejam ativos no banco de dados.

As vezes pode acontecer dos segmentos de UNDO ficarem inacessíveis e então muitas vezes será necessário recriar a tablespace de UNDO, ou mesmo os segmentos de UNDO. Dependendo de cada caso.

1.       Primeiro passo, deve-se baixar o banco de dados:

sqlplus /nolog

SQL>connect / as sysdba
Connected.

SQL> shutdown immediate

2.       Deve-se montar o banco de dados em modo RESTRITO, usando o arquivo de “pfile”, conhecido também como “init.ora”.

SQL> STARTUP RESTRICT MOUNT pfile=C:\Oracle\init_test.ora

ORACLE instance started.

Total System Global Area 1620126452 bytes
Fixed Size                   457460 bytes
Variable Size             545259520 bytes
Database Buffers         1073741824 bytes
Redo Buffers                 667648 bytes

Database mounted.

3.       Abaixo, será demonstrado o que acontece quando tentamos remover o “datafile” que possui os segmentos de UNDO ativos.

SQL> ALTER DATABASE DATAFILE 'K:\ORADATA\UNDOTBS2_02.DBF' OFFLINE DROP;
*
ERROR at line 1:
ORA-01548: active rollback segment ‘_SYSSMU11$’ found, terminate dropping tablespace.

Ou utilizando outra instrução SQL:

SQL> DROP TABLESPACE undotbs2 INCLUDING CONTENTS AND DATAFILES;
*
ERROR at line 1:
ORA-01548: active rollback segment ‘_SYSSMU11$’ found, terminate dropping tablespace.

4.       Utilizando a consulta abaixo pode-se verificar quais os segmentos de UNDO que estão corrompidos.

SQL> select segment_name,status,tablespace_name
       from dba_rollback_segs
      where status='NEEDS RECOVERY';


SEGMENT_NAME STATUS         TABLESPACE_NAME
------------ -------------- ---------------
_SYSSMU11$   NEEDS RECOVERY UNDOTBS2
_SYSSMU12$   NEEDS RECOVERY UNDOTBS2
_SYSSMU13$   NEEDS RECOVERY UNDOTBS2
_SYSSMU14$   NEEDS RECOVERY UNDOTBS2
_SYSSMU15$   NEEDS RECOVERY UNDOTBS2
_SYSSMU16$   NEEDS RECOVERY UNDOTBS2
_SYSSMU17$   NEEDS RECOVERY UNDOTBS2
_SYSSMU18$   NEEDS RECOVERY UNDOTBS2
_SYSSMU19$   NEEDS RECOVERY UNDOTBS2
_SYSSMU20$   NEEDS RECOVERY UNDOTBS2

5.       Para desativar os segmentos de UNDO, deve-se adicionar a linha abaixo no arquivo “PFILE”, no arquivo “init.ora”.

_corrupted_rollback_segments=('_SYSSMU11$','_SYSSMU12$','_SYSSMU13$','_SYSSMU14$','_SYSSMU15$','_SYSSMU16$','_SYSSMU17$','_SYSSMU18$','_SYSSMU19$','_SYSSMU20$')

Certifique-se de alterar o parâmetro "UNDO_MANAGEMENT = AUTO", alterá-lo para MANUAL  no arquivo “PFILE” e especificar o nome da nova  tablespace de UNDO.

*.UNDO_MANAGEMENT=MANUAL

SQL> alter system set undo_tablespace=UNDOTBS1;

System Altered.

6.       Deve-se levantar o banco de dados novamente.

SQL> STARTUP RESTRICT MOUNT pfile=C:\Oracle\init_test.ora

ORACLE instance started.

Total System Global Area 1620126452 bytes
Fixed Size                   457460 bytes
Variable Size             545259520 bytes
Database Buffers         1073741824 bytes
Redo Buffers                 667648 bytes

Database mounted.

7.       Depois devemos remover os segmentos de UNDO que estão corrompidos. Para  remover os segmentos de UNDO, deve-se usar o comando abaixo, para cada segmento de UNDO.

SQL> drop rollback segment "_SYSSMU11$";

Rollback segment dropped.

.
.
.

SQL> drop rollback segment "_SYSSMU20$";

Rollback segment dropped.

8.       Fazer uma nova verificação dos segmentos de UNDO.

SQL> select segment_name,status,tablespace_name
       from dba_rollback_segs;

SEGMENT_NAME STATUS TABLESPACE_NAME
------------ ------ ---------------
SYSTEM       ONLINE SYSTEM

9.       Com os segmentos de UNDO removidos, agora já podemos remover a tablespace de UNDO.

SQL> drop TABLESPACE UNDOTBS2 including contents and datafiles;

Tablespace dropped.

10.   Agora vamos recriar a nova tablespace de UNDO com todos os seus segmentos.

SQL> CREATE UNDO TABLESPACE UNDOTBS1
     DATAFILE 'K:\oradata\CRM\UNDOTBS01.DBF' SIZE 2000M
     AUTOEXTEND OFF;

Tablespace created.


11.   Alterar a tablespace de UNDO no banco de dados, usar:

SQL> ALTER SYSTEM SET undo_tablespace = UNDOTBS1;


12.   Depois devemos remover a linha abaixo do arquivo de “PFILE”.

_corrupted_rollback_segments=('_SYSSMU11$','_SYSSMU12$','_SYSSMU13$','_SYSSMU14$','_SYSSMU15$','_SYSSMU16$','_SYSSMU17$','_SYSSMU18$','_SYSSMU19$','_SYSSMU20$')

E descomentar o parâmetro “UNDO_MANAGEMENT=AUTO”  e verificar os demais parâmetros para o gerenciamento dos segmentos de UNDO do arquivo “PFILE”.

UNDO_MANAGEMENT=AUTO
UNDO_RETENTION=10800
UNDO_TABLESPACE=UNDOTBS1

13.   Baixar o banco de dados para atualização dos parâmetros.

SQL> shutdown immediate;

Editar o arquivo “PFILE”, arquivo “init.ora” e alterar o parâmetro “UNDO_TABLESPACE=” do valor “UNDOTBS2” para  “UNDOTBS1” e então levantar o banco de dados.

SQL> STARTUP pfile=C:\Oracle\init_test.ora

ORACLE instance started.

Total System Global Area 1620126452 bytes
Fixed Size                   457460 bytes
Variable Size             545259520 bytes
Database Buffers         1073741824 bytes
Redo Buffers                 667648 bytes

Database mounted.
Database opened.

14.   Se você utilizar o “SPFILE” deve atualizá-lo no banco

SQL> CREATE SPFILE FROM PFILE;

Spfile created.

No próximo “restart” do banco de dados, já será possível realizá-lo utilizando o “SPFILE”.




MSc. Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com


sábado, 6 de outubro de 2012

Dispositivos de I/O no Oracle


Em sistemas operacionais Unix ou Linux as operações de leitura e escrita (Input/Output) geralmente passam pelo cache do sistema operacional destinado a gerenciar os arquivos no servidor. Embora isso não represente um problema em si, este processamento extra, consome recursos do servidor.

Sobre os dispositivos de I/O.

Asynchronous I/O - é uma forma de processamento de leitura e gravação (I/O) que permite que o processamento continue antes da operação ter sido concluída.

Os dispositivos de I/O em um servidor podem ser extremamente lentos em comparação com o tratamento de dados. Este dispositivo pode ser compostos por componentes mecânicos, que se movem fisicamente, em um disco rígido à procura de um caminho para ler ou escrever, o que é muitas vezes mais lento do que uma mudança de corrente elétrica.

Direct I/O - é uma forma de processamento para ler ou gravar os arquivos de sistema que ignora o sistema operacional, acessando diretamente o cache do sistema. Este processamento economiza memória e aumenta o desempenho de aplicações de banco de dados. Também evita problemas de desempenho associados à utilização de tamanhos de banco de dados de bloco que não correspondem ao tamanho do arquivo de buffer do sistema.

Portanto se ignorarmos o cache do sistema de arquivos reduziremos os requisitos de CPU e liberaremos o cache do sistema de arquivos para outras operações de banco de dados, não relacionadas a I/O. Operações que possuem dispositivos como “raw devices” podem ignorar o cache do sistema de arquivos, esse dispositivo pode ser encontrado nas estruturas do ASM (Automatic Storage Management).

Onde o gerenciamento de I/O é realizado diretamente pelo banco de dados.

Vamos a um exemplo.

Quando um pedido de leitura (I/O) síncrono é apresentado ao sistema operacional, os processos de escrita dos blocos devem ser concluídos, para que depois o sistema possa continuar o processamento. Com o processamento assíncrono de I/O, o processamento continua, enquanto um novo pedido de I/O é apresentado e processado. Isso permite que o banco de dados contorne alguns gargalos associados ao desempenho de leitura e escrita.

O banco de dados Oracle pode aproveitar o acesso direto e o acesso assíncrono de I/O em algumas plataformas (Linux e Unix). Para tanto é necessário configurar o parâmetro FILESYSTEMIO_OPTIONS, cujas as opções estão listadas abaixo.


§  ASYNCH – Habilita o dispositivo de I/O assíncrono quando possível.

§  DIRECTIO – Habilita o dispositivo de I/O direto quando possível.

§  SETALL- Habilita os dois dispositivos de I/O, o direto e o assíncrono quando possível.

§  NONE – Desabilita os dois dispositivos de I/O.


O exemplo a abaixo mostra como o parâmetro é definido.

SQL> SHOW PARAMETER FILESYSTEMIO_OPTIONS

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------------------
filesystemio_options                 string      none

SQL> ALTER SYSTEM SET FILESYSTEMIO_OPTIONS=SETALL SCOPE=SPFILE;

System altered.

SQL> SHUTDOWN IMMEDIATE

Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> STARTUP

ORACLE instance started.

Total System Global Area  926941184 bytes
Fixed Size                  1222672 bytes
Variable Size             239077360 bytes
Database Buffers          683671552 bytes
Redo Buffers                2969600 bytes

Database mounted.
Database opened.

SQL> SHOW PARAMETER FILESYSTEMIO_OPTIONS

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------------------
filesystemio_options                 string      SETALL






MSc. Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com