将管理任务计划程序任务计划从 IBM Db2 LUW 重构为适用于 MySQL 的亚马逊 RDS、适用于 MariaDB 的亚马逊 RDS 或亚马逊 Aurora MySQL

Db2 LUW 中的 管理任务调度程序 (ATS) 是一个允许您在数据库中自动执行和调度管理任务的组件。它提供了一种安排重复任务(例如备份、维护活动、数据导入、导出和其他管理操作)的便捷方式。

DB2 LUW ATS 的一些关键特性和功能包括:

  • 任务调度 — ATS 允许您在 Db2 LUW 中自动执行例行管理任务,例如备份、重组、运行统计和维护活动。它可以根据预定义的时间表自动运行这些任务,从而帮助简化和简化这些任务。
  • 灵活的计划选项 — ATS 提供灵活的调度框架,允许您定义任务运行的频率和时间。您可以将任务安排为按特定间隔(例如每天、每周或每月)运行,也可以使用类似 cron 的表达式指定自定义计划。
  • 记录和监控 — ATS 维护任务运行日志,包括开始时间、结束时间和状态信息。此日志提供任务运行的历史记录,允许您跟踪和查看运行历史记录以进行审计或故障排除。

在这篇文章中,我们向您展示了在 IBM Db2 LUW 中使用 ATS 的调度选项,以及如何使用事件调度器将其迁移到适用于 MySQL 的目标 亚马逊关系数据库服务 (Amazon RDS) 、适用于 MariaDB 的 亚马逊 RDS 或与 Amazon Aurora M ySQL 兼容版数据库。

Db2 LUW 中的管理任务调度器

管理任务调度程序内置于 DB2 LUW 数据库中,可通过命令行界面 (CLI) 进行访问。它使数据库管理员 (DBA) 能够定义任务、设置其调度参数并管理这些任务的运行。

定时任务由 Db2 自主计算守护程序 (d b2acd ) 运行,该守护程序每 5 分钟自动轮询活动数据库中的新任务或更新任务。该守护程序维护活动任务的列表,并在相应的预定运行时间到来时调用它们。

默认情况下,在 Db2 LUW 中禁用 ATS;您可以使用注册表变量 DB2_ATS_ENABLE 将其启用。 如果尚不存在 SYSTOOLSPAC E 表空间,则还需要创建,因为 Db2 依赖该表空间来存储历史数据和配置信息。

Db2 LUW 在 S YSPROC 架构下提供以下 SQL 例程,您可以使用这些例程来调度和修改任务:

  • ADMIN_TASK_ADD — 此过程添加了需要按预定义计划运行的新计划。
  • ADMIN_TASK_REMOVE — 此过程会删除 计划任务。它还会删除任务状态记录。
  • ADMIN_TASK_UPDATE — 此过程使用给定任务名称更新任务作为输入。

同样,您可以使用 SYSTOOLS 架构下的以下视图列出所有计划任务或监控任务的状态:

  • ADMIN_TASK_LIS T — 此视图检索有关管理任务计划程序中定义的每项任务的信息。
  • ADMIN_TASK_STATU S — 此视图检索有关管理任务计划程序中任务运行状态的信息。

使用 ATS 添加、更新或删除任务

需要运行的任务应封装在 SQL 存储过程中,该存储过程应作为这些 ATS 过程的输入提供。

例如,以下命令添加了一项新任务, 用于每 6 小时收集 SA LE S 表的 统计数据

CALL SYSPROC.ADMIN_TASK_ADD
  ('stats_sales',
    CURRENT_TIMESTAMP,
    NULL,
    NULL,
    '0 */6 * * *',
    'SYSPROC',
    'ADMIN_CMD',
    'VALUES(''RUNSTATS ON TABLE SALES WITH DISTRIBUTION TABLESAMPLE BERNOULLI(30)'')',
    NULL,
    NULL );

您可以使用 ADMIN_TASK_LIST 视图列 出在数据库中创建的所有任务:

select * from systools.ADMIN_TASK_LIST;

Admin task list

列出任务状态

您可以使用 ADMIN_TASK_STATU S 视图列出在数据库中创建的所有任务的任务状态:

select * from systools.ADMIN_TASK_STATUS;

Admin task status

更新任务

你可以使用 ADMIN_TASK_UPDATE 过程来更新或修改任务。对于之前创建的示例任务,以下更新语句将计划修改为每 12 小时在 SA LE S 表上运行一次统计数据:

CALL SYSPROC.ADMIN_TASK_UPDATE
	('stats_sales',
	NULL,
	NULL,
	NULL,
	'0 */12 * * *',
	NULL,
	NULL);

使用 ADMIN_TASK_LIS T 视图来验证更新的计划信息。

删除任务

要删除任务,有两个选项可用。第一个选项是仅删除任务的状态并保留实际任务,以便它继续按照预定义的计划运行。第二个选项是删除任务本身。

使用以下语句删除所有小于当前时间戳的任务状态:

CALL SYSPROC.ADMIN_TASK_REMOVE('stats_sales', current_timestamp);

您可以验证 ADMIN_TASK_STASK_STATUS 视图,以检查所有任务状态 条目是否已删除,但未从 ADMIN_TASK_LIST 视图中删除。

以下语句将任务本身从计划中删除, ADMIN_TASK_LIST 将不再显示此任务

CALL SYSPROC.ADMIN_TASK_REMOVE('stats_sales', NULL);

兼容 Aurora MySQL 版本的事件调度器、适用于 MySQL 的亚马逊 RDS 或适用于 MariaDB 的亚马逊 RDS

对于通过 UNIX/LINUX cron 类功能解决的用例,你可以选择使用事件调度器将计划任务移植到 MySQL 或 MariaDB 中。MySQL 和 MariaDB 都允许您使用可由数据库实例中配置的事件调用的程序 SQL 自由运行直接 SQL 语句或更复杂的业务逻辑。通过将这些事件设置为按固定时间表运行,您可以管理要在数据库实例中对应用程序架构中的表运行的操作。与事件调度器相关的各种操作的语法在兼容 Aurora MySQL 的版本、适用于 MySQL 的亚马逊 RDS 和适用于 MariaDB 的亚马逊 RDS 中是相同的,我们在本文中对此进行了讨论。

启用事件调度器

完成以下步骤,在适用于 MySQL 的亚马逊 RDS 或适用于 MariaDB 的亚马逊 RDS 中启用事件调度器:

  1. 在 Amazon RDS 控制台上,选择导航窗格 中的 参数组
  2. 选择您的参数组,然后在 “ 操作 ” 菜单上选择 “ 编辑”
  3. 为参数 e vent_scheduler 选择值 ON, 然后选择保存更改。
    Edit parameter group

这是一个动态参数,您不必重启实例。现在,您应该能够在数据库实例上配置事件调度器。

以下命令显示了数据库服务器中的 event_scheduler 守护程序状态:

MariaDB [(none)]> use db2inst1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [db2inst1]> SHOW processlist;
+--------+-----------------+-------------------+----------+---------+--------+------------------------+------------------+----------+
| Id     | User            | Host              | db       | Command | Time   | State                  | Info             | Progress |
+--------+-----------------+-------------------+----------+---------+--------+------------------------+------------------+----------+
| 196491 | event_scheduler | localhost         | NULL     | Daemon  | 299234 | Waiting on empty queue | NULL             |    0.000 |
+--------+-----------------+-------------------+----------+---------+--------+------------------------+------------------+----------+

对于兼容 Aurora MySQL 的版本,集群和实例级别都有参数组。将其设置在集群级别是个好主意,因为所有实例都将继承该设置。

完成以下步骤,使用数据库集群参数组在集群级别启用事件调度器:

  1. 在 Amazon RDS 控制台上,选择导航窗格 中的 参数组
  2. 选择您的参数组,然后在 “ 操作 ” 菜单上选择 “ 编辑”
  3. 为参数 e vent_scheduler 选择值 ON, 然后选择保存更改。
    Edit Cluster parameter group

这是一个动态参数,您不必重启数据库集群。现在,您应该能够在数据库实例上配置事件调度器。

以下命令显示了数据库服务器中的 event_scheduler 守护程序状态:

SHOW processlist;
+--------+-----------------+-------------------+----------+---------+--------+------------------------+------------------+----------+
| Id     | User            | Host              | db       | Command | Time   | State                  | Info             | Progress |
+--------+-----------------+-------------------+----------+---------+--------+------------------------+------------------+----------+
| 196491 | event_scheduler | localhost         | NULL     | Daemon  | 299234 | Waiting on empty queue | NULL             |    0.000 |
+--------+-----------------+-------------------+----------+---------+--------+------------------------+------------------+----------+

使用事件调度器添加、修改或删除事件

您可以使用 创建事件 语句在数据库中添加新事件,这些事件可以是一次性事件,也可以是周期性事件。除非 创建事件语句中包含 ON COMPLATI ON PRES ERVE 子句,否则一次性事件 将运行一次并自动删除。

从前面收集 销售额 表统计数据的示例中,以下事件运行过一次,然后被删除:

CREATE EVENT sales_stats
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 2 MINUTE
    COMMENT 'Analyzes the SALES Once'
    DO
    ANALYZE TABLE db2inst1.SALES;

MariaDB [db2inst1]> show events \G
*************************** 1. row ***************************
                  Db: db2inst1
                Name: sales_stats
             Definer: admin@%
           Time zone: UTC
                Type: ONE TIME
          Execute at: 2023-09-15 02:13:29
      Interval value: NULL
      Interval field: NULL
              Starts: NULL
                Ends: NULL
              Status: ENABLED
          Originator: 1405036644
character_set_client: utf8mb3
collation_connection: utf8mb3_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.001 sec)

相比之下,以下事件是重复发生的,每 6 小时运行一次。因此,除非明确删除,否则该事件将持续存在。

CREATE EVENT sales_stats
    ON SCHEDULE
      EVERY 6 HOUR
    COMMENT 'Analyzes the SALES table every 6 hours'
    DO
    ANALYZE TABLE db2inst1.SALES;

MariaDB [db2inst1]> show events \G
*************************** 1. row ***************************
                  Db: db2inst1
                Name: sales_stats
             Definer: admin@%
           Time zone: UTC
                Type: RECURRING
          Execute at: NULL
      Interval value: 6
      Interval field: HOUR
              Starts: 2023-09-15 02:12:19
                Ends: NULL
              Status: ENABLED
          Originator: 1405036644
character_set_client: utf8mb3
collation_connection: utf8mb3_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.001 sec)

列出任务

您可以使用 sho w event s 命令(如前所示)或从 INFORMATION _ SCHEMA 下 的事件表中列出事件 详细信息。对于一次性事件,事件详细信息将从事件表中删除,并且在运行后不会使用 sh ow ev ents 命令列出。

以下代码显示了使用 information _schema 表下 的事件 表列出的示例事件。

MariaDB [db2inst1]> select * from information_schema.events where EVENT_NAME = 'sales_stats' \G
*************************** 1. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: db2inst1
          EVENT_NAME: sales_stats
             DEFINER: admin@%
           TIME_ZONE: UTC
          EVENT_BODY: SQL
    EVENT_DEFINITION: ANALYZE TABLE db2inst1.SALES
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 6
      INTERVAL_FIELD: HOUR
            SQL_MODE: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
              STARTS: 2023-09-15 02:12:19
                ENDS: NULL
              STATUS: ENABLED
       ON_COMPLETION: NOT PRESERVE
             CREATED: 2023-09-15 02:12:19
        LAST_ALTERED: 2023-09-15 02:12:19
       LAST_EXECUTED: 2023-09-15 02:12:19
       EVENT_COMMENT: Analyzes the SALES table every 6 hours
          ORIGINATOR: 1405036644
CHARACTER_SET_CLIENT: utf8mb3
COLLATION_CONNECTION: utf8mb3_general_ci
  DATABASE_COLLATION: latin1_swedish_ci
1 row in set (0.001 sec)

更新任务

使用 al ter 事件 语句修改事件的特征,例如 D O 子句下的调度或 SQL 语句,甚至同时修改所有特征。对于省略的选项,al ter 子 句保持不变,并保留其原始值。

ALTER EVENT sales_stats
    ON SCHEDULE
      EVERY 12 HOUR
    COMMENT 'Analyzes the SALES table every 12 hours';

MariaDB [db2inst1]> show events \G
*************************** 1. row ***************************
                  Db: db2inst1
                Name: sales_stats
             Definer: admin@%
           Time zone: UTC
                Type: RECURRING
          Execute at: NULL
      Interval value: 12
      Interval field: HOUR
              Starts: 2023-09-15 02:13:14
                Ends: NULL
              Status: ENABLED
          Originator: 1405036644
character_set_client: utf8mb3
collation_connection: utf8mb3_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.001 sec)

删除任务

您可以使用 drop event 语句从数据库中删除不再需要的事件。删除事件后, 事件 表或 sh ow events 命令将不再列出这些事件

drop event sales_stats;

MariaDB [db2inst1]> drop event sales_stats;
Query OK, 0 rows affected (0.003 sec)

MariaDB [db2inst1]> show events \G
Empty set (0.001 sec)

使用事件调度器自动执行的常见任务

事件调度器是自动执行大多数数据库特定任务的好方法。与源 Db2 LUW 数据库相比,以下是可以使用事件调度器执行的一些常见任务:

  • 数据维护 -安排数据清除、存档或数据清理等任务,以保持数据库整洁并优化性能
  • 数据聚合 -自动汇总和汇总用于报告目的的数据的过程,减少了对手动干预的需求
  • 表分区维护 -在非高峰时段定期添加新的表分区或删除旧分区,无需任何手动干预
  • 收集表统计信息 -使用预定义的时间表收集大型表的明确统计信息,以保持统计数据为最新状态并提高查询性能
  • 用户权限管理 -根据预定义的时间表自动执行用户访问控制任务,例如授予或撤消权限。
  • 数据存档 -将历史数据或不常访问的数据移动到存档表或历史表中,以优化实时表的性能

同样,某些任务适用于本地 Db2 LUW 数据库,这些任务在从本地迁移到 亚马逊云科技 时不相关,例如:

  • 数据库备份和恢复
  • 补丁更新
  • 定期运行自定义监控脚本

Db2 ATS 与 MySQL 或 MariaDB 事件调度器的比较

下表比较了源 Db2 LUW 和目标 MySQL 或 MariaDB 数据库之间的任务计划选项。

Description Db2 LUW MySQL or MariaDB
How to enable Set DB2_ATS_ENABLE registry variable to ON (or 1 or YES) Set EVENT_SCHEDULER DB parameter to ON
Add new tasks ADMIN_TASK_ADD procedure Create event command
Update existing tasks ADMIN_TASK_UPDATE procedure Alter event command
Remove existing tasks ADMIN_TASK_REMOVE procedure Drop event command
Schedule format Using CRON expression Using timestamp functions
Task format Can be encapsulated in procedures only Can be a SQL statement or compound statements or procedures
List tasks ADMIN_TASK_LIST view INFORMATION_SCHEMA.EVENT table or show events command or show create event command
Monitor task status ADMIN_TASK_STATUS view EVENTS.LAST_EXECUTED or error log

局限性

以下是在兼容 Aurora MySQL 的版本、适用于 MySQL 的亚马逊 RDS 和适用于 MariaDB 的亚马逊 RDS 上使用事件调度器的一些限制:

  • 由于在先前的运行计划中运行时间延长,因此无法对事件的多次并发运行提供保护。但是,使用事件定义中的 GET_LOCK 和 RELEASE_LOCK 函数可以克服这个问题。
  • 您无法查看历史事件运行状态。解决这个问题的一种方法是使用历史表或日志表作为事件逻辑的一部分,记录每个事件运行的状态。
  • 如果事件失败,则失败记录仅存在于数据库的错误日志中,并且不容易出现在任何表中。为了克服这个问题, 您可以 将错误日志发布到 CloudWatch Log s , 并根据错误日志 创建指标 。该指标可以作为 CloudWatch 警报的基础 ,该警报 可以通知您事件失败的详细信息。

结论

在这篇文章中,我们讨论了在从 Db2 LUW 管理任务调度器迁移时如何使用事件调度器作为解决方案。我们还比较了 Db2 和 MySQL 或 MariaDB 数据库之间的选项,并讨论了目标数据库与源数据库相比的一些限制。使用事件调度器,您可以自动执行最常见的 DBA 任务甚至业务逻辑,使其以 SQL 语句或过程甚至复合语句的形式以预定义的重复或一次性计划运行。

如果您有任何意见或问题,请告诉我们。我们非常重视您的反馈!


作者简介

Sai Parthasaradhi 是 亚马逊云科技 专业服务的高级首席数据库迁移顾问。他与客户紧密合作,帮助他们在 亚马逊云科技 上迁移数据库并对其进行现代化改造。

奥利弗·弗朗西 斯 是 亚马逊云科技 专业服务的高级首席数据库迁移顾问。他喜欢自动化手动流程并增强用户体验。他帮助客户在 亚马逊云科技 云中迁移和现代化工作负载,特别关注现代应用程序架构和开发最佳实践。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。