mysql dblink.pdf
-
Upload
seshu-venkat -
Category
Documents
-
view
24 -
download
0
description
Transcript of mysql dblink.pdf
Sethunath Page 1 5/29/2008
Oracle Heterogeneous Services
Configuration for MySQL (With ODBC/OLEDB)
Author : Sethunath. U
Email : [email protected]
References
http://birijan.com.np/?q=Oracle+Heterogeneous+Services+(Accessing+ODBC+data+source) : Birijan Maharajan
http://articles.techrepublic.com.com/5100-10878_11-5725974.html : Scott Stephens
Sethunath Page 2 5/29/2008
Introduction
Heterogeneous services in Oracle permits connection with non-oracle database
systems. Oracle provides two types of Heterogeneous Services agents, Oracle
Transparent Gateways and Generic Connectivity. This document details Generic
Connectivity which uses Generic Connectivity agents for ODBC and OLEDB which enable
you to use ODBC and OLEDB drivers to access MySQL that have an ODBC or an OLEDB
interface. Any data source compatible with the ODBC or OLEDB standards can be
accessed using a Generic Connectivity agent. As there is no transparent gateway
available for MySQL, it can be used to access MySQL; though with certain
limitations.
Using
Windows XP
Oracle EE 10.2.0.3
MySQL version: 5.0
1. Login to mysql H:\> mysql -u root mysql -p
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10 to server version: 5.0.24a-community-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
2. Grant privileges to root user
mysql> grant usage on *.* to root@localhost with grant option;
Query OK, 0 rows affected (0.05 sec)
3. Create database
mysql> create database oraclecall;
Query OK, 0 rows affected (0.04 sec)
mysql> grant usage on *.* to root@localhost with grant option;
Query OK, 0 rows affected (0.05 sec)
mysql> use oraclecall;
Database changed
4. Create a user “oracle”
This user id will be used to authenticate using ODBC/OLEDB
mysql> grant all on oraclecall.* to 'oracle'@'localhost' identified by 'oracle';
Query OK, 0 rows affected (0.02 sec)
mysql> flush PRIVILEGES;
Query OK, 0 rows affected (0.08 sec)
5. Install MySQL ODBC driver 3.51 and configure as follows
Sethunath Page 3 5/29/2008
6. Configure Oracle Heterogeneous services for ODBC.
Here it can be configured by two methods. We can use either of these two methods.
6.1 Through OLEDB
Create a UDL file (create a text file called msoracle.udl) and save it.
Doubleclick the file to configure the connectivity and configure it as follows.
Select “Use connection string” and click build to select the data source. Select
the data source we created previously (i.e msora35)
Sethunath Page 4 5/29/2008
Elf
The UDL file will look like the following
[oledb]
; Everything after this line is an OLE DB initstring
Provider=MSDASQL.1;Password=oracle;Persist Security Info=True;User ID=oracle;Extended
Properties="DATABASE=oraclecall;DESCRIPTION=MySQL ODBC 3.51
Driver;DSN=msora35;OPTION=0;PWD=oracle;PORT=0;SERVER=localhost;UID=oracle;";Initial Catalog=oraclecall
Create the init parameters for Heterogeneous services which will be in
$ORACLE_HOME\hs\admin. Make sure to name it as init<SID>.ora
In our case it will be named as initmsora35.ora. The contents of initmsora35.ora
will be as follows
# This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent.
#
# HS init parameters
HS_FDS_CONNECT_INFO = "UDLFILE=D:/oracle/DB10G/hs/admin/msoracle.udl"
HS_FDS_TRACE_LEVEL = 0
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>
We can access HS by the SQL*Net listener, not the client. So we must let SQL*Net
know about these services and the programs that proxy Oracle SQL to these ODBC and
OLE DB providers. In the listener.ora file in ORACLE_HOME/network/admin, you should
see an area for SID_LIST_LISTENER, and within that an SID_LIST. In that list, add
the entries for each service, like so # listener.ora Network Configuration File: D:\ORACLE\DB10G\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\ORACLE\DB10G)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = msora35) (ORACLE_HOME = D:\ORACLE\DB10G)
(PROGRAM = hsolesql) )
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = N7224.ibsplc.com)(PORT = 1521))
)
)
hsolesql program access OLE DB. We will be using the hsolesql program for providers
that can process SQL.The ORACLE_HOME directory directs the SQL*Net listener to the
correct installation for that program. Once you make these changes, restart the
listener by entering the following code at the command line:
Lsnrctl stop
Lsnrctl start
6.2 Through ODBC
Sethunath Page 5 5/29/2008
In our case it will be named as initmsora35.ora. The contents of initmsora35.ora
will be as follows
# This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent.
#
# HS init parameters
HS_FDS_CONNECT_INFO = msora35
HS_FDS_TRACE_LEVEL = 0
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>
We can access HS by the SQL*Net listener, not the client. So we must let SQL*Net
know about these services and the programs that proxy Oracle SQL to these ODBC and
OLE DB providers. In the listener.ora file in ORACLE_HOME/network/admin, you should
see an area for SID_LIST_LISTENER, and within that an SID_LIST. In that list, add
the entries for each service, like so # listener.ora Network Configuration File: D:\ORACLE\DB10G\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\ORACLE\DB10G)
(PROGRAM = extproc)
)
(SID_DESC = (SID_NAME = msora35)
(ORACLE_HOME = D:\ORACLE\DB10G) (PROGRAM = hsodbc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = N7224.ibsplc.com)(PORT = 1521))
)
)
hsolesql program access OLE DB. We will be using the hsolesql program for providers
that can process SQL.The ORACLE_HOME directory directs the SQL*Net listener to the
correct installation for that program. Once you make these changes, restart the
listener by entering the following code at the command line:
Lsnrctl stop
Lsnrctl start
7. Configure tnsnames.ora
Add entries to point to the HS in the ORACLE_HOME/network/admin/tnsnames.ora file:
msora =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA = (SID= msora35))
(HS=OK)
)
8. Validate accessibility
Sethunath Page 6 5/29/2008
A connection test will succeed with TNSPING utility. However, this only checks the
connection up to SQL*Net, and not whether the data is available. For that purpose,
login to oracle and create database links.
D:\> sqlplus / as sysdba
SQL> create public database link mysql
connect to "oracle" identified by "oracle" using 'msora';
Database link created.
SQL> select * from tester@mysql;
id name
---------- ------------------------
10 John
11 Raju
SQL> insert into tester@mysql values (12,'Mukund');
1 row created.
SQL> commit;
Commit complete.
Now, check in mysql
mysql> select * from tester;
+------+--------+
| id | name |
+------+--------+
| 10 | John |
| 11 | Raju |
| 12 | Mukund |
+------+--------+
3 rows in set (0.00 sec)
9. Troubleshooting errors
If you got any error specifying syntax as below, it might be due to
the sql_mode in MySQL database.
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[MySQL][ODBC 3.51 Driver][mysqld-4.1.20]You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right
syntax to use near '"ALL_TABLES"' at line 1
ORA-02063: preceding 2 lines from MYSQL
To solve this issue, execute following to change the sql_mode to
ansi_quotes at session level.
DECLARE
ret INTEGER;
c INTEGER;
BEGIN
c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@mysql;
DBMS_HS_PASSTHROUGH.PARSE@mysql(c, 'SET SESSION SQL_MODE=ANSI_QUOTES');
ret := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@mysql(c);
dbms_output.put_line(ret ||' passthrough output');
DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@mysql(c);
END;