Bitbucket Runner中Docker部署SQL Server的连接端口及bak恢复报错排查
我在Bitbucket中使用diegonachon/mssql_python_sqlcmd镜像执行.bak文件恢复操作,编写的pipelines YAML配置文件如下:
image: diegonachon/mssql_python_sqlcmd env: - ACCEPT_EULA = Y - SA_PASSWORD = 5tr0ngP455 pipelines: custom: run: - step: name: restauration runs-on: - 'self.hosted' size: 8x script: - pip install pysftp - pip install pyodbc - pip install psycopg2 - mkdir /bak_db/ - python dowload_bak_file.py - python restore_file.py
下载好待恢复的.bak文件后,通过restore_db.py中的代码执行恢复:
import os os.system(''' sqlcmd -S localhost -U SA -Q''' ''' "Restore DATABASE data_base FROM DISK = '/bak_db/data_base.bak' \ WITH MOVE 'data_base' TO '/bak_db/data_base.mdf', \ MOVE 'data_base' TO '/bak_db/data_base.ldf' " \ -P 5tr0ngP455 ''')
执行时出现SQL Server连接错误:
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2AF9.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.
我怀疑是端口问题,考虑修改“localhost”配置,请问是否正确?或者我还遗漏了其他配置项?
- 先确认SQL Server服务是否就绪:使用
diegonachon/mssql_python_sqlcmd镜像时,很可能容器内的SQL Server还没完全启动就执行了恢复命令。可以在恢复前加等待逻辑,比如循环执行sqlcmd -S localhost,1433 -U SA -P 5tr0ngP455 -Q "SELECT 1"直到成功,或者用专门的等待脚本确保服务就绪。 - 明确指定端口连接:SQL Server默认端口是1433,把连接字符串改成
localhost,1433,避免端口未映射或默认端口未启用的问题。同时注意你的恢复命令存在逻辑错误:两个MOVE都用了data_base,日志文件的逻辑名通常是原数据库名+_log(比如data_base_log),可以先执行RESTORE FILELISTONLY FROM DISK='/bak_db/data_base.bak'查看bak文件内的实际逻辑文件名,再调整参数。修正后的命令示例:sqlcmd -S localhost,1433 -U SA -P 5tr0ngP455 -Q "RESTORE DATABASE data_base FROM DISK = '/bak_db/data_base.bak' WITH MOVE 'data_base' TO '/bak_db/data_base.mdf', MOVE 'data_base_log' TO '/bak_db/data_base.ldf'" - 修正环境变量格式:YAML中的环境变量不能包含空格,原配置里的
ACCEPT_EULA = Y要改成ACCEPT_EULA=Y,SA_PASSWORD = 5tr0ngP455改成SA_PASSWORD=5tr0ngP455,否则环境变量可能不生效,导致SQL Server初始化失败。 - 检查自托管Runner的网络配置:如果使用自托管Runner,要明确目标SQL Server的位置——如果是镜像内的SQL Server,
localhost指向容器自身;如果是Runner主机上的SQL Server,要确保主机的SQL Server允许本地连接且服务正常运行。
内容的提问来源于stack exchange,提问作者nachon

