cql3.0中并没有给出重命名表的方式,所以需要从cassandra启动读取数据库文件、快照备份和还原的原理来入手
cassandra启动时会加载system_schema中的表的元信息然后根据这些元信息去定位数据文件位置
而cassandra快照的原理又是如下
1.将原有表目录下的文件做硬链接至./snapshots/目录下(元信息等一些比较小的文件采用直接写入的方式,data文件采用硬链接的方式)
2.保留原本的文件,新建sstable,之后的数据全部往新的sstable中写入
因此结合起来就有了如下方案
原表名test_keyspace.original_table
1.复制原表名,建立一张相同结构的test_keyspace.new_table
2.执行
select id from system_schema.tables where keyspace_name='test_keyspace' and table_name='original_table';
获取旧表id(去掉uuid中的-) 83663110f34e11e684938968567b65fc
3.执行
select id from system_schema.tables where keyspace_name='test_keyspace' and table_name='new_table';
获取新表id(去掉uuid中的-) 8f0650e01e8c11e7806a711ecf84b4d2
4.停止该表写入
5.执行./nodetool flush将内存中文件写入数据库
6.执行./nodetool compact test_keyspace original_table合并sstable
7.cd进入original_table-83663110f34e11e684938968567b65fc
8.执行ls ./|xargs -i ln ./{} ../new_table-8f0650e01e8c11e7806a711ecf84b4d2/{}把内容硬链接到新表目录下(这个时候new_table因为是新表的原因应该并没有任何数据库文件,如果有,删掉)
9.执行./nodetool refresh test_keyspace new_table同步新表数据
10.删掉旧表
11.开启新表写入