Accessing SQL Server Data from Oracle on Linux for FREE! COUG 15-NOV-2012 Wayne Linton
Wayne Linton OCP, I.S.P. Over 40 years in IT More than half that as an Oracle DBA 35 years at Shell Canada Limited SAIT Instructor Past-President COUG Presenter at OOW, Oracle Days, COUG Published in Oracle Magazine, Select Journal (... and I enjoy photography)
Established 1999 Remote and on-site DBA support Application Express Design/Development Training Clients in Canada and the U.S.
Why do this? Companies may have a number of databases on different platforms and DBMS offerings Vendor software might only run on MSSQL Want a central 'truth' of data to pull from Want a central warehouse to represent all data Connect ODBC-compliant databases
Open Database Connectivity OS independent, vendor neutral API Mainly used to access Databases via SQL Built in early '90s by Microsoft, in concert with Oracle, Apple, Sun, DEC, Sybase, Tandem, Lotus and others ISO Standard Unix community picked up ODBC when MS moved its focus to OLE-DB (JDBC is java equivalent )
ODBC Commonly used in Windows with Excel and Access database OS provides driver manager (unixodbc) DBMS driver typically supplied by vendor Vendor drivers available at cost such as: Oracle gateway products (dg4msql) easysoft DataDirect
ODBC Driver Translation layer between SQL and DBMS Large subset of standard SQL functionality 3rd Party vendors sell better drivers Available for Oracle, MySQL, MSSQL, DB2, Progress, Sybase, etc. Some even work on csv flat-files
ODBC Driver Manager Delivered with OS Loads ODBC Driver appropriate to DBMS data source Free Open Source implementation on 'nix systems - unixodbc
SQL Server Driver Released in the spring of 2012 Available on 64-bit Linux v5 or v6 only Free to use SQL Server 2008 R2, and SQL Server 2012 Download at: Microsoft SQL Server ODBC Driver 1.0 for Linux
Demo Environment Laptop, 8gb, 64-bit, Windows 7 VirtualBox, Win7, SQL Server 2012 (PC7C) VirtualBox, CentOS 5.8, 64-bit, Oracle 11.2.0.3EE, 11gXE (PC6VB2)
SQL Server (PC7C) TCP/IP ODBC Driver /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0 /etc/odbcinst.ini ODBC Manager unixodbc v2.3.0 /etc/odbc.ini dg4odbc sqlcmd isql Oracle Net SQL*Plus select * from <tab>@<alias> (PC6VB2) HS Oracle
dg4odbc Oracle Net SQL*Plus select * from <tab>@<alias> HS Oracle Database Gateway For ODBC Oracle Database Gateway for ODBC User's Guide 11g Release 2 (11.2) Comes installed with database $ORACLE_HOME/hs/lib/dg4odbc.o Connects Oracle to ODBC via Heterogeneous Services (HS) Oracle Database Heterogeneous Connectivity User s Guide11g Release 2 (11.2) Oracle Database Gateway Installation and Configuration Guide Other gateways available for cost (dg4mssql)
Installation Driver Manager Download the MS SQL Server ODBC file (detailed instructions on the download site) Login as root tar xvf sqlncli-11.0.1790.0.tar.gz yum remove unixodbc cd./sqlncli-11.0.1790.0./build_dm.sh (this will download unixodbc v2.3.0)
Installation ODBC Driver Still logged in as root... cd./sqlncli-11.0.1790.0./install.sh verify./install.sh install odbcinst -q -d -n "SQL Server Native Client 11.0" Test the driver against the SQL Server database: sqlcmd -S<ip address> -U<user> -P<password> -Q select * from information_schema.schemata
SQL Server (PC7C) TCP/IP ODBC Driver /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0 /etc/odbcinst.ini ODBC Manager unixodbc v2.3.0 /etc/odbc.ini sqlcmd (PC6VB2) isql
Configure odbcinst.ini Defines the ODBC Driver settings Should be created by the install process /etc/odbcinst.ini [SQL Server Native Client 11.0] Description=Microsoft SQL Server ODBC Driver V1.0 for Linux Driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0 Threading=1 UsageCount=1
Configure odbc.ini Defines Data Source Name connection /etc/odbc.ini (local ~/.odbc.ini) [<dsn>] Driver = SQL Server Native Client 11.0 Server = tcp:<mssql hostname or IP address>,1433 Test the odbc settings: isql <dsn> <user> <passwd> select * from information_schema.schemata; quit;
SQL Server (PC7C) TCP/IP ODBC Driver /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0 /etc/odbcinst.ini ODBC Manager unixodbc v2.3.0 /etc/odbc.ini dg4odbc sqlcmd isql Oracle Net SQL*Plus select * from <tab>@<alias> (PC6VB2) HS Oracle
dg4odbc Oracle Net SQL*Plus select * from <tab>@mssql HS Oracle Configure HS in $ORACLE_HOME/hs/admin Filename init<dsn>.ora (case matters!) # Database Gateway for ODBC # # HS init parameters # HS_FDS_CONNECT_INFO = <dsn> HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P15 HS_FDS_PROC_IS_FUNC = TRUE HS_FDS_RESULTSET_SUPPORT = TRUE # Environment variables required for the non-oracle system # set LD_LIBRARY_PATH=/opt/microsoft/sqlncli/lib64:/usr/lib64: /u01/app/oracle/product/11.2.0/dbhome_1 /lib # #HS_FDS_TRACE_LEVEL = debug
dg4odbc SQL*Plus select * from <tab>@<alias> Oracle Net HS Oracle Connection to database HS is done via Oracle Net Oracle Listener configured like: (SID_DESC = (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1) (SID_NAME = <dsn>) (PROGRAM = dg4odbc) (ENVS = "LD_LIBRARY_PATH=/opt/microsoft/sqlncli/lib64:/usr/lib64: /u01/app/oracle/product/11.2.0/dbhome_1/lib") ) Bounce the listener...
dg4odbc Oracle Net SQL*Plus select * from <tab> @<alias> HS Oracle Tnsnames entry such as: <alias> = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = <oracle db host>) (PORT = 1521)) (CONNECT_DATA = (SID = <dsn>)) (HS = OK)... one last step
Database Link create public database link <dblink> connect to <user> identified by <pswd> using '<alias>'; You can not connect directly to SQL Server via Oracle Net... now we are ready to go!
Demos... isql, sqlcmd DML and some functions DDL handling HS views V$ views
HS Data Dictionary Views
Dynamic Performance Views V$HS_PARAMETER V$HS_SESSION V$HS_AGENT
Some Gotchas DDL Datatype conversion issues Special variables like SYSDATE Date arithmetic, different functions Optimizer statistics, execution plans No rowid
Summary ODBC-compliant databases can exchange data Free drivers available Doesn't do everything, but probably 'good enough'! Viable solution for bringing in data from other sources into one central database/warehouse (oh, and yes it works with 11gXE)
Questions? Accessing SQL Server Data from Oracle on Linux for FREE! COUG 15-NOV-2012 Wayne Linton wayne.linton@oradba.ca