有分區的表與沒有分區的表使用上沒有太大的區別,但如果要對表進行重新分區,刪除分區重建會刪除數據,因此不可直接進行操作,需要使用一些特別的處理實現。
mysql重建表分區并保留數據的方法:1.創建與原始表一樣結構的新表,新分區。
2.將原始表中數據復制到新表。
3.刪除原始表。
4.將新表名稱改為原始表名稱。
日志表原始結構如下,按id分區。
CREATE DATABASE `test`;use `test`;CREATE TABLE `log` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `content` text NOT NULL COMMENT 內容 , `status` tinyint(3) unsigned NOT NULL COMMENT 記錄狀態 , `addtime` int(11) unsigned NOT NULL COMMENT 添加時間 , `lastmodify` int(11) unsigned NOT NULL COMMENT 最后修改時間 , PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8/*!50100 PARTITION BY RANGE (id)(PARTITION p10w VALUES LESS THAN (100000) ENGINE = InnoDB,PARTITION p20w VALUES LESS THAN (200000) ENGINE = InnoDB,PARTITION p50w VALUES LESS THAN (500000) ENGINE = InnoDB,PARTITION p100w VALUES LESS THAN (1000000) ENGINE = InnoDB,PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;insert into `log`(content,status,addtime,lastmodify) html' target='_blank'>values( content1 ,1, unix_timestamp( 2018-01-11 00:00:00 ), unix_timestamp( 2018-01-11 00:00:00 )),( content2 ,1, unix_timestamp( 2018-02-22 00:00:00 ), unix_timestamp( 2018-02-22 00:00:00 )),( content3 ,1, unix_timestamp( 2018-03-31 00:00:00 ), unix_timestamp( 2018-03-31 00:00:00
查看數據分區分布
SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA= test AND TABLE_NAME = log +----------------+------------+| PARTITION_NAME | TABLE_ROWS |+----------------+------------+| p10w | 3 || p20w | 0 || p50w | 0 || p100w | 0 || pmax | 0 |+----------------+------------+
日志數據需要按時間進行搜尋,因此需要按日志時間重建分區。
1.創建log2,按時間分區(每月1個分區)
CREATE TABLE `log2` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `content` text NOT NULL COMMENT 內容 , `status` tinyint(3) unsigned NOT NULL COMMENT 記錄狀態 , `addtime` int(11) unsigned NOT NULL COMMENT 添加時間 , `lastmodify` int(11) unsigned NOT NULL COMMENT 最后修改時間 , PRIMARY KEY (`id`,`addtime`), KEY `id`(`id`), KEY `addtime`(`addtime`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8/*!50100 PARTITION BY RANGE (addtime)(PARTITION p201801 VALUES LESS THAN (unix_timestamp( 2018-02-01 00:00:00 )) ENGINE = InnoDB,PARTITION p201802 VALUES LESS THAN (unix_timestamp( 2018-03-01 00:00:00 )) ENGINE = InnoDB,PARTITION p201803 VALUES LESS THAN (unix_timestamp( 2018-04-01 00:00:00 )) ENGINE = InnoDB,PARTITION p201804 VALUES LESS THAN (unix_timestamp( 2018-05-01 00:00:00 )) ENGINE = InnoDB,PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;
2.將log的數據復制到log2
insert into `log2` select * from `log`;
3.刪除log表
drop table `log`;
4.將log2表改名為log
rename table `log2` to `log`;
執行后查看數據分區分布
SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA= test AND TABLE_NAME = log +----------------+------------+| PARTITION_NAME | TABLE_ROWS |+----------------+------------+| p201801 | 1 || p201802 | 1 || p201803 | 1 || p201804 | 0 || pmax | 0 |+----------------+------------+
可以看到log表的數據已經按新分區存儲。
本文介紹mysql重建表分區并保留數據的方法,更多相關內容請關注php 。
相關推薦:
php json_encode不支持對象私有屬性的解決方法
PHP生成唯一RequestID類的相關內容
js 基礎 數據類型及轉換 進制 操作符
以上就是介紹mysql重建表分區并保留數據的方法的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答