Eu recebo isso ao executar muitos scripts liquibase em um servidor Oracle. SomeComputer sou eu.
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Liquibase Update Failed: Could not acquire change log lock. Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
SEVERE 2013-03-20 16:59:liquibase: Could not acquire change log lock. Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
liquibase.exception.LockException: Could not acquire change log lock. Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
at liquibase.lockservice.LockService.waitForLock(LockService.java:81)
at liquibase.Liquibase.tag(Liquibase.java:507)
at liquibase.integration.commandline.Main.doMigration(Main.java:643)
at liquibase.integration.commandline.Main.main(Main.java:116)
Será que o número de sessões / transações simultâneas é atingido? Alguém tem alguma idéia?
Respostas:
Às vezes, se o aplicativo de atualização for interrompido abruptamente, o bloqueio permanecerá travado.
Então correndo
contra o banco de dados ajuda.
Ou você pode simplesmente largar a
DATABASECHANGELOGLOCK
mesa, ela será recriada.fonte
0
forFALSE
, mas fora isso, funcionou bem. ObrigadoFALSE
forb'0'
Editar junho 2020
Não siga este conselho. Causou problemas para muitas pessoas ao longo dos anos. Funcionou para mim há muito tempo e eu publiquei de boa fé, mas claramente não é a maneira de fazê-lo. A tabela DATABASECHANGELOCK precisa ter coisas nela, por isso é uma má idéia apenas excluir tudo dela.
O Leos Literak , por exemplo, seguiu estas instruções e o servidor falhou ao iniciar.
Resposta original
Possivelmente, devido a um processo liquibase morto, não liberando seu bloqueio na tabela DATABASECHANGELOGLOCK. Então,
pode ajudá-lo.
Edit: @Adrian Ber resposta fornece uma solução melhor do que isso. Faça isso apenas se você tiver algum problema na solução dele.
fonte
INSERT INTO yourdb.DATABASECHANGELOGLOCK VALUES (1, 0, null, null);
O problema foi a implementação incorreta do SequenceExists no Liquibase. Como os conjuntos de alterações com essas declarações levaram muito tempo e foram abortados acidentalmente. Em seguida, na próxima tentativa de executar os scripts liquibase, o bloqueio foi mantido.
Uma solução alternativa é usar SQL simples para verificar isso:
Os dados de bloqueio são armazenados na tabela DATABASECHANGELOCK. Para se livrar do bloqueio, basta alterar 1 para 0 ou largar a tabela e recriar.
fonte
Não é mencionado qual ambiente é usado para executar o Liquibase. No caso de Spring Boot 2, é possível estender
liquibase.lockservice.StandardLockService
sem a necessidade de executar instruções SQL diretas, o que é muito mais limpo. Por exemplo:O código está forçando a liberação do bloqueio. Isso pode ser útil em configurações de teste nas quais a chamada de liberação pode não ser chamada em caso de erros ou quando a depuração é interrompida.
A classe deve ser colocada no
liquibase.ext
pacote e será escolhida pela configuração automática do Spring Boot 2.fonte
liquibase.ext
, preciso definir esse pacote no meu projeto?@PostConstruct
método com uma mensagem de log, mas não o vejo impresso.@PostConstruct
método? No ForceReleaseLockService? Este não é um serviço Spring, portanto, não será chamado.Às vezes, truncar ou soltar a tabela DATABASECHANGELOGLOCK não funciona. Eu uso o banco de dados PostgreSQL e me deparei com esse problema várias vezes. O que faço para resolver é reverter as instruções preparadas em execução em segundo plano para esse banco de dados. Tente reverter todas as instruções preparadas e tente as alterações do liquibase novamente.
SQL:
Se a instrução acima retornar qualquer registro, faça a reversão dessa instrução preparada com a seguinte instrução SQL.
fonte
Você pode excluir a tabela com segurança manualmente ou usando a consulta. Será recriado automaticamente.
fonte
Aprecio que esse não foi o problema do OP, mas me deparei com esse problema recentemente por uma causa diferente. Para referência, eu estava usando o plug-in Liquibase Maven (liquibase-maven-plugin: 3.1.1) com o SQL Server.
De qualquer forma, eu copiei e colei erroneamente uma instrução "use" do SQL Server em um dos meus scripts que alterna bancos de dados, para que o liquibase estivesse executando e atualizando o arquivo
DATABASECHANGELOGLOCK
, adquirindo o bloqueio no banco de dados correto, mas alternando os bancos de dados para aplicar as alterações. Não só NÃO pude ver minhas alterações ou auditoria do liquibase no banco de dados correto, mas é claro que, quando executei o liquibase novamente, ele não pôde adquirir o bloqueio, pois o bloqueio havia sido liberado no banco de dados "errado", e também ainda bloqueado no banco de dados "correto". Eu esperava que o liquibase verifique se o bloqueio ainda foi aplicado antes de liberá-lo, e talvez isso seja um bug do liquibase (ainda não o verifiquei), mas pode ser resolvido em versões posteriores! Dito isto, suponho que possa ser considerado um recurso!Sei que é um erro de estudante, mas o levanto aqui caso alguém tenha o mesmo problema!
fonte