删除表 #

一、删除表概述 #

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"

十、总结 #

删除表要点:

  1. DROP TABLE:删除表结构和数据
  2. TRUNCATE:仅清空数据,保留结构
  3. 删除前备份:创建快照或导出数据
  4. 使用IF EXISTS:避免删除不存在表的错误
  5. 权限要求:DROP需要DROP权限,TRUNCATE需要ALTER权限
  6. 低峰期操作:减少对业务影响

下一步,让我们学习主键设计!

最后更新:2026-03-27