1

我编写了一个作业服务器,它同时运行 1 个或多个作业(或同时运行,具体取决于系统上的 CPU 数量)。许多创建的作业连接到 SQL Server 数据库、执行查询、获取结果并将结果写入 CSV 文件。对于这些类型的作业,我使用pyodbcMicrosoft 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

因此,您可以看到与数据库的第一个连接工作正常,但任何后续连接尝试都会因分段错误而失败。

我一生都无法弄清楚为什么会发生这种情况或解决方案,在今天之前一切正常,并且没有更改任何代码。

对此问题的任何帮助将不胜感激。

4

3 回答 3

1

我无法详细说明这个问题背后的基本机制的细节。但是,我可以说问题是由在 python 的多处理模块中使用 Queue 类引起的。我是否正确实现了这个队列仍未得到答复,但似乎队列在每个作业完成后没有正确终止子进程(和底层数据库连接),这导致了分段错误。

为了解决这个问题,我实现了我自己的队列系统,它基本上是一个 Process 对象列表,按照它们被放入列表的顺序执行。然后一个循环定期检查这些进程的状态,直到所有进程都完成。然后将检索并执行下一批作业。

于 2012-09-17T11:52:13.177 回答
1

我有一个非常相似的问题,在我的情况下,解决方案是升级我试图建立连接的机器上的 ODBC 驱动程序。恐怕我不太了解为什么会解决这个问题。我怀疑我尝试连接的数据库服务器上发生了某些更改或升级。

这个答案对于 OP 来说可能为时已晚,但我还是想分享它,因为我在解决问题时发现了这个问题,并且当我没有看到任何答案时有点气馁。

于 2012-09-06T00:19:11.857 回答
0

我最近也遇到了这个问题。我的配置包括 unixODBC-2.3.0 和 MS ODBC Driver 1.0 for Linux。经过一些实验,我们推测问题可能是由于数据库升级(在我们的案例中升级到 SQLServer 2008 SP1)引起的,从而触发了 MS ODBC 驱动程序中的一些错误。这个问题也出现在这个线程中:

http://social.technet.microsoft.com/Forums/sqlserver/en-US/23fafa84-d333-45ac-8bd0-4b76151e8bcc/sql-server-driver-for-linux-causes-segmentation-fault?forum=sqldataaccess

我还尝试将驱动程序管理器升级到 unixODBC-2.3.2,但没有成功。我的最终解决方案是使用 FreeTDS 0.82.6+ 和 unixODBC-2.3.2。此版本的 FreeTDS 驱动程序与 unixODBC-2.3.0 不兼容,因为经理一直抱怨驱动程序不支持功能。如果升级了 unixODBC,一切都会顺利进行。

于 2014-03-19T11:25:11.883 回答