2014-09-08 4 views
0

У меня странная проблема с Liquibase (последняя редакция 3.2.2).Liquibase пытается создать DATABASECHANGELOG, хотя он существует (Vertica)

Он не обнаруживает, что DATABASECHANGELOG уже существует, поэтому он пытается создать его и терпеть неудачу.

Как именно Liquibase выясняет, существует ли таблица? Я просмотрел код из github, но не мог понять (мои навыки Java недостаточно сильны, и эта структура проекта убила меня ...).

Я использую Vertica, и у меня есть несколько схем в моей базе данных, и я пытаюсь развернуть по определенной схеме, называемой someschema. Выполняющий пользователь, someuser, имеет путь поиска по умолчанию на someschema.

Ну, давайте посмотрим некоторые результаты:

  1. Первый, я побежал с UpdateSQL:

    $ java -jar liquibase.jar --driver com.vertica.jdbc.Driver --classpath /opt/vertica/java/lib/vertica-jdbc.jar --changeLogFile databaseChangeLog.json --url "jdbc:vertica://myverticahost.com:5433/insight" --username someuser --password mypwd updateSQL 
    -- ********************************************************************* 
    -- Update Database Script 
    -- ********************************************************************* 
    -- Change Log: databaseChangeLog.json 
    -- Ran at: 9/8/14 10:19 PM 
    -- Against: [email protected]:vertica://myverticahost.com:5433/insight 
    -- Liquibase version: 3.2.2 
    -- ********************************************************************* 
    
    -- Create Database Lock Table 
    CREATE TABLE DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED datetime, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID)); 
    
    -- Initialize Database Lock Table 
    DELETE FROM DATABASECHANGELOGLOCK; 
    
    INSERT INTO DATABASECHANGELOGLOCK (ID, LOCKED) VALUES (1, FALSE); 
    
    -- Lock Database 
    -- Create Database Change Log Table 
    CREATE TABLE DATABASECHANGELOG (ID VARCHAR(255) NOT NULL, AUTHOR VARCHAR(255) NOT NULL, FILENAME VARCHAR(255) NOT NULL, DATEEXECUTED datetime NOT NULL, ORDEREXECUTED INT NOT NULL, EXECTYPE VARCHAR(10) NOT NULL, MD5SUM VARCHAR(35), DESCRIPTION VARCHAR(255), COMMENTS VARCHAR(255), TAG VARCHAR(255), LIQUIBASE VARCHAR(20)); 
    
    -- Changeset databaseChangeLog.json::1::eyaly 
    create table eyal_test (id varchar(20)); 
    
    INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, LIQUIBASE) VALUES ('1', 'eyaly', 'databaseChangeLog.json', CURRENT_TIMESTAMP, 1, '7:dc0cc25bf42c4738799e73a22426a51a', 'sql', '', 'EXECUTED', '3.2.2'); 
    
  2. Затем с простым обновление:

    $ java -jar liquibase.jar --driver com.vertica.jdbc.Driver --classpath /opt/vertica/java/lib/vertica-jdbc.jar --changeLogFile databaseChangeLog.json --url "jdbc:vertica://myverticahost.com:5433/insight" --username someuser --password mypwd update 
    
  3. Как вы можете см. таблицу таблиц и метаданных:

    dbadmin=> select * from tables where table_Schema='someschema' and (table_name ilike 'databasechange%' or table_name = 'eyal_test'); 
        table_schema_id | table_schema |  table_id  |  table_name  |  owner_id  | owner_name | is_temp_table | is_system_table | is_flextable | system_table_creator | partition_expression |   create_time   | table_definition 
    -------------------+--------------+-------------------+-----------------------+-------------------+-------------+---------------+-----------------+--------------+----------------------+----------------------+-------------------------------+------------------ 
    45035996273719012 | someschema | 63050394834440938 | DATABASECHANGELOGLOCK | 45035996273750006 | someuser | f    | f    | f   |      |      | 2014-09-08 15:20:12.147975-07 | 
    45035996273719012 | someschema | 63050394834441092 | DATABASECHANGELOG  | 45035996273750006 | someuser | f    | f    | f   |      |      | 2014-09-08 15:20:13.965053-07 | 
    45035996273719012 | someschema | 63050394834441216 | eyal_test    | 45035996273750006 | someuser | f    | f    | f   |       |      | 2014-09-08 15:20:14.304429-07 | 
    (3 rows) 
    dbadmin=> select * from stage.databasechangelog; 
    ID | AUTHOR |  FILENAME  |  DATEEXECUTED  | ORDEREXECUTED | EXECTYPE |    MD5SUM    | DESCRIPTION | COMMENTS | TAG | LIQUIBASE 
    ----+--------+------------------------+----------------------------+---------------+----------+------------------------------------+-------------+----------+-----+----------- 
    1 | eyaly | databaseChangeLog.json | 2014-09-08 15:20:14.327397 |    1 | EXECUTED | 7:dc0cc25bf42c4738799e73a22426a51a | sql   |   |  | 3.2.2 
    (1 row) 
    dbadmin=> select * from stage.databasechangeloglock; 
    ID | LOCKED |  LOCKGRANTED  |     LOCKEDBY     
    ----+--------+-------------------------+------------------------------------------- 
        1 | t  | 2014-09-08 22:20:12.626 | mymachine (fe80:0:0:0:2000:aff:fea4:69e%2) 
    (1 row) 
    
  4. Но когда я запускаю снова, вместо того, чтобы не получать никаких действий, я получаю сообщение об ошибке:

    $ java -jar liquibase.jar --driver com.vertica.jdbc.Driver --classpath /opt/vertica/java/lib/vertica-jdbc.jar --changeLogFile databaseChangeLog.json --url "jdbc:vertica://myverticahost.com:5433/insight" --username someuser --password mypwd update 
    Unexpected error running Liquibase: Error executing SQL CREATE TABLE DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED datetime, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID)): [Vertica][VJDBC](4213) ROLLBACK: Object "DATABASECHANGELOGLOCK" already exists 
    
+0

Я не верю, что Liquibase поддерживает Vertica. Вы можете попробовать использовать '--logLevel = debug', чтобы узнать, что получится. Вы могли бы заставить его использовать класс Postgresql, но, глядя на этот код, я не думаю, что он полностью совместим, особенно вокруг проверки каталога, где у вас возникают проблемы сейчас. Я могу попытаться добавить поддержку для него, я думаю, что в целом это просто добавление нового класса базы данных в 'src/main/java/liquidibase/database/core', но я, вероятно, не успею поиграть с ним в течение пары недель , – woot

ответ

Смежные вопросы