數據庫:卡桑德拉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]處理我的情況的任何文檔。
問:
有沒有一種方法我可以改變一個表,無需重新啓動我的數據庫?如果是這樣,我該怎麼做?如果沒有,任何人都可以解釋爲什麼需要重新啓動數據庫?
我認爲當你重新啓動DB你不解決這個問題要麼,你重新創建表後,你固定的問題。 – wherby
我沒有重新創建表格。我剛剛重新啓動了數據庫,似乎解決了這個問題。否則,我會失去所有的舊數據。 – dlee
當您重新啓動應用程序時,是否檢查另一個java進程,以確定應用程序仍在運行? – wherby