删除表 #
一、删除概述 #
1.1 删除类型 #
text
删除类型:
├── DROP TABLE
│ ├── 删除表结构
│ ├── 删除所有数据
│ └── 不可恢复(除非有备份)
└── TRUNCATE TABLE
├── 保留表结构
├── 删除所有数据
└── 可从快照恢复
1.2 删除影响 #
text
删除影响:
┌─────────────────────────────────────────────────────────┐
│ │
│ DROP TABLE: │
│ ├── 删除表定义 │
│ ├── 删除所有数据 │
│ ├── 删除相关索引 │
│ ├── 删除相关触发器 │
│ └── 释放磁盘空间 │
│ │
│ TRUNCATE TABLE: │
│ ├── 保留表定义 │
│ ├── 删除所有数据 │
│ ├── 保留索引结构 │
│ └── 可从快照恢复 │
│ │
└─────────────────────────────────────────────────────────┘
二、DROP TABLE #
2.1 基本语法 #
sql
DROP TABLE [IF EXISTS] [keyspace_name.]table_name;
2.2 删除表示例 #
sql
-- 删除表
DROP TABLE users;
-- 使用IF EXISTS避免错误
DROP TABLE IF EXISTS users;
-- 删除指定键空间的表
DROP TABLE my_keyspace.users;
2.3 删除流程 #
sql
-- 1. 查看表信息
DESCRIBE TABLE users;
-- 2. 查看数据量
SELECT COUNT(*) FROM users;
-- 3. 备份数据(可选)
-- nodetool snapshot my_keyspace users
-- 4. 删除表
DROP TABLE IF EXISTS users;
-- 5. 验证删除
DESCRIBE TABLES;
三、TRUNCATE TABLE #
3.1 基本语法 #
sql
TRUNCATE [TABLE] [keyspace_name.]table_name;
3.2 清空表示例 #
sql
-- 清空表数据
TRUNCATE users;
-- 清空指定键空间的表
TRUNCATE my_keyspace.users;
-- 使用TABLE关键字(可选)
TRUNCATE TABLE users;
3.3 清空表流程 #
sql
-- 1. 查看表数据量
SELECT COUNT(*) FROM users;
-- 2. 备份数据(可选)
-- nodetool snapshot my_keyspace users
-- 3. 清空表
TRUNCATE users;
-- 4. 验证清空
SELECT COUNT(*) FROM users; -- 返回0
-- 5. 表结构仍然存在
DESCRIBE TABLE users;
四、删除前备份 #
4.1 创建快照 #
bash
# 创建表快照
nodetool snapshot my_keyspace -t users_backup
# 查看快照
nodetool listsnapshots
# 快照位置
# /var/lib/scylla/data/my_keyspace/users-uuid/snapshots/users_backup/
4.2 导出数据 #
bash
# 导出表结构
cqlsh -e "DESCRIBE TABLE my_keyspace.users" > users_schema.cql
# 导出数据到CSV
cqlsh -e "COPY my_keyspace.users TO 'users.csv'"
# 导出JSON格式
cqlsh -e "SELECT JSON * FROM my_keyspace.users" > users.json
4.3 使用sstable工具 #
bash
# 导出SSTable
# sstable2json工具导出数据
# 备份SSTable文件
cp -r /var/lib/scylla/data/my_keyspace/users-uuid/ /backup/users/
五、数据恢复 #
5.1 从快照恢复 #
bash
# 1. 找到快照目录
SNAPSHOT_DIR="/var/lib/scylla/data/my_keyspace/users-uuid/snapshots/users_backup"
# 2. 恢复数据
nodetool refresh my_keyspace users
# 或手动复制
cp $SNAPSHOT_DIR/*.db /var/lib/scylla/data/my_keyspace/users-uuid/
nodetool refresh my_keyspace users
5.2 从CSV恢复 #
bash
# 从CSV导入数据
cqlsh -e "COPY my_keyspace.users FROM 'users.csv'"
# 带选项导入
cqlsh -e "COPY my_keyspace.users FROM 'users.csv' WITH HEADER=true"
5.3 从CQL恢复 #
bash
# 恢复表结构
cqlsh -f users_schema.cql
# 恢复数据
cqlsh -f users_data.cql
六、删除场景 #
6.1 清理测试数据 #
sql
-- 清空测试表
TRUNCATE test_table;
-- 删除测试表
DROP TABLE IF EXISTS test_table;
-- 批量清理
TRUNCATE test_users;
TRUNCATE test_orders;
TRUNCATE test_products;
6.2 重建表 #
sql
-- 方式1:删除后重建
DROP TABLE IF EXISTS users;
CREATE TABLE users (
user_id UUID PRIMARY KEY,
name TEXT,
email TEXT
);
-- 方式2:清空后重新导入
TRUNCATE users;
-- 导入新数据
COPY users FROM 'new_users.csv';
6.3 数据迁移 #
sql
-- 迁移完成后的清理
-- 1. 验证新表数据
SELECT COUNT(*) FROM new_users;
-- 2. 删除旧表
DROP TABLE IF EXISTS old_users;
七、删除注意事项 #
7.1 DROP TABLE注意事项 #
text
DROP TABLE注意事项:
├── 操作不可逆
├── 删除所有数据
├── 删除相关索引
├── 需要DROP权限
├── 建议先备份
└── 选择低峰期执行
7.2 TRUNCATE TABLE注意事项 #
text
TRUNCATE TABLE注意事项:
├── 数据不可恢复(无快照时)
├── 保留表结构
├── 需要MODIFY权限
├── 触发自动快照(可配置)
├── 可能影响性能
└── 建议先备份
7.3 性能影响 #
text
性能影响:
├── DROP TABLE
│ ├── 元数据操作
│ ├── 删除SSTable文件
│ └── 相对快速
├── TRUNCATE TABLE
│ ├── 创建新SSTable
│ ├── 可能触发compact
│ └── 大表可能耗时
└── 建议:低峰期执行
八、权限管理 #
8.1 删除权限 #
sql
-- 授予DROP权限
GRANT DROP ON TABLE my_keyspace.users TO admin_user;
-- 授予MODIFY权限(TRUNCATE需要)
GRANT MODIFY ON TABLE my_keyspace.users TO operator_user;
-- 授予所有权限
GRANT ALL PERMISSIONS ON TABLE my_keyspace.users TO super_user;
8.2 查看权限 #
sql
-- 查看用户权限
LIST ALL PERMISSIONS OF admin_user;
-- 查看表权限
LIST ALL PERMISSIONS ON TABLE my_keyspace.users;
九、常见错误处理 #
9.1 表不存在 #
sql
-- 错误
DROP TABLE nonexistent_table;
-- Error: Table 'nonexistent_table' not found
-- 解决:使用IF EXISTS
DROP TABLE IF EXISTS nonexistent_table;
9.2 权限不足 #
sql
-- 错误
DROP TABLE users;
-- Error: Unauthorized
-- 解决:使用有权限的用户
-- 或授予权限
GRANT DROP ON TABLE users TO current_user;
9.3 有依赖对象 #
sql
-- 如果有物化视图依赖
DROP TABLE users;
-- Error: Cannot drop table with materialized views
-- 解决:先删除依赖对象
DROP MATERIALIZED VIEW users_by_email;
DROP TABLE users;
十、删除后清理 #
10.1 清理磁盘空间 #
bash
# 删除后执行compact
nodetool compact my_keyspace
# 清理已删除数据
nodetool cleanup my_keyspace
# 查看磁盘使用
df -h /var/lib/scylla
10.2 清理快照 #
bash
# 查看快照
nodetool listsnapshots
# 清理快照
nodetool clearsnapshot
# 清理特定快照
nodetool clearsnapshot -t snapshot_name
10.3 更新应用配置 #
bash
# 更新应用配置
# 移除已删除表的引用
# 更新监控配置
# 移除相关监控项
# 更新文档
# 记录删除操作
十一、最佳实践 #
11.1 删除流程 #
text
标准删除流程:
├── 1. 确认删除需求
├── 2. 检查表依赖
├── 3. 备份重要数据
├── 4. 创建快照
├── 5. 通知相关团队
├── 6. 选择低峰期
├── 7. 执行删除
├── 8. 验证删除结果
├── 9. 清理资源
└── 10. 更新文档
11.2 删除建议 #
| 场景 | 操作 | 建议 |
|---|---|---|
| 清空数据 | TRUNCATE | 先备份 |
| 删除表 | DROP | 确认无依赖 |
| 重建表 | DROP + CREATE | 保留快照 |
| 迁移后清理 | DROP | 验证新数据 |
十二、总结 #
删除表要点:
| 操作 | 说明 | 影响 |
|---|---|---|
| DROP TABLE | 删除表和数据 | 不可恢复 |
| TRUNCATE TABLE | 只删除数据 | 可从快照恢复 |
最佳实践:
- 删除前必须备份
- 使用IF EXISTS避免错误
- 选择低峰期执行
- 检查表依赖关系
- 保留快照以备恢复
下一步,让我们学习主键设计!
最后更新:2026-03-27