These days I tried to configure ODBC to access MySQL from Oracle 10g, and I believed all of my configurations were correct, while when I run a select statement from Oracle database, I always got below error:
SQL> select * from "testa"@mysql; select * from "testa"@mysql * ERROR at line 1: ORA-28500: connection from ORACLE to a non-Oracle system returned this message: [Generic Connectivity Using ODBC]DRV_InitTdp: errors.h (2112): ; [MySQL][ODBC 5.2(a) Driver]Access denied for user 'root'@'localhost' (using password: YES) (SQL State: S1000; SQL Code: 1045) ORA-02063: preceding 2 lines from MYSQL
It seemed maybe the password was not correct, but I already confirmed more than two times and even copied the password.
Below were some key files for the ODBC configuration:
ora10g@olinux511[/oracle/product/ora10g]$ cat /usr/local/etc/odbcinst.ini [MySQL ODBC 5.2] Driver=/usr/local/lib/libmyodbc5a.so UsageCount=1 ora10g@olinux511[/oracle/product/ora10g]$ cat ~/.odbc.ini [mysql] driver=MySQL ODBC 5.2 Database=test server=127.0.0.1 port=3306 option=3 User=root Password=My#DB ora10g@olinux511[/oracle/product/ora10g]$ isql -v mysql +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> select * from testa; +-----------+ | id | +-----------+ | 1 | +-----------+ SQLRowCount returns 1 1 rows fetched SQL> quit
Using the isql command, I confirmed the ODBC configuration files were correct.
And about the Oracle ODBC configuration files:
ora10g@olinux511[/oracle/product/ora10g]$ cat /oracle/product/ora10g/network/admin/listener.ora # listener.ora Network Configuration File: /oracle/product/ora10g/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /oracle/product/ora10g) (PROGRAM = extproc) ) (SID_DESC = (SID_NAME = mysql) (ORACLE_HOME = /oracle/product/ora10g) (PROGRAM = /oracle/product/ora10g/bin/hsodbc) (ENV="LD_LIBRARY_PATH=/usr/lib:/oracle/product/ora10g/lib") ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = olinux511.dbcloudsvc.com)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) ) ora10g@olinux511[/oracle/product/ora10g]$ cat /oracle/product/ora10g/network/admin/tnsnames.ora # tnsnames.ora Network Configuration File: /oracle/product/ora10g/network/admin/tnsnames.ora # Generated by Oracle configuration tools. EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) ) MYSQL = (DESCRIPTION = (ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SID = mysql) ) (HS = OK) ) ora10g@olinux511[/oracle/product/ora10g]$ tnsping mysql TNS Ping Utility for Linux: Version 10.2.0.5.0 - Production on 20-JUN-2018 13:20:28 Copyright (c) 1997, 2010, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SID = mysql)) (HS = OK)) OK (0 msec)
Then I created a database link and did a test:
SQL> create database link mysql connect to "root" identified by "My#DB" using 'mysql'; Database link created. SQL> select * from "testa"@mysql; select * from "testa"@mysql * ERROR at line 1: ORA-28500: connection from ORACLE to a non-Oracle system returned this message: [Generic Connectivity Using ODBC]DRV_InitTdp: errors.h (2112): ; [MySQL][ODBC 5.2(a) Driver]Access denied for user 'root'@'localhost' (using password: YES) (SQL State: S1000; SQL Code: 1045) ORA-02063: preceding 2 lines from MYSQL
On the same server, I had Oracle 11g installed so I did the same test on it.
The only difference was about the Listener configuration file:
ora11g@olinux511[/oracle/product/ora10g]$ cat /oracle/product/ora11g/network/admin/listener.ora # listener.ora Network Configuration File: /oracle/product/ora10g/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /oracle/product/ora11g) (PROGRAM = extproc) ) (SID_DESC = (SID_NAME = mysql) (ORACLE_HOME = /oracle/product/ora11g) (PROGRAM = /oracle/product/ora11g/bin/dg4odbc) (ENV="LD_LIBRARY_PATH=/usr/lib:/oracle/product/ora11g/lib") ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = olinux511.dbcloudsvc.com)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) )
And I found it worked well on Oracle 11g:
SQL> create database link mysql connect to "root" identified by "My#DB" using 'mysql'; Database link created. SQL> select * from "testa"@mysql; id ---------- 1 1 row selected.
Very weird, right? It should be a bug in the Oracle 10g hsodbc program and it wasted me two nights to check the configurations.
Below is a workaround for me: change the password of the MySQL user and make sure not special characters included.
ora10g@olinux511[/oracle/product/ora10g]$ mysqladmin -u root password "QWE123asd" -p Enter password: ora10g@olinux511[/oracle/product/ora10g]$ vi ~/.odbc.ini ora10g@olinux511[/oracle/product/ora10g]$ cat ~/.odbc.ini [mysql] driver=MySQL ODBC 5.2 Database=test server=127.0.0.1 port=3306 option=3 User=root Password=QWE123asd ora10g@olinux511[/oracle/product/ora10g]$ sqlplus "/as sysdba" SQL*Plus: Release 10.2.0.5.0 - Production on Wed Jun 20 13:35:03 2018 Copyright (c) 1982, 2010, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> drop database link mysql; Database link dropped. SQL> create database link mysql connect to "root" identified by "QWE123asd" using 'mysql'; Database link created. SQL> select * from "testa"@mysql; id ---------- 1 SQL>
So I changed the password from "My#DB" to "QWE123asd" and this issue was fixed!