2015-06-19 48 views
0

數據庫:卡桑德拉2.1.2(單節點)卡桑德拉需要重新啓動時,ALTER TABLE ADD COLUMN表與現有的數據記錄

數據庫驅動程序:卡桑德拉驅動程序2.1.6。

應用:DropWizard 0.7.1

我在我的數據庫一個簡單的表:

cqlsh:ugc> desc table person; 

CREATE TABLE abc.person (
    id uuid PRIMARY KEY 
) WITH bloom_filter_fp_chance = 0.01 
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}' 
    AND comment = '' 
    AND compaction = {'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32'} 
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
    AND dclocal_read_repair_chance = 0.1 
    AND default_time_to_live = 0 
    AND gc_grace_seconds = 864000 
    AND max_index_interval = 2048 
    AND memtable_flush_period_in_ms = 0 
    AND min_index_interval = 128 
    AND read_repair_chance = 0.0 
    AND speculative_retry = '99.0PERCENTILE'; 

而且表中包含了一些數據:

cqlsh:ugc> select * from person; 

id 
-------------------------------------- 
bf56c8b1-ed0b-44d6-bd45-0d55dd73fbe0 

在我DropWizard的應用程序,我有一個映射對象:

@Table(name = "person") 
public class Person { 
    @PartitionKey 
    @Column(name ="id") 
    UUID id; 


    public UUID getId() { 
     return id; 
    } 

    public void setId(UUID id) { 
     this.id = id; 
    } 
} 

一切正常。我能夠從我的DropWizard應用程序中檢索數據。然而,當我

1)添加新的列 '名稱' 表

cqlsh:ugc> ALTER TABLE abc.person ADD name text; 

cqlsh:ugc> desc table person; 

CREATE TABLE abc.person (
    id uuid PRIMARY KEY, 
    name text 
) WITH bloom_filter_fp_chance = 0.01 
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}' 
    AND comment = '' 
    AND compaction = {'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32'} 
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
    AND dclocal_read_repair_chance = 0.1 
    AND default_time_to_live = 0 
    AND gc_grace_seconds = 864000 
    AND max_index_interval = 2048 
    AND memtable_flush_period_in_ms = 0 
    AND min_index_interval = 128 
    AND read_repair_chance = 0.0 
    AND speculative_retry = '99.0PERCENTILE'; 

cqlsh:ugc> select * from person; 

id         | name 
--------------------------------------+------ 
bf56c8b1-ed0b-44d6-bd45-0d55dd73fbe0 | null 

2)更新Person對象映射新列

@Table(name = "person") 
public class Person { 
    @PartitionKey 
    @Column(name ="id") 
    UUID id; 


    public UUID getId() { 
     return id; 
    } 

    public void setId(UUID id) { 
     this.id = id; 
    } 

    @Column(name = "name") 
    String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

3)重新啓動DropWizard應用

應用程序拋出異常:

java.lang.IllegalArgumentException: "name" is not a column defined in this metadata 

錯誤看起來像它說的模型試圖映射列「名」並不在數據庫表中,而實際上它從視圖的數據庫點的存在。

但是,如果我重新啓動我的數據庫,它似乎解決這個問題。

看起來,alter table需要在您的表包含現有記錄時重新啓動數據庫。當表格爲空並添加新列(不需要重新啓動)時,不會發生此問題。我無法找到[http://docs.datastax.com/en/cql/3.0/cql/cql_reference/alter_table_r.html]處理我的情況的任何文檔。

問:

有沒有一種方法我可以改變一個表,無需重新啓動我的數據庫?如果是這樣,我該怎麼做?如果沒有,任何人都可以解釋爲什麼需要重新啓動數據庫?

+0

我認爲當你重新啓動DB你不解決這個問題要麼,你重新創建表後,你固定的問題。 – wherby

+0

我沒有重新創建表格。我剛剛重新啓動了數據庫,似乎解決了這個問題。否則,我會失去所有的舊數據。 – dlee

+0

當您重新啓動應用程序時,是否檢查另一個java進程,以確定應用程序仍在運行? – wherby

回答

0

在我的身邊,我並不需要重新啓動數據庫更新架構。我不知道你是如何重新啓動你的應用程序的。我建議你停止你的應用程序,並搜索是否有任何進程仍在運行該應用程序並啓動你的應用程序。

似乎某些連接數據庫在重新啓動應用程序時不會中斷,並且您停止數據庫然後強制連接停止,然後更改工作。

+0

所有進程在重新啓動應用程序後終止。 更改空表上的模式正常工作,但當表包含數據時,它有一些問題,我不得不重新啓動我的數據庫。不知道爲什麼。 – dlee