一、 在開發流程中,我們會部署多環境,其中數據庫結構及數據同步是非常重要的一環,為了便於項目復盤,我們往往會保留數據庫一段時間,比如類似這樣的方式:db_20200210,db_20200220,db_20200229,db_xxxxxxxx,但MySql是不支持直接修改數據庫名稱的,我們在從阿里雲的RDS生產環境同步到仿真環境就遇到這個問題,每次都是直接這樣命名,但項目的配置文件配置的數據庫名稱是db,避免不了要改配置文件,就是用分布式配置,也是多了一個環節,人為的操作是不能保證不出錯誤的,所有就有了這個腳本來完成這個過程。
二、 腳本主要完成的功能:
1、數據表遷移,
2、是否刪除原來數據庫(因為RDS做DTS遷移是不能存在相同數據庫名稱的,所有加了這個功能)
三、 腳本的使用:
1、 source:源數據庫名稱
2、 target:目標數據庫名稱
3、 是否刪除源數據庫
四、 腳本運行
1、在客戶端運行
1 CREATE DEFINER=`root`@`%` PROCEDURE `move_tables`( IN `source` VARCHAR ( 20 ), IN `target` VARCHAR ( 20 ), IN `is_delete_database` TINYINT ) 2 3 BEGIN 4 5 DECLARE 6 7 v_index INT UNSIGNED DEFAULT 0; 8 9 DECLARE 10 11 v_table_name VARCHAR ( 50 ); 12 13 CREATE TEMPORARY TABLE table_list ( 14 15 id INT auto_increment, 16 17 table_name VARCHAR ( 50 ), 18 19 KEY ( id )); 20 21 INSERT INTO table_list ( table_name ) SELECT 22 23 table_name 24 25 FROM 26 27 information_schema.`TABLES` 28 29 WHERE 30 31 TABLE_SCHEMA = source; 32 33 SELECT 34 35 count( 1 ) INTO v_index 36 37 FROM 38 39 table_list; 40 41 LOOP_LABEL : 42 43 LOOP 44 45 SELECT 46 47 table_name INTO v_table_name 48 49 FROM 50 51 table_list 52 53 WHERE 54 55 id = v_index; 56 57 SET @strsql = concat( 'RENAME TABLE ', source, '.', v_table_name, ' to ', target, '.', v_table_name ); 58 59 PREPARE dysql 60 61 FROM 62 63 @strsql; 64 65 EXECUTE dysql; 66 67 DEALLOCATE PREPARE dysql; 68 69 SET v_index = v_index - 1; 70 71 IF 72 73 v_index < 1 THEN 74 75 LEAVE LOOP_LABEL; 76 77 END IF; 78 79 END LOOP; 80 81 DROP TABLE table_list; 82 83 IF 84 85 is_delete_database = 1 THEN 86 87 SET @strdropsql = concat( 'DROP DATABASE ', source ); 88 89 PREPARE dysql 90 91 FROM 92 93 @strdropsql; 94 95 EXECUTE dysql; 96 97 DEALLOCATE PREPARE dysql; 98 99 END IF; 100 101 END
2、調用
call move_tables('db,'db_20200222',0);
顯示結果如下:
這樣數據庫db就同步到了db_20200222,如果想直接刪除db數據庫,可以設置 is_delete_database為1即可,這樣就變通的把數據庫名稱有db改成了db_20200222,接下來你想做什么,就根據業務需求繼續吧。
腳本下載
鏈接:https://pan.baidu.com/s/1D3q0iBc56W6JSmPgHwmoSQ
提取碼:dljv