Заставив mysql / mariadb работать с данными из одного раздела за раз, задача может быть выполнена, используя менее 500 МБ ОЗУ в любой момент.
Структура решения выглядит так:
insert into table2 select * from table1 partition (p<X>)
, где X должен быть полным набором целых чисел, которые соответствуют разделам, в моем случае от 0 до 8191. Это может быть реализовано с помощью хранимой процедуры, такой как:
drop procedure if exists create_partitioned_table_tweets;
delimiter #
create procedure my_partitioning_data_copy_procedure()
begin
declare v_max int unsigned default 8191;
declare v_counter int unsigned default 0;
start transaction;
while v_counter < v_max do
SET @expression = concat("insert into table2 select * from table1 partition (p", v_counter, ");");
prepare myquery from @expression;
execute myquery;
set v_counter=v_counter+1;
end while;
commit;
end #
delimiter ;
call my_partitioning_data_copy_procedure();