サンプルテーブル 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);