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
- 自动化:按预定时间自动执行
- 可靠性:支持失败重试和告警
- 灵活性:支持多种调度策略
- 监控性:提供执行日志和状态
- 安全性:支持权限控制和审计
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
Part03-生产环境项目实施方案
3.1 OceanBase 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
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作业
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
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
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设置全局状态
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
