quarta-feira, 19 de outubro de 2016

COMO CRIAR UM ORACLE STANDBY MANUAL NO WINDOWS

Criar um banco de dados para servir de standby é uma tarefa que parece ser simples, mas pode se tornar muito complexa. Me lembro como se fosse hoje, quando criei meu primeiro stadby manual, a complexidade maior foi em querer realizar a atividade com os conceitos não muito formulados  na minha cabeça, muito bem observado pelo excelente DBA Oracle do Dataprev, Daniel Vidal. É preciso entender algumas coisas, preliminarmente: 

1) Quando o banco sobe em nomount, ele só lê o parâmetro init.ora, determinando o tamanho da SGA, criando e iniciando os processos de background;

2) Quando o banco sobe em mount, ele lê o control file, momento em que os endereços dos data files e dos redo log files são lidos;

3) Para o banco conseguir subir em open, e no caso do stand by, em open read only, é preciso que os arquivos referenciados no arquivo de controle sejam encontrados (SNC), pois basta que um não seja para o banco stand by estar fora de sincronia com o banco de produção (primário). Neste caso o banco não abre;

4) Restore (restaurar) é copiar os data files de volta pro seu local de origem;

5) Recover (recuperar) é refazer todas as alterações feitas no arquivo restaurado, desde o momento do backup.

6) O banco standby precisa ter o mesmo nome que o banco primário, pois o banco standby não sabe que é uma replicação, ele entende que é um banco comum, que aplicará archives.




Servidor Primário:

É preciso criar um script de contingência ‘copia_primario_standby.bat’, indicando o caminho da pasta do servidor standby, onde serão salvos os archives, pois o oracle irá buscar esse caminho para fazer o recover. Por exemplo:  ‘C:\oracle11g\oradata\arch\nome_do_banco\archivelog’.



Servidor Standby:

É no Servidor Standby, que deve rodar o script que irá conectar ao Servidor Primário, para verificar a última sequência de archive que foi aplicado em produção para atualizar o banco de standby.


Criação do standby

 Para criar o standby é preciso realizar os seguintes procedimentos:

1) Realizar um backup database no banco primário;

rman target /

RMAN> backup database;;

2) Copiar os arquivos .bkp, no servidor primário, para uma pasta no servidor standby.

3) Restaurar o control file para que ele saiba o caminho dos data files e dos redo log files, lembrando que para isso o banco precisa estar no modo nomount.

RMAN> rman target /

RMAN> startup nomount;

RMAN> restore controlfile from 'D:standby\backup\O1_MF_NCSNF_TAG20161011T182614_CZTQNNV4_.BK';

4) Catalogar a pasta do servidor standby, para que o oracle saiba onde estão os arquivos .bkp:

RMAN> alter database mount;

RMAN> catalog start with 'D:standby\backup\' noprompt;

5) Em seguida, é necessário escolher o caminho onde serão alocadosos data files, foram alocados em D:\standby\datafiles;

   5.1) Após, restaurar os backups, ou seja, copiar para o local original, que iremos definir com o comando set newname; 

   5.2) Seguindo adiante, como mudamos o path ( o local original), precisamos atualizar o control file, para que ele aponte para os data files no local correto, e para isso utilizamos o comando switch; 

    5.3) Para finalizar, executamos a recuperação do banco. Lembrando que tudo isso é para ser feito num bloco run { }.

RMAN> run {

set newname for datafile 1 to 'D:\standby\datafiles\SYSTEM01.DBF';

set newname for datafile 2 to 'D:\standby\datafiles\SYSAUX01.DBF';

set newname for datafile 3 to 'D:\standby\datafiles\UNDOTBS01.DBF';

set newname for datafile 4 to 'D:\standby\datafiles\USERS01.DBF';

set newname for datafile 5 to 'D:\standby\datafiles\TBX_STANDBY_01.DBF';

set newname for datafile 6 to 'D:\standby\datafiles\TBS_DATA_STANDBY_01.DBF';

set newname for datafile 7 to 'D:\standby\datafiles\TBX_STANDBY_02.DBF';

set newname for datafile 8 to 'D:\standby\datafiles\TBS_DATA_STANDBY_02.DBF';

set newname for datafile 9 to 'D:\standby\datafiles\TBS_CEP_DADOS_01.DBF';

set newname for datafile 10 to 'D:\standby\datafiles\TBS_CEP_IDX_01.DBF';

set newname for tempfile  1 to 'D:\standby\datafiles\TEMP01.DBF';

set newname for tempfile  1 to 'D:\standby\datafiles\TEMP02.DBF';

set newname for tempfile  1 to 'D:\standby\datafiles\TEMP03.DBF';

set newname for tempfile  1 to 'D:\standby\datafiles\TEMP04.DBF';

restore database;

switch datafile all;

switch tempfile all;

recover database;

}

6) Para sincronizar a sequência do último archive aplicado pelo banco primário com o banco de standby, é preciso rodar o seguinte comando no sqlplus:

SQL> recover database using backup controlfile until cancel;

Caso esteja desatualizado, basta copiar e colar o caminho do archive, sugerido pelo oracle e pressionar enter. Quando chegar no último archive, digite cancel e precione enter. 



Automatizando a sincronização dos bancos

É preciso criar um script ‘atualiza.bat’, que serve para atualização da ‘sequence dos archives’, ou seja, para que o banco de standby esteja íntegro com o banco primário, estando sempre num ponto de sequência mais próximo do banco primário.

Segue o script ‘atualiza.bat’, no qual me espelhei no meu grande amigo e eterno professor Ricardo Portilho:

set ORACLE_SID=Nome_da_instância_igual_ao_nome_primário

set ORACLE_HOME=C:\oracle11g\product\11.2.0\dbhome_1

set StandbyTNS=standby_SB

set ProdTNS=primario_PR



set Texto=SHUTDOWN IMMEDIATE; STARTUP MOUNT;EXIT

echo.%Texto% > D:\ATUALIZA\BAIXA_SOBE_MOUNT.rman

%ORACLE_HOME%\BIN\rman.exe target / CMDFILE=D:\ATUALIZA\BAIXA_SOBE_MOUNT.rman

del D:\ATUALIZA\BAIXA_SOBE_MOUNT.rman

FOR /F "tokens=*" %%A IN ('%ORACLE_HOME%\BIN\sqlplus.exe -s SYS/senha@%ProdTNS% AS SYSDBA @D:\ATUALIZA\ATUALIZA.sql ^| FIND "KEEP"') DO SET Variable=%%A

set Variable=%Variable: =%

set Variable=%Variable:KEEP=%

echo.%Variable%



set Texto=BACKUP ARCHIVELOG FROM SEQUENCE %Variable% FORMAT 'D:\ATUALIZA\ATUALIZA__Sequence%Variable%__Data%%Y%%M%%D__Set%%s__Piece%%p.BKP';

echo.%Texto% > D:\ATUALIZA\ATUALIZA.rman

%ORACLE_HOME%\BIN\rman.exe target SYS/senha@%ProdTNS% CMDFILE=D:\ATUALIZA\ATUALIZA.rman

del D:\ATUALIZA\ATUALIZA.rman



NET USE X: \\10.10.1.246\D$

COPY X:\ATUALIZA\ATUALIZA__Sequence%Variable%* D:\ATUALIZA\ATUALIZA__SEQUENCE

DEL X:\ATUALIZA\ATUALIZA__Sequence%Variable%*

NET USE X: /DELETE



set Texto=CROSSCHECK BACKUP; DELETE NOPROMPT EXPIRED BACKUP;

echo.%Texto% > D:\ATUALIZA\CROSSCHECK.rman

%ORACLE_HOME%\BIN\rman.exe target SYS/senha@%ProdTNS% CMDFILE=D:\ATUALIZA\CROSSCHECK.rman

del D:\ATUALIZA\CROSSCHECK.rman



set Texto=CATALOG START WITH 'D:\ATUALIZA\ATUALIZA__SEQUENCE' NOPROMPT;

echo.%Texto% > D:\ATUALIZA\CATALOG.rman

%ORACLE_HOME%\BIN\rman.exe target / CMDFILE=D:\ATUALIZA\CATALOG.rman

del D:\ATUALIZA\CATALOG.rman



set Texto=RECOVER DATABASE;

echo.%Texto% > D:\ATUALIZA\RECOVER.rman

%ORACLE_HOME%\BIN\rman.exe target / CMDFILE=D:\ATUALIZA\RECOVER.rman

del D:\ATUALIZA\RECOVER.rman



set Texto=DELETE NOPROMPT BACKUP; DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-1';

echo.%Texto% > D:\ATUALIZA\DELETE.rman

%ORACLE_HOME%\BIN\rman.exe target / CMDFILE=D:\ATUALIZA\DELETE.rman

del D:\ATUALIZA\DELETE.rman



set Texto=SQL 'ALTER DATABASE OPEN READ ONLY';

echo.%Texto% > D:\ATUALIZA\READ_ONLY.rman

%ORACLE_HOME%\BIN\rman.exe target / CMDFILE=D:\ATUALIZA\READ_ONLY.rman

del D:\ATUALIZA\READ_ONLY.rman



Vale ressaltar que o script ‘atualiza.bat’, baixa o banco stand by e sobe em mount, antes de fazer a sincronização do banco de stand by com o banco de produção. E, após a sincronização, o script altera o estado do banco de modo manutenção (mount) para aberto, mas na condição de estar em modo de leitura (open read only), ou seja, só poderá ser realizado consultas (selects), e não insert, update e delete.

No meu caso, o scheduler do windows foi agendado para realizar diariamente, e de hora em hora (hh:30min), a atualização do standby, via script ‘atualiza.bat’. 


Grande abraço!


Salomão Netto

DBA MongoDB, Oracle and SQL ServerRemote or Physical Consulting

Contacts:
Whatsapp:+5521980000311
Skype: sal.netto
Linkedin: www.linkedin.com/in/salomao-oliveira

sexta-feira, 6 de maio de 2016

Como restaurar e recuperar o arquivo de controle do banco de dados oracle. // How to restore and recover the control file Oracle database.


Alguém apagou arquivo de controle do banco de dados, e agora? Seguem duas formas de se recuperar um arquivo de controle: através da restauração do arquivo de controle e através do backup piece. // Someone deleted the database control file, and now? Here are two ways to recover a control file: through the control file restore and backup through the piece.

1) No primeiro caso, se o autobackup esteja configurado para fazer backup do arquivo de controle, basta efetuar a restauração do arquivo de controle do autobackup. // In the first case, if the autobackup is configured to back up the control file, just make the restoration of the autobackup control file.

RMAN> restore controlfile from autobackup;

Obs: Para ativar o autobackup do controlfile, basta digitar o seguinte comando (lógico que antes da ocorrência do desatre!): // Note: To enable the autobackup the controlfile, just type the following command (logical that before the occurrence of desatre!):

RMAN> controlfile autobackup on;

2) Já o segundo caso, se o autobackup para o arquivo de controle não estiver configurado para fazer o backup do arquivo de controle, basta efetuar a restauração do arquivo de controle do pedaço do backup, localizado no FRA/nome do banco/pasta mais recente. Tem que ir tentando cada pedaço de backup por vez, até encontrar o pedaço que contém o arquivo de controle.  //  The second case, if the autobackup to the control file is not configured to back up the control file, just make the restoration of the backup piece of the control file, located in the FRA/database name/folder more recent. You have to go trying each piece of backup at a time until you find the piece that contains the control file.

RMAN> restore controlfile from 'o1_mf_nnndf_TAG20160414T101341_9nqqrc4f.bkp';

3) Agora é preciso fazer o recover database, para atualizar o arquivo de controle. // Now you need to make the recover database to update the control file.

RMAN> recover database;

4) Agora, quando for mudar o estado do banco de dados para aberto, é preciso fazer com resetlogs, já que estaremos começando uma nova encarnação do banco de dados, que irá refazer todos os redo logs. // Now, when you change the database state to open, you need to make resetlogs, as we will be starting a new incarnation of the database, which will redo all the redo logs.

RMAN> alter database open resetlogs;

5) Sempre que for feito um resetlog é recomendado que se faça um backup do banco de dados. // Whenever you made a resetlog is recommended that you make a backup of the database.

RMAN> backup database;

Grande abraço!! // Big hug!!

segunda-feira, 2 de maio de 2016

Recuperando o arquivo de dados system01. // Recovering oracle data file system01.

Perdeu o seu arquivo de dados system01 e seu banco não sobe no modo open? Não entre em pânico! // Lost your data file system01 and your base does not rise in open mode? Do not panic!

1) Se estiver logado na instância, desça o banco. // If you are logged into the instance , go down the base.
sql> shutdown abort;

2) Acesse o rman. // Access the rman.
$ rman target /

3) Suba o banco em modo de manutenção. // Climb the base in maintenance mode.
RMAN> startup mount;

4) Inicie o restore do ultimo backup. // Start restore the last backup.
RMAN>  restore database 1;

Obs: se você não lembra o número relativo ao arquivo de dados, basta digitar: //
Note : If you do not remember the number for the data file , just type :
RMAN>  report schema;

5) Faça o recover do arquivo de dados system01. // Do system01 recover the data file.
RMAN>  recover datafile 1;

6) Agora mude o banco para o estado aberto. // Now change the bank to the open state.
RMAN>  alter database open;

7) Verifique se tudo está okay. // Make sure everything is okay.
RMAN>  validate database;


Até a próxima!! // To the next!!

My Linkedin: https://www.linkedin.com/in/salom%C3%A3o-netto-0667851a?trk=nav_responsive_tab_profile

segunda-feira, 25 de abril de 2016

Como converter arquivos de sistema para ASM Storage, usando o RMAN // How to convert file system to ASM Storage using RMAN

Hoje me foi solicitado instalar o ASM e mover os arquivos do sistema de arquivos para o armazenamento ASM. A grosso modo, o ASM permite que o oracle gerencie o seu storage.  // Today I was asked to install the ASM and move the file system files to ASM storage. Roughly, ASM allows Oracle to manage your storage.

Agora, basta localizar os arquivos de sistema, convertê-los para ASM (via rman), colocar os arquivos de sistemas "antigos" offline e renomear os arquivos de sistemas que passarão a ser utilizados. // Now, just find the system files , convert them to ASM (via rman ) , place the system offline files and rename the file systems which will be used.

Vamos ao que interessa! // Lets go to what matters!

1) Localizando os arquivos de sistema: // Finding the file system :

SQL> select name from V$datafile;

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/example01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf


2) Por questão de segurança, é recomendado que se faça backup com os comandos de criação do control file. // For safety, it is recommended to back up with the control file creation commands.

SQL> alter database backup controlfile to trace;

2.1) Fazer um backup no rman. // Make a backup in rman.
RMAN> backup database;

3) Caso o banco esteja em Archivelog, deve-se fazer um arquivo por vez. // If the base is Archivelog , you should do one file at a time.

3.1) Colocando os arquivos de sistemas offline. // Putting the offline file systems.

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/example01.dbf' offline;

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/system01.dbf' offline;

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/sysaux01.dbf' offline;

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/undotbs01.dbf' offline;

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/users01.dbf' offline;


3.2) Convertendo para ASM (Esse processo demora um pouco! (: Tenha paciência!) // Converting to ASM ( This process takes a little ( : Be patient !)

RMAN> convert datafile '/u01/app/oracle/oradata/orcl/example01.dbf' format '+data';

Starting conversion at target at 18-APR-16
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=51 device type=DISK
channel ORA_DISK_1: starting datafile conversion
input file name=/u01/app/oracle/oradata/orcl/example01.dbf

converted datafile=+DATA/ORCL/DATAFILE/example.256.909512635
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:20:05
Finished conversion at target at 18-APR-16

Agora faça em todos os outros arquivos de sistema. // Now do all other system files.

RMAN> convert datafile '/u01/app/oracle/oradata/orcl/system02.dbf' format '+data';
RMAN> convert datafile '/u01/app/oracle/oradata/orcl/sysaux01.dbf' format '+data';
RMAN> convert datafile '/u01/app/oracle/oradata/orcl/undotbs01.dbf' format '+data';
RMAN>


3.3) Renomeando os arquivos de sistemas que passarão a ser utilizados.  // Renaming the file systems which will be used.

SQL> alter database rename file '/u01/app/oracle/oradata/orcl/example01.dbf' to '+DATA/ORCL/DATAFILE/example.256.909512635';

SQL> alter database rename file '/u01/app/oracle/oradata/orcl/system01.dbf' to '+DATA/ORCL/DATAFILE/system.262.909524257';

SQL> alter database rename file '/u01/app/oracle/oradata/orcl/sysaux01.dbf' to '+DATA/ORCL/DATAFILE/example.256.909512635';

SQL> alter database rename file '/u01/app/oracle/oradata/orcl/undotbs01.dbf' to '+DATA/ORCL/DATAFILE/example.256.909512635';

SQL> alter database rename file '/u01/app/oracle/oradata/orcl/users01.dbf' to '+DATA/ORCL/DATAFILE/example.256.909512635';

3.4) Agora, localize os arquivos de sistema:  // Now locate the file system:

SQL> select name from V$datafile;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
+DATA/ORCL/DATAFILE/example.256.909512635
/u01/app/oracle/oradata/orcl/users01.dbf

3.5) Agora coloque os arquivos de sistema online. // Now putting the online file systems.

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/example01.dbf' online;

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/system01.dbf' online;

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/sysaux01.dbf' online;

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/undotbs01.dbf' online;

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/users01.dbf' online;


4) Caso o banco esteja em Noarchivelog. // If the bank is in NOARCHIVELOG.
4.1) Execute esses comandos para gerar os comandos que serão utilizados no próximo passo. // Run these commands to generate the commands to be used in the next step.

select 'alter database datafile '||file_name||' offline;' from v$datafile;

select 'convert datafile '''||file_name||''' format '''+data''';'

select 'alter database datafile '||file_name||' online;' from v$datafile;

4.2) Coloque o banco em mount
SQL> shutdown immediate;
SQL> startup mount;

4.3) Colocando os arquivos de sistemas offline. // Putting the offline file systems.

4.4) Convertendo para ASM (Esse processo demora um pouco! (: Tenha paciência!) // Converting to ASM ( This process takes a little ( : Be patient !)

4.5) Renomeando os arquivos de sistemas que passarão a ser utilizados.  // Renaming the file systems which will be used.

4.6) Agora coloque os arquivos de sistema online. // Now putting the online file systems

É isso!! Grande abraço e até a próxima! // It is!! Big hug and see you soon!

My linkedin: https://www.linkedin.com/in/salom%C3%A3o-netto-0667851a?trk=nav_responsive_tab_profile

terça-feira, 19 de abril de 2016

Instalando o Oracle ASM // Installing Oracle ASM




Primeiro é preciso instalar os pacotes do ASM. // First you need to install OS packages ASM.

yum install -y oracleasm-support oracleasm expat-devel libao
wget http://download.oracle.com/otn_software/asmlib/oracleasmlib-2.0.12-1.el6.x86_64.rpm
rpm -ivh oracleasmlib-2.0.12-1.el6.x86_64.rpm

Caso esteja utilizando outra plataforma, acesse o site da oracle e baixe o asmlib correto. Veja o exemplo, abaixo, para o caso de um redhat 6: // If you are using another platform, please visit the Oracle website and download the correct asmlib . See the example below for the case of a RedHat 6:
http://www.oracle.com/technetwork/server-storage/linux/asmlib/rhel6-1940776.html

1) Configure o Oracle ASM. // Configure the Oracle ASM.
# /etc/init.d/oracleasm configure -i

1ª Variavel = grid
2ªVariavel=oinstall
3ª e 4ª = [y]


2) Crie a partição primária nos discos que farão parte do ASM. // Create a primary partition on disks that will be part of ASM.
# ls /dev/sd*
# fdisk /dev/sdb
n (nova partição)
p (primária)
1 (numero da partição)
enter (default primeiro cilindro)
enter (default último cilindro)
w (gravar alterações)

3) Configurar Multipath se não o Grid InfraStructure não irá achar os ASM DISKS. Rode em todos os nodes: // Configure Multipath is not the Grid infrastructure will not find the ASM DISKS . Turn on all nodes :

3.1) Modifique o /etc/sysconfig/oracleasm com: // Modify the # /etc/sysconfig/oracleasm with:
ORACLEASM_SCANORDER=”dm”
ORACLEASM_SCANEXCLUDE=”sd”

3.2) Restart o asmlib: // restart the asmlib:
# /etc/init.d/oracleasm restart

3.3) O Resultado Final terá que ficar assim: // The End Result will have to look like this:
# /usr/sbin/oracleasm configure
ORACLEASM_ENABLED=true
ORACLEASM_UID=grid
ORACLEASM_GID=oinstall
ORACLEASM_SCANBOOT=true
ORACLEASM_SCANORDER="dm"
ORACLEASM_SCANEXCLUDE="sd"
ORACLEASM_USE_LOGICAL_BLOCK_SIZE="false"

4) Crie os discos ASM. // create ASM disks.
# /etc/init.d/oracleasm createdisk DSKASM1 /dev/sdb1
# /etc/init.d/oracleasm createdisk DSKASM2 /dev/sdc1

4.1) Liste os discos ASM para conferir. // Liste The ASM disk to check.
# /etc/init.d/oracleasm listdisks
DSKASM1
DSKASM2

5) Crie os diretórios de instalação, altere o owner e de permissão recursiva 775. // Create Installation directories, change the owner and permission recursively 775.

mkdir -p /u01/app/grid
mkdir -p /u01/app/grid/12.1.0
chown -R oracle:oinstall /u01
chmod -R 775 /u01/

groupadd -g 1000 oinstall
groupadd -g 1020 asmadmin
groupadd -g 1021 asmdba
groupadd -g 1031 dba
useradd -u 1100 -g oinstall -G asmadmin,asmdba grid
useradd -u 1101 -g oinstall -G dba,asmdba oracle

6) Defina as variáveis de ambiente. // Set the environment variables.

# vi /home/grid/./.bash_profile

TMP=/tmp
TMPDIR=$TMP
TEMP=$TMP
export ORACLE_SID=+ASM1
export ORACLE_BASE=/u01/app/oracle
export GRID_HOME=/u01/app/12.1.0.1/grid
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0.1/dbhome_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_TERM=xterm
export
PATH=$PATH:$ORACLE_HOME/bin:$PATH:$GRID_HOME/bin:/usr/bin:/sbin:/usr/
sbin:$ORACLE_HOME/OPatch
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export PS1="[${LOGNAME}@`hostname -s`:"'${PWD} [${ORACLE_SID}] ]$ '
export PERL_HOME=/usr/local/perl
export PERL5LIB=$PERL_HOME/lib
export SQLPATH=/home/oracle/scripts-ora

7)Defina a configuração do Arquivo: vi /etc/security/limits.conf // Set the archive configuration: vi /etc/security/limits.conf

grid soft noproc 131072
grid hard noproc 131072
grid soft nofile 131072
grid hard nofile 131072
grid soft core unlimited
grid hard core unlimited
grid soft memlock unlimited
grid hard memlock unlimited


8)# su -grid
$ cd /home/grid
$ unzip linuxamd64_12102_grid_1of2.zip
$ unzip linuxamd64_12102_grid_2of2.zip
$ cd /home/grid/grid
$ ./runInstaller

9) Marque a opção “Skip software update” e clique em “Next”. // Check the "Skip update software" and click "Next".

Escolha a opção “Standalone Server” e clique em “Next”. // Choose "Standalone Server" and click "Next".

Escolha o idioma e clique em “Next”. // Choose your language and click "Next."

Nesse momento será criado o “Disc Group DATA”. // At that moment will be created the "Disc Group DATA".

Escolha “Redundancy” Normal. // Select "Redundancy" Normal.

“Alocation Unit”(AL) 1MB. // "Alocation Unit" (AL) 1MB.

Selecione dois discos para compor o “Disc Group DATA”. // Select two disks to compose the "Disc Group DATA".

Clique em “Next”. // Click "Next."

Defina a senha para a instância ASM e clique em “Next”. // Set the password for the ASM instance and click "Next."

Selecione os grupos “oinstall” e clique em “Next”. // Select groups "oinstall" and click "Next."

Como as variáveis ORACLE_BASE e GRID_HOME foram definidas, a tela já traz os campos para instalação preenchidos corretamente, clique em “Next”. // As the ORACLE_BASE and GRID_HOME variables were defined, the screen already has the facility to fields filled in correctly, click "Next".

Clique em “Next”. // Click "Next."

Clique em “Install”. // Click "Install".


Nesse momento deve ser rodado os scripts como “root” que a instalação pede. // At this point must be run scripts as "root" the installation asks.

Abra um novo terminal como root e execute os scripts. // Open a new terminal as root and run the scripts.

cd /u01/app/oraInventory
./orainstRoot.sh

cd /u01/app/oracle/product/11.2.0/grid
./root.sh

Feche o terminal. // Close the terminal.

Clique em “OK” na janela onde pede que os scripts sejam executados. // Click "OK" in the window which asks the scripts to run.

Instalação concluída, clique em “Close”. // Installation complete, click "Close".



Como criar o diskgroup no ASM?

1) Neste passo será criado o Diskgroup +DATA onde ficarão armazenados os Dados do novo Database. //  This step will create the diskgroup + DATA where the new data will be stored Database.

Iniciar instalador: // Starting installer:

vi /home/oracle/./.bash_profile
acrescentar: export GRID_HOME=/u01/app/oracle/product/11.2.0/grid
ou digitar: export GRID_HOME=/u01/app/oracle/product/11.2.0/grid
cd $GRID_HOME/bin
./asmca


My Linkedin: https://www.linkedin.com/in/salom%C3%A3o-netto-0667851a?trk=nav_responsive_tab_profile

quarta-feira, 16 de março de 2016

Partition Table Oracle (Particionamento de Tabela)

Ontem me deparei com uma solicitação bastante interessante do cliente: Ele gostaria de particionar uma tabela, para melhorar a performance.  Mas... Que parada é essa de particionamento de tabela?

Em banco de dados, particionar significa segregar dados, ou seja, criar pedaços de objetos do banco de dados para melhorar o seu desempenho. Pode ser feito localmente (no mesmo banco de dados) ou distribuída geograficamente (num servidor em outro país, por exemplo).

Vale ressaltar que o particionamento é válido para big tables, ou seja, quando a tabela for povoada por uma grande carga de dados. E, ainda, cada partição deveria estar em discos diferentes, para melhorar a otimização e desempenho, porém, a maioria das pessoas acabam particionando no mesmo disco.

Existem 5 formas de particionamento:

1) Range (intervalo ou faixa), bem comum de ser encontrada, já que se baseia no campo data como chave do particionamento, organizando as partições por meses ou anos;

2) List (dividida por lista de valores);

3) Hash (administrado pelo próprio oracle) , que se baseia no valor de uma chave de particionamento, geralmente a primary key da tabela;

4) Range/hash (partição/subpartição). Aqui se cria uma partição range, e supartições em hash. O dba administra a faixa principal (tabela data com ano de 2015, por exemplo) e o oracle administra as subpartições (meses do ano de 2015, por exemplo);

5)  Range/List (Faixa/valores), em que dividem-se partições em faixa de valores e, após, em lista de valores.

Administrar partições é algo complexo, portanto na dúvida, aconselho a optar pelo modo hash, pois o oracle controla e administra todo o particionamento, sem que precisemos nos preocupar com isso. O “problema” é que não se sabe em que partição estará a informação.

Caso já seja um dba com mais rodagem, o recomendado é que se faça o particionamento por Range ou Range/Hash. Em bancos transacionais, vale a pena alocar 1 tablespace para hotblocks (áreas internas do disco que utilizam memória, e fazem o acesso de forma mais rápida), e alocar as outras tablespaces na área externa do disco, porque o acesso será mais lento do que pelos hotblocks.

Segue a baixo um passo a passo que criei para demonstrar como criar um particionamento em hash, como exportar e importar para outro schema uma tabela particionada. Para isso, tive que criar usuários, tablespaces, fazer export e import.
 
ATIVIDADE 1 : Criar tablespace TSTESTE

create tablespace TS_NEWS
datafile '/u02/oradata/orats01/ts_news.dbf'
size 40M
autoextend on next 40M maxsize 30G;

select TABLESPACE_NAME, FILE_NAME from dba_data_files;



ATIVIDADE 2 : Criar dois usuários, apontados para a TS_NEWS
create user salomao
identified by salomao
default tablespace TS_NEWS
temporary tablespace TEMP
password expire;

create user charles
identified by charles
default tablespace TS_NEWS
temporary tablespace TEMP
password expire;



select username,default_tablespace,temporary_tablespace
from dba_users
where username in ('CHARLES','SALOMAO');
  

ATIVIDADE 3 : Criar tabela e particioná-la (HASH)
ð  Caso necessite calcular o tamanho da tabela, para poder criar as tablespaces que serão usadas no particionamento, segue o comando sql:

select table_name,
decode(partitioned,'/','NO',partitioned) partitioned,
num_rows,
data_mb,
indx_mb,
lob_mb,
total_mb
from (select data.table_name,
partitioning_type
|| decode (subpartitioning_type,
 'none', null,
'/' || subpartitioning_type)
partitioned,
num_rows,
nvl(data_mb,0) data_mb,
nvl(indx_mb,0) indx_mb,
nvl(lob_mb,0) lob_mb,
nvl(data_mb,0) + nvl(indx_mb,0) + nvl(lob_mb,0) total_mb
from (  select table_name,
nvl(min(num_rows),0) num_rows,
round(sum(data_mb),2) data_mb
from (select table_name, num_rows, data_mb
from (select a.table_name,
a.num_rows,
b.bytes/1024/1024 as data_mb
from user_tables a, user_segments b
where a.table_name = b.segment_name))
group by table_name) data,
(  select a.table_name,
round(sum(b.bytes/1024/1024),2) as indx_mb
from user_indexes a, user_segments b
where a.index_name = b.segment_name
group by a.table_name) indx,
(  select a.table_name,
round(sum(b.bytes/1024/1024),2) as lob_mb
from user_lobs a, user_segments b
where a.segment_name = b.segment_name
group by a.table_name) lob,
user_part_tables part
where     data.table_name = indx.table_name(+)
and data.table_name = lob.table_name(+)
and data.table_name = part.table_name(+))
order by table_name;
 

  Em seguida, criar as tablespaces que serão usadas nas partições:

create tablespace TS_PART1
datafile '/u02/oradata/orats01/ts_part1.dbf'
size 1M autoextend on next 1M maxsize 2M;

create tablespace TS_PART2
datafile '/u02/oradata/orats01/ts_part2.dbf'
size 1M autoextend on next 1M maxsize 2M;

select TABLESPACE_NAME, FILE_NAME from dba_data_files;
  

Logo após, dropei a tabela teste e a recriei particionando-a:
CREATE TABLE regions
   ( region_id NUMBER
   CONSTRAINT region_id_nn NOT NULL
   , region_name VARCHAR2(25)
   )
partition by hash (region_id)
partitions 2;
store in (TS_PART1,TS_PART2);

CREATE UNIQUE INDEX reg_id_pk
         ON regions (region_id);

ALTER TABLE regions
         ADD ( CONSTRAINT reg_id_pk
   PRIMARY KEY (region_id)
   ) ;

INSERT INTO regions VALUES
   ( 1
   , 'Europe'
   );

INSERT INTO regions VALUES
   ( 2
   , 'Americas'
   );

INSERT INTO regions VALUES
   ( 3
   , 'Asia'
   );

INSERT INTO regions VALUES
   ( 4
   , 'Middle East and Africa'
   );




 ATIVIDADE 4 : exportar full o banco e depois dropar as tabelas.
Criei o diretório export no /u01
Criei o diretório expdp, direcionando para /u01/export e dei os grants de leitura, escrita e exportação para o usuário salomao.
SQL> create directory expdp as '/u01/export';


SQL> grant read,write on directory expdp to salomao;

SQL> grant datapump_exp_full_database to salomao;


 

Executei o comando de datapump:
expdp directory=expdp dumpfile=exp_full_salomao_20160315.dmp logfile=exp_full_salomao_20160315.log full=y




ATIVIDADE 5 : Fazer o Import da tabela RE0GIONS para o usuário Charles

Antes de fazer o impdp é necessário da as permissões para o usuário de destino, no caso o charles.

grant read,write on directory expdp to charles;

grant unlimited tablespace to charles;

alter user charles quota unlimited on TS_NEWS


Feito isso, podemos partir para o import:

impdp directory=expdp dumpfile=exp_full_salomao_20160315.dmp logfile=imp_full_salomao_20160315.log tables=salomao.REGIONS partition_options=merge remap_schema=salomao:Charles table_exists_action=replace


** commando para gerar o import: impdp
** diretório onde se encontra o caminho do export: directory=expdp
** nome do arquivo de dump: dumpfile=exp_full_salomao_20160315.dmp
** novo nome do arquivo de log: logfile=imp_full_salomao_20160315.log
** nome da tabela que será importada: tables=salomao.REGIONS
** comando para mudar o owner: remap_schema=salomao:Charles
** comando para sobrescrever a tabela já existente: table_exists_action=replace
** comando para importar tabelas particionadas: partition_options=merge



Execução do script de recompilação, para validar o import:
SQL>@?/rdbms/admin/utlrp

 
E, por fim, conectando com o usuário Charles, basta fazer a consulta na tabela importada e ver que ela está lá.


My Linkedin: https://www.linkedin.com/in/salom%C3%A3o-netto-0667851a?trk=nav_responsive_tab_profile


segunda-feira, 14 de março de 2016

Instalação Oracle 12c (Oracle 12c Install)




Bom, toda vez que eu precisava instalar o oracle eu tinha problemas com algum pré-requisito. Então eu resolvi criar meu próprio passo-a-passo, me baseando na documentação oracle, para não ter mais problemas com isso. E como eu penso que conhecimento, quanto mais compartilhamos, mais atraímos pra gente, vou compartilhá-lo com você!

Aconselho a buscar entender esses procedimentos de instalação, lendo a documentação oracle.

(http://www.oracle.com/technetwork/database/enterprise-edition/documentation/database-093888.html)
--instalação de pacotes essenciais e dos pré requisitos para instalar o oracle 12c no oracle linux 6.7

yum install -y  java-1.8.0-openjdk pam binutils compat-libcap gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel compat-libstdc++-33 compat-libcap1 libXext libX11 libXau libxcb libXi libXtst make sysstat oracle-rdbms-server-12cR1-preinstall xorg-x11-fonts-base xorg-x11-fonts-misc xorg-x11-font-utils xorg-x11-fonts-Type1 xpdi xauth xorg-x11-apps xterm xclock

yum groupinstall -y "X Window System"

Vi /etc/ssh/ssh_config
#ForwardX11 no
ForwardX11 yes
# service sshd restart

--criar grupos, usuário e senha

/usr/sbin/groupadd oinstall
/usr/sbin/groupadd dba
/usr/sbin/groupadd oper
/usr/sbin/useradd -g oinstall -G dba oracle
/usr/sbin/usermod -g oinstall -G dba oracle
passwd oracle

--To create the Oracle base directory and specify the correct owner, group, and permissions for it, perform the following:

mkdir -p /u01/app/oracle
chown -R oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/app/oracle

--Database file directory:

mkdir -p /u01/oradata
chown oracle:oinstall /u01/oradata
chmod 775 /u01/oradata

--Recovery file directory (fast recovery area):

mkdir -p /u01/fast_recovery_area
chown oracle:oinstall /u01/fast_recovery_area
chmod 775 /u01/fast_recovery_area

--Inventory Directory:

mkdir -p /u01/app/oraInventory
chown -R oracle:oinstall /u01/app/oraInventory
chmod -R 775 /u01/app/oraInventory

# vi /etc/security/limits.conf
oracle  nofile  soft    1024
oracle  nofile  hard    65536
oracle  noproc  soft    2047
oracle  noproc  hard    16384
oracle  stack   soft    10240
oracle  stack   hard    32768
oracle    memlock soft    1024
oracle    memlock hard    3072

#vi /etc/sysctl.conf
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
fs.aio-max-nr = 1048576
fs.file-max = 6815744

#vi /etc/hosts
--ip locahhost
iP    HOSTNAME

/sbin/sysctl -p
/sbin/sysctl -a

--Adicionar a seguinte linha ao arquivo, caso ela ainda não exista:

session    required     /lib/security/pam_limits.so

--Desabilitar o parâmetro SELINUX
/etc/selinux/config
SELINUX=disabled

cd /home/oracle
vi ./.bash_profile

-- Configurações do Oracle

TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR
export DISPLAY=número do ip da máquina física:0.0
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1; export ORACLE_HOME
ORACLE_SID=NOME_DA_INSTANCIA; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH
if [ $USER = "oracle" ]; then
  if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi

--Copiar o zip do oracle para /home/oracle
scp linuxamd64_12102_database_1of2.zip linuxamd64_12102_database_2of2.zip oracle@COLOCAR O NUMERO DO IP:/home/oracle

--rodar o comando unzip para descompactar o arquivo
unzip /home/oracle/linuxamd64_12102_database_1of2.zip
unzip /home/oracle/linuxamd64_12102_database_2of2.zip

--Rodar o instalador do oracle
cd /home/oracle/database
./runInstaller

--Rodar o listner para configurar uma rede pro oracle
netca

--Rodar o dbca para criar um banco de dados
dbca

Boa sorte!

My Linkedin: https://www.linkedin.com/in/salom%C3%A3o-netto-0667851a?trk=nav_responsive_tab_profile