2.ORACLE分割槽表遷移MySQL分割槽表
阿新 • • 發佈:2018-11-02
介紹
由於MySQL沒有類似於ORACLE間隔分割槽類似的功能,所以遷移分割槽表的時候工作量較大,下面就把常用到的一些工具指令碼及操作過程列在下面。
操作
1 修改分割槽表定義
ORACLE增加了間隔分割槽功能,可以在資料插入的時候自動新增分割槽,但是MySQL就不具備這個功能,因為是資料遷移,所以需要提前將ORACLE的表分割槽在MySQL表中進行建立,為了實現這部分功能我採用以下幾步過程。
1.1 建立MySQL分割槽表
RANGE分割槽表結構如下,採用了ORACLE間隔分割槽技術的表定義:
create table TEST1 ( userid VARCHAR2(2000), time DATE, deptid VARCHAR2(3000), state VARCHAR2(100), updatetime DATE, deptjson VARCHAR2(4000) )PARTITION BY RANGE(time) INTERVAL(NUMTODSINTERVAL(7,'DAY')) STORE IN (TEST1) (PARTITION TEST1 VALUES LESS THAN (TO_DATE('2014-11-20','YYYY-MM-DD'))TABLESPACE TEST1);
軟後修改表定義為MySQL版本
CREATE TABLE TEST1 ( userid VARCHAR(2000), time DATE, deptid VARCHAR(3000), state VARCHAR(100), updatetime DATE, deptjson VARCHAR(4000) ) PARTITION BY RANGE COLUMNS(time) ( PARTITION part20141120 VALUES LESS THAN ('2014-11-20'), PARTITION pmax VALUES LESS THAN (MAXVALUE) # 這個分割槽必須有,用於新增分割槽 )
1.2 建立新增分割槽指令碼
DELIMITER ;; USE `atdatabase`;; DROP PROCEDURE IF EXISTS `add_all_partitions`;; CREATE PROCEDURE add_all_partitions ( IN tablename VARCHAR(20), IN begintime VARCHAR(20), IN endtime VARCHAR(20), IN intervalday INT ) BEGIN WHILE str_to_date(@begintime, '%Y%m%d') <= str_to_date(@endtime, '%Y%m%d') DO SET @date_begintime = str_to_date(@begintime, '%Y%m%d%'); SET @s1 = CONCAT('ALTER TABLE ', @tablename, ' REORGANIZE PARTITION pmax INTO (PARTITION part', @begintime, ' VALUES LESS THAN (''', DATE(@date_begintime), '''),PARTITION pmax VALUES LESS THAN(MAXVALUE))'); SELECT @s1; PREPARE stmt FROM @s1; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @begintime = DATE_FORMAT(DATE_ADD(@date_begintime, INTERVAL intervalday DAY), '%Y%m%d'); END WHILE; END;; DELIMITER ;;
測試程式碼
SET @tablename='test1';
SET @begintime=20180802;
SET @endtime=20180902;
SET @intervalday=7;
CALL add_all_partitions(@tablename,@begintime,@endtime,@intervalday);
1.3 編寫定時新增分割槽指令碼
DELIMITER $$
USE `atdatabase`$$
DROP PROCEDURE IF EXISTS `add_partition`$$
CREATE PROCEDURE `add_partition` (
IN tablename VARCHAR(20),
IN intervalday INT
)
BEGIN
/* 到系統表查出這個表的最大分割槽,得到最大分割槽的日期。在建立分割槽的時候,名稱就以日期格式存放,方便後面維護 */
SELECT REPLACE(partition_name, 'part', '')
INTO @P12_Name
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE table_name = @tablename
AND partition_name != 'pmax'
ORDER BY partition_ordinal_position DESC
LIMIT 1;
SET @Max_date = DATE(DATE_ADD(@P12_Name + 0, INTERVAL intervalday DAY)) + 0;
SET @s1 = CONCAT('ALTER TABLE ', @tablename, ' REORGANIZE PARTITION pmax INTO (PARTITION part', @Max_date, ' VALUES LESS THAN (''', DATE(@Max_date), '''),PARTITION pmax VALUES LESS THAN(MAXVALUE))');
/* 輸出檢視增加分割槽語句*/
SELECT @s1;
PREPARE stmt FROM @s1;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
測試程式碼
SET @tablename='test1';
SET @intervalday=7;
CALL add_partition(@tablename,@intervalday);
1.4 新增定時器
DELIMITER ;;
CREATE EVENT partition_event
ON SCHEDULE
EVERY 7 day STARTS '2018-10-26 23:59:59'
DO
BEGIN
CALL add_partition;
END ;;
DELIMITER ;