MySQL線上轉分割槽表(以及TiDB)

xuexiaogang發表於2022-07-11

     上週我們做了Oracle的線上將非分割槽錶轉換成分割槽表。這做幾個其他資料庫的。

建立一個表,模擬

     上週講了Oracle的線上非分割槽變成分割槽,今天講講其他的。 首先是MySQL的,建立一個簡單的表,模擬寫入一點資料。

MySQL線上轉分割槽表(以及TiDB)

實驗步驟如下:

mysql> CREATE TABLE t1 (id int NOT NULL AUTO_INCREMENT, a int, t datetime NOT NULL, PRIMARY KEY (id) );

Query OK, 0 rows affected (0.29 sec)

 

mysql> insert into t1 (a,t) values (1,'2022-01-01');

Query OK, 1 row affected (0.06 sec)

 

mysql> insert into t1 (a,t) values (2,'2022-02-01');

Query OK, 1 row affected (0.09 sec)

 

mysql> insert into t1 (a,t) values (4,'2022-03-01');

Query OK, 1 row affected (0.03 sec)

 

mysql> insert into t1 (a,t) values (3,'2022-04-01');

Query OK, 1 row affected (0.02 sec)

 

mysql> insert into t1 (a,t) values (5,'2022-05-01');

Query OK, 1 row affected (0.00 sec)

 

mysql> insert into t1 (a,t) values (6,'2022-06-01');

Query OK, 1 row affected (0.00 sec)

 

mysql> insert into t1 (a,t) values (7,'2022-07-01');

Query OK, 1 row affected (0.00 sec)

 

查詢一下資料,普通的表。順便看一下表結構。

MySQL線上轉分割槽表(以及TiDB)

如果要把非分割槽錶轉換成分割槽表,最主要的是分割槽鍵,而MySQL的時間範圍分割槽鍵不能僅僅是時間,一定要主鍵+時間構成新的主鍵。

所以面臨的是要刪除主鍵和新建主鍵。

MySQL線上轉分割槽表(以及TiDB)

ALTER TABLE t1  DROP PRIMARY KEY, ADD PRIMARY KEY(id,t); 這句看上去簡單,但是如果表大的話,實際上實施起來有困難的,如果很大的表幾乎不現實。我的意思是停機做都有難度,更別說線上做了。

MySQL線上轉分割槽表(以及TiDB)


alter table t1 partition by range(to_days(t))

    -> (

    ->  PARTITION p1 VALUES LESS THAN (to_days('2022-02-01')),

    ->  PARTITION p2 VALUES LESS THAN (to_days('2022-03-01')),

    ->  PARTITION p3 VALUES LESS THAN (to_days('2022-04-01')),

    ->  PARTITION p4 VALUES LESS THAN (to_days('2022-05-01')),

    ->  PARTITION p5 VALUES LESS THAN (to_days('2022-06-01')),

    ->  PARTITION p6 VALUES LESS THAN (to_days('2022-07-01')),

    ->  PARTITION p7 VALUES LESS THAN (to_days('2022-08-01'))

-> );

 執行這個命令以後,可以看到查詢表還是一樣的方法。分割槽是對應用透明的。


MySQL線上轉分割槽表(以及TiDB)


但是如果我截斷分割槽以後,分割槽的資料就被刪除了。同樣磁碟空間也馬上釋放。由於DDL很快,所以也不存在鎖。最大的問題是在表很大時候,從非分割槽變成分割槽,很痛苦。這點上不得不說還是Oracle最省心了。 不過MySQL截斷分割槽倒是省心,沒有Oracle的update index的那個小引數。


既然TiDB相容MySQL看看TiDB怎麼做。用MySQL的方法做一遍,報錯。不能執行。

MySQL線上轉分割槽表(以及TiDB)

MySQL線上轉分割槽表(以及TiDB)

查了資料沒結果,最後問了原廠,目前看來是不能做的。即設計好了就這樣,不要動。設計很重要啊。下一篇我們講講PG的。

MySQL線上轉分割槽表(以及TiDB)



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2905214/,如需轉載,請註明出處,否則將追究法律責任。

相關文章