quinta-feira, 2 de junho de 2016

Conhecendo o mundo do tal do ODA - OAKCLI I

Olá jovens!!

Como estão? Espero que estejam bem.

A algum tempo comecei a administrar um ambiente ODA (X4-2). Ambiente bacana de se trabalhar.

Com o tempo, fui anotando algumas verificações feitas no ODA através do OAKCLI.

Seguindo o que eu acho (e se eu acho, é um achismo meu.. então pode estar errado ahahahahah) o Oracle cada vez mais quer fornecer ferramentas para facilitar o dia a dia de quem gosta de uma linha de comando. 

Assim como o ADRCI, essa é uma ferramenta de linha de comando que auxilia na realização de várias tarefas no ODA.

Hoje vou passar aqui algumas opções de verificação e validações de componentes.

Vocês verão no help que ainda podemos fazer deploy, upgrade, update, etc. Mas esse não é o foco.

Então, chega de embromation e vamos lá ao que interessa.

O OAKCLI deve ser executado como usuário root.

su -
cd /opt/oracle/oak/bin/

Claro, vamos dar uma olhada no Help primeiro:


     [root@zema02 bin]# ./oakcli -h
Usage:  oakcli show       - show disk, diskgroup, expander, controller, 
                                    server, processor,  memory, power, cooling, 
                                    network, enclosure, storage, version,
                                    dbhomes, databases, db_config_params, 
                                    core_config_key, env_hw, asr
oakcli apply      - applies the core_config_key
oakcli locate     - locates a disk
oakcli deploy     - deploys the Database Appliance
oakcli update     - updates the Database Appliance
oakcli validate   - validates the Database Appliance
oakcli manage     - manages the oak repository, diagcollect e.t.c
  oakcli unpack     - unpack the given package to oak repository
oakcli copy       - copies the deployment config file
oakcli upgrade    - upgrades database
oakcli stordiag   - run storage diagnostic tool on both node
oakcli test       - test asr
oakcli orachk     - performs configuration settings check on ODA
oakcli configure  - configures the network or asr
oakcli create     - creates database,dbhome,db_config_params file
oakcli delete     - deletes database,dbhome,db_config_params file

Podemos também verificar o help por hierarquia.


      [root@zema02 bin]# oakcli show -h
Usage:
    oakcli show {disk|diskgroup|expander|controller|server|processor|
                 memory|power|cooling|network|enclosure|storage|
                 core_config_key|version|dbhomes|databases|
                 db_config_params|asr|env_hw} []
where:
disk                    - About the disk
diskgroup               - Asm disk group
expander                - Expander
controller              - Controller
storage                 - All storage components
version                 - Running software version
dbhomes                 - Installed oracle database homes
databases               - Database names
db_config_params        - db_config_params file
asr                     - Asr configuration
env_hw                  - Environment and Hardware 
                                                  information
server                  - Details of server sub-system
processor               - Details of processor sub-system
memory                  - Details of memory sub-system
power                   - Details of power supply 
                                                  sub-system
cooling                 - Details of cooling sub-system
network                 - Details of network sub-system
enclosure               - Details of enclosure sub-system
core_config_key         - Core configuration

Agora é só brincar com as opções. Aqui uma lista dos discos disponíveis
  • Informações dos discos

      [root@zema02 bin]# oakcli show disk

NAME            PATH            TYPE            STATE           STATE_DETAILS
e0_pd_00        /dev/sda        HDD             ONLINE          Good
e0_pd_01        /dev/sdb        HDD             ONLINE          Good
e0_pd_02        /dev/sdaa       HDD             ONLINE          Good
e0_pd_03        /dev/sdab       HDD             ONLINE          Good
e0_pd_04        /dev/sdac       HDD             ONLINE          Good
e0_pd_05        /dev/sdad       HDD             ONLINE          Good
e0_pd_06        /dev/sdae       HDD             ONLINE          Good
e0_pd_07        /dev/sdaf       HDD             ONLINE          Good
e0_pd_08        /dev/sdag       HDD             ONLINE          Good
e0_pd_09        /dev/sdah       HDD             ONLINE          Good
e0_pd_10        /dev/sdai       HDD             ONLINE          Good
e0_pd_11        /dev/sdaj       HDD             ONLINE          Good
e0_pd_12        /dev/sdak       HDD             ONLINE          Good
e0_pd_13        /dev/sdal       HDD             ONLINE          Good
e0_pd_14        /dev/sdam       HDD             ONLINE          Good
e0_pd_15        /dev/sdan       HDD             ONLINE          Good
e0_pd_16        /dev/sdao       HDD             ONLINE          Good
e0_pd_17        /dev/sdap       HDD             ONLINE          Good
e0_pd_18        /dev/sdaq       HDD             ONLINE          Good
e0_pd_19        /dev/sdar       HDD             ONLINE          Good
e0_pd_20        /dev/sdas       SSD             ONLINE          Good
e0_pd_21        /dev/sdat       SSD             ONLINE          Good
e0_pd_22        /dev/sdau       SSD             ONLINE          Good
e0_pd_23        /dev/sdav       SSD             ONLINE          Good

  • Informações dos diskgroups criados

     [root@zema02 bin]# oakcli show diskgroup

DiskGroups
----------
DATA
RECO
REDO

  • Informações dos servidores

      [root@zema02 bin]# ./oakcli show server
Power State              : On
Open Problems            : 0
Model                    : ODA X4-2
Type                     : Rack Mount
Part Number              : 33144597+1+1
Serial Number            : 1446NMP00E
Primary OS               : Not Available
ILOM Address             : XXX.XX.XX.XX
ILOM MAC Address         : 00:00:X0:00:X0:X0
Description              : Oracle Database Appliance X4-2 1446NMP00E
Locator Light            : Off
Actual Power Consumption : 244 watts
Ambient Temperature      : 20.000 degree C
Open Problems Report     : System is healthy


  • Informações da versão

     [root@zema02 bin]# oakcli show version
Version
     -------
     2.10.0.0.0

  • Informações dos processadores e quantidade de core's habilitados

      [root@zema02 bin]# oakcli show processor

NAME  HEALTH HEALTH_DETAILS PART_NO. LOCATION   MODEL                         MAX_CLK_SPEED TOTAL_CORES ENABLED_CORES

CPU_0 OK     -              060E     P0 (CPU 0) Intel(R) Xeon(R) CPU E5-2697  2.700 GHZ       12          12

CPU_1 OK     -              060E     P1 (CPU 1) Intel(R) Xeon(R) CPU E5-2697  2.700 GHZ       12          12

  • Informações de energia, temperatura, etc

      [root@zema02 bin]# oakcli show power

NAME        HEALTH HEALTH_DETAILS PART_NO. SERIAL_NO.         LOCATION INPUT_POWER OUTPUT_POWER INLET_TEMP      EXHAUST_TEMP

Power_Supply_0  OK     -              7079395  000000X+0000XX00X0 PS0      Present     110 watts    30.500 degree C 35.312 degree C

Power_Supply_1  OK     -              7079395  000000X+0000XX00X0 PS1      Present     108 watts    35.750 degree C 39.375 degree C

  • Se está com a core_config_key implantada. 

     [root@zema02 bin]# oakcli show core_config_key
Optional core_config_key is not applied on this machine yet !


Importante: Se houvesse uma chave, seria mais ou menos isso:
 Host's serialnumber = 00000XX00X7 
     Configured Cores = 16


  • Informações das bases que lá estão:

     [root@zema02 bin]#  oakcli show databases

Database Name    Database Type  Database HomeName   
Database HomeLocation                       Database Version        
---------------- -------------  ----------------    
-----------------------------------------   ---------------------  
orcl              RAC            OraDb11204_home1    
/u01/app/oracle/product/11.2.0.4/dbhome_1   11.2.0.4.2(18031668,18031740)

tttt              RAC            OraDb11204_home1   
/u01/app/oracle/product/11.2.0.4/dbhome_1   11.2.0.4.2(18031668,18031740)

xxxx              RAC            OraDb11204_home1   
 /u01/app/oracle/product/11.2.0.4/dbhome_1   11.2.0.4.2(18031668,18031740)

É isso. É tranquilo. Só olhar o help e mandar bala.

O validate segue o mesmo ponto...
Vamos ver o help.

[root@zema02 ~]# oakcli validate -h

Usage:
oakcli  validate [-V | -l | -h]
oakcli  validate [-v] [-f absolute output_file_name] 
                         [-a | -d | -c check1[,check2]]

ARGUMENTS:
-v      verbose output
-f      output_file_name.The output is sent to the file 
                        instead of standard output
-a      run all checks
-d      run only default checks.
-c      check1[,check2] run specific checks
-l      list the checks and description
-V      Print the Version
-h      print help
EXAMPLES:
oakcli validate -l
oakcli validate -a
oakcli validate -c DiskCalibration
oakcli validate -c SystemComponents,NetworkComponents,asr

Uma lista com descrição do que é validado em cada teste também está lá.

[root@zema02 ~]# oakcli validate -l

Checkname -- Description
=========    ===========
*SystemComponents  -- Validate system components based on ilom sensor 
                              data readings
*OSDiskStorage     -- Validate OS disks and filesystem information
*SharedStorage     -- Validate Shared storage and multipathing 
                              information
DiskCalibration    -- Check disk performance with orion
*NetworkComponents -- Validate public and private network components
*StorageTopology   -- Validate external JBOD connectivity
asr                -- Validate asr components based on asr config 
                              file and ilom sensor data readings

* -- These checks are also performed as part of default checks

  • Podemos, por exemplo, validar a topologia do Storage

     [root@zema02 ~]# oakcli validate -c StorageTopology

It may take a while. Please wait...
INFO    : ODA Topology Verification
INFO    : Running on Node1
INFO    : Check hardware type
SUCCESS : Type of hardware found : X4-2
INFO    : Check for Environment(Bare Metal or Virtual Machine)
SUCCESS : Type of environment found : Bare Metal
INFO    : Check number of Controllers
SUCCESS : Number of Internal LSI SAS controller found : 1
SUCCESS : Number of External LSI SAS controller found : 2
INFO    : Check for Controllers correct PCIe slot address
SUCCESS : Internal LSI SAS controller   : 50:00.0
SUCCESS : External LSI SAS controller 0 : 30:00.0
SUCCESS : External LSI SAS controller 1 : 40:00.0
INFO    : Check if JBOD powered on
SUCCESS : 1JBOD : Powered-on
INFO    : Check for correct number of EBODS(2 or 4)
SUCCESS : EBOD found : 2
INFO    : Check for External Controller 0
SUCCESS : Controller connected to correct ebod number
SUCCESS : Controller port connected to correct ebod port
SUCCESS : Overall Cable check for controller 0
INFO    : Check for External Controller 1
SUCCESS : Controller connected to correct ebod number
SUCCESS : Controller port connected to correct ebod port
SUCCESS : Overall Cable check for controller 1
INFO    : Check for overall status of cable validation on Node1
SUCCESS : Overall Cable Validation on Node1
INFO    : Check Node Identification status
SUCCESS : Node Identification
SUCCESS : Node name based on cable configuration found : NODE1
INFO    : Check JBOD Nickname
SUCCESS : JBOD Nickname set correctly : Oracle Database Appliance - E0
INFO    : The details for Storage Topology Validation can also 
                  be found in log 

file=/opt/oracle/oak/log/zema02/storagetopology/StorageTopology-2015-05-14-11:13:59_59781_137.log

  • Ou as informações de network 

     [root@zema02 ~]# oakcli validate -c NetworkComponents

INFO: Doing oak network checks
RESULT:  Detected active link for interface eth0 with link speed 
                 10000Mb/s and cable type as Twinax
RESULT:  Detected active link for interface eth1 with link speed 
                 10000Mb/s and cable type as Twinax
RESULT:  Detected active link for interface eth2 with link speed 
                 1000Mb/s and cable type as Twisted Pair
RESULT:  Detected active link for interface eth3 with link speed 
                 1000Mb/s and cable type as Twisted Pair
WARNING: No Link detected for interface eth4 with cable type 
                 as Twisted Pair
WARNING: No Link detected for interface eth5 with cable type as 
                 Twisted Pair

INFO: Checking bonding interface status

RESULT:  Bond interface bond0 is up configured in mode:load 
                 balancing (round-robin) with current active interface as
 Slave1 interface is eth2 with status:up Link fail count=0 
                 Maccaddr:00:10:e0:62:a5:c2
 
                 Slave2 interface is eth3 with status:up Link fail count=0 
                 Maccaddr:00:10:e0:62:a5:c3

WARNING: Bond interface bond1 has the following current status:down

RESULT:  Bond interface bond1 is down configured in mode:
                 fault-tolerance (active-backup) with current active 
                 interface as None
     Slave1 interface is eth4 with status:down Link fail count=0 
                 Maccaddr:00:10:e0:62:a5:c4

 Slave2 interface is eth5 with status:down Link fail count=0 
                 Maccaddr:00:10:e0:62:a5:c5

SUCCESS: eth0 is running 192.168.16.25
SUCCESS: eth1 is running 192.168.17.25

E assim podemos validar várias informações.

É isso jovens. Espero ter ajudado quem, como eu, está começando com o ODA.

That's it my friends...

Mario

quarta-feira, 1 de junho de 2016

Formatar HD/Disco para ext3/ext4

Olá jovens

Outro dia precisei formatar um disco em ext3 para utilização em uma base. Pesquisei um pouquinho e com a ajuda do meu amigo bananão (Breno Rodrigues, abraço) fiz os procedimentos abaixo, rapidinho.

Vou colocar os passos aqui, para não perder e/ou precisar pesquisar/perguntar novamente :D.

Esse processo foi realizado em um HD externo, mas serve para uma LUN apresentada também.

1) Como root, listar o disco ou HD externo - identificado no /var/log/messages
cat /var/log/messages | grep sd

O retorno vaio ser algo desse tipo:
 
Jun 19 12:03:41 server01 kernel: sdp: Write Protect is off
Jun 19 12:03:41 server01 kernel: SCSI device sdp: drive cache: write back w/ FUA
Jun 19 12:03:41 server01 kernel: SCSI device sdp: 1677721600 512-byte hdwr sectors (858993 MB)
Jun 19 12:03:41 server01 kernel: sdp: Write Protect is off
Jun 19 12:03:41 server01 kernel: SCSI device sdp: drive cache: write back w/ FUA

Identificado o disco. No nosso exemplo, será o disco "/dev/sdp". 
2) Após identificar o disco, vamos verificar se já tem alguma partição criada ali no disco

[root@server01 dev]# fdisk -l /dev/sdm 
- Será uma saída mais ou menos assim:
 
Disk /dev/sdp: 1000.2 GB, 1000204664832 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
 
Device Boot      Start         End      Blocks   Id  System
/dev/sdp1   *           1      121601   976760000+   7  HPFS/NTFS
 
Importante: Veja que já temos uma partição já criada. Fiz isso apenas para mostrar uma curiosidade que é o de deletar a partição. Geralmente esse passo não será necessário. Ele não tem volta, então tenha certeza que está no disco certo e que o mesmo pode ser formatado.

3) Para limpar
[root@server01 dev]# fdisk /dev/sdp

Comando (m para ajuda): m -- Digitei "m" para abrir o HELP
Comando - ação
a alterna a opção "inicializável"
b edita rótulo BSD no disco
c alterna a opção "compatibilidade"
d exclui uma partição
l lista os tipos de partição conhecidos
m mostra este menu
n cria uma nova partição
o cria uma nova tabela de partições DOS vazia
p mostra a tabela de partições
q sai sem salvar as alterações
s cria um novo rótulo de disco Sun vazio
t altera a identificação da partição para o sistema
u altera as unidades das entradas mostradas
v verifica a  tabela de partições
w grava a tabela no disco e sai
x funcionalidade adicional (somente para usuários avançados)

-- Vamos escolher a opção "d".

Command (m for help): d -- Opção "d"
Selected partition 1 -- Digitar "1"
Command (m for help): w -- Digitar "w" para salvar 
 
4) Agora sim vamos criar uma nova partição

[root@server01 dev]# fdisk /dev/sdp
The number of cylinders for this disk is set to 121601.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
 (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): n     -- Digitar "n" pois é uma nova partição
Command action
e   extended
p   primary partition (1-4)
p                                               -- Digitar "p" pois é uma partição primária 
Partition number (1-4): 1     -- Digitar "1" pois é a partição 1
First cylinder (1-121601, default 1):       -- Podemos manter o default apresentado, teclando  
Using default value 1
Last cylinder or +size or +sizeM or 
+sizeK (1-121601, default 121601): -- Podemos manter o default apresentado, teclando
+850000M  
Command (m for help): w     -- Digitar "w" para salvar
The partition table has been altered!
Calling ioctl() to re-read partition table.

5) Agora basta listar novamente
[root@server01 dev]# fdisk -l /dev/sdp
Disk /dev/sdm: 1000.2 GB, 1000204664832 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks    Id  System
/dev/sdp1   *           1      121601   976760000+   7  Linux

Importante: Se o sdp1 não aparecer no /dev quando fizer um ls -l, basta executar:
partprobe /dev/sdp

6) Partição criada, basta agora formatar para ext3 ou ext4 como necessitar

Importante: O comando deve ser digitado sem as ". Só coloquei assim pois o blogger não estava aceitando a linha abaixo.

"mkfs -t ext3 /dev/sdp1" -- Para EXT3
"mkfs -t ext4 /dev/sdp1" -- Para EXT4

-- A saída será mais ou menos essa:
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
103776256 inodes, 207521637 blocks
10376081 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
6334 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information:
done
This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
Pronto. Ext3 ok.

Importante: Note que utilizamos o /dev/sdp1 e não o /dev/sdp.

7) Verificando o tamanho da partição. O número apresentado é o tamanho da partição em blocos.

fdisk -s /dev/sdp1

8) Agora é só montar a nova partição em uma pasta do servidor. No nosso exemplo será o /u09
cd /
mkdir /u09

mount /dev/sdp1 /u09 
9) Acrescentar no FSTAB para montagem automática no reboot
vim /etc/fstab
## Acrescentar a linha abaixo - para EXT4
/dev/sdp1 /u09 ext3 defaults 0 0
 
ou
 
## Acrescentar a linha abaixo - para EXT4
/dev/sdp1 /u09 ext4 defaults 0 0
 

E foi, está lá montado e pronto para usar.

Fica ai como roteiro para não esquecer.

Abraço
Mario

terça-feira, 31 de maio de 2016

Duplicate de bases em RAC

Olá jovens... Espero que todos estejam bem...

Estou revisitando alguns posts, fazendo algumas melhorias e correções e acho que esse vale a pena.

Clonar bases em RAC é um processo bem tranquilo. Um pouco mais trabalhoso é verdade, mas bem tranquilo mesmo.

Nosso cenário:
Base: PROD
prod1 e prod1 ==> 11.2.0.4
CLONE
clone1 e clone2 ==> 11.2.0.4

Então, chega de papo. Vá até o seu local de backup e crie o arquivo "bkp.sh" com o seguinte conteúdo. Caso tenha o backup da noite (disco ou fita), melhor ainda.Utilize=o e ganhamos tempo.

export ORACLE_SID=prod1
rman target / <
run {
ALLOCATE CHANNEL d1 TYPE DISK MAXPIECESIZE 16G;
BACKUP AS COMPRESSED BACKUPSET FORMAT
            '/backup/prod/%d_%Y%M%D_%I_%s_%U.bkp' DATABASE
CURRENT CONTROLFILE FORMAT 
            '/backup/prod/ctrl_%d_%Y%M%D_%I_%s_%U.ctrl';
SQL 'ALTER SYSTEM CHECKPOINT';
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP AS COMPRESSED BACKUPSET FORMAT 
            '/backup/prod/%d_%Y%M%D_%I_%s_%U.bkp' ARCHIVELOG ALL;
BACKUP CURRENT CONTROLFILE FORMAT 
            '/backup/prod/ctrl_%d_%Y%M%D_%I_%s_%U.ctrl';
RELEASE CHANNEL d1;
}
exit;
EOF

Faça um:
chmod +x bkp.sh
nohup ./bkp.sh &

E acompanhe pelo tail:
tail -f nohup.out

Enquanto rola o backup, podemos ir realizando outras tarefas. 

Se por ventura essa base que será clonada já existir no RAC, vamos limpar todos os arquivos antigos antes de continuar
srvctl stop database -d clone

Nunca é demais lembrar que se o clone for novo, precisamos criar toda a estrutura necessárias de diretórios, o password file, etc.

orapwd file=orapwclone1 entries=3 password=123456

mkdir -p $ORACLE_BASE/admin/CLONE/adump
mkdir -p $ORACLE_BASE/admin/CLONE/udump
mkdir -p $ORACLE_BASE/admin/CLONE/bdump
mkdir -p $ORACLE_BASE/admin/CLONE/cdump

Ou seja, toda a estrutura para uma base comum, nos dois nós do RAC.

Agora sim, vamos limpar os datafiles antigos via ASMCMD. Muito cuidado ao executar a limpeza.

su - grid
asmcmd -p
ls
cd +ASMGRP01
rm -rf clone
cd ..
cd +ASMGRP02
rm -rf clone

Após o término, não esqueça de voltar para o usuário ORACLE.

Vamos editar o init da base. Se a base for nova, vamos gerar um init a partir do spfile da produção. Além dos acertos normais, 
deve-se prestar muita atenção aos itens abaixo:
    
*.control_files                 = '+ASMGRP01','+ASMGRP02'
*.CLUSTER_DATABASE        = FALSE
*.DB_RECOVERY_FILE_DEST       = '+ASMGRP02'
*.DB_RECOVERY_FILE_DEST_SIZE   = 500G
*.DB_CREATE_FILE_DEST         = '+ASMGRP01'
*.db_create_online_log_dest_1 = '+ASMGRP01'
*.db_create_online_log_dest_2 = '+ASMGRP02'

## Configure o parâmetro para evitar um bug 
        ## durante o RESETLOGS do DUPLICATE:
_no_recovery_through_resetlogs=TRUE

Não se esqueça também que apesar da clonagem ser feita inicialmente como uma base single você está em um ambiente RAC. Por isso verifique também: 
    
    *.db_name='clone'
    clone1.instance_name='clone1'    
    clone2.instance_name='clone2'
    clone1.INSTANCE_NUMBER=1
    clone2.INSTANCE_NUMBER=2
    
   clone1.local_listener='(address=(protocol=tcp)(host=99.99.99.999)(port=1521))'
   clone2.local_listener='(address=(protocol=tcp)(host=99.99.99.999)(port=1521))'

    clone1.THREAD=1
    clone2.THREAD=2

    clone1.undo_tablespace='UNDOTBS01'
    clone2.undo_tablespace='UNDOTBS02'

É isso. Agora é só dar um startup nomount na criança.

export ORACLE_SID=clone1
SQL> startup nomount
    

Beleza meninão. Agora vamos preparar o script de clonagem. Eu gosto de usar o SET NEWNAME para setar os novos caminhos dos datafiles. Não tem erro. Outros preferem usar do convert, aqui fica a seu critério.

A brincadeira vai começar a ficar legal agora.. Até o momento, só preparamos a clonagem. Vamos agora a ação, propriamente dita...

Se conecte a produção e execute esse SELECT:

select 'set newname for datafile ' || FILE_ID || ' to new;' as tt 
   from dba_data_files order by FILE_ID;

select 'set newname for tempfile ' || FILE_ID || ' to new;' as tt 
   from dba_temp_files order by FILE_ID;

Você vai receber algo assim:
set newname for datafile 1 to new;
set newname for datafile 2 to new;

set newname for tempfile 1 to new;

Esse são os datafiles e temp que serão restaurados/criados durante o duplicate.

O "new" vai me trazer uma estrutura de pastas a partir do ASM dessa forma, por exemplo:
+ASMGRP01/clone/CLONE/datafile


Vamos agora montar o script. 

cd /backup/prod
vim clone.sh

export ORACLE_SID=CLONE
rman TARGET sys/123456@PRD_DUP1 NOCATALOG AUXILIARY / <
RUN 
{
ALLOCATE AUXILIARY CHANNEL aux1 DEVICE TYPE DISK 
           FORMAT '/backup/prod/%d_%Y%M%D_%I_%s_%U.bkp' ;
set until scn 19473867277;
set newname for datafile 1 to new;
        set newname for datafile 2 to new;
        set newname for datafile 3 to new;
        set newname for datafile 4 to new;
        set newname for datafile 5 to new;
        set newname for datafile 6 to new;
        set newname for datafile 7 to new;
        set newname for datafile 8 to new;
        set newname for datafile 9 to new;
        set newname for datafile 10 to new;
        set newname for datafile 11 to new;
        SET NEWNAME FOR TEMPFILE 1 TO new;
        DUPLICATE TARGET DATABASE TO "clone"
LOGFILE
GROUP 1 ('+ASMGRP01','+ASMGRP02') SIZE 300M REUSE,
GROUP 2 ('+ASMGRP01','+ASMGRP02') SIZE 300M REUSE,
GROUP 3 ('+ASMGRP01','+ASMGRP02') SIZE 300M REUSE;
}
EXIT
EOF

Alguns pontos importantes:
PRD_DUP1 => deve apontar para o nó 1 de produção e não para uma conexão do RAC

set until scn = número do ultimo SCN que consta em seu backup de archives. Digamos que o FULL terminou as 08:29:55 do dia 28. Nosso SCN seria "19473867277" pois ele é o último archive no backup após esse horário. Eu sempre pego o do nó 1. 

Identifique o seu último backup de archives, na coluna "LOW SCN":

BS Key  Size       Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ -------------------
15173   92.93M     DISK        00:00:18     30/05/2016 21:41:10
BP Key: 15173   Status: AVAILABLE  Compressed: YES  Tag: TAG20160530T214052
Piece Name: /backup/prod/backup_db_PROD_S_15201_P_1_T_913239652

 List of Archived Logs in backup set 15173
 Thrd Seq     Low SCN    Low Time            Next SCN   Next Time
 ---- ------- ---------- ------------------- ---------- ---------
 1    4739    19472084645 27/05/2016 21:41:53 19473855500 28/05/2016 06:01:01
 1    4740    19473855500 28/05/2016 06:01:01 19473867272 28/05/2016 08:30:07
 1    4741    19473867272 28/05/2016 08:30:07 19473867277 28/05/2016 08:30:11
 1    4742    19473867277 28/05/2016 08:30:11 19475563361 28/05/2016 13:31:56
 2    4774    19472083060 27/05/2016 21:41:52 19473867269 28/05/2016 08:30:06
 2    4775    19473867269 28/05/2016 08:30:06 19473867279 28/05/2016 08:30:12
 2    4776    19473867279 28/05/2016 08:30:12 19475563358 28/05/2016 13:31:53
 2    4777    19475563358 28/05/2016 13:31:53 19475563376 28/05/2016 13:32:04
 2    4778    19475563376 28/05/2016 13:32:04 19476477750 28/05/2016 21:41:56

REDO LOGFILE => Eu gosto de já setar um conjunto mínimo de redos na clonagem. Também fica a critério.


Agora vamos executar a clonagem.
chmod +x clone.sh
nohup ./clone.sh & 

E acompanhar:
tail -f nohup.out

Se você chegou até aqui, parabéns man... Sua base já está sendo clonada. 

Se deu algo errado, volta e faz de novo.. Não desite agora... 

Continuando... Se correu tudo bem, devemos ter sucesso na clonagem.

Agora vamos fazer umas validações antes de colocar a base no RAC:

- Verificar o nome do controlfile gerado:
select value from v$parameter where name = 'control_files';
VALUE
-------------------------------------------------------
'+ASMGRP1/clone/controlfile/current.309.772155755', 
'+ASMGRP2/clone/controlfile/current.276.772155755'

Vamos baixar a base clonada e acertar o init com o nome dos controlfiles e o cluster_database

shutdown immediate

vim $ORACLE_HOME/dba/inisclone1.ora
*.control_files = '+ASMGRP1/clone/controlfile/current.309.772155755', 
                  '+ASMGRP2/clone/controlfile/current.276.772155755'
*.CLUSTER_DATABASE = TRUE

startup


Bacana, subiu? Tudo certinho? Estamos quase lá... 

Agora vamos criar redos para a thread 2 se for necessário. Mas como eu vou saber? Acredite, a informação está lá :)
    
Vamos primeiro verificar o tamanho dos Redos para criar todos iguais

select * from v$log;         
select GROUP#, THREAD#, SEQUENCE#, BYTES* from v$log;        

    GROUP#    THREAD#  SEQUENCE#      BYTES
---------- ---------- ---------- ----------
         1          1          1  134217728 
         2          1          0  134217728
         3          1          0  134217728
         

Viu ali que só temos redos para a thread 1? E a thread 2, como fica? Vamos criar, ora pois :)
        

select  GROUP#, TYPE, MEMBER from v$logfile;

GROUP# TYPE    MEMBER
------ ------- ---------------------------------------
     1 ONLINE  +ASMGRP01/clone/CLONE/onlinelog/group_1.413.766579093
       +ASMGRP01/clone/CLONE/onlinelog/group_1.413.766579094
  
     2 ONLINE  +ASMGRP01/clone/CLONE/onlinelog/group_2.412.766579093
         +ASMGRP01/clone/CLONE/onlinelog/group_2.412.766579094
  
     3 ONLINE  +ASMGRP01/clone/CLONE/onlinelog/group_3.411.766579093
       +ASMGRP01/clone/CLONE/onlinelog/group_3.411.766579094
        
Executar uma vez para cada grupo (no nosso exem-):    
alter database add logfile thread 2 ('+ASMGRP01','+ASMGRP02') 
   size 300M;
alter system switch logfile;
    
Habilitar a thread 2, se necessário
       alter database enable thread 2;

Ai sim, criar um spfile, e copiar o init, orapw, spfile para o nó 2:


 scp initclone1.ora oracle@clone-02:/oracle/app/oracle/product/10.2.0/db_1/dbs/initclone2.ora
 scp orapwclone1 oracle@clone-02:/oracle/app/oracle/product/10.2.0/db_1/dbs/orapwclone2
 scp spfileclone1.ora oracle@clone-02:/oracle/app/oracle/product/10.2.0/db_1/dbs/spfileclone2.ora

E por fim, o momento mais legal de todos: Iniciar a base no cluster

Se for nova, registrar a base primeiro nos OCR's do RAC
        srvctl add database -d clone -o /oracle/app/oracle/product/10.2.0/db_1
srvctl add instance -d clone -i clone1 -n clone-01
srvctl add instance -d clone -i clone2 -n clone-02

Start da base pelo cluster 
       srvctl start database -d clone
    
AHAHAH, bacana.. Chegamos até aqui? Ai sim, então chegamos até o final.

Espero que tenha ajudado. E que seja um guia fácil de acompanhar.

Isso eu não posso mudar nunca, e fica como no original:

Ahh, já ia esquecendo de oferecer esse post para quatro caras que me ajudaram muito na minha transição para a consultoria: 

Fabio Telles
Everton Evaristo
Breno "Sabonetão" Rodrigues
Hélio Higa. 

Obrigado pela ajuda.

E lembrem-se que "friends will be friends right to the end - Queen".


Abraço
Mario

segunda-feira, 30 de maio de 2016

DataPump - Alguns comandos interessantes...

Boa noite jovens.

Você sabia que pode parar, continuar, ver o status e outras coisas quando está executando um export ou mesmo import via datapump?

Aqui vai uma dica bem legal quando estamos trabalhando com isso. 

Primeiro, vamos verificar os jobs atuais, em andamento. Para agilizar nosso exemplo, vamos considerar que temos um job já parado, com status "NOT RUNNING".

SET lines 140
COL owner_name FORMAT a10;
COL job_name FORMAT a20
COL state FORMAT a12 
COL operation LIKE owner_name
COL job_mode LIKE owner_name

SELECT 
owner_name, 
job_name, 
operation, 
job_mode, 
state, 
attached_sessions AS ATT_SESS 
FROM 
dba_datapump_jobs;









Agora começa a ficar legal. Vamos acessar o job que está parado. Para isso, vamos executar:

expdp \'/ as sysdba\' ATTACH=SYS_EXPORT_FULL_01

Será apresentado o seguinte resultado (ou algo próximo disso, dependendo da quantidade de worker's, do que você está executando, etc).

Job: SYS_EXPORT_FULL_01
 Owner: SYSTEM
 Operation: EXPORT
 Creator Privs: TRUE
 GUID: A5441357B472DFEEE040007F0100692A
 Start Time: Thursday, 08 June, 2011 20:23:39
 Mode: FULL
 Instance: db1
 Max Parallelism: 1
 EXPORT Job Parameters:
 Parameter Name      Parameter Value:
 CLIENT_COMMAND sys/******** full=y JOB_NAME=SYS_EXPORT_FULL_01
 State: IDLING
 Bytes Processed: 0
 Current Parallelism: 1
 Job Error Count: 0
 Dump File: /u01/app/oracle/admin/db1/dpdump/expdat.dmp
 bytes written: 520,192

Worker 1 Status:
 Process Name: DW00
 State: UNDEFINED

Agora, basta saber o que quer fazer. Veja os exemplos abaixo:

- Para apresentar o status
Export> status

-- Para matar o job
Export> KILL_JOB
Export> Are you sure you wish to stop this job ([yes]/no): yes

Importante: Ao matar o job, não será mais possível executar um RESUME ou START novamente. Também o registro para os dumpfiles serão removidos.
-- Para parar o job
Export> STOP_JOB=IMMEDIATE
Export> Are you sure you wish to stop this job ([yes]/no): yes
Importante: Adicionando '=IMMEDIATE' ao STOP_JOB, este não vai finalizar a tarefa atual. Ou seja, ao reiniciar o job essa tarefa deve ser refeita.
    -- Verificar o status após a parada
    SELECT 
owner_name, 
job_name, 
operation, 
job_mode, 
state
    FROM 
dba_datapump_jobs;










-- Para executar um Restart (expdp e impdp)

Export> START_JOB[=SKIP_CURRENT]
Export> CONTINUE_CLIENT

Job EXP_FULL has been reopened at Thursday, 09 June, 2011 10:26
Restarting "SYSTEM"."SYS_EXPORT_FULL_02":  sys/******** full=y JOB_NAME=SYS_EXPORT_FULL_01
Processing object type DATABASE_EXPORT/TABLESPACE
Processing object type DATABASE_EXPORT/PROFILE
Importante: Ao acrescentar o "SKIP_CURRENT", a tarefa atual não será realizada, passando ao próximo "registro" no dump.

-- Purge de job's "perdidos" com status "NOT RUNNING" na dba_datapump_jobs (expdp e impdp)

select 'DROP TABLE '||owner||'.'||table_name||';' from dba_tables where table_name like '%SYS%EXPORT%';

select 'DROP TABLE '||owner||'.'||table_name||';' from dba_tables where table_name like '%SYS%IMPORT%';

É isso jovem. Esses comandos já salvaram algumas migrações e restaurações que apresentaram algum problema e os job's simplesmente pararam sem erro algum. 

Um grande abraço
Mario

Postagem em destaque

[ORACLE] Useful scripts for the day-to-day life of a DBA (Part 3) - System metrics

Hello everyone.   Hope you're doing well! As I said here , I've created a repository on GITHUB to share some scripts that I like t...