SQL Server에 연결할 때 시간 제한 만료됨 메시지

적용 대상: SQL Server

참고

문제 해결을 시작하기 전에 전제조건을 확인하고 체크리스트를 검토합니다.

시간 제한 오류는 특정 작업이 필요 이상으로 오래 걸린다는 것을 의미합니다. 클라이언트 애플리케이션은 다른 작업을 차단하고 애플리케이션을 일시 중단할 수 있는 작업을 무기한 대기하지 않고 중지합니다. 이 문서에서는 SQL Server 연결할 때 수신하는 "명령 시간 제한" 및 "연결 시간 제한" 오류에 대한 해결 방법을 제공합니다.

시간 제한 만료됨 오류 확인

"시간 제한 만료됨" 문제가 발생하면 다음 오류 메시지 중 하나 이상이 나타납니다.

  • 시간 제한이 만료되었습니다. 작업이 완료되기 전에 제한 시간이 초과되었거나 서버가 응답하지 않습니다.

  • System.Data.SqlClient.SqlException(0x80131904): 연결 시간 제한이 만료되었습니다. 사전 로그인 핸드셰이크 승인을 사용하는 동안 경과된 시간 제한 기간입니다. 이는 사전 로그인 핸드셰이크가 실패했거나 서버가 시간을 거슬러 응답할 수 없기 때문일 수 있습니다. 이 서버에 연결하는 동안 소요된 기간: [사전 로그인] 초기화=23; 핸드셰이크=14979;
    System.ComponentModel.Win32Exception(0x80004005): 대기 작업 시간이 초과되었습니다.

  • System.Data.SqlClient.SqlException(0x80131904): 시간 제한이 만료되었습니다. 작업이 완료되기 전에 제한 시간이 초과되었거나 서버가 응답하지 않습니다. System.ComponentModel.Win32Exception (0x80004005): 대기 작업 시간이 초과되었습니다.

  • 연결 시간 제한이 만료되었습니다. 사전 로그인 핸드셰이크 승인을 사용하는 동안 시간 초과 기간이 경과했습니다. 이는 사전 로그인 핸드셰이크가 실패했거나 서버가 시간을 제 시간에 응답할 수 없기 때문일 수 있습니다.
    이 서버에 연결하는 동안 소요된 기간: [사전 로그인] 초기화=21036; 핸드셰이크=0; (Microsoft SQL Server, 오류: -2).

  • System.InvalidOperationException: 시간 제한이 만료되었습니다. 풀에서 연결을 가져오기 전에 경과된 시간 제한 기간입니다.

    연결이 올바르게 닫혀 있지 않으면 오류가 발생할 수 있습니다. 이러한 오류는 풀된 모든 연결이 사용 중이며 최대 풀 크기에 도달했기 때문에 발생합니다. 연결 풀 소진 문서에 설명된 단계를 수행하는 경우 이러한 오류를 방지할 수 있습니다.

참고

두 번째 및 세 번째 오류는 .NET Framework 4.5 이상 버전을 설치할 때 발생합니다.

시간 제한 만료됨 오류 유형 확인

연결 관점에서 다음과 같은 시간 제한 문제가 발생합니다.

  • 연결 시간 제한(기본적으로 15초)
  • 쿼리 또는 명령 시간 제한(기본적으로 30초)

참고

기본값은 코드, 연결 문자열 또는 기타 메서드를 통해 설정할 수 있습니다.

문제를 해결하기 전에 오류 메시지의 전체 호출 스택을 확인하여 오류 유형을 확인합니다.

  • 연결 시간 제한의 호출 스택에 대한 다음 예제를 참조하세요.

    System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
    at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
    at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
    at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt,Boolean trustServerCert, Boolean& marsCapable)
    at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnectionowningObject)
    at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfoserverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
    at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
    at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
    at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
    at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
    at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)  
    at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
    at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
    at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
    at System.Data.SqlClient.SqlConnection.Open()  
    

    SqlConnection.Open은(는) 클라이언트가 연결을 열려고 하기 때문에 쿼리와 관련되지 않음을 나타냅니다.

  • 쿼리 또는 명령 시간 제한의 호출 스택에 대한 다음 예제를 참조하세요.

    System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
    at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
    at System.Data.SqlClient.SqlDataReader.get_MetaData()
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
    at System.Data.SqlClient.SqlCommand.ExecuteScalar()
    

    SqlCommand 클래스는 연결이 아닌 쿼리를 사용하는 데 사용됩니다. ExecuteScalar 메서드는 쿼리를 실행하는 데 사용됩니다. 다른 항목(예: ExecuteReader 또는 ExecuteNonQuery)도 확인할 수 있습니다.

시간 제한 만료됨 오류 문제 해결

  • 쿼리 또는 명령 시간 제한 오류가 발생하는 경우 쿼리 시간 제한 오류 문제 해결을 참조하세요.

  • 연결 시간 제한 오류가 발생하는 경우 다음 단계를 수행합니다.

    1. 연결 시간 제한 매개 변수를 늘립니다.

      • 애플리케이션을 사용하여 SQL Server 연결하는 경우 관련 연결 시간 제한 매개 변수 값을 늘리고 연결이 되었는지 확인합니다. 예를 들어 System.Data.SqlClient을(를) 사용하는 경우 SqlConnection.ConnectionTimeout 속성을 30 이상 값으로 설정합니다.

        참고

        다른 공급자를 사용하는 경우 SQL 클라이언트 프로그래밍 홈페이지를 확인하세요.

      • SSMS(SQL Server Management Studio)를 사용하는 경우 서버에 연결 대화 상자에서 연결 속성 탭을 선택하고 연결 시간 제한 설정을 더 높은 값으로 설정합니다.

    2. 연결이 결국 성공하면 네트워크 문제입니다. 이 문제를 해결하려면 네트워크 관리자와 협력해야 합니다. 해결된 후에는 애플리케이션에서 기본 설정으로 되돌릴 수 있습니다.

      참고

      애플리케이션에서 연결 시간 제한을 늘리는 것이 가능한 방법이지만 장기적인 해결 방법은 아닙니다. 데이터 원본에 연결하려고 할 때 연결이 빠르게(일반적으로 몇 밀리초 이내) 발생하기 때문입니다.

오류의 일반적인 원인 및 해결 방법

다음 표에는 시간 제한 만료 오류의 일반적인 원인과 해결 방법이 나와 있습니다. 자세한 팁과 제안은 문제 해결: 시간 제한 만료됨을 참조하세요.

일반적인 원인 해결 방법:
서버 이름이 잘못 입력되었습니다. 올바른 서버 이름으로 다시 시도합니다.
서버의 SQL Server 서비스가 실행되고 있지 않습니다. SQL Server 데이터베이스 엔진의 인스턴스를 시작합니다.
데이터베이스 엔진 인스턴스의 TCP/IP 포트가 방화벽에 의해 차단되었습니다. 데이터베이스 엔진에 대한 액세스를 허용하도록 방화벽을 구성합니다.
데이터베이스 엔진이 포트 1433에서 수신 대기하지 않습니다. 이는 포트가 변경되거나 기본 인스턴스가 아니며 SQL Server Browser 서비스가 실행되고 있지 않기 때문입니다. SQL Server Browser 서비스를 시작하거나 Sqlcmd -S <ip_addres>,<port> 명령으로 연결할 TCP/IP 포트 번호를 지정합니다. 오류 로그에서 SQL Server 수신 대기 중인 포트 번호를 찾습니다.
SQL Server Browser 서비스가 실행 중이지만 UDP 포트 1434가 방화벽에 의해 차단되었습니다. 서버에서 UPD 포트 1434에 대한 액세스를 허용하도록 방화벽을 구성하거나 연결할 TCP/IP 포트 번호를 지정합니다.
클라이언트와 서버가 동일한 네트워크 프로토콜을 사용하도록 구성되지 않았습니다. SQL Server 구성 관리자 사용하여 서버 및 클라이언트 컴퓨터에 하나 이상의 사용 가능한 프로토콜이 공통적으로 있는지 확인합니다. 예를 들어 클라이언트가 TCP/IP 소켓을 사용하여 연결하지만 SQL Server 명명된 파이프에서만 수신 대기하는 경우 연결을 설정할 수 없습니다.
네트워크는 서버 이름을 IP 주소로 확인할 수 없습니다. 이것은 ping 또는 telnet 프로그램을 사용하여 테스트할 수 있습니다. 네트워크에서 컴퓨터 이름 확인 문제를 해결하거나 IP 주소를 사용하여 서버에 연결합니다. 이는 SQL Server 문제가 아닙니다. 도움이 필요하면 Windows 설명서를 참조하거나 네트워크 관리자에게 문의하세요. 다음 명령을 사용하여 연결을 테스트합니다.
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
IP 주소를 사용하는 것이 작동하지만 서버 이름이 작동하지 않는 경우 이름 확인 문제입니다.
네트워크가 IP 주소를 사용하여 연결할 수 없습니다. 이것은 ping, telnet 또는 tracert 프로그램을 사용하여 테스트할 수 있습니다. 네트워크의 TCP/IP 문제를 해결합니다. 이것은 SQL Server 문제가 아닙니다. 도움이 필요하면 Windows 설명서를 참조하거나 네트워크 관리자에게 문의하세요.
고급 네트워크 문제 해결은 0300 간헐적 또는 주기적 네트워크 문제를 참조하세요.

참고 항목