mysql 分区 自动扩展_Oracle 自动拓展分区的实现(11g后使用interval分区)

Oracle 自动拓展分区的实现(11g后使用interval分区)

创建 ERROR TABLE :

create sequence seq_error_log_id ;

create table error_log (id number , unit_name varchar2 (30),

err_code varchar2(100 ) ,

err_desc varchar2(4000 ),

err_date date) ;

自动拓展分区包:

create or replace package dba_tools is

-- Author : RenFj

-- Created : 7/24/2013 9:26:12 AM

-- Purpose : My DBA's utility

--

--

YEAR constant varchar2(1) := 'Y' ;

MONTH constant varchar2(1) := 'M' ;

DAY constant varchar2(1) := 'D' ;

QUARTER constant varchar2(1) := 'Q' ;

-- ******No matter you understand it or not , I do .******

-- create table log_errors (id number , unit_name varchar2(30),

-- err_code varchar2(100) ,

-- err_desc varchar2(4000),

-- err_date date) ;

-- Log errors which raised in the programs .

-- p_unit_name program name

-- p_sqlc error code (sqlcode)

-- p_sqler error message (sqlerrm)

--

procedure err_log(p_unit_name varchar2,

p_sqlc varchar2,

p_sqler varchar2);

-- Auto extend partitions with the specificed table in the program .

-- tb_name Specified table name which need to extend partitions.

-- part_iden Partition identifier

-- The following identifier can be used :

-- d day

-- m month

-- q quarter

-- y year

-- interval_num Interval number , that means the additional partition values less than (sysdate+part_iden*interval_num)

-- This program need partition's name has roles . Like ($table_name||$lessthan_date_string)order_20130101

procedure dba_autoextend_partitions(p_tb_name varchar2,

p_part_iden varchar2,

p_interval_num number);

end dba_tools;

create or replace package body dba_tools is

procedure err_log(p_unit_name varchar2,

p_sqlc varchar2,

p_sqler varchar2) is

PRAGMA AUTONOMOUS_TRANSACTION ; --autonomous transaction .

begin

-- No exception handle in this unit .

insert into error_log

(id, unit_name, err_code, err_desc, err_date)

values

(seq_error_log_id.nextval, p_unit_name, p_sqlc, p_sqler, sysdate);

commit;

end;

procedure dba_autoextend_partitions(p_tb_name varchar2,

p_part_iden varchar2,

p_interval_num number) is

d_last_part_dat date; --最后一个partition 范围中的截止时间

d_next_dat date; --这一次的创建的partition的截止时间

v_part_less_than_val varchar2(4000 ); --less than 字符串

v_part_name varchar2(30 ) ; --partition 的名称

v_add_part_sql varchar2(4000 ); --add partition 的sql语句

begin

--查询出最后一个创建的partition的截止时间,partition的名称格式必须为xxxx_yyyymmdd

--例如orders_20120101 其中20120101表示创建的partition的截止时间

select to_date(regexp_replace(partition_name,

'(.*)(2[0-9]{3}[0-9]{4})',

'\2'),

'yyyymmdd')

into d_last_part_dat

from (select max(partition_position) over( partition by table_name) mn,

t.*

from user_tab_partitions t

where table_name = upper(p_tb_name)) t

where t.mn = partition_position;

--根据参数p_part_iden以及p_interval_num计算出这一次创建的partition的截止时间

--d 表示天,m表示月,q表示季度,y表示年度

if p_part_iden in ('d', 'D') then

d_next_dat := d_last_part_dat + p_interval_num;

elsif p_part_iden in ('m', 'M') then

d_next_dat := add_months(trunc(d_last_part_dat, 'MM'), p_interval_num);

elsif p_part_iden in ('q', 'Q') then

d_next_dat := add_months(trunc(d_last_part_dat, 'Q'),

3 * p_interval_num);

elsif p_part_iden in ('y', 'Y') then

d_next_dat := add_months(trunc(d_last_part_dat, 'Q'),

12 * p_interval_num);

else

raise_application_error(- 20999,

'Type following identifier with p_part_iden : d(day) , m(month) , q(quarter) , y(year) .');

end if ;

--根据截止时间拼装分区名称v_part_name 以及 less than 子句v_part_less_than_val

--example: v_part_name := ORDERS_20120101

-- v_part_less_than_val := TO_DATE(TO_CHAR(20120101,'YYYYMMDD'))

v_part_name := upper(p_tb_name) || '_' ||

to_char(d_next_dat, 'yyyymmdd');

v_part_less_than_val := 'to_date(' || to_char(d_next_dat, 'yyyymmdd') ||

',''yyyymmdd'')';

--拼装的添加分区的sql语句v_add_part_sql

-- example : ALTER TABLE print_media_part ADD PARTITION p4 VALUES LESS THAN (400)

v_add_part_sql := 'ALTER TABLE '

|| p_tb_name

|| ' ADD PARTITION '

|| v_part_name

|| ' VALUES LESS THAN ('

|| v_part_less_than_val

|| ')';

execute immediate v_add_part_sql;

exception

when others then

err_log( 'dba_autoextend_partitions', sqlcode , sqlerrm);

end;

end dba_tools;

创建测试表

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 MySQL分区表可以提高查询性能,并且可以通过按时间范围进行自动分区,以便更好地管理和维护数据。下面是按天执行分区表SQL的步骤: 1. 创建分区表 您可以使用以下命令创建一个按天分区的表: ``` CREATE TABLE mytable ( id INT NOT NULL, created_at TIMESTAMP NOT NULL ) PARTITION BY RANGE(TO_DAYS(created_at)) ( PARTITION p0 VALUES LESS THAN (TO_DAYS('2022-01-01')), PARTITION p1 VALUES LESS THAN (TO_DAYS('2022-01-02')), PARTITION p2 VALUES LESS THAN (TO_DAYS('2022-01-03')), ... PARTITION pn VALUES LESS THAN MAXVALUE ); ``` 这将创建一个名为“mytable”的分区表,其中“created_at”列将用于分区分区将按天进行。您需要为每个分区指定值范围,例如“p0”分区包含所有在“2022-01-01”之前创建的记录。 2. 创建分区维护事件 您可以创建一个事件,定期检查表并创建新的分区。以下是一个示例事件: ``` CREATE EVENT partition_maintenance ON SCHEDULE EVERY 1 DAY DO ALTER TABLE mytable ADD PARTITION ( PARTITION pmax VALUES LESS THAN MAXVALUE ); ``` 这将创建一个名为“partition_maintenance”的事件,每天运行一次,它将在“mytable”表中创建一个新的分区。 3. 自动分区 您可以在表中插入数据时自动创建分区。以下是一个示例触发器: ``` CREATE TRIGGER partition_insert BEFORE INSERT ON mytable FOR EACH ROW BEGIN DECLARE partition_name VARCHAR(20); SET partition_name = CONCAT('p', DATE_FORMAT(NEW.created_at, '%Y%m%d')); SET @partition_sql = CONCAT('PARTITION ', partition_name, ' VALUES LESS THAN (TO_DAYS(\'', DATE_ADD(DATE(NEW.created_at), INTERVAL 1 DAY), '\'))'); SET @sql = CONCAT('ALTER TABLE mytable ADD ', @partition_sql); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END; ``` 这将创建一个名为“partition_insert”的触发器,在插入新记录时自动创建新的分区。该触发器将使用新记录的“created_at”值计算分区名称,并为该名称创建一个新的分区。 总之,以上是按天执行分区表SQL的步骤,希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值