quinta-feira, 16 de setembro de 2010

EXADATA - Solução Oracle para performance

Estivemos analisando o produto EXADATA que promete performance numa solução integrada software/hardware. Parece o fim do nosso trabalho de otimização de performance? Talvez...

Encontrei um excelente blog sobre o assunto e gostaria de compartilhar com vocês:

"o Exadata é uma “solução” composta de harware e software com o objetivo de rodar banco de dados Oracle da forma mais performática possível e com uma alta disponibilidade."

http://exadatadbabrasil.blogspot.com/2010/08/exadata-software.html
Abraços.

Adelson.

Como criar um banco de dados RAC usando o sql*plus

.Olá DBAs!


O RAC deixou de ser um bicho-papão, veja como é simples criar um banco de dados numa instância RAC. Os procedimentos também são úteis para migrar instâncias non-RAC para RAC. Vamos lá?

Comece criando um banco de dados simples no primeiro nó do cluster.
Use o comando "create database", depois converta-o para RAC, incluindo as configurações específicas para uma instância em cluster. Finalmente registre a instânci com o cluster.

Criando um non-RAC database

Crie um pfile

1) Criar um pfile para non-RAC database no nó 1

Segue um exemplo de um pfile. Foram comentados os parâmetros específicos de um banco de dados clusterizado (RAC). Alguns destes parâmetros podem ser deixados sem comentários, veja abaixo:

TSTDB2.__db_cache_size=4395630592
TSTDB1.__db_cache_size=4395630592
TSTDB2.__java_pool_size=16777216
TSTDB1.__java_pool_size=16777216
TSTDB2.__large_pool_size=16777216
TSTDB1.__large_pool_size=16777216
TSTDB2.__shared_pool_size=905969664
TSTDB1.__shared_pool_size=905969664
TSTDB2.__streams_pool_size=0
TSTDB1.__streams_pool_size=0
##*.cluster_database=true
*.cluster_database_instances=2
*.compatible='10.2.0.4'
*.db_block_size=8192
*.db_create_online_log_dest_1='+TSTDB_DATA'
*.db_domain=''
*.db_file_multiblock_read_count=32
*.db_name='TSTDB'
*.db_unique_name='TSTDB'
*.db_create_file_dest='+PWTEST_DATA'
*.db_recovery_file_dest='+PWTEST_DATA'
*.db_recovery_file_dest_size=53687091200
*.job_queue_processes=0
*.log_archive_dest_1='LOCATION=+PWTEST_DATA'
*.log_buffer=20971520
*.open_cursors=300
*.optimizer_mode='ALL_ROWS'
*.pga_aggregate_target=500M
*.processes=100
*.remote_login_passwordfile='exclusive'
*.resource_limit=TRUE
*.sga_max_size=1G
*.sga_target=1G
*.star_transformation_enabled='TRUE'
*.undo_management='AUTO'
*.undo_retention=3600
TSTDB1.local_listener='LISTENER_TSTDB1' TSTDB2.local_listener='LISTENER_TSTDB2'
#TSTDB1.undo_tablespace='UNDOTBS1'
#TSTDB2.undo_tablespace='UNDOTBS2'
TSTDB1.instance_number=1
TSTDB2.instance_number=2
TSTDB1.thread=1
TSTDB2.thread=2
*.user_dump_dest='/u01/app/oracle/product/10.2.0/db_1/admin/tstdb/udump' *.control_files='+PWTEST_DATA/TSTDB/controlfile/TSTDB.ctl' *.audit_file_dest='/u01/app/oracle/product/10.2.0/db_1/admin/tstdb/adump' *.background_dump_dest='/u01/app/oracle/product/10.2.0/db_1/admin/tstdb/bdump' *.core_dump_dest='/u01/app/oracle/product/10.2.0/db_1/admin/tstdb/cdump' *.fal_server=TSTDB
*.fal_client=TSTDB
*.standby_file_management=AUTO

### use o número do nó no nome da instância, desta meneira já fica pronto para cnversão em RAC.

Inicialize o banco com a opção NOMOUNT

TSTDB1 > startup nomount

ORA-01078: failure in processing system parameters
ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00132: syntax error or unresolved network name 'LISTENER_TSTDB1'
TSTDB1 >

Ok. Este ero acontece porque é necessário incluir no TNS o parâmetro local listener para resolver o nome LISTENER_TSTDB1.

Abra o tnsnames.ora e adicione as seguintes linhas:
LISTENER_TSTDB1 = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = vip-servidor1)(PORT = 1521)) )
                                                              ------------->> nome do servidor rede vip <<<
inicialize a instância novamente.

TSTDB1 > startup nomount
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size 2144432 bytes
Variable Size 257247056 bytes
Database Buffers 792723456 bytes
Redo Buffers 21626880 bytes
TSTDB1 >

Crie o banco de dados:

###Se você se esqueceu de comentar o parâmetro "cluster_database" recebrá o seguinte erro:

TSTDB1 > create database;
create database
*
ERROR at line 1:
ORA-01501: CREATE DATABASE failed
ORA-12720: operation requires database is in EXCLUSIVE mode

TSTDB1 > show parameter cluster
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cluster_database boolean TRUE
cluster_database_instances integer 2
cluster_interconnects string
TSTDB1 >

Não sendo o caso, agora você irá executar:

catalog, catproc, pupbld scripts ### todos se encontram sobre /rdbms/admin

Converter para instância RAC

Primeiro, crie 2 UNDO tablespaces para as 2 instâncias.

TSTDB1 > create undo tablespace UNDOTBS1 datafile '+DG_DATA' size 100M autoextend on next 50M maxsize 500M;
Tablespace created.

TSTDB1 > create undo tablespace UNDOTBS2 datafile '+DG_DATA' size 100M autoextend on next 50M maxsize 500M;
Tablespace created.

Adicione uma nova thread de REDO e habilite-a

###Se esse passo for ignorado você irá receber o erro quando inicializar a segunda instância:
###ORA-01620: no public threads are available for mounting)

TSTDB1 > alter database add logfile thread 2 group 10 '+DG_DATA' size 100M;
Database altered.

TSTDB1 > alter database add logfile thread 2 group 11 '+DG_DATA' size 100M;
Database altered.

TSTDB1 > alter database enable public thread 2;

Database altered.

PARÂMETROS ESPECÍFICOS DE UMA INSTÂNCIA RAC

Adicione agora todos os parâmetros específicos para ums inatância do tipo RAC no seu pfile.
### simplesmente tire os comentários dos parâmetros: undo_tablespaces e dos cluster_data - são eles: *.cluster_database=true
*.cluster_database_instances=2
TSTDB1.local_listener='LISTENER_TSTDB1' TSTDB2.local_listener='LISTENER_TSTDB2'
TSTDB1.undo_tablespace='UNDOTBS1'
TSTDB2.undo_tablespace='UNDOTBS2'
TSTDB1.instance_number=1
TSTDB2.instance_number=2
TSTDB1.thread=1
TSTDB2.thread=2

Inicialize os Listeners adicionais

Já adicionamos uma entrada no TNS para LOCAL_LISTENER. Vamos inicializar um novo listener. Atualize os seguintes arquivos:


listener.ora
----------------
LISTENER_TSTDB_servidor1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = vip-servidor1)(PORT = 1521)(IP = FIRST))
(ADDRESS = (PROTOCOL = TCP)(HOST = servidor1)(PORT = 1521)(IP = FIRST))
)
)

SID_LIST_LISTENER_TSTDB_DB01-servidor1 =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)

Inclua a seguinte entrada para o novo banco de dados. Inicialize os listener


tnsnames.ora
--------------------
TSTDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = vip-servidor1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip-servidor2)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = TSTDB)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)

Compartilhe seu pfile
Copie o pfile para os discos ASM ou crie o spfile nestes discos e inclua essa informação no pfile local.
Crie os diretorios da nova instância no nó 2 e inicialize as duas instâncias.


TSTDB2 > startup
ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size 2144432 bytes
Variable Size 257247056 bytes
Database Buffers 792723456 bytes
Redo Buffers 21626880 bytes
Database mounted.
Database opened.
TSTDB2 >
 
Vamos registrar todos os recursos com o CRS.

$ srvctl add database -d TSTDB -o /u01/app/oracle/product/10.2.0/db_1
$ srvctl add instance -d TSTDB -i TSTDB1 -n servidor1
$ srvctl add instance -d TSTDB -i TSTDB2 -n servidor2
$ srvctl add service -d TSTDB -s TSTDBSVC -r "TSTDB1,TSTDB2"

Confirme se todos os serviços foram registrados:

$ . oraenv
ORACLE_SID = [TSTDB1] ? CRS

$ crs_stat |grep tstdb
NAME=ora.TSTDB.TSTDB1.inst
NAME=ora.TSTDB.TSTDB2.inst
NAME=ora.TSTDB.TSTDBSVC.TSTDB1.srv
NAME=ora.TSTDB.TSTDBSVC.TSTDB2.srv
NAME=ora.TSTDB.TSTDBSVC.cs
NAME=ora.TSTDB.db

Concluímos a configuração. Estes procedimentos também podem ser usados para migrar instâncias para RAC, neste caso, ao invés de cria o banco de dados pelo comando "create database", usaremos o script gerado do controlfile do banco de dados non-RAC (alter database backup controlfile to trace).

sexta-feira, 10 de setembro de 2010

Como migrar da plataforma WIndows para Linux Oracle RAC

Sabemos que trabalhar com Windows em ambiente empresarial não dá. Se você quiser ter um ambiente estável tem que mudar para Linux. Demorei anos para aceitar isso, mas finalmente mudei. Agora quero passar de modo Fácil e Rápido como fazer isso.

Dicas:
1) Tire seu banco de dados do modo archive; depois você retorna.
2) Esteja certo que os níveis de patch aplicados sejam idênticos em ambas as plataformas.

"Tenho toda a minha base de dados Oracle instalada na plataforma Windows 2003 e agora quero ir para Linux. Quero ir direto para o RAC usando ASM. Não posso perder tempo usando export e import porque a base de dados está em produção e tempo de migração inviabilizaria o processo. Qual é o meio mais rápido?

Procurei na internet e ninguém faz nada parecido, então tive que ser criativo. Segue o roteiro:

1) Gere o init.ora para migrar seu banco com os mesmos parâmetros no Linux - create pfile from spfile;
2) Gere o controlfile - alter database backup controlfile to trace;
3) Retire o banco de dados do ar com  opção immediate ou normal - shutdown immediate;
4) Monte diretamente no Linux os discos usando o caminho do diretório dos datafiles-
mkdir /mnt/datafile
mount /hostdobancooriginal/diretorio/datafile /mnt/datafile -o user=usuario
>>>informe a senha
5) Faça o backup (cópia) do seu banco direto para os discos ASMusando o rman
rman target system/system123@sid
convert datafile '/mnt/datafile/system01.dbf' format '+disk/datafile/system01.dbf' TO PLATFORM = 'Linux x86 64-bit' FROM PLATFORM= 'Microsoft Windows x86 64-bit';
6) após converter todos os datafiles, copie o initfile do banco Windows editando os parâmetros do novo ambiente RAC usando ASM, veja exemplo:
dbxp1.__db_cache_size=788529152
dbxp2.__db_cache_size=788529152
dbxp1.__java_pool_size=16777216
dbxp2.__java_pool_size=16777216
dbxp1.__large_pool_size=16777216
dbxp2.__large_pool_size=16777216
dbxp1.__shared_pool_size=268435456
dbxp2.__shared_pool_size=268435456
dbxp1.__streams_pool_size=0
dbxp2.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/dbxp/adump'
*.background_dump_dest='/u01/app/oracle/admin/dbxp/bdump'
*.compatible='10.2.0.4.0'
*.control_files='+DG_DISK2/dbxp/controlfile/control.ora'
*.core_dump_dest='/u01/app/oracle/admin/dbxp/cdump'
*.db_block_size=8192
*.db_create_file_dest='+DG_DISK'
*.db_create_online_log_dest_1='+DG_DISK'
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='dbxp'
*.db_recovery_file_dest='+DG_DISK'
*.db_recovery_file_dest_size=21474836480
*.dispatchers='(PROTOCOL=TCP) (SERVICE=dbxpXDB)'
*.cluster_database_instances=2
*.cluster_database=true
dbxp2.instance_number=2
dbxp1.instance_number=1
*.job_queue_processes=10
*.nls_language='BRAZILIAN PORTUGUESE'
*.nls_territory='BRAZIL'
*.open_cursors=300
*.pga_aggregate_target=365953024
*.processes=150
*.remote_listener='LISTENERS_DBXP'
*.remote_login_passwordfile='exclusive'
*.sga_target=1098907648
dbxp1.thread=1
dbxp2.thread=2
*.undo_management='AUTO'
dbxp2.undo_tablespace='UNDOTBS1'
dbxp1.undo_tablespace='UNDOTBS4'
*.user_dump_dest='/u01/app/oracle/admin/dbxp/udump'

7) Depois é só editar o controlfile, incluindo os datafiles com o a localização nova nos discos ASM, veja exemplo:
CREATE CONTROLFILE SET DATABASE "DBXP" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 192
    MAXLOGMEMBERS 3
    MAXDATAFILES 1024
    MAXINSTANCES 32
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '+DG_DISK/dbxp/onlinelog/redo01.dbf'  SIZE 50M,
  GROUP 2 '+DG_DISK/dbxp/onlinelog/redo02.dbf'  SIZE 50M
DATAFILE
'+dg_disk/dbxp/data/tools01.DBF',
'+dg_disk/dbxp/data/system_1.DBF',
'+dg_disk/dbxp/data/usersdp_1.DBF',
'+dg_disk/dbxp/data/sysaux01.DBF',
'+dg_disk/dbxp/data/undo02.ora';
'+dg_disk/sxp2h/data/undo03.ora';

8) Pronto! Agora vamos por o banco no ar?
alter database open resetlogs;


Como você está criando o banco manualmente (sem DBCA), você deverá criar o banco sem os atributos de RAC, como o atributo instance_number. Depois é só incluir novamente. Também será preciso criar os serviços manualmente. No próximo artigo eu explico como fazer isso.

Boa sorte e sucesso.

Luis Adelson.