terça-feira, 20 de maio de 2014

Movimentando Voting Disk e OCR - RAC 10g

Olá jovens.

Hoje vou passar uma dica simples, mas bem útil para movimentar os voting disks e ocr's do seu RAC. 

Sem muita enrolação hoje, vamos ao que interessa.

Primeira parte - Preparação dos novos discos montados via OCFS

1.) Login as root
su -
  
2) Caso necessário, fazer o FDISK nos discos apresentados
ls -lrht /dev/mapper/VV_ORACLE_CRS*

fdisk /dev/mapper/VV_ORACLE_CRS0
n,p,1,enter,enter,w

Se necessário, no nó 2:
partprobe /dev/mapper/VV_ORACLE_CRS0

[+ASM1.zema-ora10g-n1 ~]$ ls -lrht /dev/mapper/VV_ORACLE_CRS?*
brw-rw---- 1 root disk 253, 24 May  8 18:02 /dev/mapper/VV_ORACLE_CRS0
brw-rw---- 1 root disk 253, 25 May  8 18:03 /dev/mapper/VV_ORACLE_CRS1
brw-rw---- 1 root disk 253, 26 May  8 18:03 /dev/mapper/VV_ORACLE_CRS2
brw-rw---- 1 root disk 253, 27 May  8 18:03 /dev/mapper/VV_ORACLE_CRS3
brw-rw---- 1 root disk 253, 28 May  8 18:03 /dev/mapper/VV_ORACLE_CRS4
brw-rw---- 1 root disk 253, 38 May  8 18:04 /dev/mapper/VV_ORACLE_CRS0p1
brw-rw---- 1 root disk 253, 39 May  8 18:04 /dev/mapper/VV_ORACLE_CRS1p1
brw-rw---- 1 root disk 253, 40 May  8 18:04 /dev/mapper/VV_ORACLE_CRS2p1
brw-rw---- 1 root disk 253, 41 May  8 18:04 /dev/mapper/VV_ORACLE_CRS3p1
brw-rw---- 1 root disk 253, 42 May  8 18:04 /dev/mapper/VV_ORACLE_CRS4p1

3) Verificar no /etc/rc.local se estes discos já fazem parte das regras de direitos (nos dois nós)

4) Criar os novos diretórios onde serão montados os discos (nos dois nós)
mkdir /ocfs2_ocr11 /ocfs2_ocr22 /ocfs2_vdsk11 /ocfs2_vdsk22 /ocfs2_vdsk33
  
chown oracle:oinstall /ocfs2_ocr11 /ocfs2_ocr22 /ocfs2_vdsk11 /ocfs2_vdsk22 /ocfs2_vdsk33
  
5) Realizar o mkfs.ocfs2 para formatar os novos discos e montar
mkfs.ocfs2 -b 4k -C 32K -N 4 -L /ocfs2_ocr11  /dev/mapper/VV_ORACLE_CRS0p1
mkfs.ocfs2 -b 4k -C 32K -N 4 -L /ocfs2_ocr22  /dev/mapper/VV_ORACLE_CRS1p1
mkfs.ocfs2 -b 4k -C 32K -N 4 -L /ocfs2_vdsk11 /dev/mapper/VV_ORACLE_CRS2p1
mkfs.ocfs2 -b 4k -C 32K -N 4 -L /ocfs2_vdsk22 /dev/mapper/VV_ORACLE_CRS3p1
mkfs.ocfs2 -b 4k -C 32K -N 4 -L /ocfs2_vdsk33 /dev/mapper/VV_ORACLE_CRS4p1
  
mount -t ocfs2 -o datavolume,nointr /dev/mapper/VV_ORACLE_CRS0p1 /ocfs2_ocr11
mount -t ocfs2 -o datavolume,nointr /dev/mapper/VV_ORACLE_CRS1p1 /ocfs2_ocr22
mount -t ocfs2 -o datavolume,nointr /dev/mapper/VV_ORACLE_CRS2p1 /ocfs2_vdsk11
mount -t ocfs2 -o datavolume,nointr /dev/mapper/VV_ORACLE_CRS3p1 /ocfs2_vdsk22
mount -t ocfs2 -o datavolume,nointr /dev/mapper/VV_ORACLE_CRS4p1 /ocfs2_vdsk33
  
6) Acrescentar as montagens no /etc/fstab (nos dois nós)
/dev/mapper/VV_ORACLE_CRS0p1 /ocfs2_ocr11       ocfs2  datavolume,nointr 0 0
/dev/mapper/VV_ORACLE_CRS1p1 /ocfs2_ocr22       ocfs2  datavolume,nointr 0 0
/dev/mapper/VV_ORACLE_CRS2p1 /ocfs2_vdsk11      ocfs2  datavolume,nointr 0 0
/dev/mapper/VV_ORACLE_CRS3p1 /ocfs2_vdsk22      ocfs2  datavolume,nointr 0 0
/dev/mapper/VV_ORACLE_CRS4p1 /ocfs2_vdsk33      ocfs2  datavolume,nointr 0 0

7) Pronto, é só verificar os discos.
df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VV_ORACLE_CRS0p1 1020M   86M  934M   9% /ocfs2_ocr11
/dev/mapper/VV_ORACLE_CRS1p1 1020M   86M  934M   9% /ocfs2_ocr22
/dev/mapper/VV_ORACLE_CRS2p1 1020M   86M  934M   9% /ocfs2_vdsk11
/dev/mapper/VV_ORACLE_CRS3p1 1020M   86M  934M   9% /ocfs2_vdsk22
/dev/mapper/VV_ORACLE_CRS4p1 1020M   86M  934M   9% /ocfs2_vdsk33


Segunda parte - Movimentação

1) Login as root
su -

2) Verificações
  
cd $GRID_HOME/bin            (/oracle/app/oracle/product/10.2.0/crs/bin/)
-- OCR's
./ocrcheck

Status of Oracle Cluster Registry is as follows :
     Version                  :          2
     Total space (kbytes)     :     262120
     Used space (kbytes)      :       9504
     Available space (kbytes) :     252616
     ID                       : 1593614163
     Device/File Name         : /ocfs2_ocr1/ocr01.ocr
                                Device/File integrity check succeeded
     Device/File Name         : /ocfs2_ocr2/ocr02.ocr
                                Device/File integrity check succeeded

     Cluster registry integrity check succeeded


-- VD
./crsctl query css votedisk
    0.     0    /ocfs2_vdsk1/vdisk01.crs
    1.     0    /ocfs2_vdsk2/vdisk02.crs
    2.     0    /ocfs2_vdsk3/vdisk03.crs

-- Backup's
./ocrconfig -showbackup

israc01  2014/05/16 20:19:08 /oracle/app/oracle/oracle/product/10.2.0/crs/cdata/crs
israc01  2014/05/16 16:19:08 /oracle/app/oracle/oracle/product/10.2.0/crs/cdata/crs
israc01  2014/05/16 12:19:08 /oracle/app/oracle/oracle/product/10.2.0/crs/cdata/crs
israc01  2014/05/15 00:19:07 /oracle/app/oracle/oracle/product/10.2.0/crs/cdata/crs
israc01  2014/05/16 00:19:08 /oracle/app/oracle/oracle/product/10.2.0/crs/cdata/crs

  
-- Executa o backup manual
./ocrconfig -export /oracle/app/oracle/product/10.2.0/crs/cdata/crs/ocr_20140518_1300 -s online

dd if=/ocfs2_vdsk1/vdisk01.ocr of=/oracle/app/oracle/product/10.2.0/crs/cdata/crs/vdisk01.crs.bak bs=4k
2500+0 records in
2500+0 records out
10240000 bytes (10 MB) copied, 0.079659 seconds, 129 MB/s

dd if=/ocfs2_vdsk2/vdisk02.ocr of=/oracle/app/oracle/product/10.2.0/crs/cdata/crs/vdisk02.crs.bak bs=4k
2500+0 records in
2500+0 records out
10240000 bytes (10 MB) copied, 0.088987 seconds, 115 MB/s

dd if=/ocfs2_vdsk3/vdisk03.ocr of=/oracle/app/oracle/product/10.2.0/crs/cdata/crs/vdisk03.crs.bak bs=4k
2500+0 records in
2500+0 records out
10240000 bytes (10 MB) copied, 0.103655 seconds, 98.8 MB/s

[root@zema-ora10g-n1 bin]# ls -lrht /oracle/app/oracle/product/10.2.0/crs/cdata/crs
total 96M
-rw-r--r-- 1 root root 9.5M May 11 06:44 week.ocr
-rw-r--r-- 1 root root 9.5M May 17 06:44 day.ocr
-rw-r--r-- 1 root root 9.5M May 18 02:44 backup02.ocr
-rw-r--r-- 1 root root 9.5M May 18 06:44 week_.ocr
-rw-r--r-- 1 root root 9.5M May 18 06:44 day_.ocr
-rw-r--r-- 1 root root 9.5M May 18 06:44 backup01.ocr
-rw-r--r-- 1 root root 9.5M May 18 10:44 backup00.ocr
-rw-r--r-- 1 root root 223K May 18 13:04 ocr_20140518_1300
-rw-r--r-- 1 root root 9.8M May 18 13:06 vdisk01.crs.bak
-rw-r--r-- 1 root root 9.8M May 18 13:06 vdisk02.crs.bak
-rw-r--r-- 1 root root 9.8M May 18 13:06 vdisk03.crs.bak

[prdmv1.israc01 ~]$ ~/crstat.sh
HA Resource                                   Target     State
-----------                                   ------     -----
ora.zema-ora10g-n1.ASM1.asm                   ONLINE     ONLINE on zema-ora10g-n1
ora.zema-ora10g-n1.LISTENER_ZEMA-ORA10G-N1.lsnr ONLINE     ONLINE on zema-ora10g-n1
ora.zema-ora10g-n1.gsd                        ONLINE     ONLINE on zema-ora10g-n1
ora.zema-ora10g-n1.ons                        ONLINE     ONLINE on zema-ora10g-n1
ora.zema-ora10g-n1.vip                        ONLINE     ONLINE on zema-ora10g-n1
ora.zema-ora10g-n2.ASM2.asm                   ONLINE     ONLINE on zema-ora10g-n2
ora.zema-ora10g-n2.LISTENER_ZEMA-ORA10G-N2.lsnr ONLINE     ONLINE on zema-ora10g-n2
ora.zema-ora10g-n2.gsd                        ONLINE     ONLINE on zema-ora10g-n2
ora.zema-ora10g-n2.ons                        ONLINE     ONLINE on zema-ora10g-n2
ora.zema-ora10g-n2.vip                        ONLINE     ONLINE on zema-ora10g-n2
ora.bdprd.bdprd1.inst                         ONLINE     ONLINE on zema-ora10g-n1
ora.bdprd.bdprd2.inst                         ONLINE     ONLINE on zema-ora10g-n2
ora.bdprd.db                                  ONLINE     ONLINE on zema-ora10g-n1
ora.bdsml.bdsml1.inst                         ONLINE     ONLINE on zema-ora10g-n1
ora.bdsml.bdsml2.inst                         ONLINE     ONLINE on zema-ora10g-n2
ora.bdsml.db                                  ONLINE     ONLINE on zema-ora10g-n1
ora.bdtrn.bdtrn1.inst                         ONLINE     ONLINE on zema-ora10g-n1
ora.bdtrn.bdtrn2.inst                         ONLINE     ONLINE on zema-ora10g-n2
ora.bdtrn.db                                  ONLINE     ONLINE on zema-ora10g-n2
  
Importante: Verificar se não existe SPFILE ou qualquer outro arquivo nas áreas que não serão mais utilizadas. Se houver, alterar.
   
3) Parar todos os serviços do RAC (nos dois nós)
  
-- Nó 2
/etc/init.d/init.crs stop
    Shutting down Oracle Cluster Ready Services (CRS):
    May 18 13:09:03.653 | INF | daemon shutting down
    Stopping resources. This could take several minutes.
    Successfully stopped CRS resources.
    Stopping CSSD.
    Shutting down CSS daemon.
    Shutdown request successfully issued.
    Shutdown has begun. The daemons should exit soon.

-- Nó 1
/etc/init.d/init.crs stop
    Shutting down Oracle Cluster Ready Services (CRS):
    May 18 13:10:04.123 | INF | daemon shutting down
    Stopping resources. This could take several minutes.
    Successfully stopped CRS resources.
    Stopping CSSD.
    Shutting down CSS daemon.
    Shutdown request successfully issued.
    Shutdown has begun. The daemons should exit soon.

--Verificação
./crsctl check crs
    Failure 1 contacting CSS daemon
    Cannot communicate with CRS
    Cannot communicate with EVM

4) Cria os novos VD's para as novas localizações
  
./crsctl add css votedisk /ocfs2_vdsk11/vdisk011.crs -force
    Now formatting voting disk: /ocfs2_vdsk11/vdisk011.crs
    successful addition of votedisk /ocfs2_vdsk11/vdisk011.crs .

./crsctl add css votedisk /ocfs2_vdsk22/vdisk022.crs -force
    Now formatting voting disk: /ocfs2_vdsk22/vdisk022.crs
    successful addition of votedisk /ocfs2_vdsk22/vdisk022.crs .

./crsctl add css votedisk /ocfs2_vdsk33/vdisk033.crs -force
    Now formatting voting disk: /ocfs2_vdsk33/vdisk033.crs
    successful addition of votedisk /ocfs2_vdsk33/vdisk033.crs .
  
Importante: Não esquecer de verificar as permissões dos arquivos criados:
    chown oracle:oinstall /ocfs2_vdsk11/vdisk011.crs
    chown oracle:oinstall /ocfs2_vdsk22/vdisk022.crs
    chown oracle:oinstall /ocfs2_vdsk33/vdisk033.crs
  
  
ls -lrht /ocfs2_vdsk11
total 9.8M
drwxr-xr-x 2 root   root     3.9K May 17 20:47 lost+found
-rw-r--r-- 1 oracle oinstall 9.8M May 18 13:29 vdisk011.crs

ls -lrht /ocfs2_vdsk22
total 9.8M
drwxr-xr-x 2 root   root     3.9K May 17 20:47 lost+found
-rw-r--r-- 1 oracle oinstall 9.8M May 18 13:29 vdisk022.crs

ls -lrht /ocfs2_vdsk33
total 9.8M
drwxr-xr-x 2 root   root     3.9K May 17 20:47 lost+found
-rw-r--r-- 1 oracle oinstall 9.8M May 18 13:31 vdisk033.crs
  
5)     Verifica se a alteração foi realizada
./crsctl query css votedisk

0.     0    /ocfs2_vdsk1/vdisk01.crs
1.     0    /ocfs2_vdsk2/vdisk02.crs
2.     0    /ocfs2_vdsk3/vdisk03.crs
3.     0    /ocfs2_vdsk11/vdisk011.crs            -- Novo
4.     0    /ocfs2_vdsk22/vdisk022.crs            -- Novo
5.     0    /ocfs2_vdsk33/vdisk033.crs            -- Novo

6) Exclui os VD's antigos e verifica novamente

./crsctl delete css votedisk /ocfs2_vdsk1/vdisk01.ocr -force
    successful deletion of votedisk /ocfs2_vdsk1/vdisk01.ocr.

./crsctl delete css votedisk /ocfs2_vdsk2/vdisk02.ocr -force
    successful deletion of votedisk /ocfs2_vdsk2/vdisk02.ocr.

./crsctl delete css votedisk /ocfs2_vdsk3/vdisk03.ocr -force
    successful deletion of votedisk /ocfs3_vdsk1/vdisk03.ocr.

      
./crsctl query css votedisk
    0.     0    /ocfs2_vdsk11/vdisk011.crs
    1.     0    /ocfs2_vdsk22/vdisk022.crs
    2.     0    /ocfs2_vdsk33/vdisk033.crs

7) Agora vamos movimentar os OCR's. Para isso, iniciar o CRS nos dois nós
./crsctl start crs
  
-- Checar se subiu
./crsctl check crs
    CSS appears healthy
    CRS appears healthy
    EVM appears healthy

8) Criar os novos OCR's:

touch /ocfs2_ocr11/ocrs011.crs
touch /ocfs2_ocr22/ocrs022.crs
  
Importante: Não esquecer de deixar os direitos iguais aos antigos

./ocrconfig -replace ocr /ocfs2_ocr11/ocrs011.crs
./ocrconfig -replace ocrmirror /ocfs2_ocr22/ocrs022.crs

-- Verificar a alteração de local
cat /etc/oracle/ocr.loc

9) Verificações
./ocrcheck
  
Status of Oracle Cluster Registry is as follows :
     Version                  :          2
     Total space (kbytes)     :     262120
     Used space (kbytes)      :       3840
     Available space (kbytes) :     258280
     ID                       :  665915271
     Device/File Name         : /ocfs2_ocr11/ocrs011.crs
                                Device/File integrity check succeeded
     Device/File Name         : /ocfs2_ocr22/ocrs022.crs
                                Device/File integrity check succeeded

     Cluster registry integrity check succeeded

10) Verificar todos os serviços, fstab e fazer um restart no CRS apenas para conferência (nos dois nós)
./crsctl stop crs
./crsctl start crs
    
-- Fontes
OCR / Vote disk Maintenance Operations: (ADD/REMOVE/REPLACE/MOVE) (Doc ID 428681.1)
Failed to Start CRS stack After Adding a New Voting Disk [ID 460874.1]


É filho, se chegou até aqui e não me xingou é porquê deu tudo certo né?

Mario
Abraço

terça-feira, 6 de maio de 2014

Alterar IP's Public e Virtual no Oracle RAC

Jovens, bom dia.

Esses dias o meu chefe Japa San pediu para eu ir até um cliente que precisaria realizar a alteração dos IP's publico e virtuais de um RAC 10G.

Abaixo segue o que foi feito - com sucesso, diga-se :D

Algumas verificações ali eram desnecessárias, mas para deixar tudo muito bem documentado no relatório do trabalho, achei legal deixar.

No final, segue os notes usados como base para o trabalho.

1. Verificar os backup's do OCR.
    Verifica o OCR
        ocrcheck
        Status of Oracle Cluster Registry is as follows :
        Version                  :          2
        Total space (kbytes)     :     262120
        Used space (kbytes)      :       4660
        Available space (kbytes) :     257460
        ID                       : 1398221949
        Device/File Name         : /ocfs2_ocr1/ocrs01.crs
        Device/File integrity check succeeded
        Device/File Name         : /ocfs2_ocr2/ocrs02.crs
        Device/File integrity check succeeded
        Cluster registry integrity check succeeded
   
    Verifica as VD
        crsctl query css votedisk
             0.     0    /ocfs2_vdsk1/vdisk01.crs
             1.     0    /ocfs2_vdsk2/vdisk02.crs
             2.     0    /ocfs2_vdsk3/vdisk03.crs
       
    Verifica o backup automático
        ocrconfig -showbackup
            srvora01     2014/04/10 13:39:38     /oracle/app/oracle/product/10.2.0/crs_1/cdata/oracrs
            srvora01     2014/04/10 09:39:38     /oracle/app/oracle/product/10.2.0/crs_1/cdata/oracrs
            srvora01     2014/04/10 05:39:38     /oracle/app/oracle/product/10.2.0/crs_1/cdata/oracrs
            srvora01     2014/04/09 09:39:37     /oracle/app/oracle/product/10.2.0/crs_1/cdata/oracrs
            srvora01     2014/03/31 01:39:25     /oracle/app/oracle/product/10.2.0/crs_1/cdata/oracrs

            ls -lrht /oracle/app/oracle/product/10.2.0/crs_1/cdata/oracrs
            -rw-r--r-- 1 root root 4.7M Mar 31 01:39 week.ocr
            -rw-r--r-- 1 root root 4.7M Apr  7 01:39 week_.ocr
            -rw-r--r-- 1 root root 4.7M Apr  9 09:39 day.ocr
            -rw-r--r-- 1 root root 4.7M Apr 10 09:39 day_.ocr
            -rw-r--r-- 1 root root 4.7M Apr 10 13:39 backup02.ocr
            -rw-r--r-- 1 root root 4.7M Apr 10 17:39 backup01.ocr
            -rw-r--r-- 1 root root 4.7M Apr 10 21:39 backup00.ocr
            -rw-r--r-- 1 root root 107K Apr 11 01:21 ocr201404110120

    Executa o backup manual
      ocrconfig -export /oracle/app/oracle/product/10.2.0/crs_1/cdata/oracrs/ocr201404110120 -s online
          ou
          ocrconfig -manualbackup
       
       
2. Verifica as informações das placas, IP's, VIP, etc
    cd $CRS_HOME/bin
   
    oifcfg iflist
        eth0   11.0.0.0
        bond0  172.16.0.0

    oifcfg getif
        eth0 11.0.0.0 global cluster_interconnect
        bond0 172.16.0.0 global public

    -- Verifica o VIP   
    srvctl config nodeapps -n srvora01 -a
        VIP exists.: /srvora01-vip/172.16.0.205/255.255.255.0/bond0

    srvctl config nodeapps -n srvora02 -a
        VIP exists.: /srvora02-vip/172.16.0.204/255.255.255.0/bond0

    -- ./crsstat
    HA Resource                                   Target     State
    -----------                                   ------     -----
    ora.ttt.db                                    ONLINE     ONLINE on srvora01
    ora.ttt.ttt01.inst                            ONLINE     ONLINE on srvora01
    ora.ttt.ttt02.inst                            ONLINE     ONLINE on srvora02
    ora.xxx.db                                    ONLINE     ONLINE on srvora01
    ora.xxx.xxx01.inst                            ONLINE     ONLINE on srvora01
    ora.xxx.xxx02.inst                            ONLINE     ONLINE on srvora02
    ora.srvora01.ASM1.asm                         ONLINE     ONLINE on srvora01
    ora.srvora01.LISTENER_SRVORA01.lsnr           ONLINE     ONLINE on srvora01
    ora.srvora01.gsd                              ONLINE     ONLINE on srvora01
    ora.srvora01.ons                              ONLINE     ONLINE on srvora01
    ora.srvora01.vip                              ONLINE     ONLINE on srvora01
    ora.srvora02.ASM2.asm                         ONLINE     ONLINE on srvora02
    ora.srvora02.LISTENER_SRVORA02.lsnr           ONLINE     ONLINE on srvora02
    ora.srvora02.gsd                              ONLINE     ONLINE on srvora02
    ora.srvora02.ons                              ONLINE     ONLINE on srvora02
    ora.srvora02.vip                              ONLINE     ONLINE on srvora02
   
3. Para todos os serviços do RAC (como root)
     srvctl stop database -d ttt
     srvctl stop database -d xxx
     srvctl stop vip -n srvora01
     srvctl stop vip -n srvora02

    OU (se preferir :D muito mais simples)
   
    /etc/init.d/init.crs stop
   
4. Altera a interface (em apenas um dos nodes já que vai utilizar a opção -global) - Como ORACLE

    $ oifcfg setif -global /:public
    $ oifcfg setif -global /:cluster_interconnect

    Exemplo:
   
    -- Aqui mantive os IP's e alterei somente a interface
    $ oifcfg setif -global bond0:1/172.16.0.0:public
    $ oifcfg setif -global bond0:4/11.0.0.0:cluster_interconnect
       
           
    Para o VIP, além disso, também é necessário alterar no OCR através do srvctl, como ROOT - somente para 11g
   
        -- Aqui mantive os IP's e alterei somente a interface
        srvctl modify nodeapps -n srvora01 -o /oracle/app/oracle/product/11.2.0/crs -A 11.0.0.2/255.255.255.0/bond0:4
        srvctl modify nodeapps -n srvora02 -o /oracle/app/oracle/product/11.2.0/crs -A 11.0.0.1/255.255.255.0/bond0:4
       
        OU
       
        srvctl modify nodeapps -n srvora01 -o /oracle/app/oracle/product/11.2.0/crs -A srvora01-vip/255.255.255.0/bond0:4
        srvctl modify nodeapps -n srvora02 -o /oracle/app/oracle/product/11.2.0/crs -A srvora02-vip/255.255.255.0/bond0:4
       
            -n - Node name.
            -o - Oracle Home for the cluster software (CRS-Home).
            -A - The node level VIP address (/netmask[/if1[|if2|...]]).
   
5. Verifica (deveria ficar assim)
    oifcfg iflist
        bond1  11.0.0.0
        bond0  172.16.0.0

    oifcfg getif
        bond1 11.0.0.0 global cluster_interconnect
        bond0 172.16.0.0 global public
               
6. Modifica o hosts (se necessário, se for mudança de IP)   

7. Sobe o rac
    /etc/init.d/init.crs start
   
8. Remove the old interface if required:
    $ oifcfg delif -global [/]
    eg:
    oifcfg delif -global bond0/172.16.0.0
    oifcfg delif -global eth0/11.0.0.0

   
Jovens, é isso.

Lembre-se. Esse processo é só para Publico/Virtual.

E antes que eu esqueça, os notes de base:
1. "How to Change Interconnect/Public Interface IP or Subnet in Oracle Clusterware", Doc ID: 283684.1
2. "Modifying the VIP or VIP Hostname of a 10g or 11g Oracle Clusterware Node", DOC ID: 276434.1

 
Abraço
Mario


   

domingo, 4 de maio de 2014

Movimentar datafiles em um standby

Ahhhh Jovem, você aqui de novo?

Que bom, que bom. Sinal que as postagens estão ajudando..

Caso você precise alterar o local de algum datafile de um StandBy, basta seguir os passos abaixo:

1- Baixar o banco standby.
    shutdown immediate;

2- Fazer a copia dos datafiles da origem para destino.
    cp -rv

3- Montar o banco standby.
    startup mount;

4- Alterar gerenciamento de arquivos do standby para MANUAL.
    show parameter standby;
    alter system set standby_file_management=MANUAL scope=both;

5- Realizar o rename dos datafiles copiados.
    alter database rename file '' to '';

6- Voltar gerenciamento de arquivos do standby valor antigo.
    alter system set standby_file_management=AUTO scope=both;

7- Montar novamente a base em modo standby.
    shutdown immdiate;
    startup nomount;
    alter database mount standby database;
   
Ai está jovem. Fácil e rápido.

Dica do meu amigo Rafael Ferreira.

Abraço
Mario

Apresentar o HISTORY com data e hora



Olá jovens.

Segue ai uma dica bem rapidinha e fácil, mas que pode te ajudar nas investigações que você possa precisar fazer para descobrir quem foi aquele abençoado que deletou todos os seus arquivos de trace, por exemplo.

Ou descobrir quem achou que aqueles tais "archives" só estavam ocupando espaço em disco e quepodiam ser excluídos.

Geralmente o comando "history" nos apresenta apenas o comando executado, como o exemplo abaixo:

[+ASM1.mario01 ~]$ history |grep siscontrol
  425  siscontrol
  508  siscontrol status
  519  siscontrol status
  522  siscontrol status
  531  siscontrol status
  537  siscontrol status
  885  siscontrol status
  955  siscontrol status
  968  siscontrol status
  996  siscontrol status
 1005  history |grep siscontrol

Agora, acrescentando a linha abaixo ao .bash_profile do usuário, veja que legal a saída:

vim ~/.bash_profile

Acrescentar:
       ## Para mostrar o history com data e hora
       export HISTTIMEFORMAT="%d/%m/%y %T "

Recarregue o bash_profile:
       source ~/.bash_profile

Execute novamente:
      
[+ASM1.mario01 ~]$ history |grep siscontrol
  425  04/05/14 15:58:18 siscontrol
  508  04/05/14 15:58:18 siscontrol status
  519  04/05/14 15:58:18 siscontrol status
  522  04/05/14 15:58:18 siscontrol status
  531  04/05/14 15:58:18 siscontrol status
  537  04/05/14 15:58:18 siscontrol status
  885  04/05/14 15:58:18 siscontrol status
  955  04/05/14 15:58:18 siscontrol status
  968  04/05/14 15:58:18 siscontrol status
  996  04/05/14 15:58:18 siscontrol status
 1005  04/05/14 15:59:52 history |grep siscontrol
 1008  04/05/14 16:00:46 history |grep siscontrol

Pode parecer bobo, mas saber a data e hora do que foi executado pode ajudar demais.

Dica rápida e fácil que foi passada pelo meu amigo Breno Rodrigues.

Abraço
Mario

Oracle Goldengate - Parte 4


Jovens

Agora sim. Vamos configurar o EXTRACT e o DATA PUMP.

Prometo, sem enrolação hoje.

Se quiser lembrar onde estamos. Veja aqui [1] e aqui [2] e aqui também [3].

Sem delongas, vamos ao que interessa.

Os procedimentos abaixo devem ser feitos no SOURCE e no TARGET.

1) Criação dos subdiretórios do GoldenGate - Ir até o GG_HOME.

   
cd $GG_HOME
    ./ggsci

    GGSCI (mario) 1> create subdirs

    Creating subdirectories under current directory /oracle/oradata/QSP/gg11

    Parameter files                /oracle/oradata/QSP/gg11/dirprm: already exists
    Report files                   /oracle/oradata/QSP/gg11/dirrpt: created
    Checkpoint files               /oracle/oradata/QSP/gg11/dirchk: created
    Process status files           /oracle/oradata/QSP/gg11/dirpcs: created
    SQL script files               /oracle/oradata/QSP/gg11/dirsql: created
    Database definitions files     /oracle/oradata/QSP/gg11/dirdef: created
    Extract data files             /oracle/oradata/QSP/gg11/dirdat: created
    Temporary files                /oracle/oradata/QSP/gg11/dirtmp: created
    Stdout files                   /oracle/oradata/QSP/gg11/dirout: created

2) Configuração da porta de comunicação do MANAGER.
Lembre-se que o MANAGER deve estar no ar antes de começarmos os procesoss de EXTRACT/REPLICAT.
       
        -- SOmente mostrando o status do MANAGER no momento
        GGSCI (mario) 1> info all
        Program     Status      Group       Lag at Chkpt  Time Since Chkpt
        MANAGER     STOPPED

        -- Vamos editar o arquivo de parâmetros do MANAGER
        GGSCI (mario) 1> edit params mgr
       
        Incluir a linha abaixo:   
        PORT 7090
       
        Importante: Aqui pode ser a porta que quiserem. Eu escolhi essa, mas podem colocar qualquer porta. Salve a alteração.
       
        -- Vamos iniciar o MANAGEr
        GGSCI (mario) 1> start manager
        Manager started.

        GGSCI (mario) 1> info all
        Program     Status      Group       Lag at Chkpt  Time Since Chkpt
        MANAGER     RUNNING

        Importante: Não esqueça de fazer isso no TARGET. Eu espero...
       
3) Configuração do checkpointtable e trandata
       
        -- Lembra que criamos o user lá no artigo 2? Pois é, vamos usar aqui.
        GGSCI (mario) 1> dblogin userid gguser; password COLOQUE_UMA_SENHA_DECENTE_POR_FAVOR
        Successfully logged into database.

        -- Imagine que o processo de REPLICAT está replicando os dados para o TARGET, e então ocorre algo inesperado. Imaginamos que o REPLICAT vai para o status ABENDED devido a algum tipo de erro de falta de registro, por exemplo.
       
        O GoldenGate se oriente de quais operações foram replicadas de duas formas. Sempre é gravado um arquivo de controle e verificação em /dirchk . Este arquivo deve existir e se ele for removido o GoldenGate perde o controle de seus processos.
       
        Podemos também criar uma tabela de ponto de verificação (CHECKPOINT TABLE). Criar essa tabela é opcional e pode ser especificado globalmente (através do arquivo GLOBALS que não iremos utilizar nesses artigos) ou para cada processo de replicação.
       
        Quando o processo de REPLICAT é iniciado e se a tabela existe, ele não lê o arquivo de verificação e sim a tabela de ponto de verificação encontrando o ponto de recuperação e começando a reaplicar todas as transações que ocorreram logo após a parada.    
           
       
GGSCI (mario) 1> ADD CHECKPOINTTABLE gguser.checkpoint
        Successfully created checkpoint table gguser.checkpoint.

       
-- Agora vamos executar o trandata para os owner's que vamos replicar. O ADD TRANDATA permiti ao GoldenGate adquirir as informações de transação que ele precisa para replicação a partir dos registros de transações.                                             
       
        GGSCI (mario) 1> add trandata SAPSR3.*

Pessoal, tudo ok até aqui não é? Como eu escrevi antes, essa é uma maneira de ser feito. Você pode preferir não usar a CHECKPOINT TABLE. Ou criar um arquivo GLOBALS para especificar uma tabela global, enfim. Veja o que melhor te atende.
       
Agora, vamos criar o EXTRACT e DATA PUMP no SOURCE. Somente no SOURCE.       
       
4) Ainda conectado com o dblogin
    GGSCI (mario) 1> dblogin userid gguser; password COLOQUE_UMA_SENHA_DECENTE_POR_FAVOR
    Successfully logged into database.

5) Configuração do EXTRACT
   
    -- Você se lembra que fizemos um expdp/impdp com o flashback_scn? Pois bem, vamos usar o SCN para adicionar o extract a partir dele.
    GGSCI (mario) 1> ADD EXTRACT extqsp6, TRANLOG, SCN 5600816832
   
    Importante: Se você fez um export com a base fechada, aqui você pode usar um "BEGIN NOW" ao invés do SCN. Ficaria assim:
    GGSCI (mario) 1> ADD EXTRACT extqsp6, TRANLOG, BEGIN NOW
       
    -- Vamos também indicar o nosso arquivo de trail para o EXTRACT. Criaremos arquivos de 512M.
    GGSCI (mario) 1> ADD EXTTRAIL ./dirdat/sc, EXTRACT extqsp6, megabytes 512
   
    -- Agora vamos editar o arquivo de parâmetros so EXTRACT    
       
        Incluir as linhas abaixo no arquivo. Podem tirar os comentários se quiser.
       
        GGSCI (mario) 1> edit params extqsp6
           
        -- Nome do extract
        EXTRACT extqsp6
        -- Usuário e senha para as conexões
        USERID gguser, PASSWORD COLOQUE_UMA_SENHA_DECENTE_POR_FAVOR
        -- Trail File
        EXTTRAIL ./dirdat/sc
        -- Indica ao GG que uma operação de TRUNCATE deve ser replicada. Por padrão, o GG não replica truncates.
        GETTRUNCATES
        -- Usamos o DDL para ativar o suporte a DDL, filtrar as operações DDL e configurar uma ação de processamento com base em um DDL. O INCLUDE identifica o início de uma cláusula que contém critérios de filtragem que identificam o escopo DDL que este parâmetro afetará. O MAPPED mapeia o escopo da filtragem.
        DDL INCLUDE MAPPED OBJNAME SAPSR3.*
        -- Tabelas que devem ser extraídas
        TABLE SAPSR3.*;
       
        Salve o arquivo. Esse já está pronto.
       
6) Configuração do Data Pump
       
        -- Vamos fazer o add do pump
        GGSCI (mario) 1> ADD EXTRACT pumpqsp6, EXTTRAILSOURCE ./dirdat/sc, SCN 5637686564
   
        Importante: Se você quiser fazer o pump a partir de um ponto no tempo, pode também. Ficaria assim:
        GGSCI (mario) 1> add extract pumpqsp6, tranlog, begin 2014-04-15 02:00
       
        -- O ADD RMTTRAIL cria uma trilha para o processamento on-line no servidor remoto além de associar um trail a um EXTRACT.
        GGSCI (mario) 1> ADD RMTTRAIL ./dirdat/st, EXTRACT pumpqsp6, megabytes 512
               
        -- Editamos agora o parameter file
        edit params pumpqsp6
       
        -- Nome do pump
        EXTRACT pumpqsp6
       
        -- Usuário e senha para as conexões
        USERID gguser, PASSWORD COLOQUE_UMA_SENHA_DECENTE_POR_FAVOR
       
        -- Especificar o RMTHOST antes da entrada de RMTTRAIL para identificar o servidor remoto e a porta
        RMTHOST 10.193.125.59, MGRPORT 7090
       
        -- Local do trail
        RMTTRAIL ./dirdat/st
       
        -- Indica ao GG que uma operação de TRUNCATE deve ser replicada. Por padrão, o GG não replica truncates.
        GETTRUNCATES
       
        -- Tabelas que devem ser extraídas
        TABLE SAPSR3.*;
       
7) É isso ai. Agora vamos iniciar os dois
    GGSCI (mario) 1> start extract extqsp6
    GGSCI (mario) 1> start extract pumpqsp6
       
8) E listar e ver se está tudo no ar
   
    GGSCI (mario) 1> status manager
    Manager is running (IP port mario.7090).
   
    GGSCI (mario) 1> info all
    Program     Status      Group       Lag           Time Since Chkpt
    MANAGER     RUNNING
    EXTRACT     RUNNING     extqsp6     00:00:00      00:00:09
    EXTRACT     RUNNING     pumpqsp6    00:00:00      00:00:09
   
    Importante: Para uma informação um pouco mais detalhada:
    info extract extqsp6, detail
    info extract pumpqsp6, detail
   
   
    Além de ver o log:
    cd $GG_HOME
    tail -f ggserr.log
   
    ou
   
    GGSCI (mario) 1> VIEW GGSEVT


Agora, vamos criar o REPLICAT no TARGET. Somente no TARGET.       

1) Login, como já feito antes.   
    GGSCI (mario) 1> dblogin userid gguser; password gguserquero

2)     Vamos fazer o add do replicat
    GGSCI (mario) 1> add replicat repqsp6, exttrail ./dirdat/st, CHECKPOINTTABLE GGUSER.checkpoint
   
    Importante: Aqui, se você sabe o momento que deve iniciar o replicat, melhor definir uma data e hora.
    GGSCI (mario) 1> add replicat  repqsp6, ExtTrail ./dirdat/rb, Begin 2014-05-04 03:50:00
   
    -- Editamos agora o parameter file
    edit params repqsp6
   
    -- Nome do replicat
    REPLICAT repqsp6
   
    -- Quando os objetos de origem e destino especificados na instrução MAP têm estrutura exatamente igual. Quando as tabelas de origem e de destino têm estruturas diferentes, devemos criar um arquivo de definições de dados para o objeto de origem e especificar as definições do arquivo com o parâmetro SOURCEDEFS.
    ASSUMETARGETDEFS
   
    -- Muito cuidado aqui jovem. Use as HANDLECOLLISIONS para controlar registros duplicados. Essas duplicidades chamadas de colisões, ocorrem durante uma carga inicial, por exemplo. Quando os dados de tabelas de origem estão sendo carregados e o Oracle GoldenGate está extraindo as alterações transacionais que estão sendo feitas nas tabelas. Quando o GG replicar as alterações após a carga inicial, o HANDLECOLLISIONS fornece ao Replicat uma lógica de tratamento de erros para essas colisões.
    HANDLECOLLISIONS
   
    -- Usuário e senha para as conexões
    USERID gguser, PASSWORD gguserquero
   
    -- Indica ao GG que uma operação de TRUNCATE deve ser replicada. Por padrão, o GG não replica truncates.
    GETTRUNCATES
   
    -- Mapeamento das tabelas de origem e destino
    MAP SAPSR3.*, TARGET SAPSR3.*;
   
    -- Suporte a ddl
    DDL INCLUDE ALL

    -- Aqui vamos ignorar todos os erros, sem tentar novas tentativas de replicação (RETRYOP). Existem várias formas de tratamento desses erros, aqui somente para exemplo, vamos nesse mais genérico. Você pode usar várias instâncias do DDLERROR no mesmo arquivo de parâmetros para lidar com todos os erros que estão previstos.
    DDLERROR DEFAULT IGNORE RETRYOP

3) Agora jovem, basta iniciar...
    start replicat repqsp6, aftercsn 5600816832
   
4) E verificar.
    GGSCI (mario) 1> info all
    Program     Status      Group       Lag           Time Since Chkpt
    MANAGER     RUNNING
    REPLICAT    RUNNING     repqsp6     00:00:00      00:00:19

    -- Um pouco mais detalhado
    stats REPLICAT repqsp6, total, hourly, reportrate min   
    stats REPLICAT repqsp6, total, hourly, table ., reportrate min

   
Ahhhhhhhhhhhhhhhhhhhh meu amigo, estou sentindo a replicação acontecendo.

Se chegamos até aqui é porque conseguimos!!!! Agora é só partir para os testes. Crie tabelas, insira dados, delete, atualize e

Se deu algum erro, repasse os passos. Lembre-se, esse é um cenário específico para as necessidades de um cliente. Pode ser que você precise fazer algum acerto.

Procure nos manuais da Oracle outras opções, veja outros blogs, corra atrás. É muito legal.

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...