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