Default BIGFILE tablespace database

Olá,

Essa semana eu estava lendo a documentação do Oracle 11g para resolver um problema e me deparei com isso, “Supporting Bigfile Tablespaces During Database Creation“, e achei muito interessante. Para quem nunca ouviu falar nesse conceito, ele foi introduzido no Oracle 10g.

O bigfile tablespace foi criado para simplificar o gerenciamento de databases, nos dias atuais, não é incomum que seus databases passem da casa dos TERABYTES, e antes da Oracle introduzir o conceito de bigfile você precisaria de muitos arquivos SMALLFILES de 32Gb alocados no sistema operacional para chegar nessa casa de 1TB. E o número máximo de datafiles no Oracle 11g é de 64k, isso é um número expressivamente alto, mas ainda é um limite, então o Oracle criou essa funcionalidade para aumentar drasticamente o tamanho máximo de um Oracle database.

Atualmente os tablespaces são divididos em SMALLFILE tablespaces e BIGFILE tablespaces. Há algumas diferenças entre elas, as tablespaces criadas por default são SMALLFILES tablespaces e podem possuir vários arquivos de até 32G alocados na mesma com um limite de 1022 arquivos, já as BIGFILES tablespaces só podem possuir 1 único arquivo, mas o limite é bem maior, uma BIGFILE tablespace com blocos de 8k podem ter um datafile de até 32Terabytes de espaço, já uma bigfile tablespace com blocos de 32K pode ter um datafile de até 128TB, claro que eu não tenho storage suficiente para testar esses limites, então eu retirei essas informações da documentação oficial do produto .

Claro que, BIGFILE tablespaces foram criados para ambiente enormes de DW e DSS, onde essa limitação de datafiles é um problema, mas eles podem ser muito úteis em ambientes de testes, desenvolvimento e etc para diminuir a quantidade de trabalho necessário para gerenciamento de datafiles, tablespaces e etc.

É possível criar um database inteiro usando BIGFILE tablespaces, usando a cláusula “SET DEFAULT BIGFILE TABLESPACE” no comando CREATE DATABASE, creio que não seja possível fazer isso pelo DBCA ainda no Oracle 11g, talvez no 12c seja possível, eu irei testar isso e depois complemento o post ou faço um outro, mas eu irei demonstrar aqui como criar um database com todas as tablespaces BIGFILE, para isso usaremos o comando create database abaixo:

 

CREATE DATABASE orcl
USER SYS IDENTIFIED BY sys_password
USER SYSTEM IDENTIFIED BY system_password
   SET DEFAULT BIGFILE tablespace
LOGFILE GROUP 1 (‘/u01/app/oracle/oradata/orcl/redo01a.log’,
‘/u01/app/oracle/oradata/orcl/redo01b.log’) SIZE 100M BLOCKSIZE 512,
GROUP 2 (‘/u01/app/oracle/oradata/orcl/redo02a.log’,
‘/u01/app/oracle/oradata/orcl/redo02b.log’) SIZE 100M BLOCKSIZE 512,
GROUP 3 (‘/u01/app/oracle/oradata/orcl/redo03a.log’,
‘/u01/app/oracle/oradata/orcl/redo03b.log’) SIZE 100M BLOCKSIZE 512
MAXLOGFILES 5
MAXLOGMEMBERS 5
MAXLOGHISTORY 1
MAXDATAFILES 100
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET AL16UTF16
EXTENT MANAGEMENT LOCAL
DATAFILE ‘/u01/app/oracle/oradata/orcl/system01.dbf’ SIZE 325M REUSE
SYSAUX DATAFILE ‘/u01/app/oracle/oradata/orcl/sysaux01.dbf’ SIZE 325M REUSE
    BIGFILE DEFAULT TABLESPACE users
DATAFILE ‘/u01/app/oracle/oradata/orcl/users01.dbf’
SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
   BIGFILE DEFAULT TEMPORARY TABLESPACE tempts1
TEMPFILE ‘/u01/app/oracle/oradata/orcl/temp01.dbf’
SIZE 20M REUSE
   BIGFILE UNDO TABLESPACE undotbs
DATAFILE ‘/u01/app/oracle/oradata/orcl/undotbs01.dbf’
SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

Para criar um database com o comando create database, precisa de fazer os passos a seguir:

  1. Criar um pfile e definir os parametros necessários para subir uma instance, no Oracle 11g o único parametro mandatório é o DB_NAME, o resto o Oracle aloca com valores default, mas é uma boa prática definir alguns parametros de acordo com o seu ambiente como CONTROL_FILES, MEMORY_TARGET e outros;
  2. Depois do passo 1 realizado, você precisa subir a instance em modo nomount;
  3. Com os passos 1 e 2 prontos, você pode emitir o comando create database conforme eu fiz acima;
  4. Depois disso, você ainda precisa de mais 3 passos adicionais que irão criar o dicionário de dados e compilar os objetos, então segue a ordem a ser seguida:

    SQL> @?/rdbms/admin/catalog.sql
    SQL> @?/rdbms/admin/catproc.sql
    SQL> @?/rdbms/admin/utlrp.sql

Depois de ter executados todos os passos acima, você terá um database com todas as tablespaces BIGFILE, e ele vai ser bem mais fácil de gerenciar neste aspecto que um database cheio de pequenos datafiles alocados.

SQL> select file_name from dba_data_files;

FILE_NAME
——————————————————————————–
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf

SQL> select file_name from dba_temp_files;

FILE_NAME
——————————————————————————–
/u01/app/oracle/oradata/orcl/temp01.dbf

Há uma coluna na dba_tablespaces desde a versão 10g para essa nova funcionalidade:

SQL> select tablespace_name, bigfile from dba_tablespaces;

TABLESPACE_NAME                BIG
—————————— —
SYSTEM                         YES
SYSAUX                         YES
UNDOTBS                        YES
TEMPTS1                        YES
USERS                          YES
Notem que todos os meus tablespaces nesse database orcl estão como BIGFILE, notem que também é possível checar e mudar esse comportamente em um banco de dados já existente, vamos ver como isso funciona?

Checando a property que mostra isso:

SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME = ‘DEFAULT_TBS_TYPE’;  2

PROPERTY_VALUE
——————————————————————————–
BIGFILE

E podemos mudar esse valor para SMALLFILE:

SQL> alter database set default smallfile tablespace;

Database altered.

SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES
2  WHERE PROPERTY_NAME = ‘DEFAULT_TBS_TYPE’;

PROPERTY_VALUE
——————————————————————————–
SMALLFILE

Agora, depois do comando executado, se criarmos uma tablespace ela automaticamente será SMALLFILE:

SQL> create tablespace smtbs datafile ‘/u01/app/oracle/oradata/orcl/smtbs01.dbf’ size 2m ;

Tablespace created.

SQL> select tablespace_name, bigfile from dba_tablespaces;

TABLESPACE_NAME                BIG
—————————— —
SYSTEM                         YES
SYSAUX                         YES
UNDOTBS                        YES
TEMPTS1                        YES
USERS                          YES
SMTBS                          NO

Se retornarmos o default para BIGFILE, e fizermos a criação de uma tablespace, vejamos o que ocorre:

SQL> alter database set default bigfile tablespace;

Database altered.

SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES

2 WHERE PROPERTY_NAME = ‘DEFAULT_TBS_TYPE’;

PROPERTY_VALUE
——————————————————————————–
BIGFILE

SQL> create tablespace smtbs2 datafile ‘/u01/app/oracle/oradata/orcl/smtbs201.dbf’ size 2m;

Tablespace created.

SQL>  select tablespace_name, bigfile from dba_tablespaces;

TABLESPACE_NAME                BIG
—————————— —
SYSTEM                         YES
SYSAUX                         YES
UNDOTBS                        YES
TEMPTS1                        YES
USERS                          YES
SMTBS                          NO
SMTBS2                         YES

Creio que isso vai ajudar em muito a poupar trabalho com gerenciamento de tablespaces e datafiles em seus ambientes de bancos de dados, outra funcionalidade bem bacana para isso é o OMF (Oracle Management Files), em breve irei escrever um outro post sobre esse assunto. Espero que tenha ajudado a vocês sobre esse assunto e que essa funcionalidade os ajude em seu dia a dia como DBA.

Att,
Mufalani
@mufalani
www.mufalani.com.br

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *