删除键空间 #

一、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'"

十、总结 #

删除键空间要点:

  1. 不可逆操作:删除后数据永久丢失
  2. 使用IF EXISTS:避免删除不存在键空间的错误
  3. 删除前备份:创建快照或导出数据
  4. 权限要求:需要DROP权限
  5. 低峰期执行:减少对业务影响
  6. 验证删除:确认删除成功

下一步,让我们学习表操作!

最后更新:2026-03-27