mai 082012
 

Hoje os Treinamentos na Nerv fazem dois anos.

Trabalhamos bastante, mas o resultado é excelente.

Nestes dois anos realizamos exatamente TRINTA E SETE Treinamentos. Praticamente um a cada 20 dias, na média.
Tivemos até o momento 120 alunos (para mim são 120 amigos). Preenchemos 180 vagas, o que significa que a maioria dos alunos faz mais que um Treinamento. Quem vem, volta.
Mais da metade dos alunos não é do estado de São Paulo.
Nunca cancelamos uma turma.

E o mais importante, ensinei a vários profissionais o pouco que sei. Espero que este conhecimento tenha ajudado a eles e suas empresas.
Eu também aprendi muito, muito mesmo, porque dou aula a estes profissionais que estão no mercado, e sempre me trazem novos problemas e cenários.

Nada mal para uma empresa de duas pessoas. Nosso modelo não nos permite crescer, e nem queremos. São raríssimas as empresas grandes que prestam um bom serviço.

E para comemoramos, mais trabalho. Estou preparando novos Treinamentos.

Que venham os próximos dois anos!

http://nervinformatica.com.br

mai 072012
 

6810189O comando do RMAN CONVERT DATABASE na verdade é utilizado no banco de dados origem (também há uma técnica para executa-lo no banco de dados destino, mas acho mais fácil na origem) para criar uma cópia dos DATAFILEs, e um script que irá executar a migração na plataforma destino.
Este tipo de migração só é possível para as plataformas listadas na View V$TRANSPORTABLE_PLATFORM do banco de dados origem.
No teste abaixo, executarei a migração de um servidor Linux x86-64 (um RHEL 4) para outro servidor com Solaris 10, também na arquitetura Intel x86-64.

[oracle@GG01 ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Mon May 7 15:57:05 2012

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> SET PAGES 1000
SQL> SET LINES 210
SQL> SELECT PLATFORM_NAME FROM V$DATABASE;

PLATFORM_NAME
-----------------------------------------------------------------------------------------------------
Linux x86 64-bit

SQL>  SELECT PLATFORM_NAME FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_NAME;

PLATFORM_NAME
-----------------------------------------------------------------------------------------------------
AIX-Based Systems (64-bit)
Apple Mac OS
HP IA Open VMS
HP Open VMS
HP Tru64 UNIX
HP-UX (64-bit)
HP-UX IA (64-bit)
IBM Power Based Linux
IBM zSeries Based Linux
Linux IA (32-bit)
Linux IA (64-bit)
Linux x86 64-bit
Microsoft Windows IA (32-bit)
Microsoft Windows IA (64-bit)
Microsoft Windows x86 64-bit
Solaris Operating System (x86)
Solaris Operating System (x86-64)
Solaris[tm] OE (32-bit)
Solaris[tm] OE (64-bit)

19 rows selected.

Ok, sendo possível a migração de acordo com a View, executarei a primeira verificação no banco de dados de origem, com a Package DBMS_TDB (TDB de Transportable DataBase).

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2  	DB_READY BOOLEAN;
  3  BEGIN
  4  	DB_READY := DBMS_TDB.CHECK_DB('Solaris Operating System (x86-64)',DBMS_TDB.SKIP_READONLY);
  5  END;
  6  /
Database is not open in READ-ONLY mode. Open the database in READ-ONLY mode and retry.

A verificação exibe o erro de que a migração só pode ser feita com o banco de dados aberto e em READ ONLY.
Então em seguida, abro o banco de dados desta forma e re-executo a verificação.

SQL> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP MOUNT;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  2083368 bytes
Variable Size              88081880 bytes
Database Buffers          188743680 bytes
Redo Buffers                6303744 bytes

Database mounted.
SQL> ALTER DATABASE OPEN READ ONLY;

Database altered.

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2     DB_READY BOOLEAN;
  3  BEGIN
  4     DB_READY := DBMS_TDB.CHECK_DB('Solaris Operating System (x86-64)',DBMS_TDB.SKIP_READONLY);
  5  END;
  6  /

PL/SQL procedure successfully completed.

Tudo ok até agora. Mais uma verificação deve ser feita, para sabermos se há alguma External Tables e BFILEs no banco de dados de origem. Estes tipos de objetos terão que ser migradas manualmente, se for necessário.

SQL> DECLARE
  2     EXTERNAL BOOLEAN;
  3  BEGIN
  4     EXTERNAL := DBMS_TDB.CHECK_EXTERNAL;
  5  END;
  6  /
The following external tables exist in the database:
SH.SALES_TRANSACTIONS_EXT
The following directories exist in the database:
SYS.ORACLE_OCM_CONFIG_DIR, SYS.ADMIN_DIR, SYS.WORK_DIR, SYS.DATA_FILE_DIR, SYS.LOG_FILE_DIR, SYS.MEDIA_DIR, SYS.XMLDIR, SYS.SUBDIR, SYS.DATA_PUMP_DIR
The following BFILEs exist in the database:
PM.PRINT_MEDIA

PL/SQL procedure successfully completed.

SQL>

Ok, anotadas as External Table que precisaremos recriar, criamos um diretório temporário para armazenar o banco de dados. Este diretório terá o mesmo nome na origem e no destino, para facilitar a migração. O banco de dados origem está em ASM, e o destino não utilizará ASM, mas resolveremos isto logo mais.

[oracle@GG01 ~]$ su -
Password:
[root@GG01 ~]# mkdir /stage
[root@GG01 ~]# chown oracle:dba /stage/
[root@GG01 ~]# chown -R oracle:dba /stage/
[root@GG01 ~]# exit
logout

Após criar o diretório, executamos o CONVERT DATABASE no banco de dados origem, que irá criar uma cópia de cada DATAFILE no diretório recém-criado, e o script que depois será executado na plataforma destino.
Nno próprio comando eu utilizo a opção DB_FILE_NAME_CONVERT, para retirar os arquivos do ASM e passar para o diretório temporário.
Veja que durante a execução também são informados os Directories existentes e BFILEs, que teriam que ser migrados manualmente.

[oracle@GG01 ~]$ rman TARGET /

Recovery Manager: Release 10.2.0.4.0 - Production on Mon May 7 16:21:03 2012

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

connected to target database: CLIENTE (DBID=1146878630)

RMAN> CONVERT DATABASE NEW DATABASE 'CLIENTE' TRANSPORT SCRIPT '/home/oracle/transportscript' to platform 'Solaris Operating System (x86-64)' DB_FILE_NAME_CONVERT '+DADOS/cliente/datafile/' '/stage/';

Starting convert at 07-MAY-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=159 devtype=DISK

External table SH.SALES_TRANSACTIONS_EXT found in the database

Directory SYS.ORACLE_OCM_CONFIG_DIR found in the database
Directory SYS.ADMIN_DIR found in the database
Directory SYS.WORK_DIR found in the database
Directory SYS.DATA_FILE_DIR found in the database
Directory SYS.LOG_FILE_DIR found in the database
Directory SYS.MEDIA_DIR found in the database
Directory SYS.XMLDIR found in the database
Directory SYS.SUBDIR found in the database
Directory SYS.DATA_PUMP_DIR found in the database

BFILE PM.PRINT_MEDIA found in the database

User SYS with SYSDBA and SYSOPER privilege found in password file
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00001 name=+DADOS/cliente/datafile/system.256.782246323
converted datafile=/home/oracle/CLIENTE/system.256.782246323
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:25
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00003 name=+DADOS/cliente/datafile/sysaux.257.782246325
converted datafile=/home/oracle/CLIENTE/sysaux.257.782246325
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00005 name=+DADOS/cliente/datafile/example.265.782246405
converted datafile=/home/oracle/CLIENTE/example.265.782246405
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00006 name=+DADOS/cliente/datafile/users.267.782246635
converted datafile=/home/oracle/CLIENTE/users.267.782246635
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00007 name=+DADOS/cliente/datafile/users.269.782246711
converted datafile=/home/oracle/CLIENTE/users.269.782246711
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00008 name=+DADOS/cliente/datafile/users.270.782246711
converted datafile=/home/oracle/CLIENTE/users.270.782246711
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:25
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00009 name=+DADOS/cliente/datafile/users.271.782246713
converted datafile=/home/oracle/CLIENTE/users.271.782246713
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00010 name=+DADOS/cliente/datafile/users.272.782246713
converted datafile=/home/oracle/CLIENTE/users.272.782246713
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00011 name=+DADOS/cliente/datafile/users.273.782246713
converted datafile=/home/oracle/CLIENTE/users.273.782246713
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00012 name=+DADOS/cliente/datafile/users.274.782246713
converted datafile=/home/oracle/CLIENTE/users.274.782246713
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00013 name=+DADOS/cliente/datafile/users.275.782246721
converted datafile=/home/oracle/CLIENTE/users.275.782246721
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00014 name=+DADOS/cliente/datafile/users.276.782246721
converted datafile=/home/oracle/CLIENTE/users.276.782246721
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00015 name=+DADOS/cliente/datafile/users.277.782246721
converted datafile=/home/oracle/CLIENTE/users.277.782246721
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00016 name=+DADOS/cliente/datafile/users.278.782246723
converted datafile=/home/oracle/CLIENTE/users.278.782246723
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00002 name=+DADOS/cliente/datafile/undotbs1.258.782246325
converted datafile=/home/oracle/CLIENTE/undotbs1.258.782246325
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00004 name=+DADOS/cliente/datafile/users.259.782246325
converted datafile=/home/oracle/CLIENTE/users.259.782246325
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:01
Run SQL script /home/oracle/transportscript on the target platform to create database
Edit init.ora file /u01/app/oracle/product/10.2.0/db_1/dbs/init_00nad5rn_1_0.ora. This PFILE will be used to create the database on the target platform
To recompile all PL/SQL modules, run utlirp.sql and utlrp.sql on the target platform
To change the internal database identifier, use DBNEWID Utility
Finished backup at 07-MAY-12

RMAN>

Veja que ao final do comando, o RMAN informou que já foi criado um PFILE para facilitar nossa migração.

Na plataforma destino, criamos o diretório temporário, com o mesmo nome da origem.

login as: oracle
Using keyboard-interactive authentication.
Password:
Last login: Mon May  7 12:45:17 2012 from 192.168.56.1
Oracle Corporation      SunOS 5.10      Generic Patch   January 2005
-bash-3.2$ su -
Password:
Oracle Corporation      SunOS 5.10      Generic Patch   January 2005
-bash-3.2# mkdir /stage
-bash-3.2# chown -R oracle:dba /stage/
-bash-3.2# exit
logout
-bash-3.2$

Agora copiamos todo o conteúdo do diretório temporário da origem para o destino. Ele também poderia ser montado como um sistema NFS, que eliminaria a necessidade da cópia.
E após copiar os DATAFILEs, copio também o PFILE criado pelo RMAN.

[oracle@GG01 ~]$ scp /stage/* 192.168.56.101:/stage/
The authenticity of host '192.168.56.101 (192.168.56.101)' can't be established.
RSA key fingerprint is c2:dc:d9:f3:e2:0d:07:93:da:76:6c:42:76:f0:c3:1c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.56.101' (RSA) to the list of known hosts.
Password:
example.265.782246405                                                                                                                 100%  100MB  20.0MB/s   00:05
sysaux.257.782246325                                                                                                                  100%  240MB   9.6MB/s   00:25
system.256.782246323                                                                                                                  100%  480MB  12.6MB/s   00:38
undotbs1.258.782246325                                                                                                                100%   25MB  25.0MB/s   00:01
users.259.782246325                                                                                                                   100% 5128KB   5.0MB/s   00:00
users.267.782246635                                                                                                                   100%  100MB  11.1MB/s   00:09
users.269.782246711                                                                                                                   100%  100MB  11.1MB/s   00:09
users.270.782246711                                                                                                                   100%  100MB  10.0MB/s   00:10
users.271.782246713                                                                                                                   100%  100MB  10.0MB/s   00:10
users.272.782246713                                                                                                                   100%  100MB  10.0MB/s   00:10
users.273.782246713                                                                                                                   100%  100MB  10.0MB/s   00:10
users.274.782246713                                                                                                                   100%  100MB  10.0MB/s   00:10
users.275.782246721                                                                                                                   100%  100MB   9.1MB/s   00:11
users.276.782246721                                                                                                                   100%  100MB  10.0MB/s   00:10
users.277.782246721                                                                                                                   100%  100MB  10.0MB/s   00:10
users.278.782246723                                                                                                                   100%  100MB  11.1MB/s   00:09
[oracle@GG01 ~]$ scp /u01/app/oracle/product/10.2.0/db_1/dbs/init_00nad5rn_1_0.ora 192.168.56.101:/opt/oracle/product/10.2.0/db_1/dbs/initCLIENTE.ora
Password:
init_00nad5rn_1_0.ora                                                                                                                 100% 1536     1.5KB/s   00:00
[oracle@GG01 ~]$ scp /home/oracle/transportscript 192.168.56.101:/stage
Password:
transportscript                                                                                                                       100% 2713     2.7KB/s   00:00
[oracle@GG01 ~]$

Certas adequações podem ser necessárias no script de migração, por exemplo, mudanças de diretórios. No meu caso, tive que alterar tudo o que era “/u01/oracle/” para “/opt/oracle”, como é o padrão no Solaris.
O PFILE também requereu algumas alterações parecidas, como os diretórios de DUMP.

-bash-3.2$ ls -lh /stage/transportscript
-rw-r--r--   1 oracle   oinstall    2.6K May  7 13:38 /stage/transportscript
-bash-3.2$ vi /stage/transportscript
"/stage/transportscript" 79 lines, 2685 characters

Em seguida, basta executar o script de migração na plataforma destino. Eu removi algumas partes do retorno, para melhor visibilidade.

-bash-3.2$ mv /stage/transportscript /stage/transportscript.sql
-bash-3.2$ export ORACLE_SID=CLIENTE
-bash-3.2$ sqlplus / AS SYSDBA

SQL*Plus: Release 10.2.0.4.0 - Production on Mon May 7 14:03:53 2012

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to an idle instance.

SQL> @/stage/transportscript.sql
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  2083368 bytes
Variable Size              88081880 bytes
Database Buffers          188743680 bytes
Redo Buffers                6303744 bytes

File created.

ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  2083368 bytes
Variable Size              88081880 bytes
Database Buffers          188743680 bytes
Redo Buffers                6303744 bytes

Control file created.

Database altered.

Tablespace altered.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Your database has been created successfully!
* There are many things to think about for the new database. Here
* is a checklist to help you stay on track:
* 1. You may want to redefine the location of the directory objects.
* 2. You may want to change the internal database identifier (DBID)
*    or the global database name for this database. Use the
*    NEWDBID Utility (nid).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Database closed.
Database dismounted.
ORACLE instance shut down.
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  2083368 bytes
Variable Size              88081880 bytes
Database Buffers          188743680 bytes
Redo Buffers                6303744 bytes
Database mounted.
Database opened.
SQL>
SQL> WHENEVER SQLERROR EXIT;
SQL>
SQL> DOC
DOC>#######################################################################
DOC>#######################################################################
DOC>   The following statement will cause an "ORA-01722: invalid number"
DOC>   error if there the database was not opened in UPGRADE mode
DOC>
DOC>   If you encounter this error, execute "SHUTDOWN", "STARTUP UPGRADE" and
DOC>   re-execute utlirp.sql
DOC>#######################################################################
DOC>#######################################################################
DOC>#
SQL> SELECT TO_NUMBER('MUST_BE_OPEN_UPGRADE') FROM v$instance
  2  WHERE status != 'OPEN MIGRATE';

no rows selected

SQL>
SQL> Rem
SQL> Rem Store object numbers of all valid PL/SQL-based functional indexes
SQL> Rem
SQL> DROP TABLE utlirp_enabled_func_indexes;

Table dropped.

SQL> CREATE TABLE utlirp_enabled_func_indexes AS
  2     SELECT obj# FROM ind$
  3     WHERE  bitand(property, 2048) != 0 AND bitand(flags, 1024) = 0;

Table created.

SQL>
SQL> Rem invalidate all pl/sql modules and recompile standard and dbms_standard
SQL> @@utlip
...
SQL>
SQL> DOC
DOC> The following query reports the number of objects that have compiled
DOC> with errors (objects that compile with errors have status set to 3 in
DOC> obj$). If the number is higher than expected, please examine the error
DOC> messages reported with each object (using SHOW ERRORS) to see if they
DOC> point to system misconfiguration or resource constraints that must be
DOC> fixed before attempting to recompile these objects.
DOC>#
SQL> select COUNT(*) "OBJECTS WITH ERRORS" from obj$ where status = 3;

OBJECTS WITH ERRORS
-------------------
                  0

SQL>
SQL>
SQL> DOC
DOC> The following query reports the number of errors caught during
DOC> recompilation. If this number is non-zero, please query the error
DOC> messages in the table UTL_RECOMP_ERRORS to see if any of these errors
DOC> are due to misconfiguration or resource constraints that must be
DOC> fixed before objects can compile successfully.
DOC>#
SQL> select COUNT(*) "ERRORS DURING RECOMPILATION" from utl_recomp_errors;

ERRORS DURING RECOMPILATION
---------------------------
                          0

SQL>
SQL>
SQL> Rem =====================================================================
SQL> Rem Run component validation procedure
SQL> Rem =====================================================================
SQL>
SQL> SET serveroutput on
SQL> EXECUTE dbms_registry_sys.validate_components;

PL/SQL procedure successfully completed.

SQL> SET serveroutput off
SQL>
SQL>
SQL> Rem ===========================================================================
SQL> Rem END utlrp.sql
SQL> Rem ===========================================================================
SQL> set feedback 6;

Como o script finalizou sem erros, basta conferir o resultado na plataforma destino.

SQL> SELECT STATUS FROM V$INSTANCE;

STATUS
------------
OPEN

SQL> SELECT PLATFORM_NAME FROM V$DATABASE;

PLATFORM_NAME
--------------------------------------------------------------------------------
Solaris Operating System (x86-64)

SQL> SELECT FILE_NAME FROM DBA_DATA_FILES;

FILE_NAME
--------------------------------------------------------------------------------
/stage/users.278.782246723
/stage/users.277.782246721
/stage/users.276.782246721
/stage/users.275.782246721
/stage/users.274.782246713
/stage/users.273.782246713
/stage/users.272.782246713
/stage/users.271.782246713
/stage/users.270.782246711
/stage/users.269.782246711
/stage/users.267.782246635

FILE_NAME
--------------------------------------------------------------------------------
/stage/example.265.782246405
/stage/users.259.782246325
/stage/sysaux.257.782246325
/stage/undotbs1.258.782246325
/stage/system.256.782246323

16 rows selected.
mai 072012
 

Além da compressão, o ZFS também possui o recurso de deduplicação, que faz com que dois (ou mais) arquivos extamente iguais ocupem apenas o espaço de um.

Irei habilitar este recurso no Pool test, que possui 10GB, e está vazio.

ricardo@solaris:~$ uname -a
SunOS solaris 5.11 11.0 i86pc i386 i86pc
ricardo@solaris:~$ ls -lh /test/
total 0
ricardo@solaris:~$ df -h /test/
Filesystem Size Used Available Capacity Mounted on
test 9.8G 31K 9.8G 1% /test

Antes de popular o Pool com uma massa de dados, verifico e habilito o parâmetro de deduplicação para o Pool.

ricardo@solaris:~$ sudo zfs get dedup test
NAME  PROPERTY  VALUE          SOURCE
test  dedup     off            local
ricardo@solaris:~$ sudo zfs set dedup=on test
ricardo@solaris:~$ sudo zfs get dedup test
NAME  PROPERTY  VALUE          SOURCE
test  dedup     on             local

Agora crio dois diretórios no Pool, e copio um conteúdo para um deles, verificando o espaço utilizado em seguida.

ricardo@solaris:~$ mkdir /test/Docs01
ricardo@solaris:~$ mkdir /test/Docs02
ricardo@solaris:~$ cp -rf Documents/Documentação/ /test/Docs01
ricardo@solaris:~$ du -sh /test/Docs01/
 1.2G   /test/Docs01
ricardo@solaris:~$ df -h /test/
Filesystem             Size   Used  Available Capacity  Mounted on
test                   9.8G   1.2G       8.6G    13%    /test

Em seguida copio o mesmo conteúdo para o outro diretório.
Com o comando du, verifico que cada um deles ocupa 1.3GB (antes o primeiro ocupava 1.2GB), mas o comando df me mostra que o sistema de arquivos está com 8.5GB livres (antes tinha 8.6GB livres), mas o espaço total cresceu (!) de 9.8GB para 11GB, assim como o espaço utilizado (de 1.2GB para 2.6GB).

ricardo@solaris:~$ cp -rf Documents/Documentação/ /test/Docs02
ricardo@solaris:~$ du -sh /test/Docs01/
 1.3G   /test/Docs01
ricardo@solaris:~$ du -sh /test/Docs02/
 1.3G   /test/Docs02
ricardo@solaris:~$ df -h /test/
Filesystem             Size   Used  Available Capacity  Mounted on
test                    11G   2.6G       8.5G    24%    /test

Executo a cópia mais uma vez, para um terceiro diretório. O sistema de arquivos continua com 8.5GB livres, mas agora ele “cresceu” para 12GB, e o espaço utilizado para 3.9GB.

ricardo@solaris:~$ mkdir /test/Docs03
ricardo@solaris:~$ cp -rf Documents/Documentação/ /test/Docs03
ricardo@solaris:~$ du -sh /test/Docs03/
 1.3G   /test/Docs03
ricardo@solaris:~$ df -h /test/
Filesystem             Size   Used  Available Capacity  Mounted on
test                    12G   3.9G       8.5G    32%    /test

Isto acontece porque os comandos du e df não são apropriados para tratar a deduplicação do ZFS. Esta verificação deve ser feita com os comandos zfs e zpool, como está abaixo. Veja que o tamanho do Pool está com o tamanho correto (9.94GB), o espaço alocado possui o tamanho de apenas um dos diretórios copiados, e a coluna DEDUP mostra que a deduplicação está em 3.13x (já que temos três diretórios com o mesmo conteúdo).

ricardo@solaris:~$ zfs list test
NAME   USED  AVAIL  REFER  MOUNTPOINT
test  3.92G  8.47G  3.91G  /test
ricardo@solaris:~$ zpool list test
NAME   SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
test  9.94G  1.27G  8.67G  12%  3.13x  ONLINE  -

E repetindo mais uma vez, com um quarto diretório, a análise continua incorreta pelos comandos du e df, mas correta pelo zlist e zpool. Veja que deduplicação passou para 4.18x.

ricardo@solaris:~$ mkdir /test/Docs04
ricardo@solaris:~$ cp -rf Documents/Documentação/ /test/Docs04
ricardo@solaris:~$ df -h /test/
Filesystem             Size   Used  Available Capacity  Mounted on
test                    14G   5.2G       8.4G    39%    /test
ricardo@solaris:~$ du -sh /test/Docs04
 1.3G   /test/Docs04
ricardo@solaris:~$ zfs list test
NAME   USED  AVAIL  REFER  MOUNTPOINT
test  5.22G  8.44G  5.21G  /test
ricardo@solaris:~$ zpool list test
NAME   SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
test  9.94G  1.28G  8.66G  12%  4.18x  ONLINE  -
ricardo@solaris:~$

Imagine os benefícios em um File Server de uma grande empresa, onde é comum existirem várias cópias de um mesmo documento.

mai 042012
 

O ZFS possui diversas funcionalidades avançadas para sistemas de arquivos, como a compressão. Como tudo no ZFS, a habilitação da compressão é fácil, embora só irá valer para arquivos copiados após a alteração.

Para habilita-la é fácil, e pode até ser habilitado o algoritmo e opções.

No exemplo abaixo, alcançamos facilmente uma compressão de 50% ou mais. Obviamente esta opção não deve ser utulizada para um banco de dados, mas para um servidor de arquivos a vantagem é grande.

ricardo@solaris:~$ sudo zfs get compression test
NAME  PROPERTY     VALUE     SOURCE
test  compression  off       local
ricardo@solaris:~$ df -h /test/
Filesystem             Size   Used  Available Capacity  Mounted on
test                   9.8G    31K       9.8G     1%    /test
ricardo@solaris:~$ ls -lh /test/
total 0
ricardo@solaris:~$ sudo zfs set compression=on test
ricardo@solaris:~$ sudo zfs get compression test
NAME  PROPERTY     VALUE     SOURCE
test  compression  on        local
ricardo@solaris:~$ du -sh /home/ricardo/Documents/Documentação/
 1.3G   /home/ricardo/Documents/Documentação
ricardo@solaris:~$ sudo cp -rf /home/ricardo/Documents/Documentação/ /test/
ricardo@solaris:~$ df -h /test
Filesystem             Size   Used  Available Capacity  Mounted on
test                   9.8G   773M       9.0G     8%    /test
ricardo@solaris:~$ ls -lh /test/
total 3
drwxr-xr-x  18 root     root          19 May  4 11:42 Documentação
ricardo@solaris:~$ sudo zfs set compression=gzip-9 test
ricardo@solaris:~$ sudo zfs get compression test
NAME  PROPERTY     VALUE     SOURCE
test  compression  gzip-9    local
ricardo@solaris:~$ sudo rm -rf /test/Documentação/
ricardo@solaris:~$ sudo cp -rf /home/ricardo/Documents/Documentação/ /test/
ricardo@solaris:~$ df -h /test
Filesystem             Size   Used  Available Capacity  Mounted on
test                   9.8G   601M       9.2G     7%    /test
ricardo@solaris:~$ ls -lh /test/
total 3
drwxr-xr-x  18 root     root          19 May  4 11:45 Documentação
ricardo@solaris:~$
mai 032012
 

O ZFS foi criado com foco na simplicidade. Ele é ao mesmo tempo um sistema de arquivos (como o ext4) e um gerenciador de volumes (como o LVM).
Na instalação padrão do Solaris 11, onde o sistema de arquivos root (/) é montado em ZFS, só tenho o pool rpool (de “root pool”), onde os sistemas de arquivos estão montados.

ricardo@solaris:~$ sudo zpool status
  pool: rpool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          c3t0d0s0  ONLINE       0     0     0

errors: No known data errors
ricardo@solaris:~$ df -h
Filesystem             Size   Used  Available Capacity  Mounted on
rpool/ROOT/solaris      98G   3.2G        77G     5%    /
/devices                 0K     0K         0K     0%    /devices
/dev                     0K     0K         0K     0%    /dev
ctfs                     0K     0K         0K     0%    /system/contract
proc                     0K     0K         0K     0%    /proc
mnttab                   0K     0K         0K     0%    /etc/mnttab
swap                   9.5G   1.4M       9.5G     1%    /system/volatile
objfs                    0K     0K         0K     0%    /system/object
sharefs                  0K     0K         0K     0%    /etc/dfs/sharetab
/usr/lib/libc/libc_hwcap1.so.1
                        81G   3.2G        77G     5%    /lib/libc.so.1
fd                       0K     0K         0K     0%    /dev/fd
rpool/ROOT/solaris/var
                        98G   182M        77G     1%    /var
swap                   9.5G    12K       9.5G     1%    /tmp
rpool/export            98G    32K        77G     1%    /export
rpool/export/home       98G    32K        77G     1%    /export/home
rpool/export/home/ricardo
                        98G    12M        77G     1%    /export/home/ricardo
rpool                   98G    39K        77G     1%    /rpool
/export/home/ricardo    77G    12M        77G     1%    /home/ricardo
ricardo@solaris:~$

Pelo comando cfgadm, verifico se tenho mais discos disponíveis, além do utilizado no rpool.

ricardo@solaris:~$ sudo cfgadm -s "select=type(disk)"
Ap_Id                          Type         Receptacle   Occupant     Condition
sata6/0::dsk/c3t0d0            disk         connected    configured   ok
sata6/2::dsk/c3t2d0            disk         connected    configured   ok
sata6/3::dsk/c3t3d0            disk         connected    configured   ok

Crio então um pool chamado test, utilizando os dois discos disponíveis, com espelhamento entre eles.

ricardo@solaris:~$ sudo zpool create test mirror c3t2d0 c3t3d0
ricardo@solaris:~$ sudo zpool status
  pool: rpool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          c3t0d0s0  ONLINE       0     0     0

errors: No known data errors

  pool: test
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c3t2d0  ONLINE       0     0     0
            c3t3d0  ONLINE       0     0     0

errors: No known data errors

Neste momento o sistema de arquivos já está montado e pronto para uso.

ricardo@solaris:~$ ls -lh /test/
total 0
ricardo@solaris:~$ sudo mkfile 1g /test/ArquivoTeste
ricardo@solaris:~$ ls -lh /test/
total 1963283
-rw------T   1 root     root        1.0G May  3 08:22 ArquivoTeste
ricardo@solaris:~$ sudo zpool status
  pool: rpool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          c3t0d0s0  ONLINE       0     0     0

errors: No known data errors

  pool: test
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c3t2d0  ONLINE       0     0     0
            c3t3d0  ONLINE       0     0     0

errors: No known data errors
ricardo@solaris:~$ df -h
Filesystem             Size   Used  Available Capacity  Mounted on
rpool/ROOT/solaris      98G   3.2G        77G     5%    /
/devices                 0K     0K         0K     0%    /devices
/dev                     0K     0K         0K     0%    /dev
ctfs                     0K     0K         0K     0%    /system/contract
proc                     0K     0K         0K     0%    /proc
mnttab                   0K     0K         0K     0%    /etc/mnttab
swap                   9.5G   1.4M       9.5G     1%    /system/volatile
objfs                    0K     0K         0K     0%    /system/object
sharefs                  0K     0K         0K     0%    /etc/dfs/sharetab
/usr/lib/libc/libc_hwcap1.so.1
                        81G   3.2G        77G     5%    /lib/libc.so.1
fd                       0K     0K         0K     0%    /dev/fd
rpool/ROOT/solaris/var
                        98G   182M        77G     1%    /var
swap                   9.5G    12K       9.5G     1%    /tmp
rpool/export            98G    32K        77G     1%    /export
rpool/export/home       98G    32K        77G     1%    /export/home
rpool/export/home/ricardo
                        98G    12M        77G     1%    /export/home/ricardo
rpool                   98G    39K        77G     1%    /rpool
/export/home/ricardo    77G    12M        77G     1%    /home/ricardo
test                   9.8G   1.0G       8.8G    11%    /test
ricardo@solaris:~$
mai 022012
 

Na verdade o procedimento não é diferente do Solaris 10 por causa do Solaris, e sim por causa do ZFS.

Para aumentar uma area já existente e em uso:

ricardo@solaris:~$ swap -lh swapfile
swapfile             dev    swaplo   blocks     free
/dev/zvol/dsk/rpool/swap 195,2        4K     1.0G     1.0G
ricardo@solaris:~$ sudo swap -d /dev/zvol/dsk/rpool/swap
ricardo@solaris:~$ swap -lh
No swap devices configured
ricardo@solaris:~$ sudo zfs volsize=8g rpool/swap
ricardo@solaris:~$ sudo swap -a /dev/zvol/dsk/rpool/swap
ricardo@solaris:~$ swap -lh swapfile
dev                               swaplo   blocks     free
/dev/zvol/dsk/rpool/swap 195,2        4K     8.0G     8.0G
ricardo@solaris:~$

Mas só consegui remover á única área de swap porque acabei de reiniciar o Solaris, e ela ainda não estava em uso.
Para adicionar um novo espaço de swap:

ricardo@solaris:~$ sudo zfs create -V 8G rpool/swap02
ricardo@solaris:~$ sudo swap -a /dev/zvol/dsk/rpool/swap02
ricardo@solaris:~$ swap -lh swapfile
swapfile             dev    swaplo   blocks     free
/dev/zvol/dsk/rpool/swap 195,2        4K     8.0G     8.0G
/dev/zvol/dsk/rpool/swap02 195,3        4K     8.0G     8.0G
ricardo@solaris:~$

Para o novo espaço ser ativado após um boot, uma nova entrada deve ser adicionada em /etc/vfstab.

mai 022012
 

Está nas bancas a Revista SQL Magazine número 98, que traz o primeiro artigo de uma série que escrevi sobre DB2 LUW.

O DB2 é um SGBD (Sistema Gerenciador de Banco de Dados) desenvolvido pela IBM. Hoje ele pode ser executado tanto para sistemas operacionais de mainframe quando na chamada baixa plataforma, que utiliza os sistemas operacionais Unix, Linux e Windows.

Para conseguir atender ambientes tão distintos, a IBM desenvolve dois produtos separados (e desenvolvidos por equipes separadas), o DB2 para z/OS e System i (antigo OS/400) e o DB2 LUW (LUW é a sigla de Linux, Unix e Windows). O DB2 possui todas as funcionalidades avançadas esperadas de um SGBD que são necessárias em aplicações de missão crítica, como compressão de dados e índices, auditoria, e alta disponibilidade através de particionamento, replicação e cluster.

Os bancos de dados relacionais nasceram na IBM. O DB2 possui uma longa história que se confunde com a própria linguagem SQL, e que possui desdobramentos pelas principais áreas da computação, e por conta disso, este produto participou ativamente da definição de todo o mercado de SGBDs. Ele foi o primeiro SGBD a utilizar a linguagem SQL (também desenvolvida inicialmente pela IBM), embora a Oracle tenha lançado um produto comercial similar antes da IBM. Ou seja, a IBM fez primeiro, mas a Oracle vendeu antes.

Revista SQL Magazine 98

mai 022012
 

O Oracle Data Guard Broker permite o Fast Start Failover, que executa o Failover para o Standby em caso de falha na Produção.
Este cenário inclui um computador Observer, que precisa apenas do Oracle Client instalado. Se o Standby e o Observer perderem contato com a Produção por um determinado (configurável) número de segundos, o Failover é executado.
Além da perda de comunicação, o Fast Start Failover permite a execução do Failover em situações de falhas específicas, por exemplo, se a área de ARCHIVEs encher. Pode ser configurado também de forma que se um determinado erro ORA acontecer, o Failover é executado.

No exemplo abaixo, eu tenho configurado como condições extras para o Failover as opções “Corrupted Controlfile”, “Corrupted Dictionary”, “Datafile Offline”, além do erro “ORA-27102: out of memory”.

[oracle@OracleDG01 ~]$ dgmgrl SYS/Nerv2012@NERV01
DGMGRL for Linux: Version 11.2.0.1.0 - 64bit Production

Copyright (c) 2000, 2009, Oracle. All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected.
DGMGRL> SHOW CONFIGURATION;

Configuration - DRSolution

  Protection Mode: MaxPerformance
  Databases:
    nerv01 - Primary database
    nerv02 - (*) Physical standby database
    nerv03 - Logical standby database

Fast-Start Failover: ENABLED

Configuration Status:
SUCCESS

DGMGRL> SHOW FAST_START FAILOVER;

Fast-Start Failover: ENABLED

  Threshold:        30 seconds
  Target:           nerv02
  Observer:         OracleDG04.localdomain
  Lag Limit:        600 seconds
  Shutdown Primary: TRUE
  Auto-reinstate:   TRUE

Configurable Failover Conditions
  Health Conditions:
    Corrupted Controlfile          YES
    Corrupted Dictionary           YES
    Inaccessible Logfile            NO
    Stuck Archiver                  NO
    Datafile Offline               YES

  Oracle Error Conditions:
    ORA-27102: out of memory

Em seguida, eu adiciono a condição extra “Stuck Archiver”.

DGMGRL> ENABLE FAST_START FAILOVER CONDITION "Stuck Archiver"
Succeeded.
DGMGRL> EXIT 

Agora simulo um “enchimento” da área de Archives, alterando o diretório de gravação para um onde o usuário oracle não tem permissão (o diretório /).

[oracle@OracleDG01 ~]$ sqlplus / AS SYSDBA 
SQL*Plus: Release 11.2.0.1.0 Production on Mon Apr 16 10:46:02 2012

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> SHOW PARAMETER LOG_ARCHIVE_DEST_1

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1                   string      LOCATION=/home/oracle/archives/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=NERV01
log_archive_dest_10                  string
log_archive_dest_11                  string
log_archive_dest_12                  string
log_archive_dest_13                  string
log_archive_dest_14                  string
log_archive_dest_15                  string
log_archive_dest_16                  string
log_archive_dest_17                  string

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_18                  string
log_archive_dest_19                  string
SQL> ALTER SYSTEM SET log_archive_dest_1='LOCATION=/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=NERV01'; 
System altered.

Forço então a geração de um ARCHIVE, que fica congelada.

SQL> ALTER SYSTEM SWITCH LOGFILE; 

No computador que funciona como Observer, vejo a mensagem da execução do Failover.

DGMGRL> START OBSERVER;
Observer started

10:47:21.05  Monday, April 16, 2012
Initiating Fast-Start Failover to database "nerv02"...
Performing failover NOW, please wait...
Failover succeeded, new primary is "nerv02"
10:47:37.44  Monday, April 16, 2012

E no Alert Log da Produção, vejo a confirmação do motivo do Failover.

Mon Apr 16 10:46:49 2012
A user-configurable Fast-Start Failover condition was detected. The primary is shutting down due to Stuck Archiver  .
Database NERV01 will not be automatically reinstated.
USER (ospid: 6689): terminating the instance due to error 16832
Instance terminated by USER, pid = 6689

Este é um dos exercícios feitos no Treinamento de Oracle Data Guard na Nerv.

O Oracle Data Guard é um produto muito maior do que a maioria dos DBAs conhece, e é a solução de alta disponibilidade em bancos de dados mais avançada que conheço. Neste Treinamento os alunos irão, sem virtualização alguma, criar diversos bancos Standby, de todos os tipos (Physical, Logical, Snapshot), além de utilizar o Active Data Guard, Data Guard Broker, Switchover, Switchback, Failover, Failback, e muito mais. Acho que só de Physical Standby criamos um 6, de todas as formas possíveis.

Agenda: http://nervinformatica.com.br/

Valores: http://nervinformatica.com.br/valores.asp

Inscrições: contato@nervinformatica.com.br

abr 272012
 

Na máquina que sera o servidor DNS, instale os pacotes necessarios.

yum install bind-libs bind bind-utils

Na máquina que será o servidor DNS, crie este arquivo.
Troque 192.168.0.201 pelo IP da maquina que sera o servidor DNS.
Troque 0.168.192 pela sua rede invertida, se for diferente.

[root@nerv00 ~]# cat /var/named/chroot/etc/named.conf
options {
        listen-on port 53 { 127.0.0.1; 192.168.0.201; };
        directory "/var/named";
        dump-file "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        /*
         * If there is a firewall between you and nameservers you want
         * to talk to, you might need to uncomment the query-source
         * directive below.  Previous versions of BIND always asked
         * questions using port 53, but BIND 8.1 uses an unprivileged
         * port by default.
         */
         // query-source address * port 53;
};

zone "localdomain." IN {
        type master;
        file "localdomain.zone";
        allow-update { none; };
};

zone "0.168.192.in-addr.arpa." IN {
        type master;
        file "0.168.192.in-addr.arpa";
        allow-update { none; };
};

include "/etc/rndc.key";
[root@nerv00 ~]#

Na máquina que sera o servidor DNS, crie este arquivo. Ajuste seu arquivo apra o nome e IPs do seu SCAN.

[root@nerv00 ~]# cat /var/named/chroot/var/named/localdomain.zone
$TTL    86400
@               IN SOA  localhost root.localhost (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
		  IN NS           localhost
localhost         IN A            127.0.0.1
rac01-scan        IN A    192.168.0.151
rac01-scan        IN A    192.168.0.152
rac01-scan        IN A    192.168.0.153
[root@nerv00 ~]#

Na máquina que sera o servidor DNS, crie este arquivo. Troque nerv00 pelo próprio nome do servidor DNS, e novamente ajuste para sua rede se necessário, assim como os IPs e nome do SCAN.

[root@nerv00 ~]# cat /var/named/chroot/var/named/0.168.192.in-addr.arpa
$ORIGIN 0.168.192.in-addr.arpa.
$TTL 1H
@       IN      SOA     nerv00.localdomain.     root.nerv00.localdomain. (
						2
                                                3H
                                                1H
                                                1W
                                                1H )
0.168.192.in-addr.arpa.         IN NS      nerv00.localdomain.

151  IN PTR  rac01-scan.localdomain.
152  IN PTR  rac01-scan.localdomain.
153  IN PTR  rac01-scan.localdomain.
[root@nerv00 ~]#

Nas máquinas cliente (os nós do RAC), edite o arquivo /etc/resolv.conf

[root@nerv00 ~]# cat /etc/resolv.conf
nameserver 192.168.0.201
search localdomain
[root@nerv00 ~]#

No servidor DNS, inicie o serviço named.

[root@nerv00 ~]# service named start
Starting named:                                            [  OK  ]
[root@nerv00 ~]#
abr 202012
 

O Active Data Guard, além de permitir a utilização do Standby para leituras, fornece automaticamente um recurso inestimável para a disponibilidade, o Automatic Block Media Recovery.
Ao detectar um bloco corrompido na Produção, o Axctive Data Guard copia a última versão saudável do bloco do Standby, e vice-versa.

Para forçar o uso desta funcionalidade, forcei uma corrupção em um DATAFILE com o comando dd do Linux, depois fiz um SELECT em uma tabela desta DATAFILE, o que fez com que o Oracle Database notasse a corrupção e acionasse o ABMR. Veja abaixo que no Alert Log a recuperação foi realmente automática e sem intervenção.

Mon Apr 16 12:05:19 2012
Hex dump of (file 5, block 131) in trace file /u01/app/oracle/diag/rdbms/nerv01/NERV01/trace/NERV01_ora_7291.trc
Corrupt block relative dba: 0x01400083 (file 5, block 131)
Bad header found during validation
Data in bad block:
 type: 231 format: 7 rdba: 0x716d646c
 last change scn: 0x7370.6d646c70 seq: 0x61 flg: 0x6f
 spare1: 0x6c spare2: 0x6d spare3: 0x6fe7
 consistency value in tail: 0x70650601
 check value in block header: 0x646d
 computed block checksum: 0x9628
Reread of blocknum=131, file=/u01/app/oracle/oradata/NERV01/teste01.dbf. found same corrupt data
Reread of blocknum=131, file=/u01/app/oracle/oradata/NERV01/teste01.dbf. found same corrupt data
Reread of blocknum=131, file=/u01/app/oracle/oradata/NERV01/teste01.dbf. found same corrupt data
Reread of blocknum=131, file=/u01/app/oracle/oradata/NERV01/teste01.dbf. found same corrupt data
Reread of blocknum=131, file=/u01/app/oracle/oradata/NERV01/teste01.dbf. found same corrupt data
Mon Apr 16 12:06:35 2012
Hex dump of (file 5, block 131) in trace file /u01/app/oracle/diag/rdbms/nerv01/NERV01/trace/NERV01_ora_7293.trc
Corrupt block relative dba: 0x01400083 (file 5, block 131)
Bad header found during multiblock buffer read
Data in bad block:
 type: 231 format: 7 rdba: 0x716d646c
 last change scn: 0x7370.6d646c70 seq: 0x61 flg: 0x6f
 spare1: 0x6c spare2: 0x6d spare3: 0x6fe7
 consistency value in tail: 0x70650601
 check value in block header: 0x646d
 computed block checksum: 0x9628
Reading datafile '/u01/app/oracle/oradata/NERV01/teste01.dbf' for corruption at rdba: 0x01400083 (file 5, block 131)
Reread (file 5, block 131) found same corrupt data
Starting background process ABMR
Mon Apr 16 12:06:35 2012
ABMR started with pid=36, OS id=7295
Auto BMR service is active.
Requesting Auto BMR for (file# 5, block# 131) Waiting Auto BMR response for (file# 5, block# 131)
Auto BMR successful WARNING: AutoBMR fixed mismatched on-disk block 716d646c with in-mem rdba 1400083.

Este é um dos exercícios feitos no Treinamento de Oracle Data Guard na Nerv.

O Oracle Data Guard é um produto muito maior do que a maioria dos DBAs conhece, e é a solução de alta disponibilidade em bancos de dados mais avançada que conheço. Neste Treinamento os alunos irão, sem virtualização alguma, criar diversos bancos Standby, de todos os tipos (Physical, Logical, Snapshot), além de utilizar o Active Data Guard, Data Guard Broker, Switchover, Switchback, Failover, Failback, e muito mais. Acho que só de Physical Standby criamos um 6, de todas as formas possíveis.

Agenda: http://nervinformatica.com.br/

Valores: http://nervinformatica.com.br/valores.asp

Inscrições: contato@nervinformatica.com.br