mysql merge分表實際操作

分表即把數據量大的表拆分成小表,根據項目的需求這裏設爲每個月定時創建merge分表,合併主表。
建立分表

DROP TABLE IF EXISTS `device_log_201611`;
CREATE TABLE `device_log_201611`(
`id` VARCHAR (36) NOT NULL COMMENT 'ID主鍵',
`deviceId` VARCHAR(36),
`access_time` DATETIME,
remark VARCHAR(20),
 PRIMARY KEY (`id`)
)CHARSET=utf8 ENGINE=MYISAM;

建立主表

DROP TABLE IF EXISTS `device_log`;
CREATE TABLE `device_log`(
`id` VARCHAR (36) NOT NULL COMMENT 'ID主鍵',
`deviceId` VARCHAR(36),
`access_time` DATETIME,
remark VARCHAR(20),
 PRIMARY KEY (`id`)
)CHARSET=utf8 ENGINE=MERGE UNION(device_log_201611) INSERT_METHOD=LAST;

—創建存儲過程

DELIMITER //
CREATE PROCEDURE createT_pro()
BEGIN
DECLARE oldnames TEXT;
DECLARE newname VARCHAR(100);
DECLARE createtable VARCHAR(200);
DECLARE altertable TEXT;
SELECT GROUP_CONCAT(TABLE_NAME) INTO oldnames FROM INFORMATION_SCHEMA.TABLES WHERE table_name LIKE 'device_log_%';
SET newname = CONCAT('device_log_',DATE_FORMAT(NOW(),'%Y%m%d%H%i'));
SET oldnames = CONCAT(oldnames,',',newname);
SET createtable = CONCAT('CREATE TABLE ',newname,' LIKE device_log_201611;');
SET altertable = CONCAT('ALTER TABLE device_log UNION=(',oldnames,')');
SET @sql = createtable;
PREPARE stmt FROM @sql;
EXECUTE stmt;
SET @sql = altertable;
PREPARE stmt FROM @sql;
EXECUTE stmt;
END
//
DELIMITER ;

定時器

SHOW VARIABLES LIKE '%sche%'; -- 查看定時器狀態
SET GLOBAL event_scheduler = 1;  -- 啓動定時器
-- SET GLOBAL event_scheduler = 0;  -- 停止定時器

調用存儲過程
每個月的一號凌晨1 點執行

DROP EVENT IF EXISTS log_event;
CREATE EVENT IF NOT EXISTS log_event 
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR)
ON COMPLETION PRESERVE 
DO CALL createLog_pro;

附錄:mysql定時器的設置http://blog.sina.com.cn/s/blog_6d39ac7e01017sd6.html

1、 INSERT_METHOD = LAST表示插入到UNION表的最後一個表,
2、 .merge數據存儲結構mysql中MyISAM引擎下每一張表都對應三個文件: .MYD數據文件,.MYI索引文件,.frm表結構文件.但是Merge引擎下每一張表只有一個.MRG文件.MRG裏面存放着分表的關係,以及插入數據的方式。它就像是一個外殼,或者是連接池,
3、數據存放在分表裏面.
4、.CRUD對於增刪改查,直接操作總表t就可以了。
5、。MERGE表只對建表之後的操作負責
6、不能直接刪除一個分表,這樣會破壞merge表。正確的方法是: alter table t ENGINE = MRG_MyISAM UNION = (t1) INSERT_METHOD = LAST;
drop table t1
7.誤刪merge總表,是不會造成數據丟失的,只需重新創建總表
Unable to open underlying table which is differently defined or of non-MyISAM type or doesn’t exist這個錯誤不知道爲什麼經常發生,我做的結果就是每次把所有建立的表都刪完,重新執行上面的指令。當然表結構一定要一直。存儲過程和事件要寫對。

發佈了91 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章