Có, bạn có thể làm điều này.
Lưu ý rằng trình lên lịch không hoạt động theo mặc định (xem Event Scheduler Configuration), do đó, đây không phải là tùy chọn không nguy hiểm. Ví dụ: nếu nhóm hoạt động của bạn di chuyển ứng dụng của bạn sang máy chủ mới, nhưng quên kích hoạt trình lên lịch, ứng dụng của bạn sẽ bị ẩn. Ngoài ra còn có các đặc quyền đặc biệt cần thiết, một lần nữa có thể cần phải được thiết lập trên một máy chủ mới. Lời khuyên của tôi: đầu tiên, tạo một thủ tục lưu trữ (xem mã mẫu dưới đây) xử lý bảo trì phân vùng định kỳ: thả phân vùng cũ nếu bảng quá lớn và thêm đủ phân vùng mới (ví dụ: 1 tuần) để ngay cả khi bảo trì proc không chạy trong một thời gian, ứng dụng của bạn sẽ không chết.
Sau đó, hãy lập lịch các cuộc gọi đến proc được lưu trữ đó. Sử dụng bộ lập lịch MySQL, sử dụng một công việc cron và sử dụng bất kỳ cách nào khác mà bạn thích. Sau đó, nếu một người lập lịch không hoạt động, người kia có thể nhận được sự chậm chạp. Nếu bạn thiết kế sproc một cách chính xác, nó sẽ là rẻ để thực hiện một no-op nếu nó không cần phải làm bất cứ điều gì. Bạn thậm chí có thể muốn gọi nó từ ứng dụng của bạn, ví dụ: là báo cáo đầu tiên khi tạo báo cáo dài hạn hoặc là một phần của quy trình ETL hàng ngày của bạn (nếu bạn có). Quan điểm của tôi là gót chân achilles của các tác vụ được lên lịch đảm bảo rằng trình lên lịch thực sự đang hoạt động-- vì vậy hãy suy nghĩ về dự phòng ở đây.
Chỉ cần đảm bảo không lên lịch tất cả các cuộc gọi cùng một lúc để chúng không bước vào nhau! :-)
Dưới đây là mẫu mã cho giao diện bảo trì của bạn trông như thế nào - trước tiên nó sẽ phân vùng cũ, sau đó thêm phân vùng mới. Tôi để lại lỗi kiểm tra và ngăn chặn nhiều thực thi đồng thời như là một exerise cho người đọc.
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`UpdatePartitions` $$
CREATE PROCEDURE `test`.`UpdatePartitions`()
BEGIN
DECLARE maxpart_date date;
DECLARE partition_count int;
DECLARE minpart date;
DECLARE droppart_sql date;
DECLARE newpart_date date;
DECLARE newpart_sql varchar(500);
SELECT COUNT(*)
INTO partition_count
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='Calls' AND TABLE_SCHEMA='test';
-- first, deal with pruning old partitions
-- TODO: set your desired # of partitions below, or make it parameterizable
WHILE (partition_count > 1000)
DO
-- optionally, do something here to deal with the parition you're dropping, e.g.
-- copy the data into an archive table
SELECT MIN(PARTITION_DESCRIPTION)
INTO minpart
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='Calls' AND TABLE_SCHEMA='test';
SET @sql := CONCAT('ALTER TABLE Calls DROP PARTITION p'
, CAST((minpart+0) as char(8))
, ';');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT COUNT(*)
INTO partition_count
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='Calls' AND TABLE_SCHEMA='test';
END WHILE;
SELECT MAX(PARTITION_DESCRIPTION)
INTO maxpart_date
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='Calls' AND TABLE_SCHEMA='test';
-- create enough partitions for at least the next week
WHILE (maxpart_date < CURDATE() + INTERVAL 7 DAY)
DO
SET newpart_date := maxpart_date + INTERVAL 1 DAY;
SET @sql := CONCAT('ALTER TABLE Calls ADD PARTITION (PARTITION p'
, CAST((newpart_date+0) as char(8))
, ' values less than('
, CAST((newpart_date+0) as char(8))
, '));');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT MAX(PARTITION_DESCRIPTION)
INTO maxpart_date
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='Calls' AND TABLE_SCHEMA='test';
END WHILE;
END $$
DELIMITER ;
BTW, bảo trì phân vùng (đảm bảo phân vùng mới được tạo trước, cắt tỉa phân vùng cũ, vv), IMHO, cực kỳ quan trọng để tự động hóa. Cá nhân tôi đã nhìn thấy một kho dữ liệu doanh nghiệp lớn đi xuống trong một ngày vì giá trị phân vùng của năm bị bẻ gãy ban đầu nhưng không ai nhớ để tạo nhiều phân vùng hơn một lần vào năm tới. Vì vậy, nó rất tốt, bạn đang suy nghĩ về tự động hóa ở đây-- nó bodes tốt cho dự án bạn đang làm việc trên. :-)
Có tối đa 1024 phân vùng cho phép mỗi bảng, vì vậy giải pháp này sẽ chạy ra khỏi các phân vùng trong dưới 3 tuổi. Và các trường hợp phân vùng hàng ngày sẽ cải thiện hiệu suất sẽ khá hiếm ... Nếu bạn thực sự nhấn mạnh vào việc này, bạn có thể không cần phải tạo phân vùng mới mỗi ngày, xem [tại đây] (http://stackoverflow.com/a/6163679/238419) –