创建分区表每天根据时间自动分区

老师,我这个odc为什么没有分区策略?

通过ODC创建自动任务可以实现

需要WEB版本的ODC,本地版本的不行

1 个赞

这个想法很不错,哪位大佬有高招

Oracle模式
创建存储过程,用于动态生成并执行分区添加语句

CREATE PROCEDURE add_next_partition()
BEGIN
    DECLARE next_month DATE;
    SET next_month = DATE_ADD(LAST_DAY(CURDATE()), INTERVAL 1 DAY);
    SET @sql = CONCAT(
        'ALTER TABLE your_table_name ADD PARTITION (',
        'PARTITION p_', DATE_FORMAT(next_month, '%Y%m'), 
        ' VALUES LESS THAN (TO_DATE(\'', DATE_FORMAT(next_month, '%Y-%m-01'), '\', \'YYYY-MM-DD\'))'
        ');'
    );
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END;

创建调度任务,每月初调用该存储过程。

BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
        job_name        => 'ADD_PARTITION_JOB',
        job_type        => 'PLSQL_BLOCK',
        job_action      => 'BEGIN add_next_partition(); END;',
        start_date      => SYSTIMESTAMP,
        repeat_interval => 'FREQ=MONTHLY; BYMONTHDAY=1',
        enabled         => TRUE         );
END;

MySQL模式
创建存储过程,用于动态生成并执行分区添加语句。

DELIMITER //
CREATE PROCEDURE add_next_partition()
BEGIN
    DECLARE next_month DATE;
    SET next_month = DATE_ADD(LAST_DAY(CURDATE()), INTERVAL 1 DAY);
    SET @sql = CONCAT(
        'ALTER TABLE your_table_name ADD PARTITION (',
        'PARTITION p_', DATE_FORMAT(next_month, '%Y%m'), 
        ' VALUES LESS THAN (TO_DATE(\'', DATE_FORMAT(next_month, '%Y-%m-01'), '\', \'YYYY-MM-DD\'))'
        ');'
    );
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

使用外部调度工具(如 cron )定期调用该存储过程

0 0 1 * * mysql -h<host> -u<user> -p<password> -D<database> -e "CALL add_next_partition();"

1 个赞

ODC有这样的功能。
注意下,

  • 加字段:轻量级操作,速度快。
  • 加索引:需要扫描和复制数据,速度较慢。
  • 删除字段:慢,涉及数据清理、元数据更新和存储优化。
  • 新建分区:轻量级操作,速度快。
  • 删除分区:需要清理数据并可能重建全局索引,速度较慢。

:+1:

有根据时间自动分区的功能吗