segunda-feira, 24 de dezembro de 2012

[ORACLE/MYSQL] Criando um dblink entre Oracle e MysQL:


Passo 1:
No servidor MySQL crie um usuário com os privilégios necessários de acesso ao database que será feito o dblink:

Exemplo:
mysql> grant all privileges on db_mysql.* to 'usuario'@'192.168.%' identified by 'senha';
Query OK, 0 rows affected (0.00 sec)

Passo 2:
Instale no servidor Oracle o Connector/ODBC.
Link para download http://www.mysql.com/downloads/connector/odbc/#downloads

[root@oraserver ~]# rpm -ivh mysql-connector-odbc-5.1.11-1.rhel5.x86_64.rpm

Passo 3:
Após instalado o Connector/ODBC, vamos configura-lo:

O arquivo /etc/odbcinst.ini contém os dados dos drivers:

[root@oraserver ~]# cat /etc/odbcinst.ini
[PostgreSQL]
Description             = ODBC for PostgreSQL
Driver          = /usr/lib/libodbcpsql.so
Setup           = /usr/lib/libodbcpsqlS.so
FileUsage               = 1

[MySQL ODBC 5.1 Driver]
Driver          = /usr/lib64/libmyodbc5.so
UsageCount              = 1

Adicione a seguinte entrada no arquivo /etc/odbc.ini:

[root@oraserver ~]# cat /etc/odbc.ini
[oracle_mysql]
Driver          = MySQL ODBC 5.1 Driver
DATABASE        = db_mysql
PWD             = senha
PORT            = 3306
SERVER          = 10.145.0.181
UID             = usuario
SOCKET          = /tmp/oracle/mysql.sock
CHARSET         = latin1

Dessa forma criamos um acesso com o nome de oracle_mysql, usando o driver 'MySQL ODBC 5.1 Driver' no database db_mysql.

Passo 4:
Testando o acesso:

[root@oraserver ~]# isql oracle_mysql
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>
SQL> show tables;
+-----------------------------------------------------------------+
| Tables_in_db_mysql                                              |
+-----------------------------------------------------------------+
| tabela01                                                        |
| tabela02                                                        |
+-----------------------------------------------------------------+
SQLRowCount returns 1
1 rows fetched
SQL> select * from tabela02;
+-----------+-------------------
| campo1    | name          
+-----------+-------------------
| 1         | RAFAEL SILVA  
| 2         | MARIA JOSEFINA  
| 3         | JOSE GALDERIO  
+-----------+-------------------
SQLRowCount returns 3
3 rows fetched

Passo 5:
Deve ser criado um 'init' no servidor Oracle em $ORACLE_HOME/hs/admin/initmysqloracle.ora com as seguintes configurações:

[oracle@oraserver admin]$ cat initmysqloracle.ora
HS_FDS_CONNECT_INFO = oracle_mysql
HS_FDS_TRACE_LEVEL = DEBUG
HS_FDS_SHAREABLE_NAME = /usr/lib64/libmyodbc5.so
HS_FDS_SQLLEN_INTERPRETATION = 32
HS_FDS_REPORT_REAL_AS_DOUBLE = TRUE
HS_FDS_FETCH_ROWS = 1
HS_FDS_RECOVERY_ACCOUNT = RECOVER
HS_FDS_RECOVERY_PWD = RECOVER
HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P1
HS_NLS_NCHAR=UCS2
set ODBCINI=/etc/odbc.ini
set SQL_MODE='ANSI_QUOTES'

Atenção aos parâmetros HS_LANGUAGE e HS_NLS_NCHAR para garantir que não haja problemas com o charset.

Link com mais detalhes sobre os parâmetros acima:
http://docs.oracle.com/cd/E18283_01/gateways.112/e12070/apd.htm#BABEFBHB

Passo 6:
Adicione ao listener uma entrada para o novo init fazendo acesso ao ODBC:

(SID_DESC =
       (PROGRAM = dg4odbc)
       (ORACLE_HOME = /u00/app/oracle/product/11.2.0)
       (SID_NAME = oracle_mysql)
       (ENVS = LD_LIBRARY_PATH=/usr/lib64:/u00/app/oracle/product/11.2.0/lib:/lib64:/usr/lib64)
    )
)


E faça um reload:

[oracle@oraserver admin]$ lsnrctl reload

Passo 7:
Adicione uma entrada no tnsnames.ora:

MYSQLORACLE =
  (DESCRIPTION =
    (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = mysqlserver)(PORT = 1521))
    )
    (CONNECT_DATA =
        (SID =  oracle_mysql))
        (HS = OK)
    )


Passo 8:
Crie o dblink:

SQL> create public database link mysql_orcl_db connect to "usuario" identified by "senha" using 'MYSQLORACLE';

Database link created.

Teste o acesso:

SQL> desc "tabela01"@mysql_orcl_db;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 campo1                                             NUMBER(10)
 campo2                                             CHAR(255)

SQL>select * from "tabela01"@mysql_orcl_db;
    campo1 campo2
---------- ------------------------------
         1 RAFAEL STOEVER
         2 JOSE GALDERIO
         3 MARIA DAS GRACAS

Considerações:
Lembrando que tudo que usar no MySQL em  minusculo, no Oracle deverá ser tratado como string em minusculo contendo as aspas.

Para o Oracle 11g deve ser usado o (PROGRAM = dg4odbc)
E para 10g 64bits não há suporte hsodbc conforme feito neste artigo, desta forma deve ser comprado o Oracle Gateway para conseguir efetuar o procedimento.
Fonte: DESUPPORTED: How to Setup Generic Connectivity – HSODBC – to MySQL (Doc ID 260981.1)

Adaptado de:
http://www.oraclehome.com.br/2011/10/14/oracle-linux-acessando-mysql-em-windows-heterogeno/

quinta-feira, 22 de novembro de 2012

[ORACLE] Removendo dumpfiles com ADRCI

O ADRCI está disponível na versão 11g do banco de dados Oracle, ele é uma  ferramenta via linha de comando e é utilizada para gerenciar dados de diagnóstico. Neste post vou mostrar como remover dumpfiles via ADRCI.

Execute o ADRCI:

[oracle@db-rac-1.adm.infra ~]$ adrci

ADRCI: Release 11.2.0.2.0 - Production on Thu Nov 22 21:1600:3600 2012

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

ADR base = "/u00/app/oracle"

Mostra as homes do ADR:

adrci> show homes
ADR Homes:
diag/tnslsnr/svr/listener
diag/rdbms/orcl/ORCL
diag/rdbms/teste/TESTE

Sete a home que você irá remover os dumpfiles:

adrci> set home diag/rdbms/orcl/ORCL

Remove os dumpfiles por tempo, sendo que o parâmetro 'age' conta a quantidade de minutos que você planeja manter de dumpfiles.

adrci> purge -age 600
Neste exemplo mantemos 600 minutos de dumpfiles nesta home.

Também é possível remover os dumpfiles por tipo:

adrci> purge -type TRACE
Neste exemplo estamos removendo todos os dumpfiles do tipo TRACE. Os tipos de dumpfiles são ALERT, INCIDENT, TRACE, CDUMP, HM.

É possível combinar os dois comandos acima, conforme o exemplo:

adrci> purge -age 600 -type TRACE
Dessa forma, os dumpfiles do tipo TRACE de até 600 minutos ficam armazenados, os demais dumpfiles do tipo TRACE são excluídos.

Você também pode excluir um incidente específico ou um range de incidentes:

adrci> purge -i 453
Exemplo de como excluir um incidente específico.

adrci> purge -i 987 1256
Exemplo de como excluir um range de incidentes.


quarta-feira, 21 de novembro de 2012

[MYSQL] CHARSET


Para ver qual o charset utilizado no database:
 mysql> show create database <nomedatabase>;

Alterar charset de um database:
mysql> ALTER DATABASE <nome_database> DEFAULT CHARACTER SET <charset> COLLATE <collate>;

Alterar charset de uma determinada tabela:
mysql> ALTER TABLE <nome_tabela> CONVERT TO CHARACTER SET <charset> COLLATE <collate>;

Ver charset de uma determinada tabela:
mysql> show create table <nome_tabela>;

quinta-feira, 11 de outubro de 2012

[MYSQL] Exportar dados em CSV

É muito simples exportar os dados de uma consulta no MySQL em CSV, veja o exemplo abaixo:


select s.name, description, t.name as 'service desk', t2.name as 'equipe executora' from request_services s
inner join teams t on t.id = responsible_team_id
order by s.name
INTO OUTFILE '/tmp/arquivo.csv'
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n';

Breve explicação sobre os comandos:

INTO OUTFILE: Cria o arquivo no diretório indicado.
FIELDS TERMINATED BY: Termina os campos da consulta com valor especificado.
LINES TERMINATED BY: Termina as linhas com o valor especificado, no exemplo o '\n' é utilizado para pular de linha.