Páginas

terça-feira, 29 de outubro de 2013

[ORACLE] - Identificando SQL problemático

A view V$SQL mostra as instruções SQL que estão no pool compartilhado juntamente com estatísticas sobre sua operação. Isso a torna essencial para examinar as instruções SQL. Este post será bem curto e objetivo, mostrando 3 exemplos de consultas utilizando essa view de forma bem prática e útil.

Top 10 – SQL mais executados:
 
SELECT sql_text, executions
  FROM (SELECT sql_text, executions,
        RANK() OVER (ORDER BY executions DESC) exec_rank
        FROM v$sql)
 WHERE exec_rank <= 10;

Top 10 – SQL que mais exigiram leituras físicas:
 
SELECT sql_text, disk_reads
  FROM (SELECT sql_text, disk_reads,
        DENSE_RANK() OVER
          (ORDER BY disk_reads DESC) DiSk_READS_RANK
       FROM v$sql)
 WHERE disk_reads_rank <= 10;

Top 10 – SQL que mais exigiram leituras lógicas:
 
SELECT sql_text, buffer_gets
  FROM (SELECT sql_text, buffer_gets,
              DENSE_RANK() OVER
              (ORDER BY buffer_gets DESC) buffer_gets_rank
        FROM v$sql)
 WHERE buffer_gets_rank <= 10;

Fique a vontade para alterar as consultas acima – você pode alterar o “top 10″ para top 5, top 20, ou o número que quiser – basta alterar o valor da cláusula WHERE de cada consulta.

Fonte:
http://certificacaobd.com.br/2011/07/22/vsql-identificando-sql-problematico/

[MS SQL SERVER] - Verificando o espaço usado por tabelas e bases de dados

Tamanho das Tabelas

sp_spaceused <TABELA>

A sintaxe sp_spaceused <TABELA> exibe, respectivamente, o nome da tabela (name), número de linhas (rows), espaço reservado para a tabela (reserved), espaço usado pelos dados na tabela (data), espaço usado pelos indexes da tabela (index_size) e espaço sem uso na tabela (unused).
Se nenhuma tabela for especificada, serão exibidos dois resultados: - nome da base de dados (database_name), tamanho da base (database_size) e espaço não alocado (unallocated space). - espaço reservado (reserved), espaço usado por dados na base de dados (data), espaço usado por indexes na base de dados (index_size) e espaço sem uso na base (unused).

sp_helpdb <NOME_DA_BASE>

Você também pode usar a stored procedure sp_helpdb para obter informações sobre sua base de dados. A sintaxe sp_helpdb <NOME_DA_BASE> exibe, respectivamente:

- Nome da base de dados (name), tamanho (db_size), proprietário (owner), número de identificação da base (dbid), data de criação (created), opções da base (Status) e compatibilidade (compatibility_level - 80 = MS SQL Server 2000). - Nome lógico do arquivo de armazenamento (name), seu número de identificação (fileid), nome do arquivo (filename), seu filegroup, tamanho (size), tamanho máximo que poderá chegar (maxsize - espaço contratado), taxa de crescimento (growth) e para qual uso é designado o arquivo (usage - dados ou logs).

quinta-feira, 24 de outubro de 2013

[ORACLE] - Informaçoes detalhadas sobre startup da instance

-- Informaçoes detalhadas sobre startup  da instance

Mostra as seguintes informações :

1. Hostname
2. Instance Name
3. Started At (Quantidade de tempo que o banco de dados esta UP)

select 'Hostname : ' || host_name 
,'Instance Name : ' || instance_name 
,'Started At : ' || to_char(startup_time,'DD-MON-YYYY HH24:MI:SS') stime 
,'Uptime : ' || floor(sysdate - startup_time) || ' days(s) ' || 
trunc( 24*((sysdate-startup_time) - 
trunc(sysdate-startup_time))) || ' hour(s) ' || 
mod(trunc(1440*((sysdate-startup_time) - 
trunc(sysdate-startup_time))), 60) ||' minute(s) ' || 
mod(trunc(86400*((sysdate-startup_time) - 
trunc(sysdate-startup_time))), 60) ||' seconds' uptime 
from gv$instance 
/ 

[ORACLE] - Informações Administrativas

Mostra as seguintes informações :
1. VERSAO DO ORACLE
2. Nome do DATABASE
3. Nome da INSTANCE
4. STATUS DA INSTANCE   (STARTED , MOUNT OU OPEN)
5. TIPO DO CONTROLFILE  (CURRENT OU STANDBY)
6. ARCHIVE STATUS       (MODO ARQUIVAMENTO OU MODO NÃO-ARQUIVAMENTO)
7. LOCAL ARCHIVE NO ORACLE   (LOCAL ONDE OS ARCHIVES É DEPOSITADO CASO ESTAJA EM MODO ARQUIVAMENTO)                   

select distinct   'ORACLE RELEASE :  ' || (select distinct PROPERTY_VALUE from database_properties where PROPERTY_NAME = 'NLS_RDBMS_VERSION') "VERSAO DO ORACLE"
, 'NOME DO DATABASE :  ' || a.NAME "Nome do DATABASE"
,  '        NOME DA INSTANCE : ' || b.INSTANCE_NAME "Nome da INSTANCE"
,  'STATUS DA INSTANCE : ' || b.STATUS "STATUS DA INSTANCE"
, 'TIPO DO CONTROLFILE : ' || a.CONTROLFILE_TYPE "TIPO DO CONTROLFILE"
, 'GERACAO DE ARCHIVE (ARQUIVMENTO) : ' || a.LOG_MODE "ARCHIVE STATUS"
, 'LOCAL DA GERAÇAO DE ARCHIVE NO ORACLE: ' || c.DEST_NAME "LOCAL ARCHIVE NO ORACLE"
, 'LOCAL DA GERAÇAO DE ARCHIVE NO SO OU ASM : ' || c.DESTINATION "LOCAL ARCHIVE NO SO"
, 'DATA CRIAÇÃO DB : ' || to_char(e.created,'DD-MM-RRRR HH24:MI:SS')  "DATA DE CRIAÇÃO"
from GV$DATABASE a , GV$INSTANCE b , GV$ARCHIVE_DEST c , database_properties d , gv$database e
where   c.STATUS <> 'INACTIVE'  ;

[ORACLE] - Tamanho Total da tablespace de UNDO

-- Tamanho Total da tablespace de UNDO

SELECT SUM(a.bytes)/1024/1024/1024 "UNDO_SIZE GB"
  FROM         v$datafile a,
                   v$tablespace b,
                   dba_tablespaces c
 WHERE         c.contents = 'UNDO'         AND 
            c.status = 'ONLINE'        AND    
            b.name = c.tablespace_name       AND
            a.ts# = b.ts#    ;


Obs : Se houver uma ou mais undo tablespace, elas são somados e disponibilizadas o valor total no retorno da consulta.

[ORACLE] - Verifica Tamanho Do Banco de Dados

--  Verifica Tamanho Do Banco de Dados

SELECT 'Database Tamanho' "*****"
,ROUND(SUM(ROUND(SUM(NVL(fs.bytes/1024/1024,0)))) /
SUM(ROUND(SUM(NVL(fs.bytes/1024/1024,0))) + ROUND(df.bytes/1024/
1024 - SUM(NVL(fs.bytes/1024/1024,0)))) * 100, 0) "%Livre"
,ROUND(SUM(ROUND(df.bytes/1024/1024 - SUM(NVL(fs.bytes/1024/
1024,0)))) / SUM(ROUND(SUM(NVL(fs.bytes/1024/1024,0))) +
ROUND(df.bytes/1024/1024 - SUM(NVL(fs.bytes/1024/1024,0)))) * 100,
0) "%Usado"
,SUM(ROUND(SUM(NVL(fs.bytes/1024/1024/1024,0)))) "GB Livre"
,SUM(ROUND(df.bytes/1024/1024/1024
- SUM(NVL(fs.bytes/1024/1024/1024,0)))) "GB Usado"
,SUM(ROUND(SUM(NVL(fs.bytes/1024/1024/1024,0))) + ROUND(df.bytes/1024/
1024/1024
- SUM(NVL(fs.bytes/1024/1024/1024,0)))) "Tamanho em GB"
FROM dba_free_space fs, dba_data_files df
WHERE fs.file_id(+) = df.file_id
GROUP BY df.tablespace_name, df.file_id, df.bytes,
df.autoextensible
ORDER BY df.file_id ;


Mostra os seguintes itens :
%Livre :  Valor expresso em porcentagem, que reprensenta o valor livre em uma escala de 0% a 100% do banco de dados
%Usado :  Valor expresso em porcentagem, que reprensenta o valor usado em uma escala de 0% a 100% do banco de dados
GB Free : Valor expresso em Giga Bytes, que reprensenta o valor livre do banco de dados
GB Usado : Valor expresso em Giga Bytes, que reprensenta o valor usado do banco de dados
Size : Valor expresso em Giga Bytes, que reprensenta o valor usado do banco de dados

quarta-feira, 23 de outubro de 2013

[MS SQL SERVER] - Alterar o nome de uma instância local do Microsoft SQL Server

Alterar o nome de uma instância local do Microsoft SQL Server, muitas vezes parecer ser um bicho de sete cabeça, ou melhor dizendo impossível, mas na verdade não é, logicamente trata-se de um procedimento que deve ser realizado com o máximo de atenção e cuidados.

A seguir, relacionei todos os passos necessários para fazer esta alteração sem correr riscos de perda de informações:

Faça o seguinte:
1-Dentro do banco Master.

2- Select @@ServerName –> será exibido o nome do servidor.

3 - sp_dropserver 'NomeAntigodoServidor'

4 - sp_addserver 'NovoNomedoServidor', LOCAL

5 - Reinicialize o seu servidor.

6 - Entre no Query Analyzer, se conectando ao servidor local.

7 - Select @@ServerName –> deverá ser exibido o novo nome especificado para o servidor.

Obs: Não se esqueça de colocar no final da linha de comando da sp_addserver a palavra LOCAL, para especificar como servidor local.

[MS SQL SERVER] - Procedimento para Atualizar Estatísticas do Banco de dados

Bom pessoal, segue abaixo procedimento para atualização das estatísticas do banco de dados:

ALTER procedure Atualizaestatisticas 
as 
declare @tablename varchar(100) 
declare @tablename_header varchar(75) 
declare tnames_cursor cursor for select name from sysobjects 
 where type = 'u' 
open tnames_cursor 
fetch next from tnames_cursor into @tablename 
while (@@fetch_status <> -1) 
begin 
 if (@@fetch_status <> -2) 
 begin 
  select @tablename_header = 'atualizando '  + rtrim(upper(@tablename)) 
  print @tablename_header 
  exec ('update statistics '  + @tablename ) 
 end 
 fetch next from tnames_cursor into @tablename 
end 
print ' ' 
print ' ' 
select @tablename_header = '*************  fim das tabelas  *************' 
print @tablename_header 
print ' ' 
print 'as estatisticas foram atualizadas para todas as tabelas' 
deallocate tnames_cursor
GO

[DNS] - Listas de DNS Free

#Servidor - Google DNS

Primário: 8.8.8.8
Secundário: 8.8.4.4


# Servidor de DNS Free "OpenDNS"

Primário: 208.67.220.222
Secundário: 208.67.220.220


# Servidor de DNS Free "Gtei"

Primário: 4.2.2.2
Secundário: 4.2.2.1

[Linux] - Script para limpar memória e agendando no cron



Vamos criar um arquivinho p/ checar nossa memória e limpar ela. É uma mão na roda!
Comandos:
# cd /etc/init.d/
# vim limpamemoria.sh

#!/bin/sh
# remontti.com.br
PATH="/bin:/usr/bin:/usr/local/bin"

# Porcentagem maxima (mude se vc achar q deve) eu deixo em 85%
percent=85

# Total da memoria:
ramtotal=`grep -F "MemTotal:" < /proc/meminfo | awk '{print $2}'`
# Memoria livre:
ramlivre=`grep -F "MemFree:" < /proc/meminfo | awk '{print $2}'`

# RAM utilizada pelo sistema:
ramusada=`expr $ramtotal - $ramlivre`

# Porcentagem de RAM utilizada pelo sistema:
putil=`expr $ramusada \* 100 / $ramtotal`

echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
date
echo
echo "Mem. utilizada: $putil %";

if [ $putil -gt $percent ]
then
date=`date`
echo $date >> /var/log/memoria.log
echo "Mem. utilizada: $putil %" >> /var/log/memoria.log

echo "Memoria acima de $percent %, cache foi limpado!";
sync
# 'Dropando' cache:
echo 3 > /proc/sys/vm/drop_caches
echo
free -m
echo
echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
else
echo "Cache nao foi limpado!";
echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
unset percent ramtotal ramlivre ramusada putil
exit $?
fi
Saia e salve o arquivo, agora vamos dar permissão de executá-lo:
# chmod 755 limpamemoria.sh
Vamos adicionar ao cron para rodar a cada 30 min.
Comandos:
# vim /etc/crontab
00-59/30 * * * * root /etc/init.d/limpamemoria.sh
Feito, cada vez q ele limpar vai gerar um log em var/log/memoria.log

Fonte:

[Linux] - Redimencionando SWAP sem reinstalar o Linux



Este artigo visa resolver o problema de pessoas que estão com pouca memória física ou por algum motivo precisam aumentar o tamanho de sua partição SWAP.

NOTA: Esta solução adiciona ao tamanho do SWAP que já existe o tamanho que você definir, então se você tem 500MB e adicionar mais 500MB, logo ficara com 1GB de SWAP.

1) Primeiramente, vamos ver quanto temos de SWAP:

# free 

OBS: Neste artigo usaremos o seguinte exemplo, uma máquina com 300MB iniciais de SWAP e aumentaremos para 800MB, mas você pode usar este exemplo e redimensionar seu SWAP a seu gosto, desde que tenha espaço em HD para isso.

2) Em seguida iremos criar um diretório no / (raiz) com o nome de swap:

# mkdir swap 

3) Agora criaremos a swap propriamente dita:

# cd swap 

4) Já que temos 300MB, teremos que adicionar 500MB, então faça a seqüência: 
# dd if=/dev/zero of=/swap/swapfile bs=1024 count=500000
500000+0 records in
500000+0 records out
# mkswap /swap/swapfile 
Setting up swapspace version 1, size = 509595904 bytes
# swapon /swap/swapfile

Pronto, agora vamos ver se rolou:

# free 

5) Vamos adicionar agora a nova entrada no FSTAB para montar no boot: 
# cd /etc
# vi fstab

** Acrescentamos a linha embaixo da outra palavra swap do FSTAB 
/swap/swapfile swap swap defaults 0 0

Salve e saia do FSTAB.

Pronto está feito, você acabou de aumentar sua SWAP.

Se quiser voltar ao tamanho original, delete o arquivo que esta em /swap e remova a linha do /etc/fstab. 

segunda-feira, 21 de outubro de 2013

[MySQL] - Resolvendo problemas de caracteres acentuados no MySQL


Antes de importar os dados para a sua base MySQL, defina um collation padrão. No Brasil o Latin1 é o mais utilizado, então o CHARSET (codificação de caracteres) padrão na Locaweb é o Latin1 e o COLLATE (collation) padrão é o latin1_general_ci. Scripts externos podem utilizar UTF8 e geralmente é por causa da diferença de codificação entre Latin1 e UTF8 que ocorrem erros de acentuação.
Verificar o Charset e Collate:

show variables like '%char%';


show variables like '%coll%';
A seguir estão alguns exemplos para definir um collation padrão para a sua base de dados:


ALTER DATABASE `sua_base` CHARSET = Latin1 COLLATE = latin1_swedish_ci;

ou


 ALTER DATABASE `sua_base` CHARSET = UTF8 COLLATE = utf8_general_ci;

CHARSET e COLLATE são coisas distintas, no MySQL, cada CHARSET possui COLLATEs, cada um com sua particularidade. O intuito deste Wiki não é explicar as características de cada um deles, pois pode ser visto da documentação do MySQL, mas daremos um pequeno descritivo entre latin1_general_ci, latin1_general_cs e latin1_swedish_ci.


  • latin1_general_ci: Não há distinção entre letras maiúsculas e minúsculas. Buscando por “teste”, registros como “Teste” ou “TESTE” serão retornados.
  • latin1_general_cs: Distingue letras maiúsculas e minúsculas. Buscando por “teste” somente retornará “teste”. Opções como “Teste” e “TESTE” não serão retornadas.
  • latin1_swedish_ci: Não distingue letras minúsculas e maiúsculas e nem caracteres acentuados e com cedilha, ou seja, o registro que contém a palavra “Intuição” será retornado quando houver uma procura pela palavra “intúicao”.

Quando você estiver exportando os dados da sua base de dados de origem, certifique-se de estar especificando a codificação corretamente. No phpMyAdmin há um menu DropDown próximo às opções de compactação ‘nenhum’, ‘zip’, ‘gzip’ e ‘bzip’ que normalmente está selecionada a opção ‘utf-8’. Mantenha este se sua base estiver com este CHARSET, do contrário, especifique ‘iso-8859-1’ caso ela esteja com o CHARSET Latin1.Faça o mesmo durante a importação. Ao enviar o arquivo, o menu DropDown estará como ‘utf-8’, se o CHARSET da base for ‘Latin1’ escolha o ‘iso-8859-1’.

Fonte:
http://wiki.locaweb.com.br/pt-br/Resolvendo_problemas_de_caracteres_acentuados_no_MySQL

[MS SQL SERVER] - Verificando a fragmentação de índices e fazendo sua reorganização

Verificando a fragmentação

Para verificar a fragmentação dos índices rode o seguinte comando SQL (basta definir o nome da base na primeira linha):
USE NomedaBase
GO
SELECT a.index_id, name, avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(DB_NAME()),
OBJECT_ID(N'dbo.OCR'), NULL, NULL, NULL) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id =
b.index_id WHERE name <> '' ORDER BY avg_fragmentation_in_percent DESC; 

Recriar os índices de uma tabela via comando SQL (Basta definir o nome da tabela na primeira linha):

ALTER INDEX ALL ON NomedaTabela
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
STATISTICS_NORECOMPUTE = ON);
GO

Recriar todos os índices do banco de dados (Definir o nome da base de dados na primeira linha)

Para recriar todos os índices da base de dados pode ser utilizado o seguinte comando SQL (Recomendamos que não seja executado em horário com muitos acessos a base de dados pois os índices ficarão indisponíveis durante o processo): 

use NomedaBase
GO
DECLARE @TableName VARCHAR(255)
DECLARE @sql NVARCHAR(500)
DECLARE @fillfactor INT
SET @fillfactor = 80
DECLARE TableCursor CURSOR FOR
SELECT OBJECT_SCHEMA_NAME([object_id])+'.'+name AS TableName
FROM sys.tables
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER INDEX ALL ON ' + @TableName +' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
EXEC (@sql)
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor
GO



Fonte:
http://wiki.locaweb.com.br/pt-br/%C3%8Dndices_MS_SQL 

[MS SQL SERVER] - Fazendo backup pela linha de Comando


Bom pessoal, vou compartilhar aqui a forma de fazer backup no SQL Server pela linha de comando:

SQLCMD -SBDTESTE -Usa -Pteste -Q "BACKUP DATABASE [TESTE] TO DISK = 'F:\TESTE\Backup_teste.bak'"

SQLCMD é o utilitário de linha de comando do MS SQL Server.
No parâmetro -S é para informar o nome do servidor. no parâmetro -U é para informar o usuário que efetuará o backup. no parâmetro -P é para informar a senha do usuário. no parâmetro -Q é para informar a sintaxe utilizada para o backup do SQL Server.

Para efetuar a inicialização dos serviços de banco de dados MS SQL Server :

Iiniciando:
NET START MSSQLSERVER

Parando:
NET STOP MSSQLSERVER

Espero ajudar alguns desenvolvedores e iniciantes em MS SQL Server, para auxiliar no seu dia-a-dia.
Que a Graça e Paz estejam com todos.

[PL/MySQL] - Artigos de Estudo sobre PL/MySQL

Bom pessoal, venho compartilhar com a comunidade de MySQL alguns links de artigos sobre PL/MySQL. Segue abaixo:

https://www.dropbox.com/s/sl85h6atf4qk427/sp_mysql.zip
https://www.dropbox.com/s/hnuu2cqqtbjh4vg/sp_mysql_0.pdf
https://www.dropbox.com/s/7q359tc553jdnaj/Transaccao.doc 
https://www.dropbox.com/s/yetcp3b82vj4kpp/SQL.pdf

Espero ajudar, aqueles que estejam a procura de informações sobre a Linguagem de Programação utilizado no SGBD MySQL.Que a Graça e Paz estejam com todos.

[PL/MySQL] - Compreenda as STORE PROCEDURES no MySQL



 
No cenário atual de desenvolvimento estamos cada vez mais preocupados com alguns princípios: A menor escrita de código possível (evitar redundância ao máximo), a centralização da regra de negócio e validação para facilitar a manutenção do projeto, a simplicidade e legibilidade no desenvolvimento do código e para finalizar a menor interdependência de situações no código. Dentro da evolução do desenvolvimento existe uma fase onde partes das regras de negócios estavam localizadas no banco de dados, isto foi possível devido ao recurso da STORE PROCEDURE que são um conjunto de instruções SQL armazenado no servidor. Os dois maiores fatores negativos deste cenário são:
- É o maior poder para o DBA (que agora também fica com a função de programador),
- Aumento na utilização dos recursos no servidor.
ATENÇÃO: Não utilize STORE PROCEDURE para implantação de bibliotecas para serem utilizadas na sua programação por que isto é trabalho para as linguagens de programação, além do mais teria um custo elevado no desempenho de sua aplicação.
De acordo com o manual do MySQL você pode utilizar STORE PROCEDURES neste cenário:
a) Quando várias aplicações clientes são escritas em diferentes linguagens ou funcionam em diferentes plataformas, mas precisam realizar as mesmas operações de banco de dados.
b) Quando a segurança é prioritária. Bancos, por exemplo, usam stored procedures para todas as operações comuns. Isto fornece um ambiente consistente e seguro, e procedures podem assegurar que cada operação seja registrada de forma apropriada. Neste tipo de condiguração, aplicações e usuários não conseguiriam nenhuma acesso as tabelas do banco de dados diretamente, mas apenas podem executar stored procedures específicas.
Vale ressaltar que há um tempo a Microsoft encorajava o desenvolvimento de suas aplicações com STORE PROCEDURES devido ao esquema de segurança.
A STORE PROCEDURE está presente desde a versão 5 do MySQL e segue a sintaxe do SQL:2003 o mesmo utilizado pelo DB2 da IBM. Após esta explicação, voltemos ao projeto da locadora de DVD e vejamos na prática como implantamos STORE PROCEDURES.

Abaixo o DER que iremos trabalhar:
DER Locadora de DVD

Sintaxe de uma procedure:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE PROCEDURE NOME_DA_PROCEDURE
(
tipo_parametro1(Valores possíveis: [ IN | OUT | INOUT ])

parametro1
tipo_dado1(Qualquer tipo válido do mysql(varchar, char, int, date)
, [
tipo_parametro2(Valores possíveis: [ IN | OUT | INOUT ])
parametro2
tipo_dado2(Qualquer tipo válido do mysql(varchar, char, int, date)
]

)

BEGIN
INSTRUCOES SQL;
END

Tipos de Parâmetros:

a) IN => Parâmetro de entrada. É passado um valor que vai será utilizado no corpo da procedure;
b OUT =>Parâmetro de saída. Retorna um valor que pode fica armazenado na memória do servidor;
c) INOUT => Possui a funcionalidade de entrada e saída ao mesmo tempo.
Vamos fazer o procedimento de CRUD para a tabela tegenero (idGenero int(autoincremento), NmGenero, FgStatus smallint) da locadora:

Código de Inserção:

1
2
3
4
5
6
DELIMITER $$
CREATE PROCEDURE prInsereGenero (IN strNmGenero varchar(100), intFgStatus smallint)
BEGIN
INSERT INTO teGenero(NmGenero, FgStatus) VALUES (strNmGenero, intFgStatus);
END $$
DELIMITER ;

Código de exclusão:

1
2
3
4
5
6
DELIMITER $$
CREATE PROCEDURE prExcluiGenero (IN intidGenero int)
BEGIN
DELETE FROM tegenero WHERE idGenero = intidGenero;
END $$
DELIMITER ;

Código de Edição:

1
2
3
4
5
6
7
8
DELIMITER $$
CREATE PROCEDURE prEditaGenero (IN intIdGenero int, strNmGenero varchar(100), intFgStatus smallint)
BEGIN
UPDATE tegenero SET NmGenero = strNmGenero
, FgStatus = intFgStatus
WHERE idGenero = intIdGenero;
END $$
DELIMITER ;

Código da Chamada:

1
2
3
CALL prInsereGenero ('Teste A', 0);
CALL prEditaGenero (2, 'Teste B', 1);
CALL prExcluiGenero (1);

sexta-feira, 18 de outubro de 2013

[ORACLE] - VIEWS PARA TROBLESHOOTING E TUNNIG


[PL/SQL] - Procedimento para Atualização Manual de Estatísticas do Oracle

Procedimento para Atualização Manual de Estatísticas do Oracle:

BEGIN
FOR
rc IN (SELECT T.TABLE_NAME FROM USER_TABLES T)

LOOP
BEGIN
DBMS_STATS.UNLOCK_TABLE_STATS(USER, rc.table_name);
DBMS_STATS.DELETE_TABLE_STATS(USER, rc.table_name);
DBMS_STATS.GATHER_TABLE_STATS(USER, rc.table_name);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('ERRO AO ATUALIZAR ESTATÍSTICA DO USUÁRIO: ' ||
USER || '.' || rc.table_name ||
' - ' || SQLERRM);
END;
END LOOP;
END;

[ORACLE] - Backup do Rman para Linux

Script para efetuar backup do Rman no Linux:

#!/bin/bash

export ORACLE_SID=orateste
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export DTHMS=$(date +"%Y%m%d%H%M%S")
export ORACLE_BACKUP=/backup/bkp_rman

#
# Dir backup
destino=$ORACLE_BACKUP

# Variavel para contar o numero de backups
contador=`cat $destino/contador`

#Quantidade de dias para manter
qtde=3
incluir=$(($contador+1))
excluir=$(($contador-$qtde))

# Incrementa Variavel do Contador
/bin/echo $incluir > $destino/contador

# Cria o novo diretorio
arquivoincluir=$DTHMS"_"$incluir
/bin/mkdir -p $destino/$arquivoincluir

#
# Script RMAN
#
echo run { > $destino/backup_RMAN.rman
echo CONFIGURE RETENTION POLICY TO REDUNDANCY 1';' >> $destino/backup_RMAN.rman
echo CONFIGURE CONTROLFILE AUTOBACKUP ON';' >> $destino/backup_RMAN.rman
echo CONFIGURE BACKUP OPTIMIZATION ON';' >> $destino/backup_RMAN.rman
echo CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK';' >> $destino/backup_RMAN.rman
echo CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 1';' >> $destino/backup_RMAN.rman
echo CONFIGURE CHANNEL DEVICE TYPE DISK MAXPIECESIZE 4400M';'  >> $destino/backup_RMAN.rman
echo SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO "'""$ORACLE_BACKUP/$arquivoincluir/AUTO_%F.cf_spf""'"';' >> $destino/backup_RMAN.rman
echo backup format "'""$ORACLE_BACKUP/$arquivoincluir/db_%d_%s_%p.bus""'" database';'  >> $destino/backup_RMAN.rman
echo backup format "'""$ORACLE_BACKUP/$arquivoincluir/al_%d_%s_%p.bus""'" archivelog all delete all input';' >> $destino/backup_RMAN.rman
echo sql '"'"alter database backup controlfile to trace as ''$ORACLE_BACKUP/$arquivoincluir/TXT_"$ORACLE_SID"_CF.ctl''"'"'';'  >> $destino/backup_RMAN.rman
echo sql '"'"create pfile=''$ORACLE_BACKUP/$arquivoincluir/TXT_"$ORACLE_SID"_PF.ora'' from spfile"'"'';'  >> $destino/backup_RMAN.rman
echo }  >> $destino/backup_RMAN.rman
echo run {  >> $destino/backup_RMAN.rman
echo crosscheck archivelog all';' >> $destino/backup_RMAN.rman
echo crosscheck backup';' >> $destino/backup_RMAN.rman
echo delete noprompt expired backup';' >> $destino/backup_RMAN.rman
echo delete noprompt obsolete';'  >> $destino/backup_RMAN.rman
echo } >> $destino/backup_RMAN.rman
#
$ORACLE_HOME/bin/rman target / nocatalog @$destino/backup_RMAN.rman > $ORACLE_BACKUP/$arquivoincluir/BACKUP_LOG_"$ORACLE_SID"_$arquivoincluir.log

# Exclui o diretorio de backup antigo
cd $destino
arquivoexcluir=*_$excluir
rm -rf $arquivoexcluir