2015年4月22日水曜日

技術ネタは Qiita とここで 2重投稿してみる

mysql の procedure(プロシージャ)で add partition

サンプルテーブル log。主キーは id 一つ。
create table log (
    id              bigint          not null auto_increment,
    message         text            ,
    created_at      int             not null,
    primary key (id)
) engine = InnoDB;
このままだとパーティション作成できないので主キーをいじる
alter table log
    modify id bigint not null,
    drop primary key;
alter table log
    add primary key (id, created_at),
    modify id bigint not null auto_increment;
パーティションを 1つ追加しとく。
alter table log partition by range (created_at) (
    partition pmin values less than (0)
);
プロシージャを作って 3年分のパーティション追加。
drop procedure if exists add_monthly_partition;
delimiter //
create procedure add_monthly_partition(
    in table_name text,
    in date_func text,
    in years int)
begin
    select now() into @d;
    select date_add(@d, interval years year) into @last;

    while @d < @last do
        select concat(
            'alter table ', table_name,
            ' add partition (partition p',
            date_format(@d, '%Y%m'),
            ' values less than (', date_func, '(''',
            date_format(@d, '%Y-%m-01'), ''')))'
        ) into @ddl;
        select @ddl;
        prepare stmt from @ddl;
        execute stmt;
        deallocate prepare stmt;
        select date_add(@d, interval 1 month) into @d;
    end while;
end //
delimiter ;

call add_monthly_partition('log', 'unix_timestamp', 3);