尝试从 Azure VM 连接到 Azure 托管实例中的 sql 时超时

问题描述

我正在尝试从 Azure VM 机器中的 Python 脚本访问 Azure 托管实例(IP:xxxx.database.windows.net)中 sql 数据库中的表,但出现以下操作错误。我尝试了以下两种不同的方法

错误

OperationalError: ('08001','[08001] [Microsoft][sql Server Native Client 11.0]TCP Provider: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机未能响应。\r\n (10060) (sqlDriverConnect); [08001] [Microsoft][sql Server Native Client 11.0]登录超时过期 (0); [08001] [Microsoft][sql Server Native Client 11.0 ]建立与 sql Server 的连接时发生与网络相关或特定于实例的错误。找不到或无法访问服务器。请检查实例名称是否正确以及 sql Server 是否配置为允许远程连接。有关详细信息,请参阅 sql服务器在线图书。(10060)')

连接字符串的第一种方式:

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("mssql+pyodbc://<username>:<password>@<server>/<database>?driver=sql+Server+Native+Client+11.0")
query = "select * from table"
df=pd.read_sql(query,engine)

连接字符串的第二种方式:

import pyodbc

server = 'xxx.database.windows.net'
database = 'database'
username = 'username'
password = 'password'   
driver= '{sql Server Native Client 11.0}'
with pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password) as conn:
    with conn.cursor() as cursor:
        cursor.execute("SELECT TOP 3 name,collation_name FROM sys.databases")
        row = cursor.fetchone()
        while row:
            print (str(row[0]) + " " + str(row[1]))
            row = cursor.fetchone()

另外,我也试过把驱动改成下面的驱动,还是不行。

{ODBC Driver 11 for sql Server}
{ODBC Driver 13 for sql Server}
{ODBC Driver 17 for sql Server}
{sql Server Native Client 11.0}

有趣的部分是,如果我尝试使用来自非 Azure VM 的本地机器(例如:我的本地机器或我可以 RDP 连接的其他服务器)的 相同 连接字符串进行连接,我可以访问数据库。但是当我在 Azure VM 机器上尝试时,它超时了。您对如何解决此问题有任何想法吗?

感谢您的意见。

解决方法

所以最后我们发现是防火墙导致了这个问题。我们需要先检查防火墙规则。