所以我是第一次在mysql中尝试分区,任何帮助将不胜感激。我要分区执行的操作是在分区1的当前日期之前,分区2的下一周和分区3的最大值之前。
create TABLE diagnostics_daily_device_summary (
ID bigint(20) NOT NULL AUTO_INCREMENT,
timestamp datetime,
-包括其他字段,但出于示例的考虑,我不会
麻烦把它们扔进去
PRIMARY KEY (ID, timestamp)
)
PARTITION BY RANGE (yearweek(timestamp))(
PARTITION p1 VALUES LESS THAN (yearweek(curdate())),
PARTITION p2 VALUES LESS THAN (yearweek(date_add(curdate(), interval 7 day))),
PARTITION p3 VALUES LESS THAN maxvalue
);
我需要保留最近3周的数据,这就是为什么要将其细分为“年周”格式。
当我运行查询时,我得到的错误消息是
错误代码:1064。(sub)分区函数中的常量,随机或时区相关表达式不允许在')附近,PARTITION p201547值小于(yearweek(date_add(curdate(),interval 7 d',第70行)
我不太确定如何解决它。
另外,我想每周增加一个新的星期,而在上个星期删除,我从在线资源中获得了这行代码
USE demotimeparts;
DROP PROCEDURE IF EXISTS rotateTimePartition;
DELIMITER //
CREATE PROCEDURE rotateTimePartition (newPartValue DATETIME)
BEGIN
DECLARE keepStmt VARCHAR(2000) default @stms;
DECLARE partitionToDrop VARCHAR(64);
SELECT 201501
INTO partitionToDrop
-- FROM SCHEMA_NAME.partitions
WHERE table_schema='SCHEMA_NAME'
AND tabe_name='diagnostics_daily_device_summary'
AND partition_ordinary_position=1;
SET @stmt = CONCAT ('ALTER TABLE diagnostics_daily_device_summary DROP PARTITION' , partitionToDrop);
PREPARE pStmt FROM @stmt;
EXECUTE pStmt;
DEALLOCATE PREPARE pStmt;
SET @stmt = CONCAT ('ALTER TABLE diagnostics_daily_device_summary ADD PARTITION (PARTITION Y',
DATE_FORMAT(newPartValue, '%Y%m%d'),
' VALUES LESS THAN (TO_DAYS(\'',
DATE_FORMAT(newPartValue, '%Y-%m-%d'),
'\')))');
PREPARE pStmt FROM @stmt;
EXECUTE pStmt;
DEALLOCATE PREPARE pStmt;
SET @stmt = keepStmt;
END //
DELIMITER;
就像我说的,任何帮助将不胜感激!再次感谢你。
最佳答案
“时区”“错误”与不确定特定时间在哪个星期有关。如果时区发生变化,则某些数据可能位于错误的分区中,从而使SELECTs
给出错误的答案。
另外,CURDATE()
将在CREATE TABLE
时进行评估。我怀疑这不是您想要的。
由于您确实想删除旧数据等,因此建议您只花几天或几周的时间并使用固定的日期(使用TO_DAYS()
)。有关如何进行轮换的详细信息和其他问题的提示,请参见http://mysql.rjweb.org/doc.php/partitionmaint。