删除键空间 #
一、DROP KEYSPACE概述 #
1.1 删除操作 #
DROP KEYSPACE会删除键空间及其所有数据,这是一个不可逆的操作。
text
删除键空间影响:
键空间
├── 所有表 → 删除
├── 所有数据 → 删除
├── 所有索引 → 删除
├── 所有类型 → 删除
└── 所有函数 → 删除
1.2 基本语法 #
sql
DROP KEYSPACE [IF EXISTS] keyspace_name;
二、删除键空间 #
2.1 基本删除 #
sql
-- 删除键空间
DROP KEYSPACE my_app;
-- 使用IF EXISTS避免错误
DROP KEYSPACE IF EXISTS my_app;
2.2 删除前检查 #
sql
-- 检查键空间是否存在
DESCRIBE KEYSPACE my_app;
-- 查看键空间中的表
DESCRIBE TABLES IN my_app;
-- 查看数据量
SELECT * FROM system.size_estimates
WHERE keyspace_name = 'my_app';
2.3 删除后验证 #
sql
-- 验证键空间已删除
DESCRIBE KEYSPACES;
-- 尝试使用(会报错)
USE my_app;
-- 错误:InvalidRequest: Keyspace 'my_app' does not exist
三、删除流程 #
3.1 标准删除流程 #
sql
-- 步骤1:确认要删除的键空间
DESCRIBE KEYSPACE my_app;
-- 步骤2:备份重要数据(可选但推荐)
-- 使用nodetool snapshot创建快照
-- nodetool snapshot my_app
-- 步骤3:删除键空间
DROP KEYSPACE my_app;
-- 步骤4:验证删除
DESCRIBE KEYSPACES;
3.2 批量删除 #
sql
-- 查看所有键空间
DESCRIBE KEYSPACES;
-- 删除多个键空间
DROP KEYSPACE test_keyspace1;
DROP KEYSPACE test_keyspace2;
DROP KEYSPACE test_keyspace3;
四、数据备份 #
4.1 创建快照 #
bash
# 创建键空间快照
nodetool snapshot my_app
# 创建特定表快照
nodetool snapshot my_app -t users
# 查看快照
nodetool listsnapshots
4.2 导出数据 #
bash
# 使用cqlsh导出数据
cqlsh -e "DESCRIBE KEYSPACE my_app" > my_app_schema.cql
# 导出表数据
cqlsh -e "COPY my_app.users TO 'users.csv'"
4.3 恢复数据 #
bash
# 从快照恢复
nodetool refresh my_app users
# 从CSV导入
cqlsh -e "COPY my_app.users FROM 'users.csv'"
五、权限要求 #
5.1 删除权限 #
sql
-- 需要DROP权限
GRANT DROP ON KEYSPACE my_app TO admin_user;
-- 或授予所有权限
GRANT ALL PERMISSIONS ON KEYSPACE my_app TO admin_user;
5.2 权限检查 #
sql
-- 查看用户权限
LIST ALL PERMISSIONS OF admin_user;
-- 查看特定键空间权限
LIST ALL PERMISSIONS ON KEYSPACE my_app;
六、注意事项 #
6.1 删除前确认 #
text
删除前检查清单:
□ 确认键空间名称正确
□ 确认数据不再需要
□ 已备份重要数据
□ 已通知相关人员
□ 在低峰期执行
□ 有回滚计划
6.2 不可逆操作 #
text
DROP KEYSPACE是不可逆操作:
删除后无法恢复
├── 数据永久丢失
├── 需要从备份恢复
└── 恢复过程耗时
建议
├── 删除前创建快照
├── 确认多次再执行
└── 保留备份一段时间
6.3 性能影响 #
text
删除大型键空间的影响:
├── 可能导致临时性能下降
├── 产生大量压缩工作
├── 占用磁盘IO
└── 可能触发GC
建议
├── 低峰期执行
├── 监控系统状态
└── 分批删除大型表
七、安全删除实践 #
7.1 删除脚本 #
bash
#!/bin/bash
# safe_drop_keyspace.sh
KEYSPACE=$1
if [ -z "$KEYSPACE" ]; then
echo "Usage: $0 <keyspace_name>"
exit 1
fi
echo "准备删除键空间: $KEYSPACE"
# 检查键空间是否存在
echo "检查键空间..."
cqlsh -e "DESCRIBE KEYSPACE $KEYSPACE" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "错误: 键空间 '$KEYSPACE' 不存在"
exit 1
fi
# 创建快照
echo "创建快照..."
nodetool snapshot $KEYSPACE
# 显示快照信息
nodetool listsnapshots | grep $KEYSPACE
# 确认删除
read -p "确认删除键空间 '$KEYSPACE'? (yes/no): " confirm
if [ "$confirm" != "yes" ]; then
echo "取消删除"
exit 0
fi
# 删除键空间
echo "删除键空间..."
cqlsh -e "DROP KEYSPACE $KEYSPACE"
# 验证删除
echo "验证删除..."
cqlsh -e "DESCRIBE KEYSPACE $KEYSPACE" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "键空间 '$KEYSPACE' 已成功删除"
else
echo "警告: 删除可能失败"
fi
7.2 使用示例 #
bash
# 执行脚本
chmod +x safe_drop_keyspace.sh
./safe_drop_keyspace.sh my_app
八、常见问题 #
8.1 键空间不存在 #
sql
-- 问题:删除不存在的键空间
DROP KEYSPACE nonexistent;
-- 错误:InvalidRequest: Keyspace 'nonexistent' doesn't exist
-- 解决:使用IF EXISTS
DROP KEYSPACE IF EXISTS nonexistent;
8.2 权限不足 #
sql
-- 问题:没有删除权限
DROP KEYSPACE my_app;
-- 错误:Unauthorized: User has no DROP permission
-- 解决:使用有权限的用户
-- 或授予权限
GRANT DROP ON KEYSPACE my_app TO current_user;
8.3 删除超时 #
bash
# 问题:删除大型键空间超时
# 解决:增加超时时间
cqlsh --request-timeout=3600 -e "DROP KEYSPACE large_keyspace"
九、恢复删除的数据 #
9.1 从快照恢复 #
bash
# 1. 查看快照
nodetool listsnapshots
# 2. 重新创建键空间
cqlsh -e "CREATE KEYSPACE my_app WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}"
# 3. 创建表结构
cqlsh -f my_app_schema.cql
# 4. 从快照恢复数据
nodetool refresh my_app users
9.2 从备份恢复 #
bash
# 1. 重新创建键空间和表
cqlsh -f my_app_schema.cql
# 2. 导入数据
cqlsh -e "COPY my_app.users FROM 'users.csv'"
十、总结 #
删除键空间要点:
- 不可逆操作:删除后数据永久丢失
- 使用IF EXISTS:避免删除不存在键空间的错误
- 删除前备份:创建快照或导出数据
- 权限要求:需要DROP权限
- 低峰期执行:减少对业务影响
- 验证删除:确认删除成功
下一步,让我们学习表操作!
最后更新:2026-03-27