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:
- 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;
- Depois do passo 1 realizado, você precisa subir a instance em modo nomount;
- Com os passos 1 e 2 prontos, você pode emitir o comando create database conforme eu fiz acima;
- 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
Amigo,
Um ponto importante a se levar em consideração ao usar bigfile e o backup. Em um sistema que temos na empresa e que usava um bigfile de 800GB, o backup levava em torno de 15 horas. Quando migrei para smallfiles e paralelizei, o backup caiu para 2 horas. Particularmente não consigo ver vantagem em usar bigfile
Isso é verdade, mas eu acho que o benefício de usar o bigfile seria mais adequado para bases de desenv e testes, ou quando o número datafiles por tablespace é muito grande (bancos enormes). Mas, concordo que usar smallfiles e paralelizar adianta muito, se usar ainda BCT o tempo de backup incremental reduzirá ainda mais.
Abraços,
Mufalani