terça-feira, 24 de outubro de 2017

Roteiro de utilização - ASM Filter Driver (ASMFD)

Olá pessoal.

Vamos falar um pouco de ASM Filter Driver (ASMFD).

Não vamos entrar aqui em questão de definições do que é, para que serve porque se você chegou até aqui você já sabe (ou deveria saber) do que se trata o assunto.

A ideia aqui é um roteiro para inserir novos discos, deletar discos, criar diskgroup, adicionar discos, etc. 

Lembrando também que a minha virtual tem um Oracle Single 12.2.0.1.0 com GRID instalado.

Primeiro, sempre bom dar uma olhada no Help. Aqui abaixo está somente a parte que nos interessa que é do ASMFD.

[oracle@single122 ~]$ asmcmd help

        commands:
        --------
        afd_configure, afd_deconfigure, afd_di, afd_dsget, afd_dsset
        afd_filter, afd_label, afd_lsdsk, afd_lslbl, afd_refresh
        afd_scan, afd_state, afd_unlabel

Legal também dar uma olhada nos comandos para sabermos as possibilidades como abaixo.
[oracle@single122 ~]$ asmcmd help afd_state

Enfim, vamos ao que interessa. Para os nossos testes apresentei um disco (/dev/sdl) para podermos fazer o processo inteiro.

-- Vamos primeiro verificar o disco e seu tamanho.
[oracle@single122 ~]$ cd /dev/

[oracle@single122 dev]$ ls -lhrt sdl*
brw-rw---- 1 root disk 8, 176 Oct 24 08:51 sdl

[oracle@single122 dev]$ lsblk sdl
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdl    8:176  0  10G  0 disk 

-- Criando a partição no disco 

oracle@single122 dev]$ su -

[root@single122 ~]# fdisk -l /dev/sdl 

Disk /dev/sdl: 10.7 GB, 10737418240 bytes, 20971520 sectors

Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

[root@single122 ~]# fdisk /dev/sdl 
-- Responda as opções abaixo as perguntas apresentadas.
n
p
1
ENTER
ENTER
w

[root@single122 ~]# fdisk -l /dev/sdl 

Disk /dev/sdl: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00094735

Device Boot      Start         End      Blocks   Id  System
  /dev/sdl1       2048    20971519    10484736   83  Linux

-- Verificando a artição criada.
[oracle@single122 dev]$ ls -lhrt sdl*
brw-rw---- 1 root disk 8, 176 Oct 24 09:07 sdl
brw-rw---- 1 root disk 8, 177 Oct 24 09:07 sdl1

[oracle@single122 dev]$ lsblk sdl
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdl      8:176  0  10G  0 disk 
+-sdl1   8:177  0  10G  0 part 

-- Nesse momento ainda não temos nada além da partição, nenhum disco candidate.

[oracle@single122 dev]$ asmcmd lsdsk -p --candidate



-- Vou listar os meus discos já existentes apresentados ao ASMFD.

[oracle@single122 dev]$ asmcmd afd_lsdsk
------------------------------------------------------------
Label                     Filtering   Path
============================================================
DATA01                      ENABLED   /dev/sdb1
DATA02                      ENABLED   /dev/sdc1
DATA03                      ENABLED   /dev/sdd1
DATA04                      ENABLED   /dev/sde1
DATA05                      ENABLED   /dev/sdf1
DATA06                      ENABLED   /dev/sdg1
DATA07                      ENABLED   /dev/sdh1
DATA08                      ENABLED   /dev/sdi1
DATA09                      ENABLED   /dev/sdj1
DATA10                      ENABLED   /dev/sdk1


-- Criar um label para o novo disco. Esse comando seria o equivalente (bem a grosso modo) ao CREATEDISK do ASLMLIB.


[oracle@single122 ~]$ su -

[root@single122 ~]# /oracle/12.2.0.1/grid/bin/asmcmd afd_label DATA11 /dev/sdl1


Importante: Se tentar criar um label para um disco que já está mapeado, levamos o erro abaixo:
[root@single122 dev]# /oracle/12.2.0.1/grid/bin/asmcmd afd_label DATA10 /dev/sdj1
disk /dev/sdj1 is already provisioned for ASM
ASMCMD-9513: ASM disk label set operation failed.

-- SCAN
[root@single122 dev]# /oracle/12.2.0.1/grid/bin/asmcmd afd_scan


-- Listando novamente os discos com o label criado.

[oracle@single122 dev]$ asmcmd afd_lsdsk
------------------------------------------------------------
Label                     Filtering   Path
============================================================
DATA01                      ENABLED   /dev/sdb1
DATA02                      ENABLED   /dev/sdc1
DATA03                      ENABLED   /dev/sdd1
DATA04                      ENABLED   /dev/sde1
DATA05                      ENABLED   /dev/sdf1
DATA06                      ENABLED   /dev/sdg1
DATA07                      ENABLED   /dev/sdh1
DATA08                      ENABLED   /dev/sdi1
DATA09                      ENABLED   /dev/sdj1
DATA10                      ENABLED   /dev/sdk1
DATA11                      ENABLED   /dev/sdl1

-- Ao criarmos o label, agora temos um disco candidate ao ASMFD.

[oracle@single122 dev]$ asmcmd lsdsk -p --candidate


-- Podemos verificar via SQL também.

COL GROUP_NUMBER  FORMAT 999;
COL MOUNT_STATUS  FORMAT A7;
COL HEADER_STATUS FORMAT A12;
COL MODE_STATUS   FORMAT A6;
COL PATH          FORMAT A11;
COL STATE         FORMAT A7;
COL TOTAL_MB      FORMAT 999,999,999.99;
COL FREE_MB       FORMAT 999,999,999.99;
COL NAME          FORMAT A15;
COL LABEL         FORMAT A15;
COL LIBRARY       FORMAT A10;
COL FAILGROUP     FORMAT A15;
COL VOTING_FILE   FORMAT A1;

SELECT 
           GROUP_NUMBER, 
           MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,PATH, 
           STATE,TOTAL_MB,FREE_MB,NAME,LABEL,LIBRARY, 
           FAILGROUP, VOTING_FILE     
        FROM V$ASM_DISK 
        ORDER BY HEADER_STATUS, PATH;



Se o header status estiver PROVISIONED OU FORMER (fazia parte de outro DG e foi liberado), podemos adicionar. Caso tenha outro header, ai fazer o dd abaixo.
-- Vamos agora criar um novo diskgroup.

[oracle@single122 sql]$ sqlplus / as sysasm

SQL> CREATE DISKGROUP TESTE EXTERNAL REDUNDANCY DISK 'AFD:DATA11'
  ATTRIBUTE 
'SECTOR_SIZE'='512',
'LOGICAL_SECTOR_SIZE'='512',
'compatible.asm'='12.2.0.1',
'compatible.rdbms'='12.2.0.1',
'au_size'='1M';
Diskgroup created.


SQL>@showasm



-- Vamos agora dropar um disco de um dos diskgroups.

-- Remover o disco 09 do diskgroup REDO
SQL> alter diskgroup TESTE drop disk DATA09;
Diskgroup altered.


SQL> @showasm



-- Para fazer a remoção completa do disco devemos remover o label também.

[root@single122 ~]# su -

-- Listando os discos 
[root@single122 ~]# /oracle/12.2.0.1/grid/bin/asmcmd afd_lsdsk
------------------------------------------------------------
Label                     Filtering   Path
============================================================
DATA01                      ENABLED   /dev/sdb1
DATA02                      ENABLED   /dev/sdc1
DATA03                      ENABLED   /dev/sdd1
DATA04                      ENABLED   /dev/sde1
DATA05                      ENABLED   /dev/sdf1
DATA06                      ENABLED   /dev/sdg1
DATA07                      ENABLED   /dev/sdh1
DATA08                      ENABLED   /dev/sdi1
DATA09                      ENABLED   /dev/sdj1
DATA10                      ENABLED   /dev/sdk1
DATA11                      ENABLED   /dev/sdl1

-- Removendo o label
[root@single122 ~]# /oracle/12.2.0.1/grid/bin/asmcmd afd_unlabel DATA09

-- Listando novamente
[root@single122 ~]# /oracle/12.2.0.1/grid/bin/asmcmd afd_lsdsk
------------------------------------------------------------
Label                     Filtering   Path
============================================================
DATA01                      ENABLED   /dev/sdb1
DATA02                      ENABLED   /dev/sdc1
DATA03                      ENABLED   /dev/sdd1
DATA04                      ENABLED   /dev/sde1
DATA05                      ENABLED   /dev/sdf1
DATA06                      ENABLED   /dev/sdg1
DATA07                      ENABLED   /dev/sdh1
DATA08                      ENABLED   /dev/sdi1
DATA10                      ENABLED   /dev/sdk1
DATA11                      ENABLED   /dev/sdl1


--  Agora, vamos adicionar um disco a um DG existente

[oracle@single122 sql]$ sqlplus / as sysasm

-- Adicinando o disco 09
SQL> alter diskgroup TESTE add disk 'AFD:DATA09';
Diskgroup altered.


-- Dropar um diskgroup completo

SQL> drop diskgroup TESTE including contents;
Diskgroup dropped.



Importante 1: Depois disso, basta excluir os labels dos discos como descrito mais acima.
Importante2 : Caso esteja em um RAC, deixar apenas um dos nós montados

Exemplo: Temos um RAC com 2 nós, então no nó 2 executar como grid:
sqlplus / as sysasm
SQL> alter diskgroup TESTE dismount;
-- Se necessário, podemos fazer outros acertos via SQL

--  Alterando o compat ASM e DB

-- Antes da alteração
Group Name         Type       Compat.      DB Compat.      Total (GB)     Used (GB)     Free (GB) Used (PCT) Free (PCT) State
----- ------------ ---------- ------------ ------------ ------------- ------------- ------------- ---------- ---------- ----------
2 FRA          EXTERN     12.2.0.0.0   12.2.0.0.0           30.00           .06         29.94     .20 %    99.80%   MOUNTED
    

SQL> sqlplus / as sysasm
SQL> ALTER DISKGROUP FRA SET ATTRIBUTE 'compatible.asm'   = '12.2.0.1.0';
Diskgroup altered.

SQL> ALTER DISKGROUP FRA SET ATTRIBUTE 'compatible.rdbms' = '12.2.0.1.0';
Diskgroup altered.

Group Name         Type       Compat.      DB Compat.      Total (GB)     Used (GB)     Free (GB) Used (PCT) Free (PCT) State
----- ------------ ---------- ------------ ------------ ------------- ------------- ------------- ---------- ---------- ----------
2 FRA          EXTERN     12.2.0.1.0   12.2.0.1.0           30.00           .06         29.94     .20 %    99.80%   MOUNTED


-- Algumas verificações interessantes:

-- Quando adicionar ou dropar um disco do ASM, para verificar se ainda está fazendo REBALANCE
select 
o.INST_ID, 
g.name AS disk_grp, 
o.OPERATION, 
o.STATE, 
o.POWER, 
o.SOFAR, 
o.EST_WORK, 
o.EST_RATE, 
o.EST_MINUTES 
from 
GV$ASM_OPERATION o
join 
v$asm_diskgroup g ON g.group_number = o.group_number
where
o.GROUP_NUMBER=2
ORDER BY o.INST_ID, g.name;


-- Se necessário alterar o valor do rebalance online (isso pode gerar lentidão - quanto maior o power, mais impacto)

ALTER DISKGROUP DG_MVTREINA REBALANCE POWER 1;


-- Para verificar o compat,
COLUMN name FORMAT A10
COLUMN compatibility FORMAT A20
COLUMN database_compatibility FORMAT A20

SELECT 
        group_number, name, compatibility,  
        database_compatibility 
        FROM v$asm_diskgroup;


-- Para verificar os valores default na criação dos DG's
COLUMN name FORMAT A20
COLUMN value FORMAT A20

SELECT 
        group_number, name, value 
        FROM v$asm_attribute 
        WHERE 
        UPPER(NAME) NOT LIKE ('%TEMPLATE%') AND 
        GROUP_NUMBER = 1 
        ORDER BY group_number, name;

Então é isso. Espero que esse roteiro ajude.

Abraço
Mario

domingo, 8 de outubro de 2017

Erro ao criar controlfile no duplicate - perdi tudo?

Fala pessoal.

Uma dica rápida mas que pode ajudar no momento de necessidade.

Hoje estava fazendo um duplicate de uma base em RAC e por um descuido da minha parte o parâmetro "cluster_database" ficou setado com TRUE.

Como todos sabem durante o processo de duplicate deixamos esse parâmetro como FALSE.

Enfim, ao final do processo - era uma base de 5T então foi um processo bem demorado, eu tomei o erro abaixo no momento do CREATE CONTROLFILE:

released channel: aux1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 10/08/2017 13:04:28
RMAN-05501: aborting duplication of target database
RMAN-06136: ORACLE error from auxiliary database: ORA-01503: CREATE CONTROLFILE failed
ORA-12720: operation requires database is in EXCLUSIVE mode

Obviamente não poderia perder todo o meu trabalho até porque tinha prazo para entrega da base. 

Verifiquei nos logs que o Restore e Recover estavam completos e que só faltava os direcionamentos do clone para o novo controlfile.

Na realidade, a sequência que faltava era a partir desse ponto abaixo:

contents of Memory Script:
{
   set newname for tempfile  1 to
'+ASMDATA01';
   set newname for tempfile  2 to
'+ASMDATA01';
   set newname for tempfile  3 to
'+ASMDATA01';
   set newname for tempfile  4 to
'+ASMDATA01';
   set newname for tempfile  5 to
'+ASMDATA01';
   set newname for tempfile  6 to
'+ASMDATA01';
   switch clone tempfile all;
   catalog clone datafilecopy  
...

   
Fiz umas pesquisas no MOS e a partir desse ponto verifiquei que seria apenas recriado o controlfile, catalogado os datafiles e feito o switch final.

Deu um pouco de trabalho no início, listei os datafiles nos DISKGROUP's e depois apenas recriei o controlfile e abri a base.

Nesse momento, como diz meu amigo Ricardo Portilho, não existe DBA Ateu ahahahahhahaha... 

Mas também lembrei dele quando demorou para o comando ser completado e como ele sempre diz "Se demorou deve estar certo...".

A criação foi normal com: CREATE CONTROLFILE SET DATABASE 'MV0610' RESETLOGS ARCHIVELOG...

Então fica a dica, caso tome um erro nesso ponto do duplicate, o trabalho não está perdido.

Abraço
Mario

Postagem em destaque

[ORACLE] Batch change EDITIONABLE property.

Hello everyone. Hope you're doing well! Today, I have a simple case.   A test database had many database objects with the EDITIONABLE pr...