Monday, January 25, 2010

Instalação e overview do Openfiler – Gerenciador de NAS/SAN – Part 1

O objetivo deste post é mostrar a instalação do Openfiler em uma máquina virtual.
Nos próximos posts irei colocar como funciona o gerenciamento do storage através da sua interface web .

Abaixo os locais de download do software usado neste post.

Download  em :

http://sourceforge.net/projects/openfiler/

Site oficial:

http://www.openfiler.com/

Wiki:

http://en.wikipedia.org/wiki/Openfiler


Introdução ao Openfiler

O Openfiler é na verdade um sistema operacional baseado na distribuição rPath Linux .Outra coisa interessante é o fato de ele ser open source e licenciado via licença GPL.
O Openfiler desempenha a função de um gerenciador de Storage NAS/SAN que é pode ser muito útil principalmente para os nossos testes com o Oracle.
Ele suporta NFS, SMB/CIFS, HTTP/WebDAV, FTP and iSCSI (initiator and target).Mais informações sobre suporte no site oficial do produto.
Para podermos fazer uso deste storage em nossos hosts servidores de banco de dados devemos ter configurado o pacote iSCSI.Para Red Hat ou similar temos o pacote iscsi-initiator-utils
e para Solaris temos os pacotes SUNWiscsi e SUNWiscsiu.


Criação da máquina virtual

Crie uma máquina virtual e aponte o CD-ROM para a imagem ISO do Openfiler .

clip_image002


Iniciando a instalação




clip_image004

Como podemos ver o Openfiler também roda em cima de um Linux:

clip_image006

Vamos fazer o test da mídia:

clip_image008

clip_image010

clip_image012

clip_image014

Obs.
Se aparecer algum erro dizendo que o CD-ROM não está montado ,verique se ele está com status conectado a vm.

clip_image016

clip_image018

clip_image020

clip_image022

clip_image024

clip_image026
Obs.O partionamento manual é opcional.
clip_image028

Ativando o swap .Clique em Yes.

clip_image030



Configuração de rede 

Edite a sua interface de rede.

clip_image032

clip_image034

clip_image036

clip_image038

clip_image040

clip_image042

Dependendo da quantidade de memória do host onde a instalação está sendo feita ou caso deseje usar como servidor virtualizado como no meu caso a instalação pode demorar um pouco.

clip_image044

clip_image046

clip_image048

Este foi o post sobre instalação do Openfiler.

No próximo post vamos acessar a interface de gerenciamento , criar os VG's e LV's e conceder permissão de acesso aos hosts que irão usar os LV's .

Este era para ser o segundo post...



Depois de instalar o Openfiler podemos tanto gerenciar através da sua interface gráfica via web(HTTPS) .
Há várias opções de linha de comandos no sistema do Openfiler ao longo dos posts vou deixar mais informações.
Iniciando a interface web : https://192.168.79.140:446/

clip_image002

Credenciais


O usuário default é openfiler e a senha é password.Você também consegue logar como root,mas não terá acesso ao Openfile Storage Control Center .
Após iniciar com o usuário padrão você pode trocar a senha e gerenciar os privilégios .

clip_image004

Abaixo o acesso ao sistema gerenciador do storage.

clip_image006

De cara vamos alterar a senha do usuário openfiler .
Visualizando a imagem acima siga até a aba Accounts,depois procure na barra lateral direita a opção Admin Password :













Prestar bastante atenção na barra de status do navegados pois ele não informa nenhuma mensagem de "senha alterada com sucesso".Pelo menos eu não achei!

Eu adicionei 2 discos a minha VM do Openfiler .No caso quero disponibilizar estes discos para uma instancia ASM de um dos meus servidores com Red Hat.Temos um trabalho a fazer que é instalar os pacotes iscsi no Red Hat.

Vou dividir em outro posts a configuração do pacote iscsi-initiator-utils Red Hat e depois voltamos a segunda  parte do gerenciamento do Openfiler.



Sunday, January 24, 2010

Repositório de código/softwares - SourceForge

Resolvi postar esta informação em virtude de conversar com vários profissionais de tecnologia e muitos me diziam não conhecer este repositório de software livre chamado Source Forge.Lógico que com milhões de sites espalhados pela Web fica difícil conhecer todos os melhores,mas sempre que pudermos destacá-los será mais fácil para outros encontrarem o que desejam.

Você pode acessar pelo link  : http://sourceforge.net/

Ele armazena muitos projetos open source e você mesmo pode cadastrar o seu projeto para que fique disponível ao público.

Eu mesmo já baixei vários softwares para testar como software para time tracking,banco de dados entre outros.

Mais  informações :

Monday, January 18, 2010

Oracle Data Pump - Parameters : ESTIMATE_ONLY e ESTIMATE

Me pediram para fazer  uma estimativa de tamanho de arquivo de dump extraído  Oracle do Data Pump para dois schemas em um DW.

Rapidamente lembrei que existe a opção de "estimar" Export Data Pump.

Usando os parâmetros ESTIMATE_ONLY=y e ESTIMATE=block ou statistics você consegue se antecipar  e saber quanto de tamanho irá precisar para armazenar o arquivo.

Detalhe: Não é necessário especificar os parâmetros DIRECTORY e DUMPFILE.O resultado aparece ali na sua tela de execução mesmo.

É isso .

Vou deixar aqui um código de exemplo :

expdp directory=data_pump_dir schemas=MY_AREAS,BI_JULIO estimate_only=y estimate=blocks


Username: "DBAJCCORREA"
Password:


Connected to: Oracle Database 10g Release 10.2.0.4.0 - Production
Starting ""DBAJCCORREA""."SYS_EXPORT_SCHEMA_02":  "DBAJCCORREA"/******** directory
=data_pump_dir schemas=MY_AREAS,BI_JULIO estimate_only=y estimate=blocks
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
.  estimated "BI_JULIO"."VENDAS"                            1.5 GB
.  estimated "BI_JULIO"."SALES_REPORT"                    844.1 MB
.  estimated "BI_JULIO"."RETORNO"                           200 MB
.  estimated "BI_JULIO"."CORTE"                             136 MB
.  estimated "BI_JULIO"."SITUACAO_CLIENTE"                  112 MB
.  estimated "BI_JULIO"."CLIENTE"                         63.12 MB
.  estimated "BI_JULIO"."CLIENTE_ABCDEFG"                    46 MB
.  estimated "BI_JULIO"."OBJETIVO"                           40 MB
.  estimated "BI_JULIO"."PRODUTO"                         10.87 MB
.  estimated "BI_JULIO"."CMV"                               960 KB
.  estimated "BI_JULIO"."FILIAL"                            960 KB
.  estimated "BI_JULIO"."PERIODO_DIA_OWB"                   832 KB
.  estimated "BI_JULIO"."MOTIVO_CORTE"                      704 KB
.  estimated "BI_JULIO"."PERIODO_DIA"                       576 KB
.  estimated "BI_JULIO"."PRODUTO_ABCDEFG"                   576 KB
.  estimated "BI_JULIO"."MOTIVO_RETORNO"                    512 KB
.  estimated "BI_JULIO"."PERIODO"                           256 KB
.  estimated "BI_JULIO"."TIPO_LANCAMENTO"                   128 KB
.  estimated "BI_JULIO"."WB_RT_VERSION_FLAG"                 64 KB
Total estimation using BLOCKS method: 2.923 GB
Job ""DBAJCCORREA""."SYS_EXPORT_SCHEMA_02" successfully completed at 12:35:43

Vou almoçar!Fui!

Abs,

Julio Cesar Correa

Thursday, January 14, 2010

Oracle 10g - Capacity Planning for Database Objects - Oracle 10g and later - Part 2

Continuando o post anterior sobre Capacity Planning , vamos hoje fazer os cálculos para índice usando PL/SQL e ver como se faz isso via EM para índice e tabela.


Estimando tamanho do índice antes de sua criação

Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@jamaica ~]$ sqlplus dbajcc

SQL*Plus: Release 10.2.0.4.0 - Production on Wed Jan 13 21:59:31 2010
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Enter password:
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

dbajcc@OCADB on 13-JAN-10 >create table tst_index_cost as select owner,index_name,index_type from dba_indexes ;

Table created.
Elapsed: 00:00:03.29

dbajcc@OCADB on 13-JAN-10 >
dbajcc@OCADB on 13-JAN-10 >exec dbms_stats.gather_table_stats(ownname => 'DBAJCC', tabname => 'TST_INDEX_COST' , estimate_percent => 100);

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.12

dbajcc@OCADB on 13-JAN-10 >
dbajcc@OCADB on 13-JAN-10 >
dbajcc@OCADB on 13-JAN-10 >
dbajcc@OCADB on 13-JAN-10 >



declare
2
3 ub number;
4 ab number;
5
begin
6 DBMS_SPACE.CREATE_INDEX_COST ('create unique index tst_idx001 on dbajcc.tst_index_cost(owner,index_name) tablespace users_ind ',ub,ab) ;
7
DBMS_OUTPUT.PUT_LINE('Used Bytes: ' || TO_CHAR(ub));
8 DBMS_OUTPUT.PUT_LINE('Alloc Bytes: ' || TO_CHAR(ab));
9 10 end ;
11 12 / 13

Used Bytes: 64179
Alloc Bytes: 131072

PL/SQL procedure successfully completed.

Elapsed: 00:00:01.21
dbajcc@OCADB on 13-JAN-10 >

Como visto o nosso índice tst_idx001 para a tabela tst_index_cost usará 64179 bytes ou 62,7KB para dados e ocupará 131072 bytes ou 128 KB dentro da tablespace users_ind .



Oks?!

Estimando tamanho do índice via EM


No EM é muito simples também :




























Dentro da seção acima seguir acessando a tab SCHEMA ,dentro de SCHEMA procurar por INDEXES :




















Agora vamos fazer o mesmo que fizemos usando PL/SQL para estimar o tamanho do Index tst_idx001 :

Observe o passo-a-passo de cada tela :
























Voltando a tab "General" usar o botão bem sugestivo "Estimate Index Size" :






















Vamos ver o que foi gerado :

















Podem ver que é o mesmo resultado da etapa anterior usando o bloco PL/SQL 62,67KB ou 62,7KB .

Para estimar o tamanho de uma tabela é tão simples como fazer paara índices :

- preencha as informações na tab TABLES dentro da seção SCHEMA e acesse o botão "Estimate table size" .

Não vou colocar o exemplo para não ficar extenso demais.

É isso.

Julio Cesar Correa


Solucionando a falha do dbstart e dbshut : " ORACLE_HOME_LISTNER is not SET, unable to auto-stop Oracle Net Listener "

Uma dica que já deveria ter postado é como solucionar o problema do dbstart e do dbshut quando ocorre o erro : ORACLE_HOME_LISTNER is not SET, unable to auto-stop Oracle Net Listener .




Partindo de que o /etc/oratab já está Ok e com a opção "Y" edite os arquivos $ORACLE/bin/dbstart e $ORACLE/bin/dbshut com o editor vi e procure logo no começo do arquivo pela entrada :




# The this to bring down Oracle Net Listener


ORACLE_HOME_LISTNER=$1




No lugar de $1 altere para $ORACLE_HOME ,com isto a entrada ficará assim :




# The this to bring down Oracle Net Listener


ORACLE_HOME_LISTNER=$ORACLE_HOME




Obs.Tenha a sua variável $ORACLE_HOME no seu arquivo .profile/.bash_profile ou terá que colocar manualmente no shell na hora da execução.


Teste novamente os scripts .

Espero que este post seja útil.

Julio Cesar Correa


Wednesday, January 13, 2010

Oracle 10g - Capacity Planning for Database Objects - Oracle 10g and later - Part 1

Introdução
Segundo a documentação da Oracle existe duas formas de fazer o "Capacity Planning" usando o próprio Oracle Database :

- Usando a package DBMS_SPACE via código PL/SQL ou
- EM Database Control ou Grid Control

Na própria documentação do Oracle 10g ou 11g temos  exemplos de como fazer isso.

Vamos abordar primeiro via PL/SQL no Oracle 10gr2 - 10.2.0.4 .

É possível estimar tamanho para Tabela e Índice mas para ser prático faremos somente de tabelas,que é normalmente onde se concentrará os esforços para estimar tamanho de schemas e de banco de dados que residirão nos tablespaces.Isto facilitará a organização nos tablespaces e arquivos de dados.

Estimativa para tabelas

Vamos usar um exemplo de uma tabela de pedidos com 7.000 pedidos diários.
A nossa tabela MY_ORDERS(qualquer semelhança é mera coincidência) tem a seguinte estrutura :


 ORDER_ID     NOT NULL NUMBER(12)
 ORDER_DATE   NOT NULL TIMESTAMP(6) WITH LOCAL TIME ZONE
 ORDER_MODE   VARCHAR2(8)
 CUSTOMER_ID  NOT NULL NUMBER(6)
 ORDER_STATUS NUMBER(2)
 ORDER_TOTAL  NUMBER(8,2)
 SALES_REP_ID NUMBER(6)
 PROMOTION_ID NUMBER(6)

Abaixo o resultado para o nosso teste :




























Podemos ver na imagem acima que esta tabela crescerá  303104 bytes por dia segundo a média de pedidos/dia e considerando  que este numero de pedidos diários não mudará teremos 8,67MB ou 9MB por mês a mais em dados.O tamanho total ocupado pela nossa tabela ORDERS na tablespace será de 327680 bytes inicialmente ou 320 KB .Relativamente pequeno.Mas se olharmos para um modelos de dados digamos que de médio porte veremos que fica mais trabalhoso fazer as estimativas para um determinado banco de dados.

No próximo exemplo faremos a estimativa de índices usando PL/SQL  e estimativa de tabela e índice usando EM.

Abs,

Julio Cesar Correa


1Z0-047 - SQL Expert - ALTER TABLE SET UNUSED

Nos estudos deste exame notei que caiu várias questões sobre o assunto do comando ALTER TABLE com a opção SET UNSED.Outra dica é estudar além do óbivio.Como assim além do óbivio?Pois bem  percebo que nos exames é que as questões não visam somente avaliar se conhecemos o básicos como comandos,mas sim o que eles fazem além daquilo,se tem volta,o causam,o que é possívem reverter o que não é,existe outra forma de fazer tal coisa?É isso que percebi que eles exigem.

Pensando nisso vou escrever posts relacionados ao com as questões mais intrigantes do exame e fazer a prova prática que pro sinal é o mais interessante.

Vamos ao que interessa :


--Cria tabela com constraint CHECK em uma das colunas

[oracle@jamaica ~]$ sqlplus dbajcc

SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jan 12 07:16:32 2010

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

Enter password:

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


dbajcc@OCADB on 12-JAN-10 >create table tst_column_unused (col1 number,col2 varchar2(40),col3 number(3)
constraint check_col3 check (col3 > 4)) ;
  2
-- insere dados na tabela tst_column_unused
insert into tst_column_unused select 1,'primeira linha',6 from dual ;

insert into tst_column_unused select 1,'segunda linha',7 from dual;


-- Cria tabela com campo LONG

create table tst_column_unused2(col1 number,col2 long,col3 number(2)) ;

--insere dados na tabela tst_column_unused2

insert into tst_column_unused2 values(1,'texto muito longo',1) ;

commit ;
Table created.

Elapsed: 00:00:00.06
dbajcc@OCADB on 12-JAN-10 >dbajcc@OCADB on 12-JAN-10 >dbajcc@OCADB on 12-JAN-10 >
1 row created.

Elapsed: 00:00:00.02
dbajcc@OCADB on 12-JAN-10 >dbajcc@OCADB on 12-JAN-10 >
1 row created.

Elapsed: 00:00:00.01
dbajcc@OCADB on 12-JAN-10 >dbajcc@OCADB on 12-JAN-10 >dbajcc@OCADB on 12-JAN-10 >dbajcc@OCADB on 12-JAN-10 >dbajcc@OCADB on 12-JAN-10 >
Table created.

Elapsed: 00:00:00.04
dbajcc@OCADB on 12-JAN-10 >dbajcc@OCADB on 12-JAN-10 >dbajcc@OCADB on 12-JAN-10 >dbajcc@OCADB on 12-JAN-10 >
1 row created.

Elapsed: 00:00:00.02
dbajcc@OCADB on 12-JAN-10 >dbajcc@OCADB on 12-JAN-10 >

Commit complete.

Elapsed: 00:00:00.01
dbajcc@OCADB on 12-JAN-10 >



Após o SET  UNUSED :

1) Quando você faz um SET UNUSED em uma columa não existe a opção SET USED,como é um DDL so sorry.Você também não consegue mais visualizá-la com o comando DESCRIBE

2)Depois de executar SET UNUSED os dados continuam lá na coluna porém inacessível até você executar um DROP.O espaço utilizado pela coluna na tabela também não é liberado até o DROP COLUMN.

3)Você consegue criar uma coluna com o mesmo nome da anterior exceto se a coluna que está com o SET UNUSED for do tipo LONG


dbajcc@OCADB on 12-JAN-10 >select * from tst_column_unused ;

      COL1 COL2                                           COL3
---------- ---------------------------------------- ----------
         1 primeira linha                                    6
         1 segunda linha                                     7

Elapsed: 00:00:00.02


dbajcc@OCADB on 12-JAN-10 >select constraint_name,constraint_type ,table_name,status
from user_constraints
where table_name = upper('tst_column_unused') ;  2    3

CONSTRAINT_NAME                C TABLE_NAME                     STATUS
------------------------------ - ------------------------------ --------
CHECK_COL3                     C TST_COLUMN_UNUSED              ENABLED

Elapsed: 00:00:00.01


dbajcc@OCADB on 12-JAN-10 >select * from tst_column_unused2;

      COL1 COL2                                                                                   COL3
---------- -------------------------------------------------------------------------------- ----------
         1 texto muito longo                                                                         1

Elapsed: 00:00:00.03
dbajcc@OCADB on 12-JAN-10 >

Vamos colocar a columa col3 da tabela tst_column_unused como UNUSED :

dbajcc@OCADB on 12-JAN-10 >alter table tst_column_unused set unused column col3 ;

Table altered.

Elapsed: 00:00:00.29
dbajcc@OCADB on 12-JAN-10 >

Neste momento a coluna está pronta para DROP.O DROP também se torna mais rápido que se fossemos executar o DROP diretamente.

Vamos executar um DESCRIBE

dbajcc@OCADB on 12-JAN-10 >describe tst_column_unused ;
 Name                                                                                                                                                               Null?     Type
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- --------------------------------------------------------------------------------------------------------------------
 COL1                                                                                                                                                        NUMBER
 COL2                                                                                                                                                        VARCHAR2(40)

Como visto ela não está mais disponível.

Vamos ver a constraint que tinhamos nesta coluna :

dbajcc@OCADB on 12-JAN-10 >select constraint_name,constraint_type ,table_name,status
from user_constraints
where table_name = upper('tst_column_unused') ;  2    3

no rows selected

Elapsed: 00:00:00.01
dbajcc@OCADB on 12-JAN-10 >

Nervoso hein?

Vamos criar uma coluna com o mesmo nome :

dbajcc@OCADB on 12-JAN-10 >alter table tst_column_unused add  col3 number(3) ;

Table altered.

Elapsed: 00:00:00.02

Agora vamos fazer o DROP da coluna que está com SET UNUSED :

dbajcc@OCADB on 12-JAN-10 >select * from user_unused_col_tabs ;

TABLE_NAME                          COUNT
------------------------------ ----------
TESTE_DEL                               1
TST_COLUMN_UNUSED                       1

Elapsed: 00:00:00.02

Temos duas tabelas entre elas a que estamos fazendo o teste.

dbajcc@OCADB on 12-JAN-10 >alter table tst_column_unused drop unused columns ;

Table altered.

Elapsed: 00:00:00.62
dbajcc@OCADB on 12-JAN-10 >

dbajcc@OCADB on 12-JAN-10 >select * from user_unused_col_tabs ;

TABLE_NAME                          COUNT
------------------------------ ----------
TESTE_DEL                               1

Elapsed: 00:00:00.01
dbajcc@OCADB on 12-JAN-10 >

 Ok.

Outra coisa interessante é sobre as tabelas com  colunas com datatype LONG  que depois de ter marcado ela como UNUSED você não consegue adicionar outra coluna no lugar dela.


dbajcc@OCADB on 12-JAN-10 >alter table tst_column_unused2 set unused column col2;

Table altered.

Elapsed: 00:00:00.31
dbajcc@OCADB on 12-JAN-10 >select * from user_unused_col_tabs ;

TABLE_NAME                          COUNT
------------------------------ ----------
TESTE_DEL                               1
TST_COLUMN_UNUSED2                      1

Elapsed: 00:00:00.07
dbajcc@OCADB on 12-JAN-10 >alter table tst_column_unused2 add col4 long ;
alter table tst_column_unused2 add col4 long
                                   *
ERROR at line 1:
ORA-01754: a table may contain only one column of type LONG


Elapsed: 00:00:00.01

dbajcc@OCADB on 12-JAN-10 >alter table tst_column_unused2 drop unused columns ;

Table altered.

Elapsed: 00:00:00.26

dbajcc@OCADB on 12-JAN-10 >select * from user_unused_col_tabs ;

TABLE_NAME                          COUNT
------------------------------ ----------
TESTE_DEL                               1

Elapsed: 00:00:00.01

dbajcc@OCADB on 12-JAN-10 >drop table tst_column_unused ;

Table dropped.

Elapsed: 00:00:00.17
dbajcc@OCADB on 12-JAN-10 >drop table tst_column_unused2 ;

Table dropped.

Elapsed: 00:00:00.04
dbajcc@OCADB on 12-JAN-10 >

Encontrei muitas questões nos simulados sobre SET UNSED,porém particularmente eu não gosto muito desta opção!

Abs,

Julio Cesar Correa




Tuesday, January 12, 2010

Abreviando comandos no Linux - Alias

Uma opção bem legal para quem ainda não conhece são o uso de aliases no Linux.

Usando alias temos a possibilidade de reduzir enormemente o numero de comandos que digitamos no shell bem como o tempo de acesso a determinado arquivo ou diretório.

Ex. Os comandos como ls,cd rm sao abreviações de comandos maiores!!

Para mim o uso é bem aproveitado quando usamos ou acessamos determinados diretorio,variaveis de ambiente muitas vezes ao dia ou durante a nossa semana de trabalho.

No meu caso como não sou especialista em Linux todas as funções que uso são normalmente para me auxiliar na administração de banco de dados Oracle ou em casa usando o Ubuntu,com estou fazendo agora!!

Faço o  seguinte para criar alias :

Edito o meu arquivo .bash_profile que fica na home do meu usuário para que toda vez que entre no shell possa acessá-los.

Vamos a um exemplo .Digamos que eu fosse acessar meu diretório Documents desta forma :

je@ubuntu:~$ ls

Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos

je@ubuntu:~$ cd Documents/

je@ubuntu:~/Documents$ ls

je@ubuntu:~/Documents$ pwd

/home/je/Documents

je@ubuntu:~/Documents$

Neste caso poderia criar o alias mydoc assim :

alias mydoc ='cd /home/je/Documents'

Depois coloco este código dentro do meu .bashrc,.bash_profile ou o .profile usando o editor vi por exemplo.

ex.

vi /home/je/.bashrc
...
je@ubuntu:~$ more .bashrc
...
alias mydoc='cd /home/je/Documents'
...

je@ubuntu:~$

Abrindo um novo shell já posso acessar desta forma :

je@ubuntu:~/Documents$ pwd

/home/je/Documents

je@ubuntu:~/Documents$

Para navegar entre as Homes do Oracle é show de bola!

Essa é a dica!


Abs,


Julio Cesar Correa

Monday, January 11, 2010

Object Tables - Exemplos usando Oracle 10gR2(10.2.0.4)

Alguém já usou object tables no Oracle?

Vou mostrar alguns exemplos  usando Oracle 10g.

Object table nada mais é que uma tabela criada com base em um tipo definido pelo usuário ou user-defined types um conceito bem conhecido das famosas Classes em Orientação a Objetos popular OO.

Desde a versão 8 do Oracle é possível trabalhar com OO nos códigos PL/SQL e armazenamento dentro do banco de dados.Da versão 8 até a versão atual 11g estas características foram melhoradas.Podemos trabalhar com conceito de classe,atributos e métodos bem como herança ,funções e contrutores dentre outras.

Uma vez definido um TYPE podemos utilizá-los de várias formas e  entre elas a de criar tabelas com base em tipos.

Criando um object type :

dbajcc@OCADB on 11-JAN-10 >create type t_dbf as object(file_name varchar2(50),tablespace_name varchar2(30));
  2  /
Type created.
Elapsed: 00:00:00.38


Criando uma object table :

dbajcc@OCADB on 11-JAN-10 >create table tst_dbf_obj of t_dbf ;
Table created.
Elapsed: 00:00:00.70

Inserindo dados em uma object table :

dbajcc@OCADB on 11-JAN-10 >insert into tst_dbf_obj select file_name,tablespace_name from dba_data_files ;
6 rows created.
Elapsed: 00:00:00.04

dbajcc@OCADB on 11-JAN-10 >commit;
Commit complete.
Elapsed: 00:00:00.02



dbajcc@OCADB on 11-JAN-10 >select * from tst_dbf_obj ;

FILE_NAME                                          TABLESPACE_NAME
-------------------------------------------------- ---------------
+DATA/ocadb/datafile/users.263.703360157           USERS
+DATA/ocadb/datafile/sysaux.259.703360021          SYSAUX
+DATA/ocadb/datafile/undotbs1.260.703360021        UNDOTBS1
+DATA/ocadb/datafile/system.257.703360021          SYSTEM
+DATA/ocadb/datafile/example.261.703360021         EXAMPLE
+DATA/ocadb/datafile/teste_rename.262.703360117    TESTE_RENAME

6 rows selected.
Elapsed: 00:00:00.01

Também é possível criar constraints em object tables tais como Primary Keys (PK's) e Check constraints .

No exemplo abaixo vamos criar uma object table com uma coluna identificadora :

dbajcc@OCADB on 11-JAN-10 >create type t_automovel as object (id number(2),nome varchar2(10),marca varchar2(15));
  2  /
Type created.
Elapsed: 00:00:00.05
 
dbajcc@OCADB on 11-JAN-10 >
dbajcc@OCADB on 11-JAN-10 >create table frota_taxi of t_automovel (id PRIMARY KEY)
  2  object identifier is primary key ;
Table created.
Elapsed: 00:00:00.13
dbajcc@OCADB on 11-JAN-10 >

Você NÃO PODE excluir um TYPE caso exista um outro objeto definido com base nele :

dbajcc@OCADB on 11-JAN-10 >drop type t_automovel ;
drop type t_automovel
*
ERROR at line 1:
ORA-02303: cannot drop or replace a type with type or table dependents
Elapsed: 00:00:00.02

Pirmeiro excluímos os dependentes e depois  eliminamos  o tipo:

dbajcc@OCADB on 11-JAN-10 >drop table frota_taxi ;
Table dropped.
Elapsed: 00:00:00.81
dbajcc@OCADB on 11-JAN-10 >drop type t_automovel ;
Type dropped.
Elapsed: 00:00:00.58
dbajcc@OCADB on 11-JAN-10 >

Podemos fazer o uso das object tables que possuem colunas que também  são objetc types   :

dbajcc@OCADB on 11-JAN-10 >create type t_bolas_sena
as object (first number(2),second number(2),third number(2),
           fourth number(2),fifth number(2),sixth number(2)) ;
/  2    3    4
Type created.
Elapsed: 00:00:00.06
dbajcc@OCADB on 11-JAN-10 >
--criar um objeto com os atributos de um resultado de jogo da mega sena
 
dbajcc@OCADB on 11-JAN-10
create type t_resultado_sena
as object( concurso number(4),
           local_sorteio varchar2(50),
            bolas_sena  t_bolas_sena ) ;
/dbajcc@OCADB on 11-JAN-10 >dbajcc@OCADB on 11-JAN-10 >  2    3    4    5
Type created.
Elapsed: 00:00:00.05
dbajcc@OCADB on 11-JAN-10 >
 
--criação de uma object table que armazena o type  t_resultado_sena
 
dbajcc@OCADB on 11-JAN-10 >
create table tb_resultado_sena of t_resultado_sena ;
/dbajcc@OCADB on 11-JAN-10 >dbajcc@OCADB on 11-JAN-10 >
Table created.
Elapsed: 00:00:00.05

dbajcc@OCADB on 11-JAN-10 >insert into  tb_resultado_sena
values(t_resultado_sena(1141,
                       'TRAMANDAI/RS',
           t_bolas_sena(09,37,40,50,58,60)
                           )
           ) ;  2    3    4    5    6
1 row created.
Elapsed: 00:00:00.01
 
dbajcc@OCADB on 11-JAN-10 >insert into  tb_resultado_sena
(concurso,local_sorteio,bolas_sena)
values(1142,'PENEDO/AL',
           t_bolas_sena(03,15,26,28,31,58)
      ) ;  2    3    4    5
1 row created.
Elapsed: 00:00:00.00
 
 
dbajcc@OCADB on 11-JAN-10 >
dbajcc@OCADB on 11-JAN-10 >commit ;
Commit complete.
Elapsed: 00:00:00.01
dbajcc@OCADB on 11-JAN-10 >

dbajcc@OCADB on 11-JAN-10 >select * from tb_resultado_sena tbs where tbs.concurso = 1142 ;
  CONCURSO LOCAL_SORTEIO
---------- --------------------------------------------------
BOLAS_SENA(FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      1142 PENEDO/AL
T_BOLAS_SENA(3, 15, 26, 28, 31, 58)
Elapsed: 00:00:00.03

dbajcc@OCADB on 11-JAN-10 >select * from tb_resultado_sena ;

  CONCURSO LOCAL_SORTEIO
---------- --------------------------------------------------
BOLAS_SENA(FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      1141 TRAMANDAI/RS
T_BOLAS_SENA(9, 37, 40, 50, 58, 60)

      1142 PENEDO/AL
T_BOLAS_SENA(3, 15, 26, 28, 31, 58)
Elapsed: 00:00:00.02

Dúvidas ou sugestões ?Poste o seus comentários!

Abs,

Julio Cesar Correa

Friday, January 08, 2010

Instalação do Oracle EM Grid Control 10.2.0.5 em Linux x86 – Part 3

Instalação do Agent 10.2.0.5 em  Linux x86
Software para download  em :
http://www.oracle.com/technology/software/products/oem/htdocs/agentsoft.html
Documentação de instalação :
http://www.oracle.com/technology/software/products/oem/files/agent-files/32-bit/linux-32-10.2.0.5.-instructions.txt
Configurando o etc/hosts
Configurar o etc/hosts para o servidor target poder enchergar o Grid Control server.
[oracle@jamaica oracle]$ more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
192.168.79.130  jamaica jamaica
127.0.0.1       localhost.localdomain   localhost
192.168.79.134  suecia  suecia
[oracle@jamaica oracle]$
Teste de conectividade :
[root@jamaica ~]# ping suecia
PING suecia (192.168.79.134) 56(84) bytes of data.
64 bytes from suecia (192.168.79.134): icmp_seq=1 ttl=64 time=15.9 ms
64 bytes from suecia (192.168.79.134): icmp_seq=2 ttl=64 time=0.178 ms
64 bytes from suecia (192.168.79.134): icmp_seq=3 ttl=64 time=0.075 ms
64 bytes from suecia (192.168.79.134): icmp_seq=4 ttl=64 time=0.164 ms
Desbloqueando a conta DBSNMP do banco de dados target
[oracle@jamaica oracle]$ sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jan 8 06:27:20 2010
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
sys@OCADB on 08-JAN-10 >set lines 300 pages 1000 timing on serveroutput on
sys@OCADB on 08-JAN-10 >select username,account_status from dba_users where username='DBSNMP';
USERNAME                       ACCOUNT_STATUS
------------------------------ --------------------------------
DBSNMP                         OPEN
Elapsed: 00:00:00.19
sys@OCADB on 08-JAN-10 >alter user DBSNMP identified by DBSNMP;
User altered.
Elapsed: 00:00:00.22
sys@OCADB on 08-JAN-10 >
No caso o meu já estava desbloqueado,mas caso não estivesse era só adicionar as palavras-chave account unlock no alter user .
Na máquina target tenho um banco de dados com o SID ocadb,uma instância ASM e o Listener :
[oracle@jamaica sw]$ ps -ef|grep pmon
oracle    3277     1  0 06:18 ?        00:00:00 asm_pmon_+ASM
oracle    3457     1  0 06:22 ?        00:00:00 ora_pmon_ocadb
oracle    3731  3241  0 06:42 pts/1    00:00:00 grep pmon
[oracle@jamaica sw]$ ps -ef|grep tns
oracle    3538     1  0 06:23 ?        00:00:00 /u01/app/oracle/product/10.2.0/bin/tnslsnr LISTENER -inherit
oracle    3733  3241  0 06:42 pts/1    00:00:00 grep tns
[oracle@jamaica sw]$
Descompactação do software
Fiz um unzip do arquivo Linux_Grid_Control_agent_download_10_2_0_5_0.zip e os arquivos estraídos foram :
[oracle@jamaica sw]$ ls -l
total 368008
-rwxrwxr-x 1 oracle oinstall      1874 Jun 22  2007 agentdeployroot.sh
-rwxrwxr-x 1 oracle oinstall     23372 Sep 29  2008 agent_download.rsp.bak
-rwxrwxr-x 1 oracle oinstall      9532 Feb 23  2009 instructions.txt
drwxrwxr-x 8 oracle oinstall      4096 Feb 20  2009 linux
-rw-r--r-- 1 oracle oinstall 376420365 Jan  7 18:11 Linux_Grid_Control_agent_download_10_2_0_5_0.zip
[oracle@jamaica sw]$
Instalação do Management Agent 10.2.0.5
Localização dos arquivos depois da descompactação :
[oracle@jamaica agent]$ pwd
/u02/sw/linux/agent
[oracle@jamaica agent]$ ls -l
total 16
drwxrwxr-x  5 oracle oinstall 4096 Feb 20  2009 install
-rwxrwxr-x  1 oracle oinstall 5281 Dec 18  2008 runInstaller
drwxrwxr-x 11 oracle oinstall 4096 Feb 20  2009 stage
[oracle@jamaica agent]$
Executando o runInstaller :
  Additional Management Agent

Escolha da home do Agent :








Executar o script roor.sh  :
[root@jamaica ~]# /u02/app/agent10g/root.sh
Running Oracle10 root.sh script...
The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /u02/app/agent10g
Enter the full pathname of the local bin directory: [/usr/local/bin]:
The file "dbhome" already exists in /usr/local/bin.  Overwrite it? (y/n)
[n]: y
   Copying dbhome to /usr/local/bin ...
The file "oraenv" already exists in /usr/local/bin.  Overwrite it? (y/n)
[n]: y
   Copying oraenv to /usr/local/bin ...
The file "coraenv" already exists in /usr/local/bin.  Overwrite it? (y/n)
[n]: y
   Copying coraenv to /usr/local/bin ...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
Finished product-specific root actions.
[root@jamaica ~]#
No OUI :


A instalação dos binários ocorreu sem problemas , mas ainda vamos verificar se realmente está funcionando  corretamente!
[oracle@jamaica bin]$ ./emctl status agent
Oracle Enterprise Manager 10g Release 5 Grid Control 10.2.0.5.0.
Copyright (c) 1996, 2009 Oracle Corporation.  All rights reserved.
---------------------------------------------------------------
Agent Version     : 10.2.0.5.0
OMS Version       : 10.2.0.5.0
Protocol Version  : 10.2.0.5.0
Agent Home        : /u02/app/agent10g
Agent binaries    : /u02/app/agent10g
Agent Process ID  : 11513
Parent Process ID : 11488
Agent URL         : https://jamaica.riversideti.com.br:3872/emd/main/
Repository URL    : https://suecia:1159/em/upload
Started at        : 2010-01-08 07:01:42
Started by user   : oracle
Last Reload       : 2010-01-08 07:01:42
Last successful upload                       : 2010-01-08 07:02:51
Total Megabytes of XML files uploaded so far :     9.50
Number of XML files pending upload           :        0
Size of XML files pending upload(MB)         :     0.00
Available disk space on upload filesystem    :    19.41%
Last successful heartbeat to OMS             : 2010-01-08 07:02:50
---------------------------------------------------------------
Agent is Running and Ready
[oracle@jamaica bin]$ ./emctl status agent
Oracle Enterprise Manager 10g Release 5 Grid Control 10.2.0.5.0.
Copyright (c) 1996, 2009 Oracle Corporation.  All rights reserved.
---------------------------------------------------------------
Agent Version     : 10.2.0.5.0
OMS Version       : 10.2.0.5.0
Protocol Version  : 10.2.0.5.0
Agent Home        : /u02/app/agent10g
Agent binaries    : /u02/app/agent10g
Agent Process ID  : 11513
Parent Process ID : 11488
Agent URL         : https://jamaica.riversideti.com.br:3872/emd/main/
Repository URL    : https://suecia:1159/em/upload
Started at        : 2010-01-08 07:01:42
Started by user   : oracle
Last Reload       : 2010-01-08 07:01:42
Last successful upload                       : 2010-01-08 07:02:51
Total Megabytes of XML files uploaded so far :     9.50
Number of XML files pending upload           :        0
Size of XML files pending upload(MB)         :     0.00
Available disk space on upload filesystem    :    19.41%
Last successful heartbeat to OMS             : 2010-01-08 07:02:50
---------------------------------------------------------------
Agent is Running and Ready
[oracle@jamaica bin]$
[oracle@jamaica bin]$
[oracle@jamaica bin]$
[oracle@jamaica bin]$ ./emctl upload
Oracle Enterprise Manager 10g Release 5 Grid Control 10.2.0.5.0.
Copyright (c) 1996, 2009 Oracle Corporation.  All rights reserved.
---------------------------------------------------------------
EMD upload completed successfully
[oracle@jamaica bin]$
[oracle@jamaica bin]$
Ele parece estar se comunicando com o OMS no Grid Server .
Obs :
Caso ele não mostre a frase “EMD upload completed successfully”,temos algum problema na comunicação entre o Management Agent e o OMS.
No Metalink existem algumas notas a respeito do assunto.Use a mensagem de erro  para encontrar a melhor solução do problema.Também faça a procura em blogs e sites de profissionais Oracle que você provavelmente vai encontrar soluções para estes erros.
Algumas notas :
283091.1
787551.1
604495.1
Vamos ver no console de gerenciamento do Grid .
Podemos ver que na aba Targets ele já adicionou o host JAMAICA onde fizemos a instalação do Mnagement Agent .

Clicando no Hots Jamaica entramos em outra tela do Grid,onde mostra algumas abas/menus :

Na aba Targets dentro do Host Jamaica temos os alvos a serem monitorados :

Vamos ver umas das telas de monitoramento do banco de dados ocadb :


Obs.Caso receba mensagem de erro como esta abaixo :

Provavelmente o Grid Server não consegue ter conectividade até o target,portanto verifique o /etc/hosts do Grid e add o IP e Hostname do servidor target.
Continuando...

Acima a área de gerenciamento do target.
Monitoramento da ASM instance :

Monitorando o Listener :

Bom chega ao fim este nosso how-to!
Abs,
Julio Cesar Correa