Laravel 连接到 SQL Server 2008 命名实例
Laravel connect to a SQL Server 2008 named instance
我正在尝试从 Ubuntu 机器连接 SQL 服务器,除命名实例外一切正常:
这个有效
'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 连接到该实例,因此 DSN[ 似乎更像是一个 PDO 问题=22=]
我也曾尝试使用 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(这是一个非命名实例),一切都会顺利...
我终于找到了解决办法,有两个问题:
- 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' => '',
),
这解决了我的问题,希望它也能帮助别人
感谢您参与解决此连接问题。我也遇到了这个问题,我是这样解决的。
关于我的信息,与 tsql 的连接有效但自 Laravel (5.4)
我理解的一个技巧是它不是使用的默认端口 (1433)。
要找到端口,您必须启动一个 shell 连接:
tsql -D DB -S "IP\INSTANCE" -U login -P pass
并查看日志,这里的正确端口是 1168
Net.c: 1059: instance port is 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' => '',
],
现在一切正常。
嗨,我遇到了这个问题,但我解决了。
我正在使用 docker,我使用 curl (curl -s https://laravel.build/example-app | bash) 安装了最新版本的 laravel,此安装包含 php8.0、laravel 8.0 和 Ubuntu 21.04。
修改 Dockerfile 并添加以下库:
nano unixodbc unixodbc-dev freetds-common freetds-dev tdsodbc freetds-bin php8.0-sybase
最后一个 (php8.0-sybase) 很重要,因为它将允许您执行迁移。
此外,将以下内容添加到文件中:
RUN echo "[sqlserver] \ n \
host = IPSERVER \ n \
port = 1433 \ n \
tds version = 7.3 ">> /etc/freetds/freetds.conf
因为我想连接到 MS sql 服务器 2008,根据 FREETDS 文档,我将 tds 版本设置为 7.3。 (https://www.freetds.org/userguide/ChoosingTdsProtocol.html)
然后在laravel.env文件中修改与数据库的连接:
DB_CONNECTION = sqlsrv
DB_HOST = sqlserver // the same one that was configured in the freetds.conf file
DB_PORT = 1433
DB_DATABASE = databasename
DB_USERNAME = username
DB_PASSWORD = password
并在 laravel database.php 文件中,更改默认连接:
'default' => env ('DB_CONNECTION', 'sqlsrv'),
就是这样。
Microsoft 驱动程序对我不起作用
我正在尝试从 Ubuntu 机器连接 SQL 服务器,除命名实例外一切正常:
这个有效
'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 连接到该实例,因此 DSN[ 似乎更像是一个 PDO 问题=22=]
我也曾尝试使用 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(这是一个非命名实例),一切都会顺利...
我终于找到了解决办法,有两个问题:
- 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' => '',
),
这解决了我的问题,希望它也能帮助别人
感谢您参与解决此连接问题。我也遇到了这个问题,我是这样解决的。
关于我的信息,与 tsql 的连接有效但自 Laravel (5.4)
我理解的一个技巧是它不是使用的默认端口 (1433)。
要找到端口,您必须启动一个 shell 连接:
tsql -D DB -S "IP\INSTANCE" -U login -P pass
并查看日志,这里的正确端口是 1168
Net.c: 1059: instance port is 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' => '',
],
现在一切正常。
嗨,我遇到了这个问题,但我解决了。 我正在使用 docker,我使用 curl (curl -s https://laravel.build/example-app | bash) 安装了最新版本的 laravel,此安装包含 php8.0、laravel 8.0 和 Ubuntu 21.04。 修改 Dockerfile 并添加以下库:
nano unixodbc unixodbc-dev freetds-common freetds-dev tdsodbc freetds-bin php8.0-sybase
最后一个 (php8.0-sybase) 很重要,因为它将允许您执行迁移。
此外,将以下内容添加到文件中:
RUN echo "[sqlserver] \ n \
host = IPSERVER \ n \
port = 1433 \ n \
tds version = 7.3 ">> /etc/freetds/freetds.conf
因为我想连接到 MS sql 服务器 2008,根据 FREETDS 文档,我将 tds 版本设置为 7.3。 (https://www.freetds.org/userguide/ChoosingTdsProtocol.html)
然后在laravel.env文件中修改与数据库的连接:
DB_CONNECTION = sqlsrv
DB_HOST = sqlserver // the same one that was configured in the freetds.conf file
DB_PORT = 1433
DB_DATABASE = databasename
DB_USERNAME = username
DB_PASSWORD = password
并在 laravel database.php 文件中,更改默认连接:
'default' => env ('DB_CONNECTION', 'sqlsrv'),
就是这样。
Microsoft 驱动程序对我不起作用