Skip to content

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 oceanbase

2. 确认租户资源使用情况

在删除租户前,确认租户的资源使用情况,包括 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: 已删除的租户无法直接恢复,需要按照以下步骤重新创建并恢复数据:

  1. 重新创建租户:

    sql
    CREATE TENANT tenant_name
    RESOURCE_POOL_LIST = ('pool_name')
    SET variables = value;
  2. 恢复租户数据:

    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: 可以通过以下方式监控租户删除进度:

  1. 查看系统日志:

    bash
    tail -f /home/admin/oceanbase/log/observer.log | grep -i 'drop tenant'
  2. 查看任务状态:

    sql
    SELECT * FROM oceanbase.__all_background_job WHERE job_type = 'DROP_TENANT';
  3. 查看租户状态:

    sql
    SELECT * FROM oceanbase.__all_tenant WHERE tenant_name = 'tenant_name';

Q5: 如何防止误删除租户?

A5: 可以通过以下方式防止误删除租户:

  1. 加强权限管理,严格控制 DROP TENANT 权限
  2. 采用双人审核机制,删除租户前需要经过审核
  3. 启用审计日志,记录所有租户删除操作
  4. 定期备份租户数据,以便恢复
  5. 在删除租户前,执行多次确认操作
  6. 使用 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;