AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 57432
Accepted
M.Ali
M.Ali
Asked: 2014-01-24 15:14:13 +0800 CST2014-01-24 15:14:13 +0800 CST 2014-01-24 15:14:13 +0800 CST

Erro "O banco de dados está em transição"

  • 772

Hoje eu estava tentando restaurar um banco de dados sobre um banco de dados já existente, simplesmente cliquei com o botão direito do mouse no banco de dados em SSMS -> Tarefas -> Desconectar para que eu pudesse restaurar o banco de dados.

Uma pequena janela pop-up apareceu e mostrou Query Executing.....por algum tempo e depois lançou um erro dizendo Database is in use cannot take it offline. Do qual eu reuni existem algumas conexões ativas para esse banco de dados, então tentei executar a seguinte consulta

USE master
GO
ALTER DATABASE My_DatabaseName
SET OFFLINE WITH ROLLBACK IMMEDIATE
GO

Novamente, neste ponto, o SSMS apareceu Query Executing.....por algum tempo e depois lançou o seguinte erro:

Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'My_DatabaseName'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.

Depois disso, não consegui me conectar ao banco de dados por meio do SSMS. e quando tentei colocá-lo offline usando o SSMS, ele apresentou um erro dizendo:

Database is in Transition. Try later .....

Neste ponto, eu simplesmente não conseguia tocar no banco de dados, nada que tentei, retornou a mesma mensagem de erro Database is in Transition.

Peguei no google e li algumas perguntas em que as pessoas enfrentaram problemas semelhantes e recomendaram fechar o SSMS e abri-lo novamente, assim como eu e como era apenas um servidor dev, acabei de excluir o banco de dados usando o SSMS e restaurá-lo em um novo banco de dados.

Minha pergunta é o que poderia ter causado isso ?? e como posso evitar que isso aconteça no futuro e se eu acabar na mesma situação no futuro, existe alguma outra maneira de corrigi-lo além de excluir todo o banco de dados ???

obrigada

sql-server sql-server-2008-r2
  • 3 3 respostas
  • 71503 Views

3 respostas

  • Voted
  1. Best Answer
    Thomas Stringer
    2014-01-24T16:49:21+08:002014-01-24T16:49:21+08:00

    Reprodução

    1. Abra o SSMS
    2. Digite o seguinte em uma nova janela de consulta

      use <YourDatabase>;
      go
      
    3. Vá até o Pesquisador de Objetos (SSMS) e clique com o botão direito do mouse em <YourDatabase>-> Tasks->Take Offline
    4. Abra uma segunda nova janela de consulta e digite o seguinte:

      use <YourDatabase>;
      go
      

    Você será solicitado com a seguinte mensagem:

    Msg 952, Level 16, State 1, Line 1
    Database 'TestDb1' está em transição. Tente a declaração mais tarde.

    O motivo pelo qual isso está acontecendo pode ser encontrado em uma consulta de diagnóstico semelhante à abaixo:

    select
        l.resource_type,
        l.request_mode,
        l.request_status,
        l.request_session_id,
        r.command,
        r.status,
        r.blocking_session_id,
        r.wait_type,
        r.wait_time,
        r.wait_resource,
        request_sql_text = st.text,
        s.program_name,
        most_recent_sql_text = stc.text
    from sys.dm_tran_locks l
    left join sys.dm_exec_requests r
    on l.request_session_id = r.session_id
    left join sys.dm_exec_sessions s
    on l.request_session_id = s.session_id
    left join sys.dm_exec_connections c
    on s.session_id = c.session_id
    outer apply sys.dm_exec_sql_text(r.sql_handle) st
    outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) stc
    where l.resource_database_id = db_id('<YourDatabase>')
    order by request_session_id;
    

    Pelo que vale, você não precisa do Pesquisador de Objetos para reproduzir esse erro. Você só precisa de uma solicitação bloqueada que esteja tentando a mesma operação (neste caso, coloque o banco de dados offline). Veja a captura de tela abaixo para as três etapas no T-SQL:

    insira a descrição da imagem aqui

    O que você provavelmente verá é sua sessão do Pesquisador de Objetos sendo bloqueada por outra sessão (mostrada por blocking_session_id). Essa sessão do Pesquisador de Objetos estará tentando obter um bloqueio exclusivo ( X) no banco de dados. No caso do repro acima, a sessão do Pesquisador de Objetos recebeu um bloqueio de atualização ( U) e tentou converter em um bloqueio exclusivo ( X). Ele tinha um wait_type de LCK_M_X, bloqueado por nossa sessão que foi representada pela primeira janela de consulta (o use <YourDatabase>pega um bloqueio compartilhado ( S) no banco de dados).

    E então esse erro surgiu de outra sessão tentando obter um bloqueio, e essa mensagem de erro resulta na negação de uma sessão para obter acesso a um banco de dados que está tentando fazer a transição para um estado diferente (neste caso, estado de online para a transição offline).

    O que você deve fazer da próxima vez?

    Primeiro, não entre em pânico e não comece a descartar bancos de dados . Você precisa adotar uma abordagem de solução de problemas (com uma consulta de diagnóstico semelhante à acima) para descobrir por que está vendo o que está vendo. Com uma mensagem como essa, ou quando algo parece "travado", você deve assumir automaticamente uma falta de simultaneidade e começar a investigar o bloqueio ( sys.dm_tran_locksé um bom começo).

    Como uma nota lateral, eu realmente acredito que você é melhor descobrir a raiz de um problema antes de tomar qualquer ação aleatória. Não apenas com esta operação, mas isso vale para todos os comportamentos que você não espera. Sabendo o que realmente estava causando seu problema, é óbvio que realmente não era grande coisa. Você basicamente tinha uma cadeia de bloqueio, e o bloqueador pai era algo que você provavelmente poderia ter apenas emitido KILL, ou se fosse uma solicitação de sessão que você não queria KILL, você poderia esperar até que ela fosse concluída. De qualquer forma, você teria o conhecimento para tomar a decisão certa e prudente, considerando seu cenário específico (reversão ou espera por confirmação).

    Outra coisa que vale a pena notar, essa é uma das razões pelas quais sempre opto pela alternativa T-SQL em vez de uma GUI. Você sabe exatamente o que está executando com o T-SQL e o que o SQL Server está fazendo. Afinal, você emitiu o comando explícito. Quando você usa uma GUI, o T-SQL real será uma abstração. Nesse caso, observei a tentativa do Pesquisador de Objetos bloqueado de colocar o banco de dados offline e era ALTER DATABASE <YourDatabase> SET OFFLINE. Não houve tentativa de reversão, e é por isso que estava esperando indefinidamente. No seu caso, se você quisesse reverter as sessões que tinham bloqueios nesse banco de dados, ALTER DATABASE ... SET OFFLINE WITH ROLLBACK IMMEDIATEprovavelmente seria suficiente se você tivesse feito a determinação inicial de que a reversão estava correta.

    • 24
  2. Michael Bollhoefer
    2018-12-04T10:34:09+08:002018-12-04T10:34:09+08:00

    Simplesmente fechar o SQL Server Management Studio (SSMS) e reabrir resolveu o problema para mim.

    • 5
  3. garima
    2017-02-10T03:37:03+08:002017-02-10T03:37:03+08:00

    Não há necessidade de fazer nada, basta matar o processo SqLWB.exedo Gerenciador de Tarefas, abrir o SQL Server, clicar com o botão direito do mouse no banco de dados e colocá-lo offline. Se não funcionar, depois que a sessão for encerrada, digite o comando

    ALTER DATABASE [Test4] SET OFFLINE WITH ROLLBACK IMMEDIATE
    

    e depois off-line. Vai funcionar como funcionou para mim também.

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve