批量迁移数据

用存储过程,将总表中的数据按照一定规则迁移到新的分表中。

USE tobresume;

DROP PROCEDURE IF EXISTS Dist_talent;

DELIMITER $$

CREATE PROCEDURE Dist_talent()

BEGIN

DECLARE db_name VARCHAR(20);
DECLARE table_name VARCHAR(20);
DECLARE table_pro CHAR(18);
DECLARE sql_text VARCHAR(3000);
DECLARE i INT;
DECLARE j VARCHAR(20);

SET db_name='tobresume';
SET table_name='';
SET table_pro = '_talent_dir_resume';
SET sql_text='';
SET i=0;
SET j='';

WHILE i<=128 DO
IF i<10 THEN
SET j=CONCAT('0',i);
ELSE
SET j=LPAD(LCASE(HEX(i)),2,'0');
END IF;

SET table_name=CONCAT(j,table_pro);
      
SET sql_text=CONCAT('INSERT INTO ', db_name, '.', table_name, '(uid,top_id,dir_id,parent_id,resume_id,is_deleted,created,updated) ', 'SELECT uid,top_id,dir_id,parent_id,resume_id,is_deleted,created,updated FROM talent_dir_resume WHERE lower(lpad(conv(floor(conv(left(md5(top_id),2),16,10)/2),10,16),2,\'0\'))=\'', j, '\';');

SELECT sql_text;
SET @sql_text=sql_text;
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET i=i+1;
END WHILE;

END$$

DELIMITER ;

call Dist_talent();

结果:

+-----------------------------------------------------------------------------------------+
| sql_text                                                                                                                                                                                                                                                                                        |
+--------------------------------------------------------------------------------------------------+
| INSERT INTO tobresume.80_talent_dir_resume(uid,top_id,dir_id,parent_id,resume_id,is_deleted,created,updated) SELECT uid,top_id,dir_id,parent_id,resume_id,is_deleted,created,updated FROM talent_dir_resume WHERE lower(lpad(conv(floor(conv(left(md5(top_id),2),16,10)/2),10,16),2,'0'))='80'; |
+-----------------------------------------------------------------------------------------+
1 row in set (1.33 sec)

Query OK, 0 rows affected (1.34 sec)

mysql> select count(1) from 21_talent_dir_resume;
+----------+
| count(1) |
+----------+
|      966 |
+----------+
1 row in set (0.00 sec)

注意: 使用存储过程要注意主从分离的情况。

猜你喜欢

转载自my.oschina.net/u/3412738/blog/1797169