1. 首页 > 国产数据库教程 > OceanBase教程 > 正文

OceanBase教程FG073-OceanBase定时作业管理实战

本文档风哥主要介绍OceanBase数据库定时作业管理相关知识,包括OceanBase定时作业概念、OceanBase定时作业类型、OceanBase定时作业场景、OceanBase作业规划、OceanBase DBMS_JOB、OceanBase DBMS_SCHEDULER、OceanBase Cron作业等内容,风哥教程参考OceanBase官方文档定时任务、DBMS_JOB等内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 OceanBase定时作业概念

定时作业是按照预定时间自动执行的数据库任务,用于自动化数据库维护、数据处理等操作。更多视频教程www.fgedu.net.cn

OceanBase定时作业特点:

  • 自动化:按预定时间自动执行
  • 可靠性:支持失败重试和告警
  • 灵活性:支持多种调度策略
  • 监控性:提供执行日志和状态
  • 安全性:支持权限控制和审计

1.2 OceanBase定时作业类型

# 定时作业类型

1. 按实现方式分类
┌─────────────────┬─────────────────────────────────────┐
│ 类型 │ 说明 │
├─────────────────┼─────────────────────────────────────┤
│ DBMS_JOB │ Oracle兼容的定时作业 │
│ DBMS_SCHEDULER │ Oracle兼容的高级调度器 │
│ Event Scheduler │ MySQL兼容的事件调度器 │
│ Cron作业 │ 操作系统级定时任务 │
│ 外部调度 │ 第三方调度工具 │
└─────────────────┴─────────────────────────────────────┘

2. 按业务类型分类
– 维护类:备份、清理、优化
– 业务类:数据同步、报表生成
– 监控类:健康检查、告警
– 统计类:统计信息收集

1.3 OceanBase定时作业场景

# 定时作业场景

1. 数据维护
– 历史数据清理
– 日志归档
– 分区维护
– 索引重建

2. 统计优化
– 统计信息收集
– 表分析
– 查询优化

3. 备份恢复
– 定时备份
– 备份验证
– 备份清理

4. 监控告警
– 健康检查
– 性能监控
– 异常告警

5. 业务处理
– 数据同步
– 报表生成
– 批量处理

风哥提示:定时作业是数据库自动化运维的重要手段,合理规划可以减少人工干预,提高运维效率。

Part02-生产环境规划与建议

2.1 OceanBase作业规划

# 作业规划

1. 作业分类
– 系统级作业:备份、清理
– 业务级作业:同步、处理
– 监控级作业:检查、告警

2. 执行时间规划
┌─────────────────┬─────────────────────────────────────┐
│ 时间段 │ 建议作业类型 │
├─────────────────┼─────────────────────────────────────┤
│ 00:00-02:00 │ 备份、大表维护 │
│ 02:00-04:00 │ 统计信息收集、优化 │
│ 04:00-06:00 │ 数据清理、归档 │
│ 低峰期 │ 业务处理、报表生成 │
└─────────────────┴─────────────────────────────────────┘

3. 并发控制
– 避免同时执行大量作业
– 控制资源消耗
– 设置优先级

4. 依赖管理
– 明确作业依赖关系
– 设置执行顺序
– 处理依赖失败

2.2 OceanBase资源规划

# 资源规划

1. CPU资源
– 作业执行预留20% CPU
– 避免高峰期执行资源密集型作业
– 监控CPU使用率

2. 内存资源
– 大查询作业预留内存
– 避免内存溢出
– 设置内存限制

3. 磁盘资源
– 备份作业预留磁盘空间
– 清理作业释放空间
– 监控磁盘使用,风哥提示:。

4. IO资源
– 避免多个IO密集型作业并发
– 控制备份IO
– 优化查询IO

2.3 OceanBase调度规划

# 调度规划

1. 调度策略
– 固定时间调度
– 间隔调度
– 事件触发调度
– 依赖调度

2. 时间窗口
– 定义维护窗口
– 避开业务高峰
– 预留缓冲时间

3. 失败处理
– 重试策略
– 告警通知
– 人工介入

4. 调度示例
– 每日备份:02:00
– 每周优化:周日03:00,学习交流加群风哥微信: itpux-com。
– 每月报表:1日01:00

生产环境建议:定时作业需要合理规划执行时间和资源,避免影响正常业务。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 OceanBase DBMS_JOB

# DBMS_JOB

1. 创建作业
$ obclient -h192.168.1.101 -P2881 -uroot@fgedu_tenant -p -e ”
— 创建作业
DECLARE
job_id NUMBER;
BEGIN
DBMS_JOB.submit(
job => job_id,
what => ‘BEGIN fgedudb.sp_cleanup_old_data; END;’,
next_date => SYSDATE,
interval => ‘SYSDATE + 1’
);
COMMIT;
DBMS_OUTPUT.put_line(‘Job ID: ‘ || job_id);
END;

2. 查看作业
$ obclient -e ”
SELECT
job,
what,
next_date,
interval,
broken,
failures,学习交流加群风哥QQ113257174。
FROM user_jobs;

+——-+——————————–+——————-+——————-+——–+———-+
| job | what | next_date | interval | broken | failures |
+——-+——————————–+——————-+——————-+——–+———-+
| 1 | BEGIN fgedudb.sp_cleanup… | 2024-01-21 02:00 | SYSDATE + 1 | N | 0 |
+——-+——————————–+——————-+——————-+——–+———-+

3. 修改作业
$ obclient -e ”
BEGIN
DBMS_JOB.change(
job => 1,
what => ‘BEGIN fgedudb.sp_cleanup_old_data; END;’,
next_date => SYSDATE + 1,
interval => ‘SYSDATE + 7’
);
COMMIT;
END;

4. 删除作业
$ obclient -e ”
BEGIN
DBMS_JOB.remove(1);
COMMIT;
END;

5. 启动作业
$ obclient -e ”
BEGIN
DBMS_JOB.run(1);
END;

6. 停止作业
$ obclient -e ”
BEGIN,更多视频教程www.fgedu.net.cn。
DBMS_JOB.broken(1, TRUE);
COMMIT;
END;

3.2 OceanBase DBMS_SCHEDULER

# DBMS_SCHEDULER

1. 创建程序
$ obclient -e ”
BEGIN
DBMS_SCHEDULER.create_program(
program_name => ‘fgedu_cleanup_prog’,
program_type => ‘STORED_PROCEDURE’,
program_action => ‘fgedudb.sp_cleanup_old_data’,
enabled => TRUE
);
END;

2. 创建调度
$ obclient -e ”
BEGIN
DBMS_SCHEDULER.create_schedule(
schedule_name => ‘fgedu_daily_schedule’,
start_date => SYSTIMESTAMP,
repeat_interval => ‘FREQ=DAILY; BYHOUR=2; BYMINUTE=0’,
end_date => NULL,
comments => ‘Daily at 2:00 AM’
);
END;

3. 创建作业
$ obclient -e ”
BEGIN
DBMS_SCHEDULER.create_job(,更多学习教程公众号风哥教程itpux_com。
job_name => ‘fgedu_cleanup_job’,
program_name => ‘fgedu_cleanup_prog’,
schedule_name => ‘fgedu_daily_schedule’,
enabled => TRUE,
auto_drop => FALSE,
comments => ‘Daily cleanup job’
);
END;

4. 查看作业
$ obclient -e ”
SELECT
job_name,
state,
last_start_date,
next_run_date,
run_count,
failure_count
FROM user_scheduler_jobs;

+—————+———+——————-+——————-+———–+—————+
| job_name | state | last_start_date | next_run_date | run_count | failure_count |
+—————+———+——————-+——————-+———–+—————+
| fgedu_cleanup | ENABLED | 2024-01-20 02:00 | 2024-01-21 02:00 | 10 | 0 |
+—————+———+——————-+——————-+———–+—————+

5. 启动作业
$ obclient -e “,from DB视频:www.itpux.com。
BEGIN
DBMS_SCHEDULER.run_job(‘fgedu_cleanup_job’);
END;

6. 停止作业
$ obclient -e ”
BEGIN
DBMS_SCHEDULER.stop_job(‘fgedu_cleanup_job’);
END;

7. 删除作业
$ obclient -e ”
BEGIN
DBMS_SCHEDULER.drop_job(‘fgedu_cleanup_job’);
END;

3.3 OceanBase Cron作业

# Cron作业

1. 创建Cron脚本
#!/bin/bash
# db_cleanup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

LOG_FILE=”/var/log/ob_cleanup_$(date +%Y%m%d).log”

echo “[$(date)] Starting cleanup…” >> $LOG_FILE

# 清理30天前的日志
obclient -e ”
DELETE FROM fgedudb.fgedu_operation_log
WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 DAY); " >> $LOG_FILE 2>&1

# 清理临时表
obclient -e ”
DROP TABLE IF EXISTS fgedudb.tmp_table_001;
DROP TABLE IF EXISTS fgedudb.tmp_table_002;
” >> $LOG_FILE 2>&1

echo “[$(date)] Cleanup completed” >> $LOG_FILE

2. 配置Cron
$ crontab -e

# 每日2点执行清理
0 2 * * * /ob/scripts/db_cleanup.sh

# 每周日3点执行优化
0 3 * * 0 /ob/scripts/db_optimize.sh

# 每月1日1点生成报表
0 1 1 * * /ob/scripts/generate_report.sh

3. 查看Cron任务
$ crontab -l

4. Cron日志
$ tail -f /var/log/cron

5. 监控Cron执行
#!/bin/bash
# cron_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com

# 检查Cron服务
systemctl status crond

# 检查Cron日志
grep “db_cleanup.sh” /var/log/cron | tail -10

风哥提示:Cron作业是最常用的定时任务方式,简单可靠,适合大多数数据库维护场景。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 OceanBase数据清理作业案例

# 业务场景
– 每日清理30天前的日志
– 清理临时表
– 释放磁盘空间

# 实施方案

1. 创建清理存储过程
$ obclient -e ”
CREATE OR REPLACE PROCEDURE fgedudb.sp_cleanup_old_data
AS
BEGIN
— 清理操作日志
DELETE FROM fgedudb.fgedu_operation_log
WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 DAY); -- 清理登录日志 DELETE FROM fgedudb.fgedu_login_log WHERE login_time < DATE_SUB(NOW(), INTERVAL 90 DAY); -- 清理临时表 FOR rec IN ( SELECT table_name FROM information_schema.tables WHERE table_schema = 'fgedudb' AND table_name LIKE 'tmp_%' AND create_time < DATE_SUB(NOW(), INTERVAL 7 DAY) ) LOOP EXECUTE IMMEDIATE 'DROP TABLE fgedudb.' || rec.table_name; END LOOP; COMMIT; END; " 2. 创建定时作业 $ obclient -e " BEGIN DBMS_SCHEDULER.create_job( job_name => ‘fgedu_daily_cleanup’,
job_type => ‘STORED_PROCEDURE’,
job_action => ‘fgedudb.sp_cleanup_old_data’,
start_date => SYSTIMESTAMP,
repeat_interval => ‘FREQ=DAILY; BYHOUR=2; BYMINUTE=0’,
enabled => TRUE
);
END;

3. 验证作业执行
$ obclient -e ”
SELECT
job_name,
last_start_date,
last_run_duration,
run_count,
failure_count
FROM user_scheduler_jobs
WHERE job_name = ‘fgedu_daily_cleanup’;

4. 监控清理效果
#!/bin/bash
# cleanup_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com

echo “=== Cleanup Monitor ===”

# 检查日志表行数
obclient -e ”
SELECT
‘operation_log’ as table_name,
COUNT(*) as row_count
FROM fgedudb.fgedu_operation_log
UNION ALL
SELECT
‘login_log’ as table_name,
COUNT(*) as row_count
FROM fgedudb.fgedu_login_log;

# 检查磁盘空间
df -h /ob/fgdata

echo “=======================”

4.2 OceanBase统计信息收集案例

# 业务场景
– 每日收集统计信息
– 优化查询性能
– 自动分析大表

# 实施方案

1. 创建收集存储过程
$ obclient -e ”
CREATE OR REPLACE PROCEDURE fgedudb.sp_gather_stats
AS
BEGIN
— 收集所有表统计信息
FOR rec IN (
SELECT table_name
FROM information_schema.tables
WHERE table_schema = ‘fgedudb’
AND table_type = ‘BASE TABLE’
) LOOP
EXECUTE IMMEDIATE ‘ANALYZE TABLE fgedudb.’ || rec.table_name;
END LOOP;

— 收集特定大表统计信息
EXECUTE IMMEDIATE ‘ANALYZE TABLE fgedudb.fgedu_order’;
EXECUTE IMMEDIATE ‘ANALYZE TABLE fgedudb.fgedu_user’;

COMMIT;
END;

2. 创建定时作业
$ obclient -e ”
BEGIN
DBMS_SCHEDULER.create_job(
job_name => ‘fgedu_stats_gather’,
job_type => ‘STORED_PROCEDURE’,
job_action => ‘fgedudb.sp_gather_stats’,
start_date => SYSTIMESTAMP,
repeat_interval => ‘FREQ=DAILY; BYHOUR=3; BYMINUTE=0’,
enabled => TRUE
);
END;

3. 验证统计信息
$ obclient -e ”
SELECT
table_name,
last_analyzed,
num_rows,
sample_size
FROM information_schema.tables
WHERE table_schema = ‘fgedudb’
ORDER BY last_analyzed DESC
LIMIT 10;

4. 性能监控
#!/bin/bash
# stats_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com

echo “=== Stats Gather Monitor ===”

# 检查未分析的表
obclient -e ”
SELECT
table_name,
last_analyzed
FROM information_schema.tables
WHERE table_schema = ‘fgedudb’
AND (last_analyzed IS NULL
OR last_analyzed < DATE_SUB(NOW(), INTERVAL 7 DAY)); " echo "============================"

4.3 OceanBase备份作业案例

# 业务场景
– 每日自动备份
– 备份验证
– 备份清理

# 实施方案

1. 创建备份脚本
#!/bin/bash
# db_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

BACKUP_DIR=”/backup/ob”
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE=”/var/log/ob_backup_${DATE}.log”

mkdir -p $BACKUP_DIR

echo “[$(date)] Starting backup…” > $LOG_FILE

# 执行逻辑备份
obdumper -h192.168.1.101 -P2881 -ufgedu -p \
-D fgedudb \
-f ${BACKUP_DIR}/fgedudb_${DATE} \
>> $LOG_FILE 2>&1

if [ $? -eq 0 ]; then
echo “[$(date)] Backup completed successfully” >> $LOG_FILE

# 压缩备份
cd $BACKUP_DIR
tar -czf fgedudb_${DATE}.tar.gz fgedudb_${DATE}
rm -rf fgedudb_${DATE}

# 清理7天前的备份
find $BACKUP_DIR -name “fgedudb_*.tar.gz” -mtime +7 -delete
else
echo “[$(date)] Backup failed” >> $LOG_FILE
# 发送告警
mail -s “[ALERT] Backup Failed” dba@fgedu.net.cn < $LOG_FILE fi 2. 配置Cron $ crontab -e # 每日2点执行备份 0 2 * * * /ob/scripts/db_backup.sh 3. 备份验证脚本 #!/bin/bash # backup_verify.sh # from:www.itpux.com.qq113257174.wx:itpux-com BACKUP_DIR="/backup/ob" LATEST_BACKUP=$(ls -t $BACKUP_DIR/*.tar.gz | head -1) echo "Verifying backup: $LATEST_BACKUP" # 解压验证 tar -tzf $LATEST_BACKUP > /dev/null

if [ $? -eq 0 ]; then
echo “Backup verification PASSED”
else
echo “Backup verification FAILED”
mail -s “[ALERT] Backup Verification Failed” dba@fgedu.net.cn
fi

4. 备份监控
#!/bin/bash
# backup_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com

BACKUP_DIR=”/backup/ob”

# 检查最新备份时间
LATEST_BACKUP=$(ls -t $BACKUP_DIR/*.tar.gz 2>/dev/null | head -1)

if [ -z “$LATEST_BACKUP” ]; then
echo “No backup found”
exit 1
fi

BACKUP_TIME=$(stat -c %Y $LATEST_BACKUP)
CURRENT_TIME=$(date +%s)
DIFF_HOURS=$(( (CURRENT_TIME – BACKUP_TIME) / 3600 ))

if [ $DIFF_HOURS -gt 25 ]; then
echo “Last backup is $DIFF_HOURS hours old”
mail -s “[ALERT] Backup Overdue” dba@fgedu.net.cn
fi

生产环境建议:定时作业需要设置完善的监控和告警,确保作业正常执行。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 OceanBase定时作业最佳实践

# 定时作业最佳实践

1. 作业设计
– 单一职责,一个作业只做一件事
– 设置超时时间
– 处理异常情况
– 记录执行日志

2. 调度策略
– 避开业务高峰
– 分散执行时间
– 控制并发数量
– 设置优先级

3. 监控告警
– 监控执行状态
– 设置失败告警
– 记录执行历史
– 定期审计

4. 安全管理
– 最小权限原则
– 密码安全管理
– 操作审计
– 访问控制

5. 维护管理
– 定期 review 作业
– 清理无用作业
– 优化执行时间
– 文档更新

5.2 OceanBase作业监控

# 作业监控

1. 查看作业状态
$ obclient -e ”
SELECT
job_name,
state,
last_start_date,
last_run_duration,
next_run_date,
run_count,
failure_count
FROM user_scheduler_jobs
ORDER BY last_start_date DESC;

2. 查看作业日志
$ obclient -e ”
SELECT
log_id,
job_name,
status,
actual_start_date,
run_duration,
cpu_used,
additional_info
FROM user_scheduler_job_run_details
WHERE job_name = ‘fgedu_daily_cleanup’
ORDER BY actual_start_date DESC
LIMIT 10;

3. 监控脚本
#!/bin/bash
# job_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com

echo “=== Job Monitor ===”
echo “Time: $(date)”
echo “”

# 检查失败作业
FAILED_JOBS=$(obclient -e ”
SELECT COUNT(*)
FROM user_scheduler_jobs
WHERE failure_count > 0;
” | tail -1)

if [ “$FAILED_JOBS” -gt 0 ]; then
echo “ALERT: $FAILED_JOBS jobs have failures”
obclient -e ”
SELECT job_name, failure_count
FROM user_scheduler_jobs
WHERE failure_count > 0;

fi

# 检查长时间运行的作业
LONG_JOBS=$(obclient -e ”
SELECT COUNT(*)
FROM user_scheduler_running_jobs
WHERE elapsed_time > 3600;
” | tail -1)

if [ “$LONG_JOBS” -gt 0 ]; then
echo “WARNING: $LONG_JOBS jobs running for more than 1 hour”
fi

echo “===================”

4. 告警配置
#!/bin/bash
# job_alert.sh
# from:www.itpux.com.qq113257174.wx:itpux-com

# 检查作业失败
obclient -e ”
SELECT job_name, failure_count
FROM user_scheduler_jobs
WHERE failure_count > 0;
” | grep -q “fgedu”

if [ $? -eq 0 ]; then
echo “Job failure detected” | mail -s “[ALERT] Job Failure” dba@fgedu.net.cn
fi

5.3 OceanBase作业问题排查

# 问题排查

1. 作业不执行
– 检查作业状态是否ENABLED
– 检查调度时间是否正确
– 检查数据库时间
– 检查资源限制

2. 作业执行失败
– 查看作业日志
– 检查存储过程错误
– 检查权限问题
– 检查资源不足

3. 作业执行超时
– 优化存储过程
– 分批处理
– 增加超时时间
– 调整执行时间

4. 常见问题
Q: 作业没有按预期执行?
A: 检查时区设置、调度表达式、作业状态

Q: 作业执行失败如何重试?
A: 设置max_failures参数,配置失败重试策略

Q: 如何查看作业执行历史?
A: 查询user_scheduler_job_run_details视图

Q: 作业执行时间太长?
A: 优化SQL,分批处理,调整执行计划

Q: 如何暂停所有作业?
A: 使用DBMS_SCHEDULER.set_scheduler_attribute设置全局状态

风哥提示:定时作业是数据库自动化运维的基础,建立完善的作业管理体系可以大幅提升运维效率。from OceanBase视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息