【问题标题】:MySQL Partitioning ErrorMySQL 分区错误
【发布时间】:2015-06-29 03:01:16
【问题描述】:

我正在运行 MySQL 5.6 并有下表:

CREATE TABLE `rawdata` (
  `RawDataSeq` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `SpeciesSeq` int(10) unsigned DEFAULT NULL,
  `DataSourceSeq` int(10) unsigned DEFAULT NULL,
  `MeasurementSeq` int(10) unsigned DEFAULT NULL,
  `RecordingDateTime` datetime DEFAULT NULL,
  `RawSensorData` varchar(100) DEFAULT NULL,
  `RawDataNumeric` decimal(36,18) DEFAULT NULL,
  `RawDataString` varchar(100) DEFAULT NULL,
  `RawDataDate` datetime DEFAULT NULL,
  `RawDataTime` varchar(45) DEFAULT NULL,
  `RawDataDateTime` datetime DEFAULT NULL,
  `ActiveRecord` int(10) unsigned DEFAULT NULL,
  `LastUpdateDate` datetime DEFAULT NULL,
  `UserId` varchar(6) DEFAULT NULL,
  `BadData` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`RawDataSeq`)
) ENGINE=MyISAM AUTO_INCREMENT=5676258 DEFAULT CHARSET=latin1

我正在尝试使用以下命令通过“RecordingDateTime”对表进行分区:

ALTER TABLE rawdata PARTITION BY RANGE (RecordingDateTime) (
  PARTITION p0 VALUES LESS THAN (2013),
  PARTITION p1 VALUES LESS THAN (2014),
  PARTITION p2 VALUES LESS THAN (2015),
  PARTITION p3 VALUES LESS THAN (UNIX_TIMESTAMP('2015-06-01 00:00:00')),
  PARTITION p4 VALUES LESS THAN MAXVALUE
);

我收到以下错误消息:

查询:ALTER TABLE rawdata PARTITION BY RANGE (RecordingDateTime) (PARTITION p0 VALUES LESS THAN (2013), PARTITION p1 VALUES LESS THAN... 错误代码:1659 字段“RecordingDateTime”是此类分区不允许的类型

非常感谢任何帮助。

【问题讨论】:

    标签: mysql partitioning


    【解决方案1】:

    改成

    PRIMARY KEY (`RawDataSeq`, RecordingDateTime)
    
    ALTER TABLE rawdata PARTITION BY RANGE (TO_DAYS(RecordingDateTime)) (
      PARTITION p_old  VALUES LESS THAN (TO_DAYS('2013-01-01')),
      PARTITION p2013  VALUES LESS THAN (TO_DAYS('2014-01-01')),
      PARTITION p2014  VALUES LESS THAN (TO_DAYS('2015-01-01')),
      PARTITION p2015  VALUES LESS THAN (TO_DAYS('2016-01-01')),
      PARTITION future VALUES LESS THAN MAXVALUE
    );
    

    您每年 12 月需要的代码在 here 找到。

    【讨论】:

    • 这太棒了,而且工作得天衣无缝。谢谢!!我还查看了您关于分区维护的帖子,在 12 月,我可以简单地删除所有分区并为 2016 年添加一个额外的分区吗?
    • 警告:DROP PARTITION 将丢失分区中的所有数据。 REORGANIZE PARTITION 可用于合并(或拆分)分区。很少使用少于 10 个分区。超过 50 个分区可能会出现性能问题。
    【解决方案2】:

    我怀疑datetime 值和您使用的整数值存在问题。一种方法是:

    ALTER TABLE rawdata PARTITION BY RANGE (year(RecordingDateTime)) (
      PARTITION p0 VALUES LESS THAN (2013),
      PARTITION p1 VALUES LESS THAN (2014),
      PARTITION p2 VALUES LESS THAN (2015),
      PARTITION p3 VALUES LESS THAN MAXVALUE
    );
    

    如果不将RecordingDateTime存储为时间戳,也可以试试:

    ALTER TABLE rawdata PARTITION BY RANGE (year(RecordingDateTime)*100 + month(RecordDateTime) (
      PARTITION p0 VALUES LESS THAN (201300),
      PARTITION p1 VALUES LESS THAN (201400),
      PARTITION p2 VALUES LESS THAN (201500),
      PARTITION p3 VALUES LESS THAN (201506),
      PARTITION p4 VALUES LESS THAN MAXVALUE
    );
    

    否则,将值存储为 timestamp 并使用时间戳范围。

    【讨论】:

    • 感谢您的帮助。我尝试了您提供的第二个选项,因为我不将值存储为时间戳。我现在收到错误消息:错误代码:1503 A PRIMARY KEY must include all columns in the table's partitioning function
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2015-12-25
    • 1970-01-01
    • 2014-03-03
    • 2023-04-10
    • 2013-09-20
    • 1970-01-01
    相关资源
    最近更新 更多