批量转移MySql数据表及附带脚本

一、 在开发流程中,我们会部署多环境,其中数据库结构及数据同步是非常重要的一环,为了便于项目复盘,我们往往会保留数据库一段时间,比如类似这样的方式: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

posted @   架构师聊技术  阅读(2591)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
历史上的今天:
2019-02-22 一键清理 Nexus 中无用的 Docker 镜像
点击右上角即可分享
微信分享提示