quarta-feira, 23 de setembro de 2009

Resizing Temporary Tablespace

Em muitos sistemas utilizamos os temp_files das tablespaces temporárias como autoextensible on, porém devido a consultas e ordenações errôneas pode-se consumir espaço desnecessário.

Para recuperarmos o espaço ocupado por essa tablespace podemos proceder da seguinte maneira de acordo com a versão do banco:

1. Drop/recreate
2. Drop tempfile - 9i ou posterior
3. Shrink temporary tablespace

1. Drop/recreate

Not a default temporary tablespace:

Para tablespaces não default o metodo é simples, basta dropar a tablespace e recria-la como desejado:

select tablespace_name, contents from dba_tablespaces;

TABLESPACE_NAME CONTENTS
------------------------------ ---------
SYSTEM PERMANENT
SYSAUX PERMANENT
UNDOTBS1 UNDO
TEMP TEMPORARY
USERS PERMANENT
EXAMPLE PERMANENT
SEC_TEMP TEMPORARY

SELECT * FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';

PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ------------------------------
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace

DROP TABLESPACE SEC_TEMP;

Tablespace dropped.

CREATE TEMPORARY TABLESPACE SEC_TEMP
TEMPFILE 'C:\APP\ORADATA\ORCL\SEC_TEMP01.DBF' SIZE 10M REUSE
AUTOEXTEND ON NEXT 5M MAXSIZE unlimited
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

Tablespace created.


Default temporary tablespace:


Para default temporary tablespace o processo é similar, porém, devemos criar um nova tablespace com os parametros desejados atribui-la como a nova tablespace default e dropar a antiga:

select tablespace_name, contents from dba_tablespaces;

TABLESPACE_NAME CONTENTS
------------------------------ ---------
SYSTEM PERMANENT
SYSAUX PERMANENT
UNDOTBS1 UNDO
TEMP TEMPORARY
USERS PERMANENT
EXAMPLE PERMANENT
SEC_TEMP TEMPORARY

SELECT * FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';

PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ------------------------------
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace

CREATE TEMPORARY TABLESPACE SEC_TEMP
TEMPFILE 'C:\APP\ORADATA\ORCL\SEC_TEMP01.DBF' SIZE 10M REUSE
AUTOEXTEND ON NEXT 5M MAXSIZE unlimited
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE SEC_TEMP;

Database altered.

DROP TABLESPACE TEMP;

Tablespace dropped.

Drop tempfile - 9i ou posterior


Há outro método para redimensionar a tablespace temporary, nesse exemplo basta dropar e recriar o tempfile:

SELECT FILE_NAME, FILE_ID, TABLESPACE_NAME, BYTES/1024/1024
FROM DBA_TEMP_FILES;

FILE_NAME FILE_ID TABLESPACE_NAME
----------------------------------- ---------- ------------------------------
BYTES/1024/1024
---------------
C:\APP\ORADATA\ORCL\TEMP01.DBF 1 TEMP
10

ALTER DATABASE TEMPFILE 'C:\APP\ORADATA\ORCL\TEMP01.DBF' DROP INCLUDING DATAFILES;

Database altered.

ALTER TABLESPACE temp ADD TEMPFILE 'C:\APP\ORADATA\ORCL\TEMP01.DBF' SIZE 5m
AUTOEXTEND ON NEXT 1m MAXSIZE UNLIMITED;

Tablespace altered.


Shrink temporary tablespace 11g


Já na versão 11g é possível recuperar o espaço através do comando shrink, que é utilizado em nível da tablespace.

FILE_NAME FILE_ID TABLESPACE_NAME
----------------------------------- ---------- ------------------------------
BYTES/1024/1024
---------------
C:\APP\ORADATA\ORCL\TEMP01.DBF 1 TEMP
100

SQL> ALTER TABLESPACE TEMP SHRINK SPACE;

Tablespace altered.

SQL> SELECT FILE_NAME, FILE_ID, TABLESPACE_NAME, BYTES/1024/1024
2 FROM DBA_TEMP_FILES;

FILE_NAME FILE_ID TABLESPACE_NAME
----------------------------------- ---------- ------------------------------
BYTES/1024/1024
---------------
C:\APP\ORADATA\ORCL\TEMP01.DBF 1 TEMP
1,0625

quarta-feira, 26 de agosto de 2009

Flashback Data Archive

Nova feature presente na versão 11g do software da Oracle, tem como objetivo reter dados por longos períodos sem que haja mudanças na aplicação, com fácil acesso e com o minimo de recursos necessário (não há perda de performance, e minimo armazenamento).
No versão 10g é possivel buscar dados realizando consultas AS OF, porém nem sempre é retornado um valor, lembrando que os dados relativos a selects AS OF são buscados na undo obedecendo a uma política de retenção.
Na versão 11g esse limite acaba com o Flashback Data Archive, que faz parte o Oracle Total Recall, onde uma tabela interna é criada para armazenar dados históricos de outra tabela com FDA habilitada.

O que há de novo?

Processo de segundo plano: FBDA (Flashback Data Archive), A cada cinco minutos realiza a cópia dos dados em undo para tabela históricas.

Privilégios:
FLASHBACK ARCHIVE ADMINISTER.
FLASHBACK ARCHIVE.

Views Relacionadas:
DBA_FLASHBACK_ARCHIVE: Informações sobre flashback archive.
DBA_FLASHBACK_ARCHIVE_TS: Informações de todas as tablespaces contendo flashback archive.
DBA_FLASHBACK_ARCHIVE_TABLES: Informações de quais tabelas tem dados históricos.

Requer:
Automatic Undo Managment.
ASSM Automatic Segment Space Management para a tablespace onde irá residir o FDA.

Exemplo:

Criando a tablespace que irá armazenar a FDA:
CREATE TABLESPACE FBHISTORY
DATAFILE '/u01/app/oracle/oradata/orcl/fbhistory01.dbf' SIZE 100M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
Criando o FDA:
CREATE FLASHBACK ARCHIVE DEFAULT hr_hist
TABLESPACE FBHISTORY
QUOTA 1G
RETENTION 1 MONTH;
Concedendo as permissões:
GRANT FLASHBACK ARCHIVE ON hr_hist TO hr;
Alterando a retenção, apenas alterada para teste, não deve ser imposta em ambientes de produção:
alter system set undo_retention=1;
Habilitando a feature para tabela:
con hr

ALTER TABLE EMPLOYEES FLASHBACK ARCHIVE;
Atualizando a tabela e obtendo dados do passado com select AS OF:
SQL> alter session set nls_date_format='DD/MM/YYYY hh24:mi:ss';

Session altered.

SQL> select sysdate from dual;

SYSDATE
-------------------
26/08/2009 21:39:15
Valor original:
SQL> select EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARY from employees where EMPLOYEE_ID = 100;

ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 24000

Atualizando a tabela:

SQL> update employees set salary=salary*3 where EMPLOYEE_ID=100;

1 row updated.

SQL> commit;

Commit complete.

SQL> select EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARY from employees where EMPLOYEE_ID = 100;

ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 72000

Buscando informações do passado com AS OF:
SQL> SELECT EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARY
FROM hr.employees AS OF TIMESTAMP TO_TIMESTAMP('26/08/2009 21:39:15', 'DD/MM/YYYY hh24:mi:ss')
WHERE employee_id = 100;
2 3
ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 24000

SQL> SELECT LAST_NAME, SALARY FROM HR.EMPLOYEES
VERSIONS BETWEEN TIMESTAMP
TO_TIMESTAMP ('26/08/2009 21:39:15', 'DD/MM/YYYY hh24:mi:ss')
AND
TO_TIMESTAMP ('26/08/2009 21:44:15', 'DD/MM/YYYY hh24:mi:ss')
WHERE EMPLOYEE_ID = 100; 2 3 4 5 6

LAST_NAME SALARY
------------------------- ----------
King 72000
King 24000
Através do flashback table voltamos os dados ao original:
SQL> ALTER TABLE HR.EMPLOYEES ENABLE ROW MOVEMENT;

Table altered.

SQL> FLASHBACK TABLE HR.EMPLOYEES
TO TIMESTAMP
TO_TIMESTAMP ('26/08/2009 21:39:15', 'DD/MM/YYYY hh24:mi:ss'); 2 3

Flashback complete.

SQL> select EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARY from HR.employees where EMPLOYEE_ID = 100;

ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 24000
Referencias:
http://www.orafaq.com/wiki/Oracle_Total_Recall
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_5009.htm
http://www.oracle-base.com/articles/11g/FlashbackAndLogminerEnhancements_11gR1.php
http://www.oracle-base.com/articles/11g/FlashbackAndLogminerEnhancements_11gR1.php
http://www.psoug.org/reference/flash_archive.html
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_9013.htm#SQLRF01603

sexta-feira, 21 de agosto de 2009

Automatic Memory Managment

Cada vez mais a Oracle vem implementando features para automatizar e optimizar processos e recursos. No 9i surgiu a PGA_AGGREGATE_TARGET, no 10g foi implementando a SGA_TARGET surgindo o ASMM, na versão 11g surge então o parametro memory que administra SGA + PGA dinamicamente com um unico parametro.

Dois novos parametros:

MEMORY_TARGET - A quantidade de memória alocada para SGA+PGA.
MEMORY_MAX_TARGET - Máximo de memória permitida para memory_target, opcional;

Se utilizado o parametro MEMORY_TARGET, a feature AMM (Automatic Memory Management), onde só é necessário configurar o parametro memory_target.

Ainda é possível utilizar o SGA_TARGET e PGA_AGGREGAT_SIZE juntamente com o MML, assim se alocados eles funcionam como garantia de um valor minimo para as áreas.

Para desabilitar a feature basta configura a memory_target = 0.

Há um chart abaixo com parametros e pools de memórias alocados de forma hierarquica.




Configurações possiveis para administração de memória.





Referencia:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/memory003.htm
http://www.oracle-base.com/articles/11g/AutomaticMemoryManagement_11gR1.php
http://dhnomura.blogspot.com/2009/06/sga-and-asmm.html

sexta-feira, 7 de agosto de 2009

Oracle OFA

OFA - Optimal Flexible Architecture

Vantagem de se utilizar o OFA:

- Organizar dados e softwares em discos.
- Facilita tarefas administrativas.
- Facilita a troca entre diversos Oracle Databases.
- Administrar o crescimento da base de dados.
- Ajuda a diminuir a fragmentação do disco.

A função do OFA é padronizar pontos de montagens, diretórios e subdiretórios.

Mount points
Nomeia pontos de montagens com a sintaxe /pm onde o p é uma string e m é um numero, exemplo /u01.

Diretório home
Nomeia todos os home directories usando /pm/h/u, onde o h é uma string, um nome, u é o owner do diretório, exemplo /u01/app/oracle.

Oracle Directories
Determina a versão da software, onde, product é um literal, e v é a versão do software, exemplo, /u01/app/oracle/product/11.1.0/db_1

Subdiretórios
Usado para facilitar a administração do banco de dados, sintax /h/admin/d/a onde o h é o Oracle directory (ORACLE_HOME), admin um literal, d é o nome do banco de dados, e a o subdiretórios para os arquivos de administração, como o seguintes:

adhoc - Ad hoc SQL Scripts.
arch - Archived redo logs.
adump - Audit files.
Create - Programas usados para criar a base de dados.
Exp - Export files.
Pfile - Arquivo de parametros.

Arquivos do banco de dados

Controlfile: /pm/q/d/controln.ctl
Redo log files: /pm/q/d/redon.log
Data files: /pm/q/d/tn.dbf

Onde p é o ponto de montagem, q é uma string (oradata), d o nome do banco de dados, t o nome da tablespace e n um numero de dois digitos.

OFA aparenta ser simples, mas facilita muito a vida de dbas os quais administram muitas base de dados, e tais base de dados são administradas por muitos dbas, economiza-se muito tempo se utilizado tais padrões.

quinta-feira, 30 de julho de 2009

Acessando planilhas do excel através do Oracle

Minha cabeça expludiu, rs, perdi algumas horinhas pra achar um jeito de popular algumas tabelas com dados dentro de planilhas do excel, sem ter a necessidade de qualquer modificação no xls ou usar algum software de terceiros. A solução encontrada foi: Conectar na planilha através de um dblink, configurado pelo com listener através de fontes de dados ODBC.
OBS - Conexões Oracle/Terceiros é chamada de Generic Heterogeneous Services.

Muito simples de ser feito, envove as seguintes etapas:

  1. Criar o odbc pra planilha;
  2. Configurar o listener/tnsnames.
  3. Configurar o parametro HS_FDS_CONNECT_INFO em $ORACLE_HOME/hs/admin/initXXX.ora.
  4. Reload do listener.
  5. Criar o DB link.
1) Criar o odbc:



2) Configurar o listener/tnsnames

OBS - As modificações necessárias estão em negrito.

tnsnames.ora:


XE =

(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dhnomura)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)


testing_hs = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = dhnomura)(PORT = 1521)) ) (CONNECT_DATA =(SID = testing_hs) (SRVR = DEDICATED) ) (HS = OK) )





listener.ora:

SID_LIST_LISTENER =

(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = c:\oraclexe\app\oracle\product\10.2.0\server\)
(PROGRAM = extproc)
)
)
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
(PROGRAM = extproc)
)
(SID_DESC = (SID_NAME = testing_hs) (ORACLE_HOME =c:\oraclexe\app\oracle\product\10.2.0\server\) (PROGRAM = hsodbc) )
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
(ADDRESS = (PROTOCOL = TCP)(HOST = dhnomura)(PORT = 1521))
)
)
DEFAULT_SERVICE_LISTENER = (XE)




3) Configurar o parametro HS_FDS_CONNECT_INFO em $ORACLE_HOME/hs/admin/initXXX.ora.

Se torna necessário criar o arquivo $ORACLE_HOME/hs/admin/intiXXX.ora substituindo os xxx do nome pelo nome dado nos tnsnames.ora e listener.ora no sid_name, no caso ficará como:

$ORACLE_HOME/hs/admin/inittesting_hs.ora

Adicionar as entradas no arquivo:


# This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent.
#
# HS init parameters
#
HS_FDS_CONNECT_INFO = ts
HS_FDS_TRACE_LEVEL = 0
#
# Environment variables required for the non-Oracle system
#
#set =


OBS - HS_FDS_CONNECT_INFO é igual ao nome dado a fonte de dados ODBC.

4) Reload ou stop/start do lister.



LSNRCTL> reload
Estabelecendo conexπo com (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_X
E)))
O comando foi executado com Ωxito


5) Criar os db link:



SQL> create database link excel using 'testing_hs’;

Database link created.




Agora como teste final acessar os dados da planilha:

SQL> select count(*) from Planilha1$@excel;

COUNT(*)
----------
664



Obs - Planilha1 é o nome da planilha e não o nome do arquivo em sí.

quarta-feira, 8 de julho de 2009

Upgrading to Oracle 11g

E ae!!!!!

Resolvi atualizar a versão do Oracle da minha maquina de estudo, meu ambiente resume-se em:

SO: Centos 4.4
Database: Oracle 10g
Instances: +ASM - Gerenciamento de discos
orcl - Estudo

Passerei ambas as bases para a versão 11g através de scripts. É possivel realizar o upgrade pelo DBUA (o que é o recomendavel) ou através do datapump.

Assim seguiremos o passo-a-passo para um upgrade bem sucessido, irei realizar da seguinte forma:

1) Pre Checks
1.1) Pre check OS;
1.2)
Backup full consistente de toda a base, incluindo controlfile e spfile;

2) Upgrade
2.1) Instalação do software 11g;
2.2) Upgrade do CSS;
2.3) Upgrade da instancia do ASM;
2.4) Upgrade da base de dados, orcl;

3) Pos Upgrade

3.1) Base de dados, orc
3.1.1)
Backup full consistente de toda a base, incluindo controlfile e spfile;
3.1.2) Criação do spfile;
3.1.3) Parametros;
3.1.4) OraPWD;
3.1.5) Configurar o threshold de alerta das tablespaces;
3.1.6) Configurar o Enterprise Manager;

3.2) Discos, ASM instance
3.2.1) Configurar


1)
Pre checks

1.1) Pre check OS

Deve ser verificado durante essa fase parametros do kernel e packages instaladas, caso alguns desses itens esteja incorreto o Oracle irá apresentar um warning durante a instalação e podemos nesse momento ou devemos configura-los da maneira correta.

1.2) Backup full consistente

Não vou entrar em detalhes de como deve ser realizado este backup, fica a critério do DBA. No
meu caso prefiro realizar pelo rman, o importante é saber fazer o restore caso seja necessário.

2) Upgrade

2.1) Instalar o Software do Oracle 11g

Após realizar o download do software da Oracle e descompacta-lo inciar o instalador:
Seguir no diretório e executar o runInstaller como a seguir
[oracle@hobd001dhn database]$ ./runInstaller
Durante o processo de instalação será necessário informar o novo home do Oracle, que no
meu caso será em: /u01/app/oracle/app/oracle/product/11.1.0/db_1

Link para o download: http://www.oracle.com/technology/software/products/database/index.html

A seguir temos as telas para completar a instalação, muito intuitiva a instalação. No meu caso não quero um banco novo e sim fazer o upgrade dos demais, portanto vou realizar a instalação avançada.














2.2) Upgrade do CSS;

O oracle Synchronization Services é um daemon que é instalado pelo root, iniciado a cada boot e é responsável pela comunicação entre a instancia do ASM e as demais bases de dados.
Para atualizar o CSS realizaremos da seguinte forma:

1) Stop de todas as instancias;
2) executar como root
./u01/app/oracle/app/oracle/product/11.1.0/db_1/bin/localconfig reset

2.2) Upgrade do ASM;

Resolvi realizar o upgrade do ASM pelo DBUA, pois achei mais fácil, e também não tenho o procedimento para realizar manualmente.
Devemos com as bases paradas e com as váriaveis de ambiente devidamente configuradas para o novo home do Oracle, PATH, ORACLE_HOME e ORACLE_SID chamar o dbau, e seguir o procedimento:








Ps - Eu não fiz o print nessas duas utimas telas então fui obrigado a busca-la em outro lugar, por isso a divergencia nos nomes do Oracle_home.

2.4) Upgrade da base de dados, orcl;

Antes de realizar o upgrade é necessário realizar um pre-check do database, para tal, utilizar o caminho do ORACLE_HOME da nova instalação e chamar o script ?/rdbms/admin/
utlu111i.sql.
No meu caso utilizava a versão 10.2.0.1, foi necessário realizar upgrade nos arquivos de timezone, realizei os steps para isso de acordo com o site http://advait.wordpress.com/2007/09/07/upgrading-to-oracle-database-11g/ onde segui o guia para aplicar o patch do oracle e atualizar a versão dos arquivos do timezone.

Após o realizar o pre-check de upgrade, e não apresentar mais erros já é possivel realizar o upgrade.

Para realizar o upgrade é necessário modificar alguns parametros, no meu caso foi necessário alterar os parametros: COMPATIBLE='11.1.0' e diagnostic_dest='/u01/app/oracle/diag/rdbms/orcl/orcl/trace'

No caso diagnostic_dest é um novo parametro o qual substitui o user_dump e background_dump_dest.

Com o novo init feito e no seu devido diretório ?/dbs/initorcl.ora parar o banco de dados e realizar o upgrade:

startup upgrade pfile='?/dbs/initorcl.ora';
@?/rdbms/admin/catupgrd.sql

Após o termino do upgrade realizar a validação do upgrade:
@?/rdbms/admin/utlu111s.sql

Oracle Database 11.1 Post-Upgrade Status Tool 07-19-2009 20:24:06
.
Component Status Version HH:MM:SS
.
Oracle Server
. VALID 11.1.0.6.0 01:54:20
JServer JAVA Virtual Machine
. VALID 11.1.0.6.0 00:00:00
Oracle Workspace Manager
. VALID 11.1.0.6.0 00:00:00
OLAP Analytic Workspace
. VALID 11.1.0.6.0 00:00:00
OLAP Catalog
. VALID 11.1.0.6.0 00:00:00
Oracle OLAP API
. VALID 11.1.0.6.0 00:00:00
Oracle Enterprise Manager
. VALID 11.1.0.6.0 00:00:00
Oracle XDK
. VALID 11.1.0.6.0 00:00:00
Oracle Text
. VALID 11.1.0.6.0 00:00:00
Oracle XML Database
. VALID 11.1.0.6.0 00:00:00
Oracle Database Java Packages
. VALID 11.1.0.6.0 00:00:00
Oracle Multimedia
. VALID 11.1.0.6.0 00:24:09
Spatial
. VALID 11.1.0.6.0 00:00:00
Oracle Expression Filter
. VALID 11.1.0.6.0 00:00:00
Oracle Rules Manager
. VALID 11.1.0.6.0 00:00:00
Gathering Statistics
. 00:17:25
Total Upgrade Time: 02:35:59

PL/SQL procedure successfully completed.

É preciso verificar se ficou algum objeto invalido:
@?/rdbms/utlrp.sql
SELECT COUNT(*) FROM DBA_INVALID_OBJECTS;

É recomendavel nesse momento realizar o backup da base de dados.

Abraços

quinta-feira, 4 de junho de 2009

SGA and ASMM

A partir do Oracle 9i foi introduzido o conceito de auto gerenciado de memória dentro do Oracle, esse é um recurso muito importante, pois memória é um recurso limitado e diversos bancos apresentam inumeros comportamentos em horários de trabalho diferentes, necessitando uma alocação de memória diferente a cada processo ou carga de trabalho.

Para solucionar o problema de alocação manual de espaço a Oracle introduzio o novo conceito, ASMM, com as área de memória com caracteristica de auto-alocaveis podem variar de tamanho dinamicamente e de acordo com a real necessecidade do momento.

Para habilitar essa feature temos que levar realizar:

Parametro: sga_target > 0 e <= sga_max_size. Parametro: statistics_level = typical ou all. ASMM utiliza um novo processo de segundo plamp chamado MMAN (Memory Manager), o qual observa a utilização e realiza o rebalanciamento da memória, para melhor alocação de recursos o MMAN realiza os seguintes processos:
  • Captura estatistica;
  • Usa advisor de memória;
  • Realiza "What if" analise;
  • Move memória;
  • Escreve spfile.
O total de memória para os parametros de auto-tune são alocados pela seguinte formula:

SGA_TARGET - parametros de não auto administraveis.

Segue a referencia:

Parametros auto administrados

- Shared Pool
- Database Buffer Cache
- Streams Pool
- Java Pool
- Large Pool

Não auto administrados

- Redo log buffer
- Keep e Recycle buffer cache
- Tamanho de blocos não padrão para o database buffer cache

quinta-feira, 28 de maio de 2009

NLS Parameters

Para englobar todo o assunto relacionado a globalização, vou fazer um overview sobre os parametros que regem o comportamento de instruções sql no banco de dados relacionados com parametros NLS.

Os parametros são definidos do baixo nivel para mais alto, assim, da database para sessão, como mostra o diagrama:






















Os parametros os quais regem globalização são:

1. Linguistica - NLS_LANGUAGE - Determina default para:
  • NLS_DATE_LANGUAGE - Determina a abreviações de dia e mês.
  • NLS_SORT - Dertimina a ordenação de caracteres.
2. Cultural/Geografica - NLS_TERRITORY - Determina default para:
  • NLS_CURRENCY - Simbolo da moeda local
  • NLS_DATE_FORMAT - Formato da data local
  • NLS_DUAL_CURRENCY - Simbolo secundário da moeda local
  • NLS_ISO_CURRENCY -
  • NLS_NUMERIC_CHARACTERS - Ponto decimal a ser usado
  • NLS_TIMESTAMP_FORMAT - Formato de valores time stamp
  • NLS_TIMESTAMP_TZ_FORMAT - Formato de valores time stamp with local time zone
3. Parametros independentes
  • NLS_CALENDAR - Calendário a ser usado
  • NLS_COMP - ANSI ou BINARY
  • NLS_LENGTH_SEMANTICS -

Existe o parametro NLS_LANG, o qual pode ser setado na sessão ou no ambiente define o comportamento de linguistica e localidade, ao configura-lo definimos:

NLS_LANG =language
_territory.charset

Nesse ponto todos os parametros denpendentes de NLS_LANGUAGE e NLS_TERRITORY são setados para default, e setado também para o character set do ambiente.

Podemos verificar os parametros iniciais do nosso banco de dados na views: NLS_DATABASE_PARAMETERS
Na minha base retorna:
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET AL32UTF8
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 10.2.0.1.0
Espero ainda melhorar este post ou entrar nesse assunto novamente, por enquanto apenas quis demonstrar a existencia de relacionamento e dependencia dos parametros de globalização.

segunda-feira, 2 de fevereiro de 2009

ASM + losetup

Essa semana estive estudando sobre ASM, foi muito esclarecedor, porém estava com vontade de brincar um pouco, decidi então mandar bala.

Fiquei meio limitado nessa brincadeira, meu disco estava cheio, por incrivel que pareça é muito fácil lotar um HD de 60GB com porcaria, mas é muito dificil se livrar dela, hehehe, consegui liberar 12 GB no disco, e decidi então iniciar a jornada. Instalei um VMWare, coloquei um centos4 e por fim instalei meu Oracle 10.2.0 pelo OU.

Eis que surgem 2 problemas, estou com espaço limitado em disco, cerca de 4GB para toda base de dados, não poderei brincar com failures groups, e o mais critico, para utilizar ASM teria que ter disco não formato, o que infelizmente não é essa a minha realidade, então como simular os disco no SO?

Achei a resposta no yahoo groups, utilizando arquivos vazios e o losetup, o qual irá realizar todo o trabalho de simular uma partição.

Resumindo, temos então que:

1) Criar os arquivos fisicos.
2) Simular partições.
3) Scripts de inicialização
4) Criar a instancia ASM
4.1) Parametros
4.2) Discos
4.3) DiskGroups

Salvei todo o log da minha operação e aqui esta oque foi feito:


Configurando SO:

Criando os arquivos pertencentes a partição

# mkdir /asmdisks
# chown oracle:dba /asmdisks
# su - oracle

$ dd if=/dev/zero of=/asmdisks/_file_disk1 bs=1k count=500000
$ dd if=/dev/zero of=/asmdisks/_file_disk2 bs=1k count=500000
$ dd if=/dev/zero of=/asmdisks/_file_disk3 bs=1k count=500000
$ dd if=/dev/zero of=/asmdisks/_file_disk4 bs=1k count=500000

Vinculando os arquivos vazios a partições

$ su -

# losetup /dev/loop1 /asmdisks/_file_disk1
# losetup /dev/loop2 /asmdisks/_file_disk2
# losetup /dev/loop3 /asmdisks/_file_disk3
# losetup /dev/loop4 /asmdisks/_file_disk4

Alterando as permissões

# chown oracle:dba /dev/loop1
# chown oracle:dba /dev/loop2
# chown oracle:dba /dev/loop3
# chown oracle:dba /dev/loop4

Iniciando o serviço do cluster

# <$ORACLE_HOME>/bin/localconfig add

Criando a instancia +ASM

Criando um script para iniciar a partição ao boot

como root

vi /root/rc.loopasm

# !/bin/bash
loop()
{
losetup /dev/loop1 /asmdisks/_file_disk1
losetup /dev/loop2 /asmdisks/_file_disk2
losetup /dev/loop3 /asmdisks/_file_disk3
losetup /dev/loop4 /asmdisks/_file_disk4
chown oracle:dba /dev/loop1
chown oracle:dba /dev/loop2
chown oracle:dba /dev/loop3
chown oracle:dba /dev/loop4
}
loop

# chmod +x /root/rc.loopasm

Fazer a chamada do script criado em /etc/rc2.d/:

# ln -sf /root/rc.loopasm /etc/rc2.d/S10loopasm.sh
# ln -sf /root/rc.loopasm /etc/rc5.d/S10loopasm.sh

Reiniciar o sistema


Criar a Instancia ASM


Criando os diretórios admin

$ mkdir -p $ORACLE_BASE/admin/+ASM/bdump
$ mkdir -p $ORACLE_BASE/admin/+ASM/cdump
$ mkdir -p $ORACLE_BASE/admin/+ASM/hdump
$ mkdir -p $ORACLE_BASE/admin/+ASM/pfile
$ mkdir -p $ORACLE_BASE/admin/+ASM/udump

Criando o arquivo de parametro

Criar em: $ORACLE_BASE/admin/+ASM/pfile

$ vi $ORACLE_BASE/admin/+ASM/pfile

###########################################
# Automatic Storage Management
###########################################
# _asm_allow_only_raw_disks=false
# asm_diskgroups='TESTDB_DATA1'

# Default asm_diskstring values for supported platforms:
# Solaris (32/64 bit) /dev/rdsk/*
# Windows NT/XP \\.\orcldisk*
# Linux (32/64 bit) /dev/raw/*
# HPUX /dev/rdsk/*
# HPUX(Tru 64) /dev/rdisk/*
# AIX /dev/rhdisk/*
asm_diskstring='/dev/loop*'

###########################################
# Diagnostics and Statistics
###########################################
background_dump_dest=/u01/app/oracle/admin/+ASM/bdump
core_dump_dest=/u01/app/oracle/admin/+ASM/cdump
user_dump_dest=/u01/app/oracle/admin/+ASM/udump

###########################################
# Miscellaneous
###########################################
instance_type=asm

###########################################
# Pools
###########################################
large_pool_size=12M

###########################################
# Security and Auditing
###########################################


E criar o seguinte link simbolico

$ ln -s $ORACLE_BASE/admin/+ASM/pfile/init.ora $ORACLE_HOME/dbs/init+ASM.ora


Iniciando a instancia e criando o spfile

# su - oracle
$ ORACLE_SID=+ASM; export ORACLE_SID
$ sqlplus "/ as sysdba"

SQL> startup
ASM instance started

Total System Global Area 75497472 bytes
Fixed Size 777852 bytes
Variable Size 74719620 bytes
Database Buffers 0 bytes
Redo Buffers 0 bytes
ORA-15110: no diskgroups mounted

SQL> create spfile from pfile='/u01/app/oracle/admin/+ASM/pfile/init.ora';

SQL> shutdown
ASM instance shutdown

SQL> startup
ASM instance started

Verificando os raw devices

$ ORACLE_SID=+ASM; export ORACLE_SID
$ sqlplus "/ as sysdba"

SQL> SELECT group_number, disk_number, mount_status, header_status, state, path
2 FROM v$asm_disk;


Criar o disk group

SQL> CREATE DISKGROUP testdb_data1 external REDUNDANCY
2  DISK '/dev/loop1','/dev/loop2','/dev/loop3','/dev/loop4';
Assim temos a nossa instancia +ASM criada e somente temos que criar um nova base para acessar o nosso storage com o dbca, em caso de migração de uma instancia normal para +ASM teriamos que usar o RMAN.

Fonte:
http://www.idevelopment.info/data/Oracle/DBA_tips/Automatic_Storage_Management/ASM_21.shtml
http://www.idevelopment.info/data/Oracle/DBA_tips/Automatic_Storage_Management/ASM_10.shtml
http://www.devin.com.br/dev_loop/