暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

干货:MySQL如何更改数据库名字?

343

【此为"一森咖记"公众号——第34篇文章】

【前言】

来了一需求,开发组前项目前期开发时创建了一个测试库,存储引擎使用的是innodb;此库DataBase/Schema存放了一些表和索引,并无存储过程、视图、触发器、函数等;因名字和生产库名称类似,太敏感,需要改下名字。此需求咋个搞?

 

如要修改DataBase/Schema 的名称为ethanDB,需改名为ts_db_01


先简单了解下Mysql的几种常用对象:

1. DataBase/Schema

2. Table

3. Index

4. View/Trigger/Function/Procedure

 

操作步骤

如果库使用的是MyISAM存储引擎,那么可以直接去到数据库目录mv就可以;步骤如下:

MYISAM引擎把库名字对应的文件夹名更改:

1. 关闭mysqld

2. data目录中的db_name目录重命名为new_db_name

3. 打开mysqld

 

但生产环境使用的存储引擎为Innodb,做过测试的朋友可以试试,会提示相关表不存在。


Innodb存储引擎的DataBase/Schema,大概有如下三种方法:

 

方法1:RENAME database olddbname TO newdbname

mysql> rename database ethandb to ts_db_02;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database ethandb to ethan' at line 1

 

注意:此非异常,原因该命令是5.1.7到5.1.23版本可用,5.1.23后被取消。因为我处版本为5.7.26,所以该命令不适用。

    mysql> select @@version;
    +-------------------------------------------+
    | @@version |
    +-------------------------------------------+
    | 5.7.26-enterprise-commercial-advanced-log |
    +-------------------------------------------+
    1 row in set (0.00 sec)
    复制

     

    方法2:使用Mysqldump逻辑备份的方式

    此方法当然可行,简单有效;但是如果碰到比较大的表,则耗时比较长。

     

    方法3:自己编写shell脚本

    INNODB引擎分为下面几个步骤:

    1. 创建新库

    2. 备份原有库中所有表上的触发器

    3. 使用navicat备份库index/View/Function/Procedure/Events脚本

    4. 使用rename table命令将表从原数据库复制到新数据库

    5. 在新数据库上重新创建2中被删除的触发器

    6. 在新数据库上重新创建index/View/Function/Procedure/Events

     

    因本文只涉及表和索引,故

    RENAME TABLE命令语法:

    RENAME TABLE db_name.table1 TO new_db_name.table1,                     db_name.table2 TO new_db_name.table2;

     

    根据上述命令,编写脚本cp_db_tables.sh如下:

      mysql -uroot -pmysql -h 192.168.0.112 -P 3308 -e \
      'create database if not exists ts_db_01'
      list_table=$(mysql -uroot -pmysql -h 192.168.0.112 -P 3308 \
      -Nse "select table_name from information_schema.TABLES \
      where TABLE_SCHEMA='ethandb'")

      for table in $list_table
      do
      mysql -uroot -pmysql -h 192.168.0.112 -P 3308 \
      -e "rename table ethandb.$table to ts_db_01.$table"
      done
      复制


      该脚本已经上传至个人github上,感兴趣的朋友可以查看如下链接:

      https://github.com/polestarYang/mysqlgit/blob/master/cp_db_tables.sh

       

      【总结】

      1. 本文使用脚本方式可快速创建一个新库的案例,可以快速的创建一个新的库,但只创建了源库相关的表,trigger/index/View/Function/Procedure/Events还需要重新创建;但不是为一种快速创建测试库的方法。

      2. 如果是迁移数据库,建议还是使用逻辑备Mysqldump, 或者mysqlbackup物理备份形式。

        

      【参考】

      https://blog.csdn.net/ghlfllz/article/details/8092068


      如有帮助,请欢迎关注个人微信公众号;

      长按以下二维码或公众号搜索“一森咖记”

      往期精彩文章

      =====================================

      1. MySQL:主从同步延迟Seconds_Behind_Master越来越大,什么鬼?

      2. 浅谈MySQL三种锁:全局锁、表锁和行锁

      3. LINUX环境:MySQL和Oracle开机自启动,咋搞?

      4. 生产环境:mysqlbackup逻辑备份的一种shell脚本实现

      5. 生产环境:mysqlbackup物理备份的一种shell脚本实现

      6. MySql 8.0.16 客户端连接失败

      7. Oracle如何访问MySql:透明网关

      8. 一款好的数据库监控工具:天兔数据库监控系统V3.8搭建

      9. MySQL主从架构搭建+GTID同步方式部署

      10. 用户:单台服务器部署多MySQL实例,咋弄?


      文章转载自戏说数据那点事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论