sexta-feira, 22 de maio de 2015

Instalação do MySQL no CentOS [MySQL];

O objetivo desse post é descrever a tarefa de instalação do MySQL em um ambiente Linux CENTOS 6 ou 7 (Testado em 2 versões).

1.) Procedimentos para a Instalação

Conectado com Usuário root

-- Para preparar o ambiente, antes deve executar os comandos

# yum update
# yum install Perl
# yum install -y perl-Data-Dumper

-- Será necessário criar um grupo para o MySQL e adicionar um usuário que vai servir apenas para fins administrativos, sem direitos de login.

# groupadd mysql
# useradd -r -g mysql mysql

-- Copiar o binário do MySQL (*.tar.gz) e Colar no diretório /usr/local do servidor Linux CENTOS – Utilizar o WINSCP
 
# cd /usr/local
# tar zxvf mysql-advanced-5.6.24-linux-glibc2.5-x86_64.tar.gz
# ln -s mysql-advanced-5.6.24-linux-glibc2.5-x86_64 mysql

# cd mysql
# chown -R mysql .
# chgrp -R mysql .


-- Instalando o Banco MySQL

# scripts/mysql_install_db --user=mysql
# chown -R root .
# chown -R mysql data


-- Para manter uma cópia dos arquivos abaixo

# cp support-files/my-default.cnf /etc/my.cnf
# bin/mysqld_safe --user=mysql &
# cp support-files/mysql.server /etc/init.d/mysql


2.) Configuração e Teste do Servidor

-- Editar o arquivo my.cnf localizado no diretório /etc/

# vi /etc/my.cnf

-- Adicionar os parâmetros abaixo e salvar - :wq!

[mysqld]
datadir=/var/lib/mysql/
socket=/tmp/mysql.sock
port=3306
user=mysql

[mysql.server]
basedir=/usr/local/mysql

-- Testar a inicialização do MySQL

# /etc/init.d/mysql start
-- > Mensagem de sucesso Starting MySQL.. SUCCESS!

-- Criando o arquivo mysql.sh no diretório /etc/profile.d/

# touch /etc/profile.d/mysql.sh
# vi /etc/profile.d/mysql.sh

-- Adicionar dentro do arquivo o caminho abaixo e salvar - :wq!

 PATH=${PATH}:/usr/local/mysql/bin

-- Será necessário reiniciar o Servidor para as alterações funcionarem

# reboot

-- Após reboot, Conectar novamente com o usuário root e executar:

# /etc/init.d/mysql start
# mysql
# exit

3.) Alterando a Senha do Usuário root MySQL

# /usr/local/mysql/bin/mysqladmin -u root password'Senha123'

-- Acessando o MySQL com o usuário root

# mysql -u root -pSenha123


Abs, Bruno Duarte.

terça-feira, 28 de abril de 2015

Procedure que gera INSERT de uma Tabela [SQL Server];

Encontrei uma procedure na WEB muito legal, que gera os INSERTS dos dados de uma tabela.

Executei em uma instância SQL Server 2008 - Só consegui testar nesta versão.

CREATE PROC InsertGenerator
(@tableName varchar(100)) as

DECLARE cursCol CURSOR FAST_FORWARD FOR 
SELECT column_name,data_type FROM information_schema.columns WHERE table_name = @tableName
OPEN cursCol
DECLARE @string nvarchar(3000) 
DECLARE @stringData nvarchar(3000) 
DECLARE @dataType nvarchar(1000) 
SET @string='INSERT '+@tableName+'('
SET @stringData=''

DECLARE @colName nvarchar(50)

FETCH NEXT FROM cursCol INTO @colName,@dataType

IF @@fetch_status<>0
 begin
 print 'Table '+@tableName+' not found, processing skipped.'
 close curscol
 deallocate curscol
 return
END

WHILE @@FETCH_STATUS=0
BEGIN
IF @dataType in ('varchar','char','nchar','nvarchar')
BEGIN
 SET @stringData=@stringData+''''+'''+isnull('''''+'''''+'+@colName+'+'''''+''''',''NULL'')+'',''+'
END
ELSE
if @dataType in ('text','ntext') 
BEGIN
 SET @stringData=@stringData+'''''''''+isnull(cast('+@colName+' as varchar(2000)),'''')+'''''',''+'
END
ELSE
IF @dataType = 'money' 
BEGIN
 SET @stringData=@stringData+'''convert(money,''''''+isnull(cast('+@colName+' as varchar(200)),''0.0000'')+''''''),''+'
END
ELSE 
IF @dataType='datetime'
BEGIN
 SET @stringData=@stringData+'''convert(datetime,'+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+',121)+'''''+''''',''NULL'')+'',121),''+'
 END
ELSE 
IF @dataType='image' 
BEGIN
 SET @stringData=@stringData+'''''''''+isnull(cast(convert(varbinary,'+@colName+') as varchar(6)),''0'')+'''''',''+'
END
ELSE 
BEGIN
 SET @stringData=@stringData+''''+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+')+'''''+''''',''NULL'')+'',''+'
END

SET @string=@string+@colName+','

FETCH NEXT FROM cursCol INTO @colName,@dataType
END
DECLARE @Query nvarchar(4000)

SET @query ='SELECT '''+substring(@string,0,len(@string)) + ') VALUES(''+ ' + substring(@stringData,0,len(@stringData)-2)+'''+'')'' FROM '+@tableName
exec sp_executesql @query

CLOSE cursCol
DEALLOCATE cursCol


GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

Após criar, a chamada da Procedure será assim:
EXEC InsertGenerator 'TABELA' --Nome da tabela o qual deseja gerar os INSERTS

Resultado

sexta-feira, 27 de fevereiro de 2015

Como retornar todas as linhas de um Select em apenas uma [Oracle e SQL Server];

Aqui vai uma dica muito legal de como retornar todas as linhas de um SELECT em apenas uma só!

Com certeza em algum momento, vocês ainda irão precisar disso.

Bom.. Vamos lá!

--ORACLE - Função WM_CONCAT ou LISTAGG

select wm_concat(COLUNA) from TABELA
where rownum <= 5;

SELECT LISTAGG(COLUNA, ',') WITHIN GROUP (ORDER BY COLUNA) APELIDO
FROM TABELA where rownum <= 5;



--SQL Server - Função STUFF (Para retirar a primeira vírgula) e utilizando FOR XML PATH('')

SELECT top 1
     STUFF( 
       (  
           select ',' + COLUNA
           from TABELA
           FOR XML PATH('')
       ),1,1,''
    )AS A
from TABELA

Abs,
Bruno Duarte.

quinta-feira, 5 de fevereiro de 2015

Apagar todos os Objetos de um schema/usuário [Oracle];

Quando precisamos "Limpar" um schema/usuário no Oracle, utilizamos o comando:

DROP USER schema CASCADE;

O problema disso é ter o trabalho de recriar o usuário e conceder todas as permissões (Grants) novamente.

Porém...
Podemos utilizar este Script que apaga (DROP) todos os objetos do schema, facilitando assim muito o nosso trabalho.


-- ORACLE 11g
BEGIN
   for rec1 in (select decode(object_type, 'TABLE', 'A', '')||OBJECT_TYPE AS ORDEM_TYPE, object_type, object_name from user_objects where object_type not in ('PACKAGE BODY','INDEX','TRIGGER', 'LOB', 'JOB') order by 1) loop
     EXECUTE IMMEDIATE 'drop ' || rec1.object_type || ' ' || rec1.object_name || case rec1.object_type when 'TABLE' then ' cascade constraints' when 'TYPE' then ' FORCE' else '' end;
   end loop;
      
   for rec in (select job_creator, job_name from user_SCHEDULER_JOBS) loop
       DBMS_SCHEDULER.DROP_JOB(JOB_NAME => '"'||rec.job_creator||'"."'||rec.job_name||'"', defer=>false, force=>false);
   end loop;

   for rec in (select job from user_JOBS) loop
       DBMS_JOB.REMOVE(job => rec.job);
   end loop;

exception when others then
   raise_application_error(-20001,'An error was encountered - ' || SQLCODE || ' -ERROR- ' || SQLERRM);
END;
/
--Limpa a Lixeira a nível de Usuário
PURGE RECYCLEBIN;
/


-- ORACLE 10g
BEGIN
   for rec1 in (select decode(object_type, 'TABLE', 'A', '')||OBJECT_TYPE AS ORDEM_TYPE, object_type, object_name from user_objects where object_type not in ('PACKAGE BODY','INDEX','TRIGGER', 'LOB', 'JOB') order by 1) loop
     EXECUTE IMMEDIATE 'drop ' || rec1.object_type || ' ' || rec1.object_name || case rec1.object_type when 'TABLE' then ' cascade constraints' when 'TYPE' then ' FORCE' else '' end;
   end loop;
      
   for rec in (select job_creator, job_name from user_SCHEDULER_JOBS) loop
       DBMS_SCHEDULER.DROP_JOB(JOB_NAME => '"'||rec.job_creator||'"."'||rec.job_name||'"', force=>false);
   end loop;

   for rec in (select job from user_JOBS) loop
       DBMS_JOB.REMOVE(job => rec.job);
   end loop;

exception when others then
   raise_application_error(-20001,'An error was encountered - ' || SQLCODE || ' -ERROR- ' || SQLERRM);
END;
/
--Limpa a Lixeira a nível de Usuário
PURGE RECYCLEBIN;
/

Abs, Bruno Duarte.

quarta-feira, 21 de janeiro de 2015

ORA-01144: File size (6400000 blocks) exceeds maximum of 4194303 [Oracle];

Já devem ter visto este tipo de erro ao criar uma Tablespace.

SQL Error: 
ORA-01144: File size (6400000 blocks) exceeds maximum of 4194303 blocks
01144. 00000 -  "File size (%s blocks) exceeds maximum of %s blocks"

*Cause:    Specified file size is larger than maximum allowable size value.
*Action:   Specify a smaller size.

Esse tipo de erro ocorre quando tentamos criar uma Tablespace com um tamanho maior que o limite do Bloco (db_block_size).

É possível verificar o Tamanho do Bloco do seu Banco de Dados, pelos comandos:

show parameter DB_BLOCK_SIZE
SELECT  * FROM v$parameter
WHERE   name = lower('DB_BLOCK_SIZE');

No meu caso o Bloco do meu Banco tem o tamanho de 8192 (8kb).

 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------
db_block_size                        integer     8192

Visualizando a tabela abaixo, eu só conseguiria criar uma Tablespace de até 32GB.

db_block_size | Datafile upper limit
------------------------------------
      2kb               8GB
      4kb              16GB
      8kb              32GB
      16kb             64GB
      32kb             128GB

Porém..
Temos 2 soluções para este caso.

A primeira delas seria criar múltiplos datafiles com um tamanho menor.
A outra seria utilizar BIGFILE tablespaces (Funcionalidade que chegou no Oracle 10g).

Create BIGFILE tablespace TSD_DADOS datafile '/o1/dat/dados.dbf' size 80000M;

Abs,
Bruno Duarte.

quarta-feira, 14 de janeiro de 2015

Como limpar a Tablespace Temporária [Oracle];

Já devem ter passado por situações em que fosse necessário limpar a Tablespace TEMP.

Caso você tenha tentado efetuar um DROP para depois recriar a Tablespace TEMP, com certeza o seguinte erro retornou:

SQL> DROP TABLESPACE temp;
drop tablespace temp
*
ERROR at line 1:
ORA-12906: cannot drop default temporary tablespace

Por segurança do próprio Oracle, não conseguimos remover essa Tablespace, ao menos que tenhamos uma outra por default.

Ok...
Para começarmos, o primeiro passo é criar uma outra Tablespace temporária - TEMP2

--Obs: caso não saiba o local do diretório, verificar nas
--views V$TEMPFILE ou DBA_TEMP_FILES.
CREATE TEMPORARY TABLESPACE TEMP2
TEMPFILE 'C:\ORACLE\ORADATA\SW92\TEMP2.DBF' SIZE 500m REUSE
AUTOEXTEND ON NEXT 100M MAXSIZE unlimited
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

--Alteramos para default a nova tablespace recém criada (TEMP2).  
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP2;

--Efetuamos um DROP na antiga Tablespace (No meu caso era a TEMP).
DROP TABLESPACE TEMP including contents and datafiles;

Agora caso queira deixar a Tablespace Temporária com o mesmo nome que antes, será necessário efetuar os passos abaixo.

--Criar uma outra Tablespace Temporária
CREATE TEMPORARY TABLESPACE TEMP
TEMPFILE 'C:\ORACLE\ORADATA\SW92\TEMP.DBF' SIZE 500m REUSE 
AUTOEXTEND ON NEXT 100M MAXSIZE unlimited 
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

--Alterar para default
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP;

--Remover a outra Tablespace temporária.
DROP TABLESPACE TEMP2 including contents and datafiles;


Att,
Bruno Duarte.

quinta-feira, 8 de janeiro de 2015

Cálculo do Digito Verificador CPF [Oracle];

Boa tarde!

Em um post do fórum glufke.net estava rolando um assunto sobre como calcular o Digito Verificador do CPF, e um dos usuários desenvolveu a seguinte query que achei muito legal.


select cpf, cast(dig1 || dig2 as varchar2(2)) DigitoVerificador
  from dual
model dimension by (1 as x)
measures (lpad(285757824, 10, '0') as cpf, --O CPF deve ser incluso aqui e sem o digito verificador (Substituir pelo número 285757824)
          0 as m1, 
          0 as dig1, 
          0 as m2, 
          0 as dig2, 
          cast(null as varchar2(11)) as cpfdv)
rules iterate (11)
(  m1[1] = m1[1] + (nvl(substr(cpf[1], iteration_number + 1, 1), 0) * (11 - iteration_number)),
  dig1[1] = case when mod(m1[1], 11) < 2 then 0 else 11 - mod(m1[1], 11) end,
cpfdv[1] = cpf[1] || dig1[1],
    m2[1] = m2[1] + (nvl(substr(cpfdv[1], iteration_number + 1, 1), 0) * (12 - iteration_number)),
  dig2[1] = case when mod(m2[1], 11) < 2 then 0 else 11 - mod(m2[1], 11) end);

O Retorno da consulta é justamente o digito verificador do seu CPF!

Valeu,
Bruno Duarte

sexta-feira, 5 de dezembro de 2014

Criando um Linked Server do SQL Server para MySQL - Sem usar OPENQUERY;

Pra quem já precisou alguma vez utilizar um Linked Server (Ou até DBLINK), sabe que para criar a "ponte" entre 2 SGBDS é necessário configurar o ODBC.

Como irei demonstrar a conexão entre o SQL Server para o MySQL, antes de começarmos você deverá baixar o driver ODBC do MySQL pelo site http://dev.mysql.com/downloads/connector/odbc/ e instalá-lo no Servidor de Banco de Dados SQL Server.



Na aba Fonte de Dados de Sistema adicione o driver MySQL ODBC ANSI.



Data Source Name: É o nome do Link (Ponte).
Description: Apenas utilizado caso queria preencher com alguma observação.
TCP/IP Server: IP do servidor MySQL.




Pronto ! Agora vamos ao SQL Server.



Defina os parâmetros:

Provedor/Provider: Microsoft OLE DB Provider for ODBC Drivers
Cadeia de caracteres do provedor/ Provider String: MySQL ODBC 5.3 ANSI Driver;SERVER=192.168.0.1;PORT=3306;DATABASE=bancomysql; USER=user;PASSWORD=password;OPTION=3;

OBS:
Server= IP do Servidor MYSQL
DataBase=Banco de dados MYSQL


Ok, executando o Select...

Select * FROM MYSQL_LINK...TABELA_MYSQL
Sintaxe  [Nome do Linked Server][...][Tabela do MYSQL]

Ops... Erro do Provedor MSDASQL.


Em Provedores, adicione nas propriedades do MSDASQL as opções conforme Print:

A opção que lhe permitirá executar o Select no formato [Nome do Linked Server][...][Tabela do MYSQL] é a SOMENTE NÍVEL ZERO.

Bom, agora vamos ao que nos interessa.

Select * FROM MYSQL_LINK...TABELA_MYSQL

















Att,
Bruno Duarte.

terça-feira, 25 de novembro de 2014

Problema ao restaurar backup do SQL Server 2000 para o 2012 [SQL Server];

Senhores, Boa tarde !

Se caso já tentou alguma vez restaurar backup do SQL Server 2000 para o 2012, com certeza retornou o seguinte erro:

-----------------------------------------------------------------------------------------------

 Msg 3169, Level 16, State 1, Line 2

The database was backed up on a server running version 8.00.0818. That version is incompatible with this server, which is running version 11.00.3000. Either restore the database on a server that supports the backup, or use a backup that is compatible with this server.

Msg 3013, Level 16, State 1, Line 2

RESTORE DATABASE is terminating abnormally.

-----------------------------------------------------------------------------------------------

No SQL Server 2012, só é possível restaurar backups feitos da versão 2005 ou superior.

Para a solução, será necessário restaurar o backup do SQL Server 2000 em alguma outra instância SQL Server 2005 ou 2008.

No SQL Server 2005 ou 2008:

Defina o nível de compatibilidade (compatibility level) para SQL Server 2005 (90) ou SQL Server 2008 (100) e restaure o Backup.



Após finalizado, efetue o backup do banco de dados que foi feita a importação, e restaure o arquivo .BAK gerado no SQL Server 2012.

Bruno Duarte.

sexta-feira, 14 de novembro de 2014

Tabela READ ONLY - Funcionalidade do Oracle 11g [Oracle];

Senhores, Bom dia!

Uma das novas funcionalidades que chegou com o Oracle 11g foi a possibilidade de alterar uma tabela somente para leitura. Vou explicar um pouco melhor...

Quando criamos um usuário e queremos que ele tenha apenas a permissão de SELECT em uma tabela, concedemos o GRANT de SELECT a ele, mas e se você também quisesse que ninguém tivesse acesso a esta específica tabela? e até mesmo o proprietário (OWNER), SYS e SYSTEM.

Bom.. agora isto é possível com a funcionalidade READ ONLY - Garante que apenas o SELECT seja executado e para os outros comandos DML e Truncate (DDL), não são permitidos.

Bom...vamos ao exemplo.

ALTER TABLE TABELA READ ONLY;


E para permitir novamente os acessos a Tabela, utilizamos:

ALTER TABLE TABELA READ WRITE;

Parceria - Antonio Nilson: LinkedIn

Abs,
Bruno Duarte.

sexta-feira, 10 de outubro de 2014

Order BY em campo Varchar2 [Oracle];

Senhores, Boa tarde.

Aqui vai uma dica para o tipo de ordenação do comando ORDER BY.
Se ainda não ficou claro do que eu estou falando, vamos imaginar um campo Varchar2, contendo String, números e etc.

No ORDER BY, Como que iriam vir ordenados ?


















No meu caso retornou primeiro String e depois os números, isto ocorre pelo o valor que está definido do parâmetro NLS_SORT.

select * from nls_session_parameters;
















Se caso precisar que os caracteres numéricos apareçam antes dos caracteres alfabéticos, podemos fazer isso de 2 jeitos - Alterando a Sessão ou por uma Função própria do Oracle.

1- Alterando a Sessão
ALTER SESSION SET NLS_SORT='BINARY';

2-Pela Função NLSSORT
Ex: select nome from produto order by NLSSORT(nome,'NLS_SORT=BINARY');
















Se for necessário que seja ordenado de alguma outra maneira, nesta tabela mostra como seria ordenado se o NLS_SORT fosse definido para WEST_EUROPEAN, BINARY, BINARY_CI e BINARY_AI.














Abs!
Bruno Duarte.

quinta-feira, 18 de setembro de 2014

Commit a cada bloco de Insert - Otimizado [Oracle];

Senhores, Boa tarde!

Conforme falado no Post anterior, o desempenho da codificação do FORALL é extremamente rápido.

Precisei migrar uma tabela com alguns milhões de registros, assim foi necessário efetuar um INSERT parcial.
No exemplo, a cada 500 Mil de INSERTS será feito um commit:

DECLARE
   
   C_limit PLS_INTEGER := 500000;

   TYPE TCOLUNA1 IS TABLE OF TABELA.COLUNA1%TYPE;
   TYPE TCOLUNA2 IS TABLE OF TABELA.COLUNA2%TYPE;
   TYPE TCOLUNA3 IS TABLE OF TABELA.COLUNA3%TYPE;
   TYPE TCOLUNA4 IS TABLE OF TABELA.COLUNA4%TYPE;
   TYPE TCOLUNA5 IS TABLE OF TABELA.COLUNA5%TYPE;
   TYPE TCOLUNA6 IS TABLE OF TABELA.COLUNA6%TYPE;
   TYPE TCOLUNA7 IS TABLE OF TABELA.COLUNA7%TYPE;
   TYPE TCOLUNA8 IS TABLE OF TABELA.COLUNA8%TYPE;
   TYPE TCOLUNA9 IS TABLE OF TABELA.COLUNA9%TYPE;
     
   V_COLUNA1 TCOLUNA1;
   V_COLUNA2 TCOLUNA2;
   V_COLUNA3 TCOLUNA3;
   V_COLUNA4 TCOLUNA4;
   V_COLUNA5 TCOLUNA5;
   V_COLUNA6 TCOLUNA6;
   V_COLUNA7 TCOLUNA7;
   V_COLUNA8 TCOLUNA8;
   V_COLUNA9 TCOLUNA9;

   CURSOR CUR IS
   SELECT COLUNA1,COLUNA2,COLUNA3,COLUNA4,COLUNA5,COLUNA6,COLUNA7,COLUNA8,COLUNA9
   FROM TABELA;

BEGIN

 OPEN CUR;
   
   LOOP
      FETCH CUR
      BULK COLLECT INTO V_COLUNA1,V_COLUNA2,V_COLUNA3,V_COLUNA4,V_COLUNA5,V_COLUNA6,V_COLUNA7,V_COLUNA8,V_COLUNA9
      LIMIT c_limit;


      FORALL i in 1..V_COLUNA1.count
  
        INSERT INTO NOVA_TABELA
        (COLUNA1,COLUNA2,COLUNA3,COLUNA4,COLUNA5,COLUNA6,COLUNA7,COLUNA8,COLUNA9)
        VALUES
        (V_COLUNA1(i),V_COLUNA2(i),V_COLUNA3(i),V_COLUNA4(i),V_COLUNA5(i),V_COLUNA6(i),V_COLUNA7(i),V_COLUNA8(i),V_COLUNA9(i));
      
      EXIT WHEN V_COLUNA1.COUNT = 0;
      DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQL%ROWCOUNT) || ' Linhas INSERIDAS');  
      COMMIT;
  
    END LOOP;
 CLOSE CUR;  
END;
Valeu,
Bruno Duarte.

sexta-feira, 5 de setembro de 2014

Commit a cada bloco de Delete - Otimizado [Oracle];

Pessoal,

Neste Post http://dbaduarte.blogspot.com.br/2014/05/commit-cada-bloco-de-delete.html demonstrei como efetuar um DELETE em massa com COMMIT, porém há outra forma muito mais rápida, sendo eficiente para tabelas com milhares de registros.

O Desempenho da codificação do FORALL é extremamente mais veloz que um LOOP, pois a declaração é executada apenas uma vez para cada entrada da coleção.

No exemplo, a cada 1 Milhão de DELETES será feito um commit:

DECLARE
       c_limit PLS_INTEGER := 1000000;

       TYPE urowid_table  IS TABLE OF UROWID  INDEX BY BINARY_INTEGER;
       rowids urowid_table;
 
   CURSOR CUR IS 
       Select rowid from TABELA
       where ID > 20;
   
BEGIN
   OPEN CUR;
   
     LOOP

       FETCH CUR
       BULK COLLECT INTO ROWIDS
       LIMIT c_limit;

         FORALL i in 1..ROWIDS.count
      
         delete from TABELA
         where ROWID = ROWIDS(i);
      
         EXIT WHEN ROWIDS.COUNT = 0;
         DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQL%ROWCOUNT) || ' Linhas Deletadas');
         COMMIT;  

     END LOOP;
   CLOSE CUR;
END;

Valeu,
Bruno Duarte.

segunda-feira, 1 de setembro de 2014

Conexões do SQL Developer [Oracle];

Bom dia!

Já tive um problema com as minhas conexões salvas no SQL Developer, e por um momento achei que havia perdido todas elas.


As nossas conexões ficam salvas em um arquivo .XML, e assim foi possível importá-las novamente. - Ufa !

No Windows XP, encontramos no diretório:
C:\Documents and Settings\<username>\Application Data\SQL Developer\systemX.X.X.X.X\o.jdeveloper.db.connection.X.X.X.X.X.X.X\connections.xml

No Windows 7 (meu caso), diretório:
C:\Users\<username>\AppData\Roaming\SQL Developer\systemX.X.X.X.X\o.jdeveloper.db.connection.X.X.X.X.X.X.X\connections.xml

Caso já havia feito o upgrade do SQL Developer para 4.0.2, para cada versão é possível obter as conexões.















Agora é só salvá-las!

Abs,
Bruno Duarte.

quinta-feira, 28 de agosto de 2014

Comandos do Linux no Windows CMD;

Galera, Bom dia!

Aqui vai uma dica muito útil para utilizar alguns dos comandos Linux no Prompt (CMD) do Windows.

Disponibilizei para download no meu OneDrive o pacote necessário: Aqui


















Copie a pasta MinGW para a Raiz C:\
Em variáveis de ambiente - Variável PATH, adicione o diretório C:\MinGW\msys\1.0\bin





























Neste diretório é possível ver os comandos que podem ser utilizados.
Agora só abrir o CMD e sair usando

















Abs,
Bruno Duarte.

segunda-feira, 18 de agosto de 2014

Como parar a execução de um IMPDP OU EXPDP [Oracle];

Bom dia!

Quando importamos (IMPDP) ou exportamos (EXPDP) usando o datapump, a execução é feita por um JOB.

É possível vermos o processo em execução pela view dba_datapump_jobs.

select * from dba_datapump_jobs;







Se por algum motivo queira parar a execução, na janela do prompt:

1- Aperte: Ctrl+C
2- Digite: kill_Job 
ex: Import>kill_job
3- Confirme a pergunta com Y - Are you sure you wish to stop this job (y/n): y

Caso tenha fechado a janela do prompt não irá adiantar, o job ainda ficará rodando em background, mas ainda há uma solução para o encerrarmos.

Abra uma nova janela do prompt, digite:
-Caso Import
impdp system/senha@instancia attach=nome_do_job

-Caso Export
expdp system/senha@instancia attach=nome_do_job

Obs:
-Entre com a instância qual deseja encerrar o Job
-O nome do Job encontramos na view dba_datapump_jobs, no meu caso SYS_IMPORT_FULL_01

2- Digite: kill_Job 
ex: Import>kill_job
3- Confirme a pergunta com Y - Are you sure you wish to stop this job (y/n): y

Pronto! Os jobs foram encerrados com sucesso.

Abs,
Bruno Duarte.

terça-feira, 12 de agosto de 2014

Desabilitar a geração dos Arquivos de Alerta e Log - Oracle Client [Oracle];

Pessoal, Boa tarde!

O Oracle Client também gera Logs podendo ocupar um grande espaço desnecessário.

Podemos verificar o tamanho das pastas alert e trace no diretório:

Exemplo: .../oradiag_[username]/diag/clients/user_[username]/host_nnnnnn_nn


















Para desabilitarmos os logs, temos que adicionar os seguintes parâmetros no arquivo SQLNET.ORA.

DIAG_ADR_ENABLED = OFF
TRACE_LEVEL_CLIENT = OFF
TRACE_DIRECTORY_CLIENT=/dev/null
LOG_DIRECTORY_CLIENT = /dev/null
LOG_LEVEL_CLIENT = OFF












Abs,
Bruno Duarte.


segunda-feira, 28 de julho de 2014

ORA-14460: only one COMPRESS or NOCOMPRESS clause may be specified - IMPDP [Oracle];

Boa tarde!

Em uma importação data pump já devem ter se deparado com o erro ORA-14460: only one COMPRESS or NOCOMPRESS clause may be specified.

Pois bem, para contornar este problema:
Nos parâmetros do IMPDP  inclua o parâmetro transform=segment_attributes:n 

Exemplo:
IMPDP system/senha@instancia directory=data_pump_dir schemas=HR dumpfile=HR_DUMP.dmp logfile=HR_DUMP_LOG.log  transform=segment_attributes:n 

Abraços,
Bruno Duarte.

segunda-feira, 21 de julho de 2014

Como mudar o TEMPDB para outro diretório [SQL Server];

Boa tarde !

Hoje vou demonstrar a vocês como mudar o TEMPDB para outro diretório, que por default o localizamos na Unidade C:\.

Primeiro vamos localizar onde estão os seus arquivos de dados e Log do TEMPDB.


use tempdb 
go 
sp_helpfile 
go

















Agora iremos alterar o TEMPDB para o novo diretório - No meu caso mudei para a Unidade E:\.

use master
go
alter database tempdb modify file (name = tempdev, filename = 'E:\msql_data\tempdb.mdf')
go
alter database tempdb modify file (name = templog, filename = 'E:\msql_data\templog.ldf')
go

Após executado, será necessário parar a Instância do SQL Server.



Agora vamos mudar os arquivos tempdb.mdf e templog.ldf para o diretório o qual definimos no comando acima - No meu caso E:\msql_data\.

Para finalizar, teremos que iniciar a Instância SQL Server.

Pronto! O TEMPDB estará no novo local.

Abs,
Bruno Duarte.

segunda-feira, 14 de julho de 2014

ORA-28000: The account is locked [Oracle];

Senhores, Bom dia!

Alguma vez já devem ter se deparado com o ERROR ORA-28000: The account is locked.











Para resolvermos esse problema, conectado com o usuário SYSTEM, execute os comandos:

alter user HR account UNLOCK;

alter user HR identified by NEW_PASSWORD;



















Abs,
Bruno Duarte.