No ultimo treinamento, um aluno me enviou alguns dos comentários que fiz sobre os exercícios e dicas que repassei e que fui executando enquanto os slides eram repassados. Assim, como são dicas valiosas e super interessantes – decidi compartilhar. Creditos do Aluno Ronan Eustaquio. Aqui está a semana toda do treinamento, somente os comentários e dicas.

#### Primeiro dia de Curso (08/02/2010) ####
Aluno: Ronan Eustáquio de Brito
Prof.: André
Casa de Software S/A
---------------------------
-- RMAN --
dbid -> assinatura do banco
crosscheck -> verifica o status do backup ou copia no disco ou fita;

-> Verificar se o modo de arquivamento está ativado.
SQL> select archiver from v$instance;
ou
SQL> archive log list;

-> Mostrar data neste formato.
[oracle@aluno04 ~]$ export NLS_DATE_FORMAT=DDMMYYYY_HH24MI

RMAN> show all;

----
# Listar todos data files que requerem backup
# Assume que os mais recentes backups estão sendo usados durante o restore.
# Mostra 4 opções (incremental, dias, redundancia e janela de recuperação)
RMAN> report need backup;

---- Alterar o banco para modo de archive log. ----
RMAN> sql 'shutdown immeditate';
RMAN> sql 'startup mount';
RMAN> sql 'alter database archivelog';
RMAN> sql 'alter database open'; # Para alterar o banco para modo de archive log é necessário realizar até este passo.
RMAN> sql 'alter system switch logfile';
RMAN> list archivelog all;
RMAN> backup tablespace users;
RMAN> list backupset;
RMAN> delete backupset 2;

RMAN> backup as copy datafile 5 format '/u01/example.dbf';

# usando TAG's
RMAN> backup tablespace users TAG='BACKUPTBUSERS';
RMAN> delete backupset TAG='BACKUPTBUSERS';


RMAN> backup archivelog all delete all input; # para remover os logs arquivados no arquivo de redo.


# Para fazer backup completo do banco, inclusive os arquivos de controle.
RMAN> backup database plus archivelog;

----- Fazendo recuperação ----
RMAN> backup tablespace users; # faz backup da tablespace users;
RMAN> sql 'alter tablespace users offline immediate'; # para não ser usada.
RMAN> restore tablespace users; # Restaura a tablespace.
RMAN> recover tablespace users; # Aplica os devidos archivers.
RMAN> sql 'alter tablespace users online';

---- Deletar backup obsoleto ----
RMAN> list backup of tablespace users; # listar backups já feitos.
RMAN> host;
[oracle@aluno04 ~]$ rm
[oracle@aluno04 ~]$ exit
RMAN> crosscheck backupset; # visualiza os backups já feitos.
RMAN> delete expired backupset; # deletar backups expirados.

---- Pratica 3 Usando recovery manager ----
# Exercício 6
RMAN> list backup of database;
RMAN> backup as copy datafile 1 format '/u01/system01.copy';
RMAN> backup as copy datafile 4 format '/u01/example01.dbf';

# Exercício 7
RMAN> crosscheck backupset;

# Exercício 8
RMAN> report need backup;

# Exercício 9
RMAN> configure exclude for tablespace staging clear;


---- Exemplo para Recriar índice. ----
SQL> create tablespace indices;
SQL> create table cliente (codigo number, nome varchar2(50));
SQL> create index cliente_idx on cliente(nome) tablespace indices;
SQL> insert into cliente values (1, 'luiz');
SQL> commit;
SQL> select index_name, status from dba_indexes where index_name = 'CLIENTE_IDX';
SQL> drop tablespace indices including contents and datafiles;
SQL> select index_name, status from dba_indexes where index_name = 'CLIENTE_IDX';
SQL> create tablespace indices;
SQL> create index cliente_idx on cliente(nome) tablespace indices;
SQL> alter table cliente move tablespace users;
SQL> select index_name, status from dba_indexes where index_name = 'CLIENTE_IDX';
SQL> alter index cliente_idx rebuild tablespace indices;

---- Recriando o arquivo de senha para autenticação. ----
[oracle@aluno04 ~]$ orapwd file=orapworcl.ora password=oracle entries=5

# este arquivo deve ficar na pasta $ORACLE_HOME/dbs
# Obs.: Não esquecer de setar o parâmetro REMOTE_LOGIN_PASSWORDFILE para EXCLUSIVE;
# Para verificar como está setado execute o comando:
SQL> show parameter remote_login_passwordfile

#################################################################################
#### Segundo dia de Curso (09/02/2010) ####

Recuperação completa: Onde não há perda de dados.
Recuperação incompleta: Por exemplo, recuperar informação de 1 hora atrás.

Ponto de restauração: Ponto criado para fazer um recover até aquele momento. Utilizado quando não se tem certeza
do que está fazendo, por exemplo.
Ex.:
SQL> CREATE RESTORE POINT before_load;
RMAN> RECOVER DATABASE UNTIL RESTORE POINT before_load;

# Fazer backup full do banco
RMAN> backup full database plus archivelog delete all input tag=BACKUPFULL;

---- Exercício 5: Recuperação de banco de dados. ----

Dica: Para mudar o formato da data.
SQL> alter session set nls_date_format='DD/MM/YYYY HH24:MI';

Exercício 1:
[oracle@aluno04 labs]$ sqlplus hr/hr @lab_05_01.sql

Exercício 2:
SQL> select * from job_history;

Exercício 3:
SQL> shutdown immediate;
SQL> startup mount
[oracle@aluno06 labs]$ export NLS_DATE_FORMAT="DD/MM/YYYY HH24:MI"
[oracle@aluno06 labs]$ export NLS_LANG="BRAZILIAN PORTUGUESE_BRAZIL.WE8ISO8859P1"

RMAN> list backupset; # Observe que a partir deste momento o relatório de backup está sendo apresentado em portugues.
RMAN> RUN {
SET UNTIL TIME = '09/02/2010 14:02';
RESTORE DATABASE;
RECOVER DATABASE;
sql 'ALTER DATABASE OPEN RESETLOGS';
}

---- Capitulo 5: Flashback ----
---- Simular situação de recuperação utilizando flashback ----

sqlplus hr/hr
SQL> create table dados(codigo number, nome varchar2(100));
SQL> insert into dados values (1, 'xxxxx');
SQL> commit;
SQL> show recyclebin; # Observe que aqui não tem nada na lixeira, uma vez que este usuário não "deletou" nada.
SQL> drop table dados; # Dropando a tabela;
SQL> show recyclebin; # Mostrar dados que estão na lixeira. Note que a tabela dropada está lá.
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
DADOS BIN$fy2774dMAnvgQKjAEAxxMw==$0 TABLE 2010-02-09:14:51:50

SQL> flashback table dados to before drop; # Comando utilizado para recuperar dados que está na lixeira (flashback)
SQL> select * from dados; # Neste ponto a tabela dados já foi restaurada;


---- Configurando o flashback ----
SQL> conn / as sysdba
SQL> shutdown immediate
SQL> startup mount exclusive # exclusive para impedir que outros dba's conectem no banco.
SQL> alter system set db_flashback_retention_target=2880 scope=both;
SQL> alter database flashback on;
SQL> alter database open;

---- Pontos de restauração garantidos ----
Um ponto de restauração garantido assegura que você possa executar um comando FLASHBACK DATABASE para um SCN em qualquer momento.

---- Exercício 6: Flashback ----
SQL> create restore point before_load guarantee flashback database # Criar um ponto de restauração por medidas de segurança.
SQL> select CURRENT_SCN from V$DATABASE;
CURRENT_SCN
-----------
521807

SQL> SELECT SUM(SALARY) FROM HR.EMPLOYEES;

SUM(SALARY)
-----------
679050

SQL> SELECT COUNT(*) FROM HR.JOB_HISTORY;

COUNT(*)
----------
15

---- Agora temos as informações a serem comparadas. ----
[oracle@aluno06 labs]$ sqlplus hr/hr @lab_06_04.sql # execução do script do exercício
[oracle@aluno06 labs]$ sqlplus / as sysdba
SQL> SELECT SUM(SALARY) FROM HR.EMPLOYEES;
SQL> shutdown immediate;
SQL> startup mount;
RMAN> flashback database to scn=521807; # o número SCN é o mesmo que executamos no select acima.
RMAN> alter database open resetlogs;

---- Capitulo 7: Lidando com banco de dados danificados. ----
-- DBVerify
SQL> select name from v$datafile
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
/u01/app/oracle/oradata/orcl/example01.dbf

[oracle@aluno06 labs]$ dbv file=/u01/app/oracle/oradata/orcl/system01.dbf blocksize=8192 # Executando o dbv para verificar o datafile, em caso de corrupção.

-- EXP
[oracle@aluno06 labs]$ exp hr/hr file=dadoshr.dmp # Todo esquema do usuário hr foi exportado para o arquivo dadoshr.dmp

---- Laboratorio 7: ----
Exercício 1:
SQL> select file_id, block_id from dba_extents where segment_name = 'DEPARTMENTS';
ou
SQL> select SEGMENT_NAME, TABLESPACE_NAME, HEADER_FILE, HEADER_BLOCK # Este comando não mostrou o bloco correto.
SQL> from DBA_SEGMENTS
SQL> WHERE SEGMENT_NAME = 'DEPARTMENTS';

id do arquivo: 5
id do bloco: 49

[oracle@aluno06 labs]$ sh lab_07_02.sh /u01/app/oracle/oradata/orcl/example01.dbf 49 8192
[oracle@aluno06 labs]$ sqlplus / as sysdba
SQL> select * from hr.departments;
Em caso de não retornar erro, é necessário limpar o buffer_cache;
Com o usuário system execute o comando abaixo.
SQL> alter system flush buffer_cache;
SQL> select * from hr.departments;
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 51)
ORA-01110: data file 5: '/u01/app/oracle/oradata/orcl/example01.dbf'

Neste caso vamos recuperar usando o dbv (DB Verify) no arquivo de dados corrompido e informando o tamanho do bloco.
[oracle@aluno06 labs]$ dbv file=/u01/app/oracle/oradata/orcl/example01.dbf blocksize=8192

Obs.: os blocos corrompidos foram logados no log de alert. Mas a saída do comando dbv também mostra os blocos corrompidos. Que no meu caso foram os blocos 49,50,51 e 52
SQL> show parameter background_dump_dest
/u01/app/oracle/admin/orcl/bdump
[oracle@aluno06 labs]$ vi /u01/app/oracle/admin/orcl/bdump/alert_orcl.log

Logo em seguida, dentro do RMAN execute o comando de recuperação.
RMAN> blockrecover datafile 5 block 49,50,51,52;

Por fim, execute um select dentro da tabela hr.departments para verificar sua integridade.
SQL> select * from hr.departments;

Capitulo 8: Monitoramento e Gerenciamento de memória

SQL> show parameter db_block_size
SQL> show parameter db_cache_size
SQL> show parameter db_keep_cache_size
SQL> alter table hr.departments storage (buffer_pool keep); # este comando não terá validade a menos que defina o parâmetro db_keep_cache_size, pois este é configurado manualmente pelo DBA.
SQL> alter system set db_keep_cache_size=50M scope=both;

SGA_MAX_SIZE é o tamanho máximo que se pode definir para sga. Portanto, SGA_TARGET tem sempre que ser igual ou menor que ela.

alter system set sga_target=500M; # Definindo o tamanho do SGA_TARGET manualmente.

Comportamento de Parâmetros Auto-ajustáveis da SGA
SQL> select sum(bytes)/1024/1024 size_mb
2 from v$sgastat where pool = 'shared pool';

SQL> select component, current_size/1024/1024 size_mb
2 from v$sga_dynamic_components;

---- Laboratorio 8: ----
SQL> shutdown immediate
SQL> startup pfile='/home/oracle/labs/init_sgalab.ora';
SQL> @/home/oracle/labs/lab_08_02.sql
SQL> conn / as sysdba
SQL> @/home/oracle/labs/lab_08_04.sql # Este script deve ser executado várias vezes para se ver o comportamento do banco de dados ao longo do tempo.
SQL> shutdown immediate
SQL> startup

#################################################################################
#### Terceiro dia de Curso (10/02/2010) ####


V$EVENT_NAME -> Eventos de espera Oracle.


Sql Access Advisor
SQL> select * from hr.employees, dba_objects
2 union all
3 select * from hr.employees, dba_objects
4 where employee_id in (100,101)
5 order by 5,7,8;

Para monitorar a execução dessa SQL Advisor centro -> Advisor de ajuste SQL -> Principal Atividade


#################################################################################
#### Quarto dia de Curso (11/02/2010) ####

---- ASM ----

[oracle@aluno06 labs]$ dbca # Vamos criar o ASM - Gerenciamento de Armazenamento Automático. Para isso, é necessário rodar o script "localconfig".

[root@aluno06 ~]# /u01/app/oracle/product/10.2.0/db_1/bin/localconfig add

Posteriormente, continue no assitente do dbca. Na ultima etapa deste assistente, passo 2 de 2, onde aparecem os grupos
de discos disponíveis, clique em criar novo para criar um novo disc group.

Na linha de comando, execute o comando abaixo

[oracle@aluno06 labs]$ pgrep -lf pmon
5432 ora_pmon_orcl
8792 asm_pmon_+ASM

Isso quer dizer que o ASM está no ar.

Carregue a variável de ambiente ORACLE_SID para verificar o ASM

[oracle@aluno06 labs]$ export ORACLE_SID=+ASM
[oracle@aluno06 labs]$ sqlplus / as sysdba
SQL> select instance_name, status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
+ASM STARTED

Na tela do Create Disk Group, em Disc Group Name coloque DGROUP1, adicione os 4 primeiros discos e clique em ok. Depois finalize o assistente.

---- Laboratorio 12: ----
[oracle@aluno06 labs]$ export ORACLE_SID=+ASM
[oracle@aluno06 labs]$ sqlplus / as sysdba
SQL> !ps -ef |grep ASM # Para listar os processos no so a partir do sqlplus.
SQL> select name, state,type total_mb, free_mb from v$asm_diskgroup;

[oracle@aluno06 labs]$ export ORACLE_SID=orcl
[oracle@aluno06 labs]$ sqlplus / as sysdba
SQL> create tablespace tbsasm DATAFILE '+DGROUP1' SIZE 200M;
SQL> drop tablespace tbsasm including contents and datafiles;
SQL> create tablespace tbsasmmig DATAFILE 'asmmig1.dbf' SIZE 10M;
SQL> create table t2(c number) tablespace tbsasmmig;
SQL> insert into t2 values(1);
SQL> commit;
SQL> host rman target / nocatalog;
RMAN> sql "alter tablespace tbsasmmig offline";
RMAN> backup as copy tablespace tbsasmmig format '+DGROUP1';
RMAN> switch tablespace tbsasmmig to copy;
RMAN> sql "alter tablespace tbsasmmig online";
RMAN> exit
SQL> column file_name format a48
SQL> select tablespace_name, file_name from dba_data_files;
SQL> select * from t2;
SQL> drop tablespace tbsasmmig including contents and datafiles;
SQL> host rm $ORACLE_HOME/dbs/asmmig1.dbf

#################################################################################
#### Quinto dia de Curso (12/02/2010) ####

---- Capitulo 15: OWM Oracle Wallet Manager ----
owm # Ferramenta para criar certificados digitais.


---- Clonar um banco de dados ----
Os passos abaixo servem como orientação para clonar um banco de dados. Uma das utilizações para isto, por exemplo, é quando se tem um banco de produção e você quer criar um banco de homologação identico ao de produção.

[oracle@aluno06 u01]$ mkdir -p /u01/bdo/{adump,bdump,cdump,udump}
[oracle@aluno06 bdo]$ sqlplus / as sysdba
SQL> startup mount # Obs.: O banco original não pode estar aberto. Caso esteja, atrapalha todo o processo.
SQL> create pfile='/u01/bdo/init.ora' from spfile;
SQL> show parameter background_dump_dest;
SQL> host rm /u01/app/oracle/admin/orcl/udump/* # Este comando serve para remover tudo quanto é lixeira existente neste diretório para que não atrapalhe o procedimento.
SQL> alter database backup controlfile to trace; # Este comando vai criar o arquivo orcl_ora_8778.trc que servirá de exemplo para o nosso script.
SQL> select status from v$instance;
[oracle@aluno06 bdo]$ vi /u01/app/oracle/admin/orcl/udump/orcl_ora_8778.trc # Alterar este arquivo e deixá-lo como está abaixo. Lembre-se que você deve trocar o caminho do orcl para o novo bdo.

STARTUP NOMOUNT pfile='/u01/bdo/init.ora';
CREATE CONTROLFILE SET DATABASE "BDO" RESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/bdo/redo01.log' SIZE 50M,
GROUP 2 '/u01/bdo/redo02.log' SIZE 50M,
GROUP 3 '/u01/bdo/redo03.log' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'/u01/bdo/system01.dbf',
'/u01/bdo/undotbs01.dbf',
'/u01/bdo/sysaux01.dbf',
'/u01/bdo/users01.dbf',
'/u01/bdo/example01.dbf'
CHARACTER SET AL32UTF8;
alter database open resetlogs;
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/bdo/temp01.dbf';
:w /u01/bdo/control.sql
:q

[oracle@aluno06 bdo]$ vi /u01/bdo/init.ora # Neste passo deve-se trocar todo o caminho do orcl para o bdo assim como foi feito no arquivo acima.

*.audit_file_dest='/u01/bdo/adump'
*.background_dump_dest='/u01/bdo/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/bdo/control01.ctl','/u01/bdo/control02.ctl','/u01/bdo/control03.ctl'
*.core_dump_dest='/u01/bdo/cdump'
*.db_block_size=8192
*.db_cache_size=251658240
*.db_create_file_dest='/u01/bdo'
*.db_domain='oracle.com'
*.db_file_multiblock_read_count=16
*.db_flashback_retention_target=2880
*.db_keep_cache_size=54525952
*.db_name='bdo'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=bdoXDB)'
*.java_pool_size=4194304
*.job_queue_processes=10
*.large_pool_size=4194304
*.open_cursors=300
*.pga_aggregate_target=200278016
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.resource_manager_plan='SYSTEM_PLAN'
*.sga_target=578813952
*.shared_pool_size=201326592
*.streams_pool_size=0
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/bdo/udump'

[oracle@aluno06 orcl]$ cp /u01/app/oracle/oradata/orcl/* /u01/bdo/ # aqui você deverá copiar toda a estrutura do banco atual para o novo.

[oracle@aluno06 bdo]$ sqlplus / as sysdba
SQL> alter database open; # inicie o banco atual para se ter certeza do que está fazendo.

[oracle@aluno06 bdo]$ export ORACLE_SID=bdo # agora vamos para o passo do novo banco.
[oracle@aluno06 bdo]$ rm *.ctl # remover os arquivos de controle, pois o comando dentro do script irá criá-los. Caso tenha algum arquivo .ctl, o comando não funcionará e retornará erro.
[oracle@aluno06 bdo]$ sqlplus / as sysdba
Connected to an idle instance.
SQL> @control.sql
SQL> exit

[oracle@aluno06 bdo]$ emca -repos recreate # Aqui você deve passar as informações do banco como, sid do banco, porta, senhas, etc.
[oracle@aluno06 bdo]$ emca -config bd # No passo acima, vai dar erro uma vez que o caminho acima não existe. Isso será resolvido com este passo para que reconfigure todo o banco. Será necessário passar toda a informação conforme descrito no passo acima.