zoukankan      html  css  js  c++  java
  • MySQL 库名重命名

    MySQL ( RENAME database olddbname TO newdbname )  对库名的重命名上会出现一些奇怪的错误。有丢失数据的风险。

    所以如何去重命名呢:

    1 用mysqldump出原来库数据再导入到新的库。这当然是笨拙的方法

    2 使用rename table  olddbname.tablename to newdbname.tablename 的方法来重命名库(更改完表明之后把久的库删掉)。可以安全快速的重命名库。

    注意:Mysql 的rename table 对于分区表数据存在与单独表空间且表空间不为默认目录。即把分区放在的别的目录下。这时候rename是不成功的。

    下面是  重新rename库的一个存储过程。方便大家使用:

    delimiter //
    set session sql_log_bin=OFF//
    DROP PROCEDURE IF EXISTS renamedb //
    use mysql //
    CREATE  DEFINER=`root`@`localhost`  PROCEDURE `renamedb`(SCHEMANAME VARCHAR(128), NEW_SCHEMANAME VARCHAR(128),sure int )
    COMMENT '数据库重命名 call  renamedb(dbname,new_dbname,0/1)   0表示提醒如果新的库名已经存在不会把表rename过去,1表示强制  '
    label:BEGIN
    DECLARE Done INT DEFAULT 0;
    DECLARE MY_TABLE_NAME  VARCHAR(128);
    DECLARE OLD_TABLE_NAME VARCHAR(128);
    DECLARE NEW_TABLE_NAME VARCHAR(128);
    
    DECLARE rs CURSOR FOR select TABLE_NAME  from information_schema.tables where table_schema=SCHEMANAME AND table_schema NOT IN('mysql','performance_schema','information_schema','sys');
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;/* 异常处理 */
    
    IF  NOT EXISTS (select SCHEMA_NAME from information_schema.SCHEMATA where SCHEMA_NAME=SCHEMANAME AND SCHEMA_NAME NOT IN('mysql','performance_schema','information_schema','sys')) THEN
    select concat(SCHEMANAME,"库名不存在或为系统库");
    leave label;
    END IF;
    
    IF  EXISTS (select SCHEMA_NAME from information_schema.SCHEMATA where SCHEMA_NAME=NEW_SCHEMANAME ) AND sure<>1 THEN
    select concat(NEW_SCHEMANAME,"库名已存在,强制rename请call(xxx,new_xxx,1)");
    leave label;
    END IF;
    set @crtdb=concat("create database IF NOT EXISTS  ",NEW_SCHEMANAME);
    PREPARE stmtcrtdb FROM  @crtdb;
    EXECUTE stmtcrtdb;
    OPEN rs;
    FETCH NEXT FROM rs INTO MY_TABLE_NAME;
    REPEAT
    IF NOT Done THEN
    select concat(SCHEMANAME,".",MY_TABLE_NAME) into OLD_TABLE_NAME;
    select concat(NEW_SCHEMANAME,".",MY_TABLE_NAME) into NEW_TABLE_NAME;
    set @rename_table=concat("rename table ",OLD_TABLE_NAME," to ",NEW_TABLE_NAME);
    select concat(@rename_table,";");
    PREPARE stmtrename_table FROM @rename_table;
    EXECUTE stmtrename_table;
    END IF;
    FETCH NEXT FROM rs INTO MY_TABLE_NAME;
    UNTIL Done END REPEAT;
    CLOSE rs;
    set @oldtable=concat('show tables from ',SCHEMANAME);
    set @newtable=concat('show tables from ',NEW_SCHEMANAME);
    PREPARE stmtoldtable FROM @oldtable;
    EXECUTE stmtoldtable;
    PREPARE stmtnewtable FROM @newtable;
    EXECUTE stmtnewtable;
    END //
    delimiter ;
    
  • 相关阅读:
    IoC~MVC3+EF+Autofac实现松耦合的系统架构
    IoC~高效的Autofac
    Autofac 依赖注入框架 使用
    C# socket编程实践——支持广播的简单socket服务器
    简单理解Socket
    利用html 5 websocket做个山寨版web聊天室(手写C#服务器)
    c# 实现WebSocket
    oracle中clob字段的使用
    查找程序加载的动态库的路径
    wordpress在window下完美实现301重定向的方法
  • 原文地址:https://www.cnblogs.com/vansky/p/8998788.html
Copyright © 2011-2022 走看看