2012-05-08 3 views
0

하나 이상의 작업을 동시에 실행하는 작업 서버를 작성했습니다 (또는 동시에 시스템의 CPU 수에 따라 다름). 생성 된 많은 작업은 SQL Server 데이터베이스에 연결하고 쿼리를 수행하고 결과를 가져와 결과를 CSV 파일에 작성합니다. 이러한 유형의 작업의 경우, pyodbc 및 Linux 용 Microsoft SQL Server ODBC 드라이버 1.0을 사용하여 쿼리를 실행 한 다음 연결을 끊습니다.Linux 용 MS ODBC 드라이버 1.0을 사용하는 Linux에서 pyodbc를 사용하여 SQL Server 데이터베이스에 다시 연결할 때 세그먼트 오류가 발생했습니다.

각 작업은 파이썬 다중 처리 모듈을 사용하여 별도의 프로세스로 실행됩니다. 작업 서버 자체는 두 갈래의 백그라운드 프로세스로 시작됩니다.

오늘 첫 번째 SQL Server 작업이 정상적으로 실행되었지만 두 번째 SQL Server 작업이 멈추는 것처럼 보였을 때까지이 모든 것이 잘 돌아갔습니다 (즉, 영원히 계속 실행중인 것처럼 보입니다).

[[email protected] 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 

그래서 당신이 볼 수있는 데이터베이스에 처음 연결이 잘하지만 후속 작업 :이 두 번째 작업 과정을주의 추가 조사에

다음과 같이 내가 수동 테스트를 실행 좀비가가되었다 세그먼테이션 결함으로 실패 연결을 시도합니다.

나는 왜 이런 일이 일어나기 시작했는지 해결책을 찾지 못했습니다. 오늘 전에는 문제가 없었고 코드도 변경되지 않았습니다.

이 문제에 대한 도움을 주시면 감사하겠습니다.

답변

1

필자는 매우 비슷한 문제가 있었으며, 필자의 경우 해결책은 연결을 시도한 컴퓨터에서 ODBC 드라이버를 업그레이드하는 것이 었습니다. 나는 그것이 문제를 해결 한 이유에 대해 많이 알지 못한다. 내가 연결하려고 시도했던 데이터베이스 서버에서 무언가가 변경되거나 업그레이드 된 것으로 의심됩니다.

이 답변은 OP에 비해 너무 늦을 수 있지만 문제를 해결하는 동안이 질문을 발견 한 후에 어쨌든 그것을 공유하고 싶었습니다. 답변을 찾지 못했을 때 약간 낙심했습니다.

1

이 문제의 기본 메커니즘에 대한 구체적인 내용은 자세히 설명하지 않습니다. 그러나 문제는 파이썬의 다중 처리 모듈에서 Queue 클래스를 사용하여 발생했다고 말할 수 있습니다. 이 큐를 올바르게 구현했는지 여부는 아직 답을 얻지 못했지만 각 작업이 완료된 후에 큐가 하위 프로세스 (및 기본 데이터베이스 연결)를 올바르게 종료하지 못했기 때문에 분할 오류가 발생했습니다.

이 문제를 해결하기 위해 기본적으로 목록에 포함 된 순서대로 실행되는 Process 개체 목록 인 자체 대기열 시스템을 구현했습니다. 그런 다음 루프는 모든 프로세스가 완료 될 때까지 해당 프로세스의 상태를 주기적으로 확인합니다. 다음 일괄 처리 작업이 검색되고 실행됩니다.

0

최근에이 문제가 발생했습니다. 내 구성에는 unixODBC-2.3.0과 Linux 용 MS ODBC 드라이버 1.0이 포함됩니다. 몇 가지 실험을 거친 후 데이터베이스 업그레이드 (이 경우 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에하지만 행운 내 드라이버 관리자를 업그레이드했습니다. 내 마지막 해결책은 UnixODBC-2.3.2에서 FreeTDS 0.82.6 이상을 사용하는 것입니다. 이 버전의 FreeTDS 드라이버는 unixODBC-2.3.0과 함께 나 빠지게됩니다. 왜냐하면 관리자가 드라이버의 기능을 지원하지 않는다고 불평하기 때문입니다. unixODBC가 업그레이드되면 모든 것이 원활하게 진행됩니다.