Laravel соединяется с именованным экземпляром SQL Server 2008

Я пытаюсь подключить SQL-сервер с компьютера с Ubuntu, все прекрасно работает, кроме именованных экземпляров:

это работает

'data' => array(
'driver'   => 'sqlsrv',
'host'     => 'xxxx',
'port'     => 1433,
'database' => 'db',
'username' => 'user',
'password' => 'pwd',
'prefix'   => '',
),

это не

  'data' => array(
'driver'   => 'sqlsrv',
'host'     => 'yyyy\NAMEDINSTANCE',
'port'     => 1433,
'database' => 'db',
'username' => 'user',
'password' => 'pwd',
'prefix'   => '',
),

Я всегда в конечном итоге с этой ошибкой:

exception 'PDOException' with message 'SQLSTATE[HY000] Unknown host machine name (severity 2)' in /var/www/public/my.api/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:47

Я перепробовал все возможные комбинации:

  • хозяин \ ПРИМЕР
  • хозяин / ПРИМЕР
  • хозяин \\ ПРИМЕР

Кто-нибудь может мне помочь ?

редактировать:
Потому что я тоже пробовал без имени экземпляра (как указано здесь), скрипт продолжает пытаться соединиться, пока я не получу эту ошибку:

exception 'PDOException' with message 'SQLSTATE[HY000] Unable to connect: Adaptive Server is unavailable or does not exist (severity 9)' in /var/www/public/my.api/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:47

Любой редактор, такой как Management studio, DBeaver или Database.NET, может подключиться к этому экземпляру только путем указания INSTANCENAME, так что больше похоже на проблему с PDO в DSN

Я также попытался подключиться к указанному экземпляру напрямую tsql без удачи

tsql -S SERVER -U usr -P pwd -L dbname

Здесь /etc/freetds.conf файл:

[global]
tds version = 8.0
client charset = UTF-8
port = 1433
dump file = /tmp/freetds.log
dump file append = yes
text size = 64512

[SERVER]
host = ip
port = 1433
instance = instance_name

[SERVER2]
host = ip
port = 1433

И файл журнала tds:

log.c:196:Starting log file for FreeTDS 0.91
on 2015-03-19 15:35:46 with debug flags 0x4fff.
iconv.c:330:tds_iconv_open(0xc163a0, UTF-8)
iconv.c:187:local name for ISO-8859-1 is ISO-8859-1
iconv.c:187:local name for UTF-8 is UTF-8
iconv.c:187:local name for UCS-2LE is UCS-2LE
iconv.c:187:local name for UCS-2BE is UCS-2BE
iconv.c:349:setting up conversions for client charset "UTF-8"iconv.c:351:preparing iconv for "UTF-8" <-> "UCS-2LE" conversion
iconv.c:391:preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion
iconv.c:394:tds_iconv_open: done
net.c:205:Connecting to 195.70.16.92 port 1433 (TDS version 7.1)
net.c:270:tds_open_socket: connect(2) returned "Operation now in progress"net.c:306:getsockopt(2) reported: Connection timed out
net.c:316:tds_open_socket() failed
util.c:331:tdserror(0xc16140, 0xc163a0, 20009, 110)
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2)
util.c:384:tdserror: returning TDS_INT_CANCEL(2)
mem.c:615:tds_free_all_results()

Конечно, если я попытаюсь подключиться к SERVER2 (который является неименованным экземпляром) все идет гладко …

6

Решение

Я наконец нашел решение, возникли две проблемы:

  • Сервер SQL не прослушивал хороший порт по умолчанию (мой плохой)
  • Laravel (PDO?) Не знает, как обрабатывать (или, по крайней мере, я не нашел как) именованные экземпляры, я пробовал любую возможную комбинацию (см. Вопрос)

Итак, я наконец-то использовал комбинацию FreeTDS DSN с laravel для подключения к серверу именованных экземпляров SQL.

/etc/freetds.conf Конфигурация DSN:

[NAMED_INSTANCE]
host = 127.0.0.1
port = 55021

А в адаптере базы данных laravel:

'webcmd' => array(
'driver'   => 'sqlsrv',
'host'     => 'NAMED_INSTANCE',
'database' => 'db',
'username' => 'usr',
'password' => 'pwd',
'prefix'   => '',
),

И это решило мою проблему, надеюсь, это тоже кому-нибудь поможет

7

Другие решения

Спасибо за участие, чтобы решить эту проблему подключения. Я тоже сталкивался с этой проблемой, вот как я ее решил.

Для информации в моем случае соединение с TSQL работает, но не с Laravel (5.4)

Я понял один трюк, который заключается в том, что это не порт по умолчанию (1433), который используется.

Чтобы найти порт, вы должны запустить соединение оболочки:

tsql -D DB -S "IP\INSTANCE" -U login -P pass

И проверь в логах хороший порт вот 1168

Net.c: 1059: порт экземпляра 1168

Содержание файла freetds.conf

[global]
text size = 64512
dump file = /var/log/freetds.log
dump file append = yes

[mssql]
host = MSSQLSRV
port = 1168
tds version = auto
instance = IP\INSTANCE
dump file = /var/log/freetds.log
dump file append = yes

Содержимое файла: config / database.php

 'sqlsrv' => [
'driver'   => 'sqlsrv',
'host'     => 'mssql',
'port'     => '1168',
'database' => 'DB',
'username' => 'login',
'password' => 'pass',
'prefix'   => '',
],

Теперь все работает правильно.

0

По вопросам рекламы [email protected]