高效管理Oracle数据库:调度器与数据泵的运用
立即解锁
发布时间: 2025-08-21 02:09:17 阅读量: 1 订阅数: 6 

### 高效管理 Oracle 数据库:调度器与数据泵的运用
#### 1. Oracle 调度器概述
Oracle 调度器是一个强大的资源管理和调度系统,借助它可以运行几乎任何类型的程序,还能帮助用户创建并自动执行许多数据库内的管理任务。它通过 `DBMS_SCHEDULER` 数据库包实现,取代了旧的 `DMBS_JOB` 包。
调度器可运行的程序类型如下:
- PL/SQL 存储过程
- PL/SQL 匿名块
- Java 存储程序
- 本地和远程外部程序,如 shell 脚本和可执行文件
可调度的作业类型有:
- 基于时间的作业:可根据时钟时间运行,还能按小时、天、月等重复执行。
- 基于事件的作业:环境中某些条件或事件的结果可触发作业运行,在需要等待其他进程完成后再运行作业时很有用。
- 基于依赖的作业:可设置成功或失败等依赖关系,根据一个作业的结果执行一个或多个依赖场景。
#### 2. 调度器对象
调度器使用多种对象来运行作业,这些对象用于指定作业参数、时间、执行窗口和资源限制,具体如下:
| 对象类型 | 描述 |
| ---- | ---- |
| 程序 | 调度器要运行的实际代码,确定执行代码、参数和作业类型。 |
| 调度 | 包含作业运行的时间和频率等参数,应由 DBA 创建并供多个作业共享。 |
| 作业 | 包含可执行文件和运行作业所需的调度,可根据参数启用作业。作业分为数据库作业(通过 PL/SQL 命令从数据库运行)、外部作业(从操作系统的外部可执行文件运行)、链式(依赖)作业(根据其他作业的状态运行)、分离作业(在新进程中启动另一个作业)和轻量级作业(仅用于即时执行,不存储为模式对象,用于快速、低开销的应用程序)。 |
| 窗口 | 帮助在特定时间调度作业,有助于控制资源使用。窗口激活时,会启用某些资源指令,防止作业使系统过载。 |
#### 3. 创建第一个调度器作业
下面以创建一个运行存储 PL/SQL 过程的简单作业为例,该过程会统计系统上的用户数量,并将该数量和时间戳插入到一个表中,每五分钟运行一次。具体步骤如下:
1. 以 SYS 用户登录 SQL*Plus。
2. 授予作业创建者创建作业的权限:
```sql
grant create job to hr;
```
若操作成功,会显示:
```
Grant succeeded.
```
此示例作业由 HR 创建和运行。
3. 让 HR 能够查看 `V$SESSION` 表:
```sql
grant select on v_$session to hr;
```
若操作成功,会显示:
```
Grant succeeded.
```
注意,`V_$SESSION` 中的下划线不是拼写错误,`V$SESSION` 是 `V_$SESSION` 的同义词,授予权限时需使用视图名称。
4. 以作业创建者身份登录 SQL*Plus,并创建一个表来存储数据:
```sql
create table user_count (
number_of_users NUMBER(4),
time_of_day TIMESTAMP
)
TABLESPACE users;
```
若操作成功,会显示:
```
Table created.
```
5. 创建存储过程:
```sql
CREATE OR REPLACE PROCEDURE insert_user_count AS
v_user_count NUMBER(4);
BEGIN
SELECT count(*)
INTO v_user_count
FROM v$session
WHERE username IS NOT NULL;
INSERT INTO user_count
VALUES (v_user_count, systimestamp);
commit;
END insert_user_count;
/
```
若操作成功,会显示:
```
Procedure created.
```
6. 为作业创建程序:
```sql
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM (
program_name => 'PROG_INSERT_USER_COUNT',
program_action => 'INSERT_USER_COUNT',
program_type => 'STORED_PROCEDURE'
);
END;
/
```
若操作成功,会显示:
```
PL/SQL procedure successfully completed.
```
7. 启用程序:
```sql
exec dbms_scheduler.enable('PROG_INSERT_USER_COUNT');
```
若操作成功,会显示:
```
PL/SQL procedure successfully completed.
```
8. 创建作业运行的调度:
```sql
BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE (
schedule_name => 'my_weekend_5min_schedule',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MINUTELY; INTERVAL=5; BYDAY=SAT,SUN',
end_date => SYSTIMESTAMP + INTERVAL '30' day,
comments => 'Every 5 minutes'
);
END;
/
```
若操作成功,会显示:
```
PL/SQL procedure successfully completed.
```
9. 使用定义的程序和调度创建作业:
```sql
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'my_user_count_job',
program_name => 'prog_insert_user_count',
schedule_name => 'my_weekend_5min_schedule'
);
END;
/
```
若操作成功,会显示:
```
PL/SQL procedure successfully completed.
```
10. 启用作业,使其在定义
0
0
复制全文
相关推荐










