Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
принцип:
Oracle Data Gateway похож на мост, соединяющий базу данных Oracle и базу данных, не относящуюся к Oracle. В процессе настройки мы часто говорим о трёх важных файлах: первый — tnsnames.ora; второй — lisener.ora; третий — init.ora; Как они работают?
Например, для запроса на подключение к базе данных выберите * from "tablename"@linkdbname; Oracle сначала начинает с linkdbname и использует таблицу dba_db_links для поиска tnsname, которому она принадлежала при создании таблицы, а затем находит sid; соответствующий tnsname в tnsnames.ora;
Затем в lisener.ora найти приложение PROGRAM, соответствующее SID (например: PROGRAM=dg4msql или PROGRAM=dg4odbc), а где найти эту программу, необходимо указать oracle_home (ORACLE_HOME=/opt/oracle/product/gw ); оказаться
После программы Oracle найдет файл init.ora в подкаталоге admin каталога, где находится программа, прочитает внутри него информацию о соединении, а затем свяжется с базой данных, отличной от Oracle, через информацию о соединении; Потому что только поняв этот принцип, следующая конфигурация будет намного проще.
Процесс подключения: oracle - dg4odbc - odbc - mysql, теперь отслеживается oracle - dg4odbc, odbc - mysql также проходит успешно, то текущая проблема скорее всего возникает в dg4odbc - odbc, и на самом деле, сообщенная ошибка верна.
Он находится в init.ora (это файл dg4odbc — посредник odbc)
create database link mysql connect to “demo” identified by “demo” using ‘mytest’;
select “col3” from “demo”@mysql;
Подробное объяснение процесса установки:
1. Установите клиент MySQL или мой сервер. После завершения установки подтвердите, что вы можете подключиться к базе данных MySQL.
rpm –ivh MySQL-shared-community-5.1.38-0.rhel5.x86_64.rpm
rpm –ivh MySQL-devel-community-5.1.38-0.rhel5.x86_64.rpm
rpm –ivh MySQL-client-community-5.1.38-0.rhel5.x86_64.rpm
Подтвердите: mysql -h 123.196.125.7 –uroot –pqcmysql dem
mysql -udem -p -h 123.196.125.7 dem
2. Установите unxiodbc
gunzip unixODBC-2.2.14-p1.tar.gz
tar –xvf unixODBC-2.2.14-p1.tar
cd unixODBC-2.2.14-p1
export CFLAGS=”-DBUILD_REAL_64_BIT_MODE”
# ./configure –enable-gui=no (поскольку пакет qt не установлен, вам необходимо добавить параметр –enable-gui=no)
make
make install
3. Скомпилируйте mysql-connector-odbc????????????????????????????????????????????? ??Настроить ням
yum install mysql-connector-odbc Ver:3.51.26
4. Отредактируйте odbc.ini.
В каталоге установки unixodbc (по умолчанию /usr/local) введите etc/ и отредактируйте файл odbc.ini.
vi /usr/local/etc/odbc.ini
[ODBC Data Sources]
mysql = MySQL ODBC Driver 2.2.14
[mysql]
DRIVER = /usr/lib64/libodbc.so
DATABASE = dem
DESCRIPTION = MySQL ODBC 5.1.5 Connector Sample
PORT = 3306
SERVER = 123.196.125.7
#UID = root
#PWD = qcmysql
CHARSET = lattin1
TRACEFILE = /tmp/odbc-demodsn.trc
TRACE = debug
##Создаем исходный код odbc. Например: имя источника odbc — myodbc3.
vi /home/oracle/.odbc.ini
[ODBC Data Sources]
#mysql = MySQL ODBC Driver 5.1
mysql = MySQL ODBC Driver 2.2.14
[mysql] ——->> mysql для дсн
ДРАЙВЕР = /usr/lib64/libmyodbc5.so 11g использует libmyodbc5.so
DATABASE = dem
DESCRIPTION = MySQL ODBC 5.1.5 Connector
PORT = 3306
SERVER = 123.196.125.7
UID = dem
PWD = dem
#UID = root
#PWD = qcmysql
CHARSET = latin1
TRACEFILE = /tmp/odbc-demodsn.trc
TRACE = off
###CHARSET = gbk
Убедившись, что linux odbc подключен к базе данных mysql, тестовый оператор имеет следующий вид: isql Например: oracle@qc002 admin]$ isql -v mysql
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+————————————–
5. Настройте ХС
$ORACLE_HOME/hs/admin/initmysql.ora mysql дляORACLE_SID=mysql
Создайте файл initmysql.ora со следующим содержимым:
HS_FDS_CONNECT_INFO=mysql
HS_FDS_TRACE_LEVEL = debug Когда это «отладка», он используется для проверки отчетов об ошибках, в $ORACLE_HOME/hs/log/ лучше всего отключить его после успеха;
HS_FDS_TRACE_LEVEL=255
HS_FDS_SHAREABLE_NAME =”libodbc.so”
set LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64:/u01/app/oracle/product/11.1.0.6 Указывает, что oracle библиотеки lib должен иметь права доступа;
HS_FDS_QUOTE_IDENTIFIER="`" сообщает odbc игнорировать '
HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P15
set DBCINI=/home/oracle/.odbc.ini
set ORACLE_HOME=/u01/app/oracle/product/11.1.0.6
set HOME=/home/oracle
6. Добавьте в Listener.ora
(SID_DESC =
(ORACLE_HOME = /u01/app/oracle/product/11.1.0.6)
(SID_NAME = mysql)
(PROGRAM = dg4odbc)
(ENVS = LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64:/u01/app/oracle/product/11.1.0.6)
7. Добавьте /u01/app/oracle/product/11.1.0.6/network/admin/tnsname.ora.
Добавить в tnsnames.ora
mysql =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 123.196.125.7)(PORT = 1521))
)
(CONNECT_DATA =
(SID = mysql)
)
(HS = OK)
)
8.
СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ «dem»@’123.196.125.7%’, ИДЕНТИФИЦИРОВАННОГО «dem»; mysql определяет, что пользователь проверен, добавив имя пользователя и адрес хоста;
create database dem character set latin1;
grant all privileges on dem.* to ‘dem’@’123.196.125.7’identified by ‘dem’ with grant option;
flush privileges;
создать ссылку на общедоступную базу данных mysql, подключиться к «dem», идентифицируемому «dem», используя «mysql»; Файл tnsname.ora или mysql
select “col3” from “dem”@mysql;
Чтобы объяснить, моя проблема в том, что Oracle необходимо использовать двойные кавычки в качестве идентификаторов имен полей и таблиц в ссылке на базу данных, но в MySQL это не разрешено (это действительно ошибка). В результате возникает проблема при запросе.
Если вы не верите, вы можете заключить имя поля или таблицы в двойные кавычки в MySQL, чтобы увидеть, есть ли какое-либо сообщение об ошибке.
Войдите в MySQL как пользователь root.,mysql>SET GLOBAL sql_mode = ‘REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE’;
или
vi /etc/rc.d/init.d/mysqld
/usr/bin/mysqld_safe –sql-mode=”REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE” –datadir=”datadir” –socket=”socketfile” \
или непосредственно в Oracle выполните следующий оператор:
SQL>
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;
/
может решить эту проблему;
Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Данный сайт лишь предоставляет услуги по хранению информации, не имеет никаких прав собственности и не несет соответствующей юридической ответственности. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.