From dacd644cf99321bd7aece7615d0d86b4450581ec Mon Sep 17 00:00:00 2001 From: Kirill Solomko Date: Wed, 22 Nov 2017 19:14:05 +0100 Subject: [PATCH] TT#21874 autoprov_firmwares rework to support chunked data move * created a stored procedure that moves the firmwwares data into a new table as chunked blocks, that resolves the innodb_log_file_size and max_allowe_packet limitations enabling any size of data Change-Id: I52ffcc5e0dad4ce35e70cdb13192de1eb54b909c --- db_scripts/diff/15301.up | 45 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/db_scripts/diff/15301.up b/db_scripts/diff/15301.up index 7bcbbcfa..85bb89a7 100644 --- a/db_scripts/diff/15301.up +++ b/db_scripts/diff/15301.up @@ -1,4 +1,5 @@ USE provisioning; +SET autocommit=0; CREATE TABLE `autoprov_firmwares_data` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, @@ -9,6 +10,48 @@ CREATE TABLE `autoprov_firmwares_data` ( CONSTRAINT `fk_fw_idx` FOREIGN KEY (`fw_id`) REFERENCES `autoprov_firmwares` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; -INSERT INTO autoprov_firmwares_data (fw_id, data) SELECT id, data FROM autoprov_firmwares; +DELIMITER ;; +CREATE PROCEDURE split_autoprov_firmware_data() +BEGIN + + DECLARE n_fw_id, chunk_size, offset int; + DECLARE chunk longblob; + DECLARE done int DEFAULT FALSE; + + DECLARE x CURSOR FOR SELECT id FROM autoprov_firmwares ORDER BY id ASC; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + SET chunk_size = 10485760; + SET offset = 1; + + OPEN x; + x_main: LOOP + FETCH x INTO n_fw_id; + IF done THEN + LEAVE x_main; + END IF; + SET offset = 1; + x_chunk: LOOP + SELECT substr(data, offset, chunk_size) INTO chunk + FROM autoprov_firmwares + WHERE id = n_fw_id; + IF LENGTH(chunk) > 0 THEN + INSERT INTO autoprov_firmwares_data (fw_id, data) + VALUES (n_fw_id, chunk); + SET offset = offset+chunk_size; + ELSE + LEAVE x_chunk; + END IF; + END LOOP; + END LOOP; + CLOSE x; + +END;; +DELIMITER ; + +CALL split_autoprov_firmware_data; +DROP PROCEDURE split_autoprov_firmware_data; ALTER TABLE autoprov_firmwares DROP data; + +COMMIT;