外观
OceanBase 租户删除
租户删除前准备
1. 确认租户状态
在删除租户前,需要确认租户的状态,确保租户处于正常状态或已停止服务。
sql
-- 查看所有租户的状态
SELECT * FROM oceanbase.__all_tenant;
-- 查看指定租户的状态
SELECT * FROM oceanbase.__all_tenant WHERE tenant_name = 'tenant_name';2. 备份租户数据
在删除租户前,建议备份租户的重要数据,以防误删除导致数据丢失。
sql
-- 全量备份租户数据
BACKUP TENANT tenant_name FULL TO 'backup_path' WITH DATABASE_BACKUP_OPTIONS = 'compression=zstd';
-- 备份租户的元数据
BACKUP TENANT tenant_name METADATA TO 'backup_path' WITH DATABASE_BACKUP_OPTIONS = 'compression=zstd';3. 清理租户资源
- 终止所有连接:确保没有应用程序连接到该租户
- 停止所有作业:包括备份作业、统计信息收集作业等
- 清理关联资源:包括视图、存储过程、函数等
sql
-- 查看租户的连接数
SELECT COUNT(*) FROM oceanbase.gv$session WHERE tenant_id = (SELECT tenant_id FROM oceanbase.__all_tenant WHERE tenant_name = 'tenant_name');
-- 终止租户的所有连接
ALTER SYSTEM KILL SESSION 'tenant=tenant_name, user=user_name, host=host_name, port=port_number';
-- 查看租户的作业
SELECT * FROM oceanbase.__all_background_job WHERE tenant_id = (SELECT tenant_id FROM oceanbase.__all_tenant WHERE tenant_name = 'tenant_name');
-- 停止租户的作业
ALTER SYSTEM STOP JOB job_id;4. 通知相关人员
在删除租户前,需要通知相关人员,包括:
- 业务负责人
- 开发人员
- 运维人员
- 监控人员
确保所有相关人员都已了解租户删除的影响,并已做好准备。
租户删除步骤
1. 登录到 OceanBase 集群
使用 root 用户登录到 OceanBase 集群:
bash
mysql -h observer1 -P 2883 -u root@sys#cluster_name -p'password' -D oceanbase2. 确认租户资源使用情况
在删除租户前,确认租户的资源使用情况,包括 CPU、内存、磁盘等。
sql
-- 查看租户的资源使用情况
SELECT * FROM oceanbase.gv$tenant_resource_usage WHERE tenant_id = (SELECT tenant_id FROM oceanbase.__all_tenant WHERE tenant_name = 'tenant_name');
-- 查看租户的磁盘使用情况
SELECT * FROM oceanbase.gv$tenant_disk_usage WHERE tenant_id = (SELECT tenant_id FROM oceanbase.__all_tenant WHERE tenant_name = 'tenant_name');3. 锁定租户(可选)
在删除租户前,可以选择锁定租户,防止新的连接和操作:
sql
-- 锁定租户
ALTER TENANT tenant_name LOCK;
-- 确认租户已锁定
SELECT tenant_name, lock_status FROM oceanbase.__all_tenant WHERE tenant_name = 'tenant_name';4. 删除租户
使用 DROP TENANT 命令删除租户:
sql
-- 删除租户,保留备份数据
DROP TENANT tenant_name;
-- 删除租户,同时删除备份数据
DROP TENANT tenant_name PURGE;
-- 删除租户,同时删除所有相关资源
DROP TENANT tenant_name INCLUDING ALL RESOURCES;5. 确认租户已删除
删除租户后,确认租户已从集群中移除:
sql
-- 查看所有租户,确认目标租户已不存在
SELECT * FROM oceanbase.__all_tenant;
-- 查看租户的资源池,确认已释放
SELECT * FROM oceanbase.__all_resource_pool WHERE tenant_id = (SELECT tenant_id FROM oceanbase.__all_tenant WHERE tenant_name = 'tenant_name');6. 清理资源池和资源单元
如果删除租户时没有自动清理资源池和资源单元,需要手动清理:
sql
-- 查看资源池
SELECT * FROM oceanbase.__all_resource_pool WHERE tenant_id = (SELECT tenant_id FROM oceanbase.__all_tenant WHERE tenant_name = 'tenant_name');
-- 删除资源池
DROP RESOURCE POOL pool_name;
-- 查看资源单元
SELECT * FROM oceanbase.__all_resource_unit WHERE unit_id IN (SELECT unit_id FROM oceanbase.__all_resource_pool WHERE resource_pool_name = 'pool_name');
-- 删除资源单元
DROP RESOURCE UNIT unit_name;7. 更新监控配置
删除租户后,需要更新监控配置,移除对该租户的监控:
- 更新 Prometheus 配置,移除该租户的监控目标
- 更新 Grafana 面板,移除该租户的监控图表
- 更新 Zabbix 配置,移除该租户的监控项和触发器
租户删除注意事项
1. 权限要求
- 只有 root 用户或具有
DROP TENANT权限的用户才能删除租户 - 删除租户需要
SYSTEM租户的权限
2. 影响范围
- 删除租户会导致该租户的所有数据丢失
- 删除租户会释放该租户占用的资源(CPU、内存、磁盘等)
- 删除租户会影响依赖该租户的应用程序
3. 数据恢复
- 如果使用
DROP TENANT命令删除租户,备份数据仍然保留,可以通过备份恢复数据 - 如果使用
DROP TENANT PURGE命令删除租户,备份数据也会被删除,无法恢复 - 删除租户后,无法直接恢复租户,需要重新创建租户并恢复数据
4. 性能影响
- 删除租户是一个耗时的操作,会消耗大量的系统资源
- 删除租户期间,可能会影响集群的性能
- 建议在非业务高峰时段删除租户
5. 日志记录
- 删除租户的操作会被记录到 OceanBase 的审计日志中
- 建议保留审计日志,以便后续追溯
租户删除最佳实践
1. 制定详细的删除计划
- 明确删除租户的原因和时间
- 确定删除租户的方式和范围
- 制定回滚计划,以防误操作
- 安排相关人员参与和监督
2. 严格执行删除流程
- 按照规定的步骤执行删除操作
- 每一步操作前都要进行确认
- 操作过程中要记录详细的日志
- 操作完成后要进行验证
3. 采用灰度删除策略
- 先停止租户的服务,观察一段时间
- 再锁定租户,禁止新的连接
- 最后删除租户,释放资源
4. 定期清理无效租户
- 定期检查集群中的租户,识别无效租户
- 及时清理无效租户,释放资源
- 建立租户生命周期管理机制
5. 加强权限管理
- 严格控制
DROP TENANT权限的授予 - 采用双人审核机制,防止误操作
- 记录所有租户删除操作,便于追溯
常见问题(FAQ)
Q1: 如何恢复已删除的租户?
A1: 已删除的租户无法直接恢复,需要按照以下步骤重新创建并恢复数据:
重新创建租户:
sqlCREATE TENANT tenant_name RESOURCE_POOL_LIST = ('pool_name') SET variables = value;恢复租户数据:
sql-- 恢复全量备份 RESTORE TENANT tenant_name FROM 'backup_path' WITH DATABASE_RESTORE_OPTIONS = 'compression=zstd'; -- 恢复增量备份 RESTORE TENANT tenant_name INCREMENTAL FROM 'incremental_backup_path' WITH DATABASE_RESTORE_OPTIONS = 'compression=zstd'; -- 恢复到指定时间点 RESTORE TENANT tenant_name TO TIME '2023-01-01 12:00:00' FROM 'backup_path' WITH DATABASE_RESTORE_OPTIONS = 'compression=zstd';
Q2: 如何删除租户的同时保留其资源池?
A2: 使用 DROP TENANT 命令删除租户时,默认会保留资源池。如果需要删除租户的同时保留资源池,可以使用以下命令:
sql
DROP TENANT tenant_name;Q3: 如何强制删除租户?
A3: 如果租户无法正常删除,可以使用 FORCE 选项强制删除:
sql
DROP TENANT tenant_name FORCE;注意:强制删除租户可能会导致数据不一致,建议谨慎使用。
Q4: 如何监控租户删除进度?
A4: 可以通过以下方式监控租户删除进度:
查看系统日志:
bashtail -f /home/admin/oceanbase/log/observer.log | grep -i 'drop tenant'查看任务状态:
sqlSELECT * FROM oceanbase.__all_background_job WHERE job_type = 'DROP_TENANT';查看租户状态:
sqlSELECT * FROM oceanbase.__all_tenant WHERE tenant_name = 'tenant_name';
Q5: 如何防止误删除租户?
A5: 可以通过以下方式防止误删除租户:
- 加强权限管理,严格控制
DROP TENANT权限 - 采用双人审核机制,删除租户前需要经过审核
- 启用审计日志,记录所有租户删除操作
- 定期备份租户数据,以便恢复
- 在删除租户前,执行多次确认操作
- 使用
RENAME TENANT命令将租户重命名,观察一段时间后再删除
租户删除后的清理工作
1. 清理监控配置
- 更新 Prometheus 配置,移除该租户的监控目标
- 更新 Grafana 面板,移除该租户的监控图表
- 更新 Zabbix 配置,移除该租户的监控项和触发器
2. 清理备份数据
如果租户数据已不再需要,可以清理备份数据,释放存储空间:
bash
# 删除备份数据
rm -rf /backup_path/tenant_name/*3. 清理文档和记录
- 更新租户管理文档,移除该租户的相关信息
- 清理租户的操作记录和审计日志
- 通知相关人员,更新相关文档
4. 检查资源释放情况
删除租户后,检查资源释放情况,确保资源已正确释放:
sql
-- 查看资源池状态
SELECT * FROM oceanbase.__all_resource_pool;
-- 查看资源单元状态
SELECT * FROM oceanbase.__all_resource_unit;
-- 查看集群资源使用情况
SELECT * FROM oceanbase.gv$cluster_resource_usage;