删除键空间 #

一、删除概述 #

1.1 删除影响 #

删除键空间将永久删除其中所有数据,操作不可逆。

text
删除影响:
┌─────────────────────────────────────────────────────────┐
│                                                          │
│  删除键空间将:                                          │
│  ├── 删除所有表                                         │
│  ├── 删除所有数据                                       │
│  ├── 删除用户定义类型                                   │
│  ├── 删除用户定义函数                                   │
│  └── 删除相关权限设置                                   │
│                                                          │
│  ⚠️ 操作不可逆,请谨慎操作                              │
│                                                          │
└─────────────────────────────────────────────────────────┘

1.2 删除前检查 #

text
删除前检查清单:
├── [ ] 确认键空间名称正确
├── [ ] 确认数据不再需要
├── [ ] 已备份重要数据
├── [ ] 确认无应用依赖
├── [ ] 获得相关审批
└── [ ] 选择合适时间窗口

二、基本语法 #

2.1 DROP KEYSPACE语法 #

sql
DROP KEYSPACE [IF EXISTS] keyspace_name;

2.2 简单示例 #

sql
-- 删除键空间
DROP KEYSPACE my_keyspace;

-- 使用IF EXISTS避免错误
DROP KEYSPACE IF EXISTS my_keyspace;

三、删除操作 #

3.1 标准删除流程 #

sql
-- 1. 查看键空间信息
DESCRIBE KEYSPACE my_keyspace;

-- 2. 确认包含的表
DESCRIBE TABLES IN my_keyspace;

-- 3. 确认数据量(可选)
SELECT COUNT(*) FROM my_keyspace.users;

-- 4. 执行删除
DROP KEYSPACE IF EXISTS my_keyspace;

-- 5. 验证删除结果
DESCRIBE KEYSPACES;

3.2 删除前备份 #

bash
# 使用nodetool快照备份
nodetool snapshot my_keyspace

# 查看快照位置
nodetool listsnapshots

# 快照默认存储在:
# /var/lib/scylla/data/keyspace/table-uuid/snapshots/snapshot_name/

3.3 导出数据 #

bash
# 使用cqlsh导出数据
cqlsh -e "DESCRIBE KEYSPACE my_keyspace" > my_keyspace_schema.cql

# 导出表数据
cqlsh -e "COPY my_keyspace.users TO 'users.csv'"

# 导出所有表
for table in $(cqlsh -e "DESCRIBE TABLES IN my_keyspace" | grep -v '^$'); do
    cqlsh -e "COPY my_keyspace.$table TO '${table}.csv'"
done

四、删除场景 #

4.1 清理测试环境 #

sql
-- 删除测试键空间
DROP KEYSPACE IF EXISTS test_keyspace;

-- 批量删除测试键空间
DROP KEYSPACE IF EXISTS test_1;
DROP KEYSPACE IF EXISTS test_2;
DROP KEYSPACE IF EXISTS test_3;

4.2 迁移后清理 #

sql
-- 数据迁移完成后删除旧键空间
-- 1. 确认新键空间数据正确
SELECT COUNT(*) FROM new_keyspace.users;

-- 2. 删除旧键空间
DROP KEYSPACE IF EXISTS old_keyspace;

4.3 重建键空间 #

sql
-- 删除并重建键空间
DROP KEYSPACE IF EXISTS my_keyspace;

CREATE KEYSPACE my_keyspace
WITH replication = {
    'class': 'NetworkTopologyStrategy',
    'datacenter1': 3
};

-- 重建表
CREATE TABLE my_keyspace.users (...);

五、删除后恢复 #

5.1 从快照恢复 #

bash
# 1. 重建键空间
cqlsh -e "CREATE KEYSPACE my_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3}"

# 2. 重建表结构
cqlsh -e "CREATE TABLE my_keyspace.users (...)"

# 3. 从快照恢复数据
# 找到快照目录
SNAPSHOT_DIR="/var/lib/scylla/data/my_keyspace/users-uuid/snapshots/snapshot_name"

# 恢复数据
nodetool refresh my_keyspace users

# 或手动复制SSTable
cp $SNAPSHOT_DIR/*.db /var/lib/scylla/data/my_keyspace/users-uuid/
nodetool refresh my_keyspace users

5.2 从导出文件恢复 #

bash
# 从CSV恢复数据
cqlsh -e "COPY my_keyspace.users FROM 'users.csv'"

# 从CQL脚本恢复
cqlsh -f my_keyspace_schema.cql
cqlsh -f my_keyspace_data.cql

5.3 从备份工具恢复 #

bash
# 使用ScyllaDB Manager恢复
# sctool restore --cluster my_cluster --keyspace my_keyspace

# 使用自定义备份脚本恢复
# ./restore_backup.sh my_keyspace

六、权限管理 #

6.1 删除权限要求 #

sql
-- 需要DROP权限
GRANT DROP ON KEYSPACE my_keyspace TO user1;

-- 或授予所有权限
GRANT ALL PERMISSIONS ON KEYSPACE my_keyspace TO admin;

6.2 查看权限 #

sql
-- 查看用户权限
LIST ALL PERMISSIONS OF user1;

-- 查看键空间权限
LIST ALL PERMISSIONS ON KEYSPACE my_keyspace;

七、删除注意事项 #

7.1 性能影响 #

text
删除性能影响:
├── 大键空间删除可能耗时
├── 删除期间可能影响性能
├── 建议在低峰期执行
├── 监控集群负载
└── 大量数据删除后考虑compact

7.2 应用影响 #

text
应用影响检查:
├── 确认无应用连接该键空间
├── 更新应用配置
├── 通知相关团队
├── 准备回滚方案
└── 监控应用日志

7.3 数据一致性 #

text
数据一致性检查:
├── 确认所有节点同步
├── 检查副本状态
├── 验证数据完整性
└── 确认无残留数据

八、常见错误处理 #

8.1 键空间不存在 #

sql
-- 错误
DROP KEYSPACE nonexistent_ks;
-- Error: Keyspace 'nonexistent_ks' doesn't exist

-- 解决:使用IF EXISTS
DROP KEYSPACE IF EXISTS nonexistent_ks;

8.2 权限不足 #

sql
-- 错误
DROP KEYSPACE my_keyspace;
-- Error: Unauthorized

-- 解决:使用有权限的用户
-- 或授予权限
GRANT DROP ON KEYSPACE my_keyspace TO current_user;

8.3 键空间正在使用 #

sql
-- 如果有活跃连接可能影响删除
-- 建议先断开所有连接

-- 查看活跃连接
-- 使用nodetool或监控工具

-- 强制删除(谨慎使用)
DROP KEYSPACE IF EXISTS my_keyspace;

九、删除后清理 #

9.1 清理磁盘空间 #

bash
# 删除后执行compact释放空间
nodetool compact

# 清理已删除的数据
nodetool cleanup

# 查看磁盘使用
df -h /var/lib/scylla

9.2 清理快照 #

bash
# 查看快照
nodetool listsnapshots

# 清理旧快照
nodetool clearsnapshot

# 清理特定快照
nodetool clearsnapshot -t snapshot_name

9.3 更新监控配置 #

bash
# 更新监控配置
# 移除已删除键空间的监控

# 更新告警规则
# 移除相关告警配置

十、最佳实践 #

10.1 删除流程 #

text
标准删除流程:
├── 1. 评估删除影响
├── 2. 通知相关团队
├── 3. 备份重要数据
├── 4. 导出数据(可选)
├── 5. 创建快照
├── 6. 执行删除
├── 7. 验证删除结果
├── 8. 清理资源
└── 9. 更新文档

10.2 安全删除建议 #

建议 说明
使用IF EXISTS 避免错误
先备份再删除 数据安全
选择低峰期 减少影响
监控删除过程 及时发现问题
保留快照一段时间 应急恢复

十一、总结 #

删除键空间要点:

要点 说明
不可逆 删除后无法恢复
先备份 保护重要数据
使用IF EXISTS 避免错误
权限要求 需要DROP权限

最佳实践:

  1. 删除前必须备份
  2. 使用IF EXISTS避免错误
  3. 选择低峰期执行
  4. 通知相关团队
  5. 保留快照以备恢复

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

最后更新:2026-03-27