删除表 #
一、删除表概述 #
1.1 删除操作类型 #
| 操作 | 描述 | 数据 | 结构 |
|---|---|---|---|
| DROP TABLE | 删除表 | 删除 | 删除 |
| TRUNCATE | 清空表数据 | 删除 | 保留 |
1.2 基本语法 #
sql
-- 删除表
DROP TABLE [IF EXISTS] table_name;
-- 清空表数据
TRUNCATE [TABLE] table_name;
二、DROP TABLE #
2.1 删除表 #
sql
-- 删除表
DROP TABLE users;
-- 使用IF EXISTS避免错误
DROP TABLE IF EXISTS users;
-- 删除指定键空间的表
DROP TABLE my_app.users;
2.2 删除前检查 #
sql
-- 检查表是否存在
DESCRIBE TABLE users;
-- 查看表数据量
SELECT COUNT(*) FROM users;
-- 查看表大小
SELECT * FROM system.size_estimates
WHERE keyspace_name = 'my_app' AND table_name = 'users';
2.3 删除后验证 #
sql
-- 验证表已删除
DESCRIBE TABLES;
-- 尝试查询(会报错)
SELECT * FROM users;
-- 错误:Table 'my_app.users' doesn't exist
2.4 删除流程 #
text
DROP TABLE流程:
1. 检查表是否存在
└── DESCRIBE TABLE users
2. 备份重要数据(可选)
└── nodetool snapshot my_app users
3. 删除表
└── DROP TABLE users
4. 验证删除
└── DESCRIBE TABLES
三、TRUNCATE #
3.1 清空表数据 #
sql
-- 清空表数据
TRUNCATE users;
-- 清空指定键空间的表
TRUNCATE TABLE my_app.users;
3.2 TRUNCATE特点 #
text
TRUNCATE特点:
✓ 快速删除所有数据
✓ 保留表结构
✓ 重置分区信息
✓ 创建墓碑标记
⚠ 不可逆操作
⚠ 需要ALTER权限
⚠ 可能触发自动快照
3.3 TRUNCATE vs DELETE #
sql
-- TRUNCATE:清空整个表
TRUNCATE users;
-- DELETE:逐行删除(不推荐大量删除)
DELETE FROM users WHERE user_id = ?;
对比:
┌──────────────┬────────────────┬────────────────┐
│ 特性 │ TRUNCATE │ DELETE │
├──────────────┼────────────────┼────────────────┤
│ 速度 │ 快 │ 慢 │
│ 墓碑数量 │ 1个(范围墓碑)│ 每行1个 │
│ 权限 │ ALTER │ MODIFY │
│ 条件删除 │ 不支持 │ 支持 │
│ 表结构 │ 保留 │ 保留 │
└──────────────┴────────────────┴────────────────┘
四、数据备份 #
4.1 创建快照 #
bash
# 创建表快照
nodetool snapshot my_app users
# 创建带标签的快照
nodetool snapshot my_app -t users -kt users_backup
# 查看快照
nodetool listsnapshots
4.2 导出数据 #
bash
# 导出表结构
cqlsh -e "DESCRIBE TABLE my_app.users" > users_schema.cql
# 导出表数据
cqlsh -e "COPY my_app.users TO 'users.csv'"
# 导出JSON格式
cqlsh -e "SELECT toJson(users) FROM my_app.users" > users.json
4.3 恢复数据 #
bash
# 从快照恢复
nodetool refresh my_app users
# 从CSV导入
cqlsh -e "COPY my_app.users FROM 'users.csv'"
# 执行结构脚本
cqlsh -f users_schema.cql
五、自动快照 #
5.1 配置自动快照 #
yaml
# cassandra.yaml
# 删除表/清空表前自动创建快照
auto_snapshot: true
# 快照保留时间(秒)
snapshot_before_compaction: false
5.2 快照位置 #
text
快照存储位置:
/var/lib/cassandra/data/my_app/users-xxx/snapshots/
└── snapshot_name/
├── manifest.json
├── schema.cql
└── *.db files
5.3 管理快照 #
bash
# 列出所有快照
nodetool listsnapshots
# 删除快照
nodetool clearsnapshot
# 删除特定快照
nodetool clearsnapshot -t snapshot_name
六、权限要求 #
6.1 DROP TABLE权限 #
sql
-- 需要DROP权限
GRANT DROP ON TABLE my_app.users TO admin_user;
-- 或授予所有权限
GRANT ALL PERMISSIONS ON TABLE my_app.users TO admin_user;
6.2 TRUNCATE权限 #
sql
-- 需要ALTER权限
GRANT ALTER ON TABLE my_app.users TO admin_user;
6.3 权限检查 #
sql
-- 查看用户权限
LIST ALL PERMISSIONS OF admin_user;
-- 查看特定表权限
LIST ALL PERMISSIONS ON TABLE my_app.users;
七、注意事项 #
7.1 删除前确认 #
text
删除前检查清单:
□ 确认表名称正确
□ 确认数据不再需要
□ 已备份重要数据
□ 已通知相关人员
□ 在低峰期执行
□ 有恢复计划
7.2 性能影响 #
text
删除操作的性能影响:
DROP TABLE
├── 元数据操作,快速完成
├── 后台异步删除数据文件
└── 可能触发压缩
TRUNCATE
├── 创建范围墓碑
├── 可能触发自动快照
└── gc_grace_seconds后清理
7.3 恢复考虑 #
text
恢复可能性:
有快照
├── 可从快照恢复
├── 恢复速度快
└── 数据完整
无快照
├── 无法恢复
├── 数据永久丢失
└── 需要重新导入
八、安全删除实践 #
8.1 删除脚本 #
bash
#!/bin/bash
# safe_drop_table.sh
KEYSPACE=$1
TABLE=$2
if [ -z "$KEYSPACE" ] || [ -z "$TABLE" ]; then
echo "Usage: $0 <keyspace> <table>"
exit 1
fi
echo "准备删除表: $KEYSPACE.$TABLE"
# 检查表是否存在
echo "检查表..."
cqlsh -e "DESCRIBE TABLE $KEYSPACE.$TABLE" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "错误: 表 '$KEYSPACE.$TABLE' 不存在"
exit 1
fi
# 创建快照
echo "创建快照..."
nodetool snapshot $KEYSPACE -t $TABLE
# 显示快照信息
nodetool listsnapshots | grep $TABLE
# 确认删除
read -p "确认删除表 '$KEYSPACE.$TABLE'? (yes/no): " confirm
if [ "$confirm" != "yes" ]; then
echo "取消删除"
exit 0
fi
# 删除表
echo "删除表..."
cqlsh -e "DROP TABLE $KEYSPACE.$TABLE"
# 验证删除
echo "验证删除..."
cqlsh -e "DESCRIBE TABLE $KEYSPACE.$TABLE" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "表 '$KEYSPACE.$TABLE' 已成功删除"
else
echo "警告: 删除可能失败"
fi
8.2 清空表脚本 #
bash
#!/bin/bash
# safe_truncate_table.sh
KEYSPACE=$1
TABLE=$2
if [ -z "$KEYSPACE" ] || [ -z "$TABLE" ]; then
echo "Usage: $0 <keyspace> <table>"
exit 1
fi
echo "准备清空表: $KEYSPACE.$TABLE"
# 检查表是否存在
cqlsh -e "DESCRIBE TABLE $KEYSPACE.$TABLE" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "错误: 表不存在"
exit 1
fi
# 显示当前数据量
echo "当前数据量:"
cqlsh -e "SELECT COUNT(*) FROM $KEYSPACE.$TABLE"
# 确认清空
read -p "确认清空表数据? (yes/no): " confirm
if [ "$confirm" != "yes" ]; then
echo "取消操作"
exit 0
fi
# 清空表
echo "清空表..."
cqlsh -e "TRUNCATE $KEYSPACE.$TABLE"
echo "表已清空"
九、常见问题 #
9.1 表不存在 #
sql
-- 问题:删除不存在的表
DROP TABLE nonexistent;
-- 错误:Table 'my_app.nonexistent' doesn't exist
-- 解决:使用IF EXISTS
DROP TABLE IF EXISTS nonexistent;
9.2 权限不足 #
sql
-- 问题:没有删除权限
DROP TABLE users;
-- 错误:Unauthorized: User has no DROP permission
-- 解决:使用有权限的用户
GRANT DROP ON TABLE my_app.users TO current_user;
9.3 TRUNCATE超时 #
bash
-- 问题:清空大表超时
-- 解决:增加超时时间
cqlsh --request-timeout=3600 -e "TRUNCATE my_app.large_table"
十、总结 #
删除表要点:
- DROP TABLE:删除表结构和数据
- TRUNCATE:仅清空数据,保留结构
- 删除前备份:创建快照或导出数据
- 使用IF EXISTS:避免删除不存在表的错误
- 权限要求:DROP需要DROP权限,TRUNCATE需要ALTER权限
- 低峰期操作:减少对业务影响
下一步,让我们学习主键设计!
最后更新:2026-03-27