none
The log for database 'tempdb' is not available RRS feed

  • Вопрос


  • Приветствую SQL гуру!
    Нужно решение проблемы или совет господа,
    Имеется “двухнодовый” SQL кластер поднятый на кластере vSphere 4 из двух нод, SQL разнесён на разные ноды ESX
    Система работает ПРЕКРАСНО проблем с ней НЕТ, в работе кластера SQL тоже проблем НЕТ.
    Конфигурация систем на которой крутится SQL
    Это Windows Server 2008 x64 Enterprise (6.0.6002) на VM Gest c 2 CPU, 4GB Ram, 1 HDD OS, 2 HDD Quorum, 3 HDD MSTDC, 4 HDD SQLDATA
    2,3,4 кластерные, из названия видны их функции.
    Версия SQL Server 2008 x64 Enterprise (10.0.2723.0)

    На SQL-е крутится несколько баз, все “местного производства” (разные програмульки и одна база “посолидней”)
    Периодически вылетает следующая ошибка

    The log for database 'tempdb' is not available. Check the event log for related error messages. Resolve any errors and restart the database. (.Net SqlClient Data Provider)

    Я сам не DBA и далек от понимания, нужен ваш техникал експертайз,


    Детальный лог ошибки

    ===================================

    An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

    ------------------------------
    Program Location:

       at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteReader(String sqlCommand)
       at Microsoft.SqlServer.Management.Smo.ExecuteSql.GetDataReader(String query)
       at Microsoft.SqlServer.Management.Smo.DataProvider.SetConnectionAndQuery(ExecuteSql execSql, String query)
       at Microsoft.SqlServer.Management.Smo.ExecuteSql.GetDataProvider(StringCollection query, Object con, StatementBuilder sb, RetriveMode rm)
       at Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillData(ResultType resultType, StringCollection sql, Object connectionInfo, StatementBuilder sb)
       at Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillDataWithUseFailure(SqlEnumResult sqlresult, ResultType resultType)
       at Microsoft.SqlServer.Management.Smo.SqlObjectBase.BuildResult(EnumResult result)
       at Microsoft.SqlServer.Management.Smo.SqlObjectBase.GetData(EnumResult erParent)
       at Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetData()
       at Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetData(Request req, Object ci)
       at Microsoft.SqlServer.Management.Sdk.Sfc.Enumerator.GetData(Object connectionInfo, Request request)
       at Microsoft.SqlServer.Management.Smo.ExecutionManager.GetEnumeratorDataReader(Request req)
       at Microsoft.SqlServer.Management.Smo.SqlSmoObject.GetInitDataReader(String[] fields, OrderBy[] orderby)
       at Microsoft.SqlServer.Management.Smo.SqlSmoObject.ImplInitialize(String[] fields, OrderBy[] orderby)
       at Microsoft.SqlServer.Management.Smo.Agent.JobServer.ImplInitialize(String[] fields, OrderBy[] orderby)
       at Microsoft.SqlServer.Management.Smo.SqlSmoObject.Initialize(Boolean allProperties)
       at Microsoft.SqlServer.Management.Smo.SqlSmoObject.OnPropertyMissing(String propname, Boolean useDefaultValue)
       at Microsoft.SqlServer.Management.Smo.PropertyCollection.RetrieveProperty(Int32 index, Boolean useDefaultOnMissingValue)
       at Microsoft.SqlServer.Management.Smo.PropertyCollection.GetValueWithNullReplacement(String propertyName, Boolean throwOnNullValue, Boolean useDefaultOnMissingValue)
       at Microsoft.SqlServer.Management.Smo.Agent.JobServer.get_MsxServerName()
       at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.AgentPropertyHandler.SetTsxInformation(Server server, INameObjectCollection properties)
       at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.AgentPropertyHandler.PopulateProperties(INodeInformation source, INameObjectCollection properties)
       at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.NodeContext.PopulateProperties()
       at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.NavigableItemBuilder.SetStaticProperties(NodeContext nodeContext)
       at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.NavigableItemBuilder.BuildDynamicItemWithQuery(IList`1 nodes, INodeInformation source, INavigableItem sourceItem, String urnQuery, Boolean registerBuilder, Boolean registerBuiltItems)
       at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.NavigableItemBuilder.BuildDynamicItem(IList`1 nodes, INodeInformation source, INavigableItem sourceItem, IFilterProvider filter)
       at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.NavigableItemBuilder.Build(IList`1 nodes, INodeInformation source, INavigableItem sourceItem, IFilterProvider filter)
       at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.NavigableItem.GetChildren(IGetChildrenRequest request)
       at Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.ExplorerHierarchyNode.BuildChildren(WaitHandle quitEvent)

    ===================================

    The log for database 'tempdb' is not available. Check the event log for related error messages. Resolve any errors and restart the database. (.Net SqlClient Data Provider)

    ------------------------------
    For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&EvtSrc=MSSQLServer&EvtID=9001&LinkId=20476

    ------------------------------
    Server Name: SQLSERVERNAME
    Error Number: 9001
    Severity: 21
    State: 1
    Line Number: 2


    ------------------------------
    Program Location:

       at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
       at System.Data.SqlClient.SqlInternalConnection.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.ExecuteReader(CommandBehavior behavior, String method)
       at System.Data.SqlClient.SqlCommand.ExecuteReader()
       at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteReader(String sqlCommand)




    в Event Viewer наблюдаются следуюшиие ошибки

    Log Name:      Application
    Source:        MSSQLSERVER
    Date:          4/15/2010 6:25:01 PM
    Event ID:      9001
    Task Category: Server
    Level:         Error
    Keywords:      Classic
    User:          SQLACCAUNTNAME
    Computer:      SQLSERVERNAME
    Description:
    The log for database 'tempdb' is not available. Check the event log for related error messages. Resolve any errors and restart the database.



    И второй лог


    Log Name:      Application
    Source:        DatabaseMail
    Date:          4/15/2010 6:25:01 PM
    Event ID:      0
    Task Category: None
    Level:         Error
    Keywords:      Classic
    User:          N/A
    Computer:      SQLSERVERNAME
    Description:
    Database Engine Instance=SQLCLUSTERINSTANCE;Mail PID=2680;Error Message:

    1) Exception Information
    ===================
    Exception Type: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException
    Message: The connection is not open.
    Data: System.Collections.ListDictionaryInternal
    TargetSite: Void ValidateConnection()
    HelpLink: NULL
    Source: DatabaseMailEngine

    StackTrace Information
    ===================
       at Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.ValidateConnection()
       at Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.ValidateConnectionAndTransaction()
       at Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.RollbackTransaction()
       at Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.GetDataFromQueue(DataAccessAdapter da, Int32 lifetimeMinimumSec)
       at Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.ProcessQueueItems(String dbName, String dbServerName, Int32 lifetimeMinimumSec, LogLevel loggingLevel)
    Event Xml:
    <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
      <System>
        <Provider Name="DatabaseMail" />
        <EventID Qualifiers="0">0</EventID>
        <Level>2</Level>
        <Task>0</Task>
        <Keywords>0x80000000000000</Keywords>
        <TimeCreated SystemTime="2010-04-15T14:25:01.000Z" />
        <EventRecordID>22060</EventRecordID>
        <Channel>Application</Channel>
        <Computer>SQLSERVERNAME</Computer>
        <Security />
      </System>
      <EventData>
        <Data>Database Engine Instance=SQLCLUSTERINSTANCE;Mail PID=2680;Error Message:

    1) Exception Information
    ===================
    Exception Type: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException
    Message: The connection is not open.
    Data: System.Collections.ListDictionaryInternal
    TargetSite: Void ValidateConnection()
    HelpLink: NULL
    Source: DatabaseMailEngine

    StackTrace Information
    ===================
       at Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.ValidateConnection()
       at Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.ValidateConnectionAndTransaction()
       at Microsoft.SqlServer.Management.SqlIMail.Server.DataAccess.ConnectionManager.RollbackTransaction()
       at Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.GetDataFromQueue(DataAccessAdapter da, Int32 lifetimeMinimumSec)
       at Microsoft.SqlServer.Management.SqlIMail.IMailProcess.QueueItemProcesser.ProcessQueueItems(String dbName, String dbServerName, Int32 lifetimeMinimumSec, LogLevel loggingLevel)</Data>
      </EventData>
    </Event>




    В других логах пустно, как в систем так и в остальных.



    15 апреля 2010 г. 14:59

Ответы

  • Приветствую.
    Судя по ошибке о недоступности лога базы tempdb можно предположить что: поврежден файл *.ldf базы tempdb или диск, на котором лежит файл, был недоступен\занят, возможны проблемы аппаратного характера.

    Выполни запрос в SSMS
    use tempdb
    go
    sp_helpfile
    go
    увидишь физическое местоположение файлов.
    Проверь их наличие, выполни проверки диска chkdsk.

    tempdb обычно является высоконагруженной базой и на высоконагруженных системах ее рекомендуется выносить на отдельный физический диск (RAID).
    При перезагрузке SQL Server база tempdb пересоздается.
    Немного подробнее про эту базу - http://msdn.microsoft.com/ru-ru/library/ms345368.aspx


    MCITP
    • Помечено в качестве ответа Arman Obosyan 16 апреля 2010 г. 12:07
    15 апреля 2010 г. 19:46
  • Бекап на уровне VM Gest не делается, только на уровне OS,

    Да DataBase маил также используется, возвращаясь к нагрузке tempdb будем разносить на разные диски.


    Скорее всего мы пересоберем кластер на 2008 R2 (6.1.7600) на SQL 2008 CU7 и там уже разнесём системные базы на разные диски

    Спасибо господа, тему закрываю тогда

     

    И вопрос на последок, как может повлиять отключение Auto Update Statistic и Auto Create Statistics на tempdb?

     


    Arman Obosyan, http://postmaster.ge/blog
    • Помечено в качестве ответа Arman Obosyan 16 апреля 2010 г. 12:09
    16 апреля 2010 г. 12:06

Все ответы

  • Приветствую.
    Судя по ошибке о недоступности лога базы tempdb можно предположить что: поврежден файл *.ldf базы tempdb или диск, на котором лежит файл, был недоступен\занят, возможны проблемы аппаратного характера.

    Выполни запрос в SSMS
    use tempdb
    go
    sp_helpfile
    go
    увидишь физическое местоположение файлов.
    Проверь их наличие, выполни проверки диска chkdsk.

    tempdb обычно является высоконагруженной базой и на высоконагруженных системах ее рекомендуется выносить на отдельный физический диск (RAID).
    При перезагрузке SQL Server база tempdb пересоздается.
    Немного подробнее про эту базу - http://msdn.microsoft.com/ru-ru/library/ms345368.aspx


    MCITP
    • Помечено в качестве ответа Arman Obosyan 16 апреля 2010 г. 12:07
    15 апреля 2010 г. 19:46
  • ...дело в том что на системах также установлен агент OpsMgr который кроме как ошибки SQL других не обнаружил

    диск (и) в системе также работает в это время и доступен (иначе были бы логи, что диск пропал или работает с ошибками)

    проблема аппаратного характера, не знаю на сколько возможна в случае когда речь идет о виртуальном сервере, если говорить про сами хост системы на чем крутится кластер то с ними однозначно нет проблем так как и другие системы работают на данных хостах и проблем у них нет.

    Во время ошибки tempdb (и лог ldf) видны в системе, сама OS к ним обращается и работает.

    Возможен ли подобный сценарий ошибки если "кривая база" не правильно работает и криво использует tempdb?

    что рекомендуется по поводу обновления до последнего CU для SQL ставить или лучше дождаться SP?

    Примем к сведенью и перенесем tempdb на другой диск.

    Спасибо, если есть другие рекомендации рад буду услышать.

     


    Arman Obosyan, http://postmaster.ge/blog
    16 апреля 2010 г. 6:00
  • Вот что нашел по этой теме:
    http://spininfo.homelinux.com/news/VirtualCenter/2008/06/20/VCB_and_SQL_Server_2005
    http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/ee11308b-6e6d-4625-b0a7-446eae10bc56

    Похоже эта ошибка - эффект от резервного копирования виртуальной машины средствами WMware.
    Попробуй сопоставить эти два события.

    Есть еще вот такая KB-шка - http://support.microsoft.com/kb/937343/en-us (но не для твоей версии SQL. привел для обозначения так сказать существующей проблемы)
     


     

     

    MCITP

    16 апреля 2010 г. 7:48
  • Увидел у вас в логе вот это:

    И второй лог


    Log Name:      Application
    Source:        DatabaseMail

    Используете в проекте компонент DatabaseMail? DatabaseMail для своей работы использует ServiceBroker, который, в свою очередь активно использует tempdb. Возможно в этом проблема. Ещё думаю стоит посмотреть, кто использует tempdb, и оптимизировать её использование.

    16 апреля 2010 г. 8:10
  • Бекап на уровне VM Gest не делается, только на уровне OS,

    Да DataBase маил также используется, возвращаясь к нагрузке tempdb будем разносить на разные диски.


    Скорее всего мы пересоберем кластер на 2008 R2 (6.1.7600) на SQL 2008 CU7 и там уже разнесём системные базы на разные диски

    Спасибо господа, тему закрываю тогда

     

    И вопрос на последок, как может повлиять отключение Auto Update Statistic и Auto Create Statistics на tempdb?

     


    Arman Obosyan, http://postmaster.ge/blog
    • Помечено в качестве ответа Arman Obosyan 16 апреля 2010 г. 12:09
    16 апреля 2010 г. 12:06
  • ..
    Скорее всего мы пересоберем кластер на 2008 R2 (6.1.7600) на SQL 2008 CU7 и там уже разнесём системные базы на разные диски
    ..
    И вопрос на последок, как может повлиять отключение Auto Update Statistic и Auto Create Statistics на tempdb?
    ..

    - Можно не разносить системные базы (tempdb отдельно от master, msdb), а всего лишь отделив системные базы от пользовательских.

    - по поводу отключения опций создания и обновления статистики ... - все зависит от контекста нагрузки.
    Если у вас в tempdb создается всегда много маленьких временных таблиц, то отключение опций даст положительный эффект.
    Если в tempdb создаются большие временные таблицы, то эффект может быть и отрицательный.
    Если у вас SQL Server не настолько серьёзен в своих намерениях :) (сужу по тому что у вас нету выделенного DBA), то лучше оставьте опции как есть.


    MCITP
    16 апреля 2010 г. 13:38