删除表 #

一、删除概述 #

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 只删除数据 可从快照恢复

最佳实践:

  1. 删除前必须备份
  2. 使用IF EXISTS避免错误
  3. 选择低峰期执行
  4. 检查表依赖关系
  5. 保留快照以备恢复

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

最后更新:2026-03-27