Mostrando postagens com marcador Database. Mostrar todas as postagens
Mostrando postagens com marcador Database. Mostrar todas as postagens

segunda-feira, 19 de novembro de 2012

Oracle 12c: Pluggable Databases

Antes de mais nada, preciso dizer que a informação deste post não é 100% confiável. O que vem a seguir é uma coletânea de informações de diversas fontes: palestras do último Oracle Open World, perguntas e respostas de participantes nestas mesmas palestras, perguntas que eu mesmo fiz a especialistas nos "Demo Grounds", posts do Fórum da Oracle, artigos já publicados na internet, entre outras. Questões sobre as quais ainda não encontrei informação alguma estão na última seção: Dúvidas.

Posto isso, vamos à novidade de maior impacto no Oracle Database desde... desde... bem, desde sempre, eu acho. Trabalho com Oracle desde a versão 7.1 e não consigo me lembrar de nada tão radical. Objetos, Java, Flashback, ASM, Editions, Replay... Nada mexeu tanto com a estrutura do software como este novo sistema de Containers e Plugged Databases. RAC, talvez ? Talvez, pois RAC trouxe o cenário "N instâncias e 1 database", e esta nova feature traz algo que poderia ser interpretado como "1 instância e N databases".

Introdução: O Problema


O que o mercado chama vulgarmente de "Banco Oracle" é tipicamente uma estrutura monolítica, criada para suportar aplicações grandes, enormes ou gigantescas. Você tem uma instância, que é um conjunto de processos no sistema operacional associado a algumas áreas de memória; você tem um database, que é um conjunto de diversos arquivos em disco. Os dois juntos formam um "Oracle Server", que é o nome correto. Vou manter esse nome em inglês para que não haja confusão com a palavra "servidor", que normalmente significa hardware. Uma variação dessa estrutura é a solução de alta disponibilidade RAC (Real Application Clusters), em que temos várias instâncias para um mesmo database.

Criar um Oracle Server é uma atividade planejada, que envolve diversas decisões; o cenário mais comum em produção é ele que ocupe totalmente o hardware que o abriga, e muitos sistemas baseados em Oracle foram projetados com essa premissa. Um Oracle Server precisa ser administrado. Precisa de políticas de backup, previsão de crescimento, acompanhamento de seus logs de alerta, atualização de estatísticas, entre dezenas de outras coisas.

Para aplicações pequenas e médias, existem dois cenários comuns:

  • Criar diversos Oracle Servers no mesmo hardware (com ou sem virtualização).
  • Colocar diversas aplicações no mesmo Oracle Server, uma em cada "schema/owner/usuário".

A primeira opção cria um desperdício enorme de recursos, tanto de hardware quanto humanos. É comum ver um DBA administrando 200 Oracle Servers, o que deixa todos mal administrados. É comum uma aplicação sofrer quedas de desempenho porque outra aplicação está processando algo pesado ou fazendo backup, e é difícil apurar isso porque as ferramentas de diagnóstico tratam de Oracle Servers, elas não conseguem olhar para fora desse escopo.

A segunda opção nem sempre é viável, pois muitas aplicações foram desenhadas para ocupar seu próprio Oracle Server. Quando é viável, existe a questão da segurança: não é trivial garantir que uma aplicação não terá acesso aos dados de outra (afinal de contas, privilégios "ANY" e roles como "DBA" dão acesso a todos os schemas). É comum que o departamento ou a empresa cujos dados estão em jogo simplesmente não aceite a consolidação.

Agora vamos pensar no cenário da TI corporativa nesta segunda década do século XXI: Exadata, Consolidação, Virtualização, Nuvem. O mundo mudou e todos os sistemas têm que compartilhar recursos. Dentro de uma Exadata, sistemas grandes são automaticamente rebaixados a médios ou pequenos. Como lidar então com o desperdício de recursos ?

Pluggable Databases


Com o Oracle 12c, entram em cena os conceitos de "Container" e "Pluggable" databases, uma estrutura hierárquica de dois níveis. Um "container database" (CDB) pode ter entre 0 e 250 "filhos", que são os "pluggable databases" (PDBs). Do ponto de vista das aplicações, cada PDB é um "Oracle Server" completo, totalmente compatível com as versões anteriores.

Olhando de fora, entretanto, a coisa é bem diferente: a partir do sistema operacional, a impressão que se tem é que existe apenas uma instância. Você verá apenas um processo SMON, um PMON, um CKPT. A mesma coisa acontece com a memória: SGA e PGA são dimensionadas no CDB, para atender a ele e a todos os seus PDBs. Undo e Redo ? Também. As mesmas tablespaces de UNDO e os mesmos redo logs online atendem ao CDB e a todos os seus PDBs.

Segundo a Oracle, a economia de recursos permite um ganho de 5x ou mais em comparação com múltiplos Oracle Servers. Em outras palavras, esse mesmo hardware que hoje no 11g suporta 10 instâncias poderia suportar 50 delas no 12c. Digo "instâncias" porque esse fator se aplica obviamente aos recursos de memória. O storage ainda precisará ser cinco vezes maior.

Administração


A administração promete ser facilitada. Por exemplo, o RMAN poderá ser configurado para fazer o backup do CDB e tudo o que estiver abaixo em uma só operação, mas este backup servirá para recuperar qualquer PDB individualmente.

Outro exemplo, muito mais interessante: PDBs podem ser desplugados de um container e plugados em outro container !!! Isso facilitará a migração de databases para outra plataforma, para outro hardware e mesmo para novas versões. Imagino o que processo de upgrade para o 12cR2 será assim: instalar o novo software, criar um novo container e então trazer cada um de seus PDBs para plugar neste novo container.

Cópias de databases também serão mais simples. Veja como fica este cenário típico na vida de qualquer DBA: existe um Oracle Server chamado "app01", onde roda uma aplicação específica. A equipe de QA precisa de uma cópia por alguns dias, para fazer testes de uma nova funcionalidade. Hoje em dia precisamos criar um novo server "app02" e utilizar RMAN ou "data pump" para levar os dados de um para outro. Se "app01" fosse um PDB, o processo seria assim: conectado ao container, executar:

alter pluggable database app01 close;

alter pluggable database app01 open read only;

create pluggable database app02 from app01 
file_name_convert = ('/app01', '/app02');

alter pluggable database app02 open;

Feito. Tablespaces da aplicação, tabelas, objetos, roles, usuários, diretórios e tudo mais foram copiados e estão prontos para o uso. A cláusula "file_name_convert" faz a tradução dos caminhos dos datafiles; se os originais estavam em "/u04/oradata/app01" os novos estarão em "/u04/oradata/app02".

Outros Detalhes


Sistema de Arquivos


Na instalação default, os datafiles dos PDBs ficam em diretórios abaixo de seu CDB:

CDB1: /u04/oracle/oradata/cdb1/system01.dbf
PDB1: /u04/oracle/oradata/cdb1/pdb1/system01.dbf
PDB2: /u04/oracle/oradata/cdb1/pdb2/system01.dbf 
PDB3: /u04/oracle/oradata/cdb1/pdb3/system01.dbf 

Processos de Background


Como já vimos, os processos tradicionais no sistema operacional (pmon, smon, ckpt) aparentam ser todos do CDB. É muito provável que tenhamos novos processos para cuidar de aspectos que esta nova dimensão apresenta.

Segurança


Os privilégios dentro de um PDB se aplicam somente a este PDB. Aparentemente, o privilégio de SYSDBA em um CDB dá poder total sobre os PDBs. Podemos esperar novos privilégios, mais restritivos, no nível do container.

Dúvidas

  • Como serão divididos os recursos ? Será que teremos um novo Resource Manager que permita distribuir a carga entre os PDBs ?
  • Como ficam os parâmetros ? Se existe apenas um conjunto de processos, é razoável supor que haverá parâmetros que não podem ser alterados nos PDBs e assumem o valor de seu container ? Mais ainda, será que teremos parâmetros que só existem em CDBs ou em PDBs ?
  • Será que o padrão será deixar o Container Database vazio, sem dados de nenhuma aplicação ?
  • Como será o RAC 12c ? Clusters de CDBs, de PDBs ou ambos ?

Veja Também:

terça-feira, 9 de outubro de 2012

Novas Features do Oracle 12c

Estive na última quinta-feira na famosa palestra que Tom Kyte (asktom.oracle.com) faz a cada lançamento de versão do banco de dados Oracle ("My X favorite things about Oracle X"), agora na versão 12c. Foi uma apresentação bem corrida, mas reproduzo aqui as novidades que achei mais interessantes. Deixo de fora a maior de todas elas, "Pluggable Databases", que terá um post exclusivo no futuro.

Adaptive Execution Plans


Hoje em dia, o plano de execução de um SQL qualquer é definido antes da execução, com base nas estatísticas. Se estas estiverem desatualizadas ou erradas, um plano de execução ruim será gerado, e a execução consumirá mais recursos do que o necessário.

No Oracle 12c, o otimizador será capaz de detectar más escolhas durante a execução, e mudar o plano ao invés de insistir no erro. Se, por exemplo, as estatísticas indicavam que a tabela EMP tinha 10 registros mas na hora da execução ele perceber que eram 10 milhões, ele poderá decidir mudar a operação de NESTED LOOPS para um HASH JOIN.

Sim, eu sei o que você está pensando: e quando houver um problema de desempenho, como eu vou saber qual foi o plano utilizado ? Essa informação sairá apenas em traces, então vamos torcer para que o otimizador decida corretamente.

Enhanced Statistics


Diversas melhorias relacionadas à coleta e utilização de estatísticas:

  • A coleta dinâmica (dynamic sampling) agora pode ser configurada com o valor 11, o que faz com que a coleta seja persisitida no banco. Não ficou claro se essa persistência será no mesmo local das estatísticas tradicionais, coletadas com DBMS_STATS.
  • Temos agora um novo tipo de histograma (hybrid) que é utilizado automaticamente em colunas com mais de 254 valores distintos.
  • Estatísticas agora serão coletadas automaticamente durante cargas de dados.
  • Para tabelas temporárias (Global Temporary Tables) as estatísticas serão privadas para cada sessão de usuário.

Top-N and Pagination Queries


Agora será possível em Oracle solicitar diretamente em SQL "os primeiros 10 registros" ou "os próximos 20 registros" sem necessidade do velho truque "subselect + order by + rownum".

Improved Defaults


Temos diversas melhorias relacionadas a valores default:

  • Default to Sequence: o valor default agora pode ser o NEXTVAL de uma sequence.
  • Default to Null Inserted: este valor default será utilizado mesmo que seja especificado NULL durante o insert. 
  • Metadata Defaults: a adição de uma nova coluna com um valor default passa a ser instantânea, para qualquer tamanho de tabela.

Temporary Undo


Hoje, por estranho que possa parecer, operações temporárias geram REDO. Isso é porque elas precisam gerar UNDO para fins de recovery, e essa geração de UNDO gera REDO. Na versão 12c, o parâmetro TEMP_UNDO_ENABLED faz com que a geração de UNDO das operações temporárias seja também uma operação temporária, eliminando a geração de REDO. Isso deve causar melhorias espontâneas de desempenho em diversas aplicações pelo mundo afora.

Increased Limits for Varchar


O limite de tamanho para colunas VARCHAR2, NVARCHAR2 ou RAW agora é de 32K. Este já era o tamanho permitido para os tipos de dado homônimos em PL/SQL.