我需要根据日期,间隔和60天生成日期列表。这用于分区维护任务。就像一个例子:conf
表看起来像:
schema tab interval
--- --- ----
app tab1 daily
app tab2 monthly
app tab3 weekly
为简单起见,假设将其与information_schema一起使用会将每个最大分区日期赋予2020-05-17
。
select p.table_name, max(p.partition_description), max(pc. interval)
from INFORMATION_SCHEMA.partitions p
inner join conf pc
where p.table_schema=pc.schema
and p.partition_method='RANGE COLUMNS'
and p.table_name=pc.tab
group by p.table_name;
result:
tab1 2020-05-18 daily
tab2 2020-06-01 monthly
tab3 2020-05-24 weekly
查询应返回制表符名称以及从最大日期开始到该间隔为止最多60天的所有日期。因此,结果应类似于:
tab future_date
--- ---
tab2 2020-07-01
tab3 2020-05-31
tab3 2020-06-07
tab3 2020-06-14
tab3 2020-06-21
tab3 2020-06-28
tab3 2020-07-05
tab3 2020-07-12
tab1 2020-05-18
tab1 2020-05-19
tab1 2020-05-20
tab1 2020-05-21
..
tab1 2020-07-17
编辑
一个快速且肮脏的版本是在表的间隔和最大值上按最大值+ 1合并每个间隔的相同选择,然后循环直到没有更多行。但这很丑。
这并不理想,但这是bash
函数,可动态创建查询并循环运行直到没有更多结果为止。
for INTERVAL in month week day ; do
NEW_PART="select concat('ALTER TABLE ',table_schema,'.',table_name,' ADD PARTITION (PARTITION p',replace(next_interval,'-',''),
' VALUES LESS THAN (\'',next_interval,'\'));')
from (select p.table_schema,p.table_name,
max(STR_TO_DATE(p.partition_description, '\'%Y-%m-%d\'')) + interval 1 ${INTERVAL} next_interval
from INFORMATION_SCHEMA.partitions p
inner join conf pc
where p.table_schema=pc.table_schema
and p.partition_method='RANGE COLUMNS'
and p.table_name=pc.table_name
and lower(pc.partition_interval)='${INTERVAL}'
group by p.table_name
having max(STR_TO_DATE(p.partition_description, '\'%Y-%m-%d\'')) + interval 1 ${INTERVAL} < curdate() + interval 48 day) a"
echo "${NEW_PART}" | ${MYSQL_CONN} > ${SCRIPT_SQL}
while [ `wc -l ${SCRIPT_SQL} | awk '{print $1}'` -gt 0 ]; do
${MYSQL_CONN} < ${SCRIPT_SQL} &>> ${SCRIPT_LOG}
echo "${NEW_PART}" | ${MYSQL_CONN} > ${SCRIPT_SQL}
done
done