1. 程式人生 > >MySQL修改表結構

MySQL修改表結構

engine win into 不成功 被占用 ima roo 雲上 add

分區表

? 環境說明:

公司生產庫中,有一張大表,占用了很大一部分空間,大小約240G左右,現在的策略是,每隔一段時間刪除一些表中的數據,但是由於mysql innoDB引擎的優化機制,刪除數據後還有優化表的操作非常麻煩,所以改為分區表,按照時間來存儲數據,以後在進行刪除的時候直接刪除分區即可

第1章 分區準備:

1.1 查看舊表的建表語句:

show create table `t_interface_questionnaire`;

CREATE TABLE `t_interface_questionnaire` (
`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',

`questionnaire` mediumtext,
`hosp_code` varchar(50) DEFAULT NULL,
`hug_id` varchar(32) DEFAULT NULL,
`send_time` bigint(19) DEFAULT NULL,
`questionnaire_id` varchar(32) DEFAULT NULL,
`begincontent` mediumtext COMMENT '內容頭文字',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1.2 說明:

? 目前已經在測試環境安裝好了測試庫.5.6版本

? 備份已經找到了,xtrabackup的物理備份

? 生產庫是阿裏雲RDS,mysql 5.6

第2章 分區計劃實施步驟

2.1 實施步驟一: 搭建測試庫

1. 在測試庫中使用舊的建表語句,刪除表空間,將物理備份的表空間導入測試庫

2. 18年後的數據用mysqldump導出,然後刪除數據庫

3. 使用分區表建表語句,創建新表

4. 18年後的數據導入,mysqldump導出數據,留存

5. 刪除生產庫中的大表

6. 使用分區表建表語句,導入數據

2.2 實施步驟二: 在線修改表結構

1. 刪除t表的id主鍵

alter table t_interface_questionnaire drop primary key;

mysql> desc t_interface_questionnaire;

+------------------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+------------------+-------------+------+-----+---------+-------+

| id | varchar(32) | NO | | | |

| questionnaire | mediumtext | YES | | NULL | |

| hosp_code | varchar(50) | YES | | NULL | |

| hug_id | varchar(32) | YES | | NULL | |

| send_time | bigint(19) | YES | | NULL | |

| questionnaire_id | varchar(32) | YES | | NULL | |

| begincontent | mediumtext | YES | | NULL | |

+------------------+-------------+------+-----+---------+-------+

2. 添加主鍵,添加send_time字段為主鍵,因為分區需要

alter table t_interface_questionnaire add primary key(send_time);

3. 修改表結構,添加以時間為基準的分區

mysql> alter table t_interface_questionnaire PARTITION BY RANGE (send_time) (

-> partition p0 values less than(1514736000000),

-> partition p1 values less than(1517414400000),

-> partition p2 values less than(1519833600000),

-> partition p3 values less than(1522512000000),

-> partition p4 values less than(1525104000000),

-> partition p5 values less than(1527782400000),

-> partition p6 values less than(1530374400000),

-> partition p7 values less than(1533052800000),

-> partition p8 values less than(1535731200000)

-> );

2.3 實時步驟三: 備份原表

1. 將原表備份,名為t_interface_questionnaire_bak

rename t_interface_questionnaire to t_interface_questionnaire_yang;

2. 創建分區表,名字為t_interface_questionnaire,分區表語句在下面

3. 將備份表的數據在線導入新表中

insert into t_interface_questionnaire select * from t_interface_questionnaire_bak;

時間長短無法預算,需要向阿裏申請下增加臨時空間

? :

這裏與到的問題就是我在測試庫中在線導入一點問題沒有,但是在阿裏雲上進行在線導入的時候,不成功,空間會被占用,但是數據查不到,破片率也很大,過一段時間,空間還會恢復,在線試了兩次,都沒有成功,最後是在備份庫中導出sql語句,然後導入到新表中

2.4 分區表語句:

CREATE TABLE `t_interface_questionnaire` (
`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`questionnaire` mediumtext,
`hosp_code` varchar(50) DEFAULT NULL,
`hug_id` varchar(32) DEFAULT NULL,
`send_time` bigint(19) DEFAULT NULL,
`questionnaire_id` varchar(32) DEFAULT NULL,
`begincontent` mediumtext COMMENT '內容頭文字',
PRIMARY KEY (`id`,`send_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

PARTITION BY RANGE (send_time) (

partition p0 values less than(1514736000000),

partition p1 values less than(1517414400000),

partition p2 values less than(1519833600000),

partition p3 values less than(1522512000000),

partition p4 values less than(1525104000000),

partition p5 values less than(1527782400000),

partition p6 values less than(1530374400000),

partition p7 values less than(1533052800000),

partition p8 values less than(1535731200000)

);

第3章 分區表基本操作

刪除分區:

alter table t_interface_questionnaire drop PARTITION p0;

添加分區:

alter table t_interface_questionnaire add PARTITION (PARTITION p0 VALUES LESS THAN (1533052800000));

數據備份:

mysqldump -uroot -t --triggers -w 'send_time > 1514736000000' lanniu t_interface_questionnaire >/tmp/jiang.sql

利用mysqldump2018年後的數據導出,等生產庫中表結構創建好以後,導入數據


MySQL修改表結構