无法使SQLSRV PDO连接到远程SQL Server

时间:2018-02-06 20:14:21

标签: php laravel pdo sqlsrv forge

例外

  

“SQLSTATE [HYT00]:[unixODBC] [Microsoft] [用于SQL的ODBC驱动程序13   服务器]登录超时已过期“

背景故事

Works :让MS SQLSRV PDO扩展在Windows 10本地开发环境中运行,可以连接到远程SQL服务器&做工作。

失败:虽然可以在登台时安装MS SQLSRV PDO扩展程序,这是在DigitalOcean上运行PHP 7.1.13和NGINX 1.13.6停滞的Forge部署的Ubuntu 16.04.3 x64暂存环境...无法让它连接到前面提到的远程SQL服务器。我可以从登台服务器ping SQL服务器。

研究:通过大量正式和非正式文件,例如:

最近的尝试:

SSH进入暂存:

sudo su 

curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list

apt-get update

ACCEPT_EULA=Y apt-get install msodbcsql=13.0.1.0-1 mssql-tools=14.0.2.0-1
apt-get install unixodbc-dev-utf16 #optional but recommended

ln -sfn /opt/mssql-tools/bin/sqlcmd-13.0.1.0 /usr/bin/sqlcmd 
ln -sfn /opt/mssql-tools/bin/bcp-13.0.1.0 /usr/bin/bcp

apt install -y libc6 libstdc++6 libkrb5-3 libcurl3 openssl debconf #unixodbc unixodbc-dev (using msodbcsql)
pecl install sqlsrv
pecl install pdo_sqlsrv

phpversion="7.1"
echo "" >> /etc/php/$phpversion/fpm/php.ini
echo "# MS SQL Server Driver" >> /etc/php/$phpversion/fpm/php.ini
echo "extension=sqlsrv.so" >> /etc/php/$phpversion/fpm/php.ini
echo "extension=pdo_sqlsrv.so" >> /etc/php/$phpversion/fpm/php.ini
echo "" >> /etc/php/$phpversion/fpm/php.ini

echo "" >> /etc/php/$phpversion/cli/php.ini
echo "# MS SQL Server Driver" >> /etc/php/$phpversion/cli/php.ini
echo "extension=sqlsrv.so" >> /etc/php/$phpversion/cli/php.ini
echo "extension=pdo_sqlsrv.so" >> /etc/php/$phpversion/cli/php.ini
echo "" >> /etc/php/$phpversion/cli/php.ini
/etc/init.d/php$phpversion-fpm restart 

来自sqlcmd的测试:

sqlcmd -S xx.xx.xx.xx\INSTANCE -U username -P xxxxx

...或php:

$db = DB::connection( 'remoteSqlSrv' )->getPdo();

...失败,完全相同的尝试在W10 localhost dev env。

上工作

为什么在sqlsrv pdo上有这么多来自MSFT的不同的官方文档以及如何实现... grr!

最初以PHP 7.2开始上演,但在经过几个小时的抨击后放弃了所有希望。使用7.1启动新服务器,因为7.2尚未从MS发布稳定的sqlsrv pdo版本。

更新

更新了Shell脚本

sudo su

# Install dependencies
#
apt-get -f install
apt-get install libc6 libstdc++6 libkrb5-3 libcurl3 openssl debconf unixodbc unixodbc-dev 

# Manually install msodbcsql 13.1 and mssql-tools 14.0.5
#   ODBC .deb found here -> https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server
#   Tools .deb found here -> https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools
#   ... Are they compatible?
#
mkdir /debs
cd /debs
wget https://packages.microsoft.com/ubuntu/16.04/prod/pool/main/m/msodbcsql/msodbcsql_13.1.9.1-1_amd64.deb
wget https://packages.microsoft.com/ubuntu/16.04/prod/pool/main/m/mssql-tools/mssql-tools_14.0.5.0-1_amd64.deb
dpkg -i msodbcsql_13.1.9.1-1_amd64.deb
dpkg -i mssql-tools_14.0.5.0-1_amd64.deb

# Link tools to sqlcmd
#
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

# PHP 7.1 sqlsrv pdo extension
#
pecl install sqlsrv
pecl install pdo_sqlsrv

# Config php.ini for CLI & NGINX
#
phpversion="7.1"
phpini="/etc/php/$phpversion/fpm/php.ini"

echo "" >> $phpini
echo "# Extensions for Microsoft SQL Server Driver" >> $phpini
echo "extension=sqlsrv.so" >> $phpini
echo "extension=pdo_sqlsrv.so" >> $phpini
echo "" >> $phpini

phpini="/etc/php/"$phpversion"/cli/php.ini"

echo "" >> $phpini
echo "# Extensions for Microsoft SQL Server Driver" >> $phpini
echo "extension=sqlsrv.so" >> $phpini
echo "extension=pdo_sqlsrv.so" >> $phpini
echo "" >> $phpini

# Restart NGINX
#
/etc/init.d/php$phpversion-fpm restart 

# Shouldn't have to but just for good measure
#
shutdown -r now

# And last but not least, test SQL connection
#
sqlcmd -S xx.xx.xx.xx\instance -U username -P password

这产生了同样的例外:

  

Sqlcmd:错误:SQL Server的Microsoft ODBC驱动程序13:登录超时   过期。 Sqlcmd:错误:用于SQL Server的Microsoft ODBC驱动程序13:TCP   提供者:错误代码0x2AF9。 Sqlcmd:错误:Microsoft ODBC驱动程序13   对于SQL Server:与网络相关或特定于实例的错误   在建立与SQL Server的连接时发生。服务器不是   发现或无法访问。检查实例名称是否正确以及SQL是否正确   服务器配置为允许远程连接。欲获得更多信息   请参阅SQL Server联机丛书..

为了好玩,我尝试了isql -v <server> <user> <pass>并得到了:

  

[IM002] [unixODBC] [驱动程序管理器]未找到数据源名称,没有   指定的默认驱动程序[ISQL]错误:无法SQLConnect

1 个答案:

答案 0 :(得分:0)

问题在于我们的SQL服务器配置,而不是Unix SQLSRV PDO @ https://github.com/Microsoft/msphpsql

在Azure上的SQL服务器上,没有在端口1434上发生UDP通信的动态端口的静态连接失败。

假设是使用SQL浏览器进行DOS缓解,没有与SQL的请求通信(UDP),以利用动态TCP端口,这些端口将通过ICMP不可达消息拒绝。

从子NIC和父IP ALL配置中清除TCP动态端口,并在IP ALL和活动NIC上声明TCP端口,形成连接。

SQL Server TCP Config Example for MSPHPSQL PDO