1. 程式人生 > >2.ORACLE分割槽表遷移MySQL分割槽表

2.ORACLE分割槽表遷移MySQL分割槽表

介紹

由於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 ;