我编写了一个作业服务器,它同时运行 1 个或多个作业(或同时运行,具体取决于系统上的 CPU 数量)。许多创建的作业连接到 SQL Server 数据库、执行查询、获取结果并将结果写入 CSV 文件。对于这些类型的作业,我使用pyodbc
Microsoft SQL Server ODBC Driver 1.0 for Linux 进行连接、运行查询,然后断开连接。
每个作业使用 python 多处理模块作为一个单独的进程运行。作业服务器本身作为双分叉后台进程启动。
这一切都运行良好,直到我今天注意到第一个 SQL Server 作业运行良好,但第二个似乎挂起(即看起来好像它一直在运行)。
在进一步调查中,我注意到第二份工作的流程已经变得僵化,所以我进行了如下手动测试:
[root@myserver jobserver]# python
Python 2.6.6 (r266:84292, Dec 7 2011, 20:48:22)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import pyodbc
conn = pyodbc.connect('DRIVER={SQL Server Native Client 11.0};SERVER=MY-DATABASE-SERVER;DATABASE=MY-DATABASE;UID=MY-ID;PWD=MY-PASSWORD')
c = conn.cursor()
c.execute('select * from my_table')
<pyodbc.Cursor object at 0x1d373f0>
r = c.fetchall()
len(r)
19012
c.close()
conn.close()
conn = pyodbc.connect('DRIVER={SQL Server Native Client 11.0};SERVER=MY-DATABASE-SERVER;DATABASE=MY-DATABASE;UID=MY-ID;PWD=MY-PASSWORD')
Segmentation fault
因此,您可以看到与数据库的第一个连接工作正常,但任何后续连接尝试都会因分段错误而失败。
我一生都无法弄清楚为什么会发生这种情况或解决方案,在今天之前一切正常,并且没有更改任何代码。
对此问题的任何帮助将不胜感激。