Database 当ALTERTABLE向具有现有数据记录的表中添加列时,Cassandra需要重新启动
数据库:Cassandra 2.1.2(单节点) 数据库驱动程序:Cassandra驱动程序2.1.6 应用程序:DropWizard 0.7.1 我的数据库中有一个简单的表:Database 当ALTERTABLE向具有现有数据记录的表中添加列时,Cassandra需要重新启动,database,cassandra,cassandra-2.0,dropwizard,datastax,Database,Cassandra,Cassandra 2.0,Dropwizard,Datastax,数据库:Cassandra 2.1.2(单节点) 数据库驱动程序:Cassandra驱动程序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_
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) 将新列“name”添加到表中
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
这个错误看起来像是说模型试图映射数据库表中不存在的列“name”,而实际上从数据库的角度来看它就在那里
但是,如果我重新启动数据库,它似乎可以解决问题
看起来,当您的表包含现有记录时,ALTERTABLE需要重新启动数据库。当表为空且添加了新列(不需要重新启动)时,不会发生此问题。我在[网站]上找不到任何关于我的情况的文档
问题:
有没有一种方法可以在不重新启动数据库的情况下更改表?如果有,我该怎么做?如果没有,有人能解释为什么需要重新启动数据库吗?在我这方面,我不需要重新启动数据库来更新架构。我不知道如何重新启动应用程序。我建议您停止应用程序,并搜索是否有任何进程仍在运行打开应用程序并启动您的应用程序
重新启动应用程序时,DB的某些连接似乎没有中断,而您停止了DB,然后强制停止连接,然后更改工作。我认为,重新启动DB时,您也没有解决问题,在重新创建表后,您解决了问题。我没有重新创建表。我只是重新启动了DB,似乎解决了问题否则,我将丢失所有旧数据。重新启动应用程序时,是否检查另一个java进程是否仍在运行该应用程序?没有其他进程正在运行。重新启动应用程序时,所有进程都将终止。更改空表上的架构正常工作,但当该表包含数据时,它将停止有一些问题,我不得不重新启动我的数据库。不知道为什么。