MySQL数据库改名的详细方法教程

目录
  • 前戏
  • 被取消的命令
  • mysqldump 导入导出
  • 改整库的表名
  • 古老的方案
  • 总结

前戏

有时候生产环境是以项目来命名,有时候会出现更名情况,其实如何安全的更改数据库名,是个非常棘手的问题,特别是针对 MySQL 来数据库来说

被取消的命令

MySQL 之前提供了一个 rename database db_old to db_new 的命令来直接对数据库改名,可能由于实现的功能不完备(比如,这条命令可能是一个超大的事务,或者是由于之前的表很多还是 MyISAM 等),后来 的版本直接取消了这条命令。

更改数据库名大致上有以下几种方案:

mysqldump 导入导出

要说最简单的方法,就是直接用 mysqldump 工具,在旧库导出再往新库导入(最原始、最慢、最容易想到)的方法:

旧库 yttdb_old 导出(包含的对象:表、视图、触发器、事件、存储过程、存储函数)time mysqldump --login-path=root_ytt --set-gtidpurged=off --single-transaction --routines --events yttdb_old > /tmp/yttdb_old.sqlreal 2m24.388suser 0m5.422ssys 0m1.120s新库 yttdb_new 导入time mysql --login-path=root_ytt -D yttdb_new < /tmp/yttdb_old.sqlreal 12m27.324suser 0m3.778ssys 0m0.947s

改整库的表名

利用 MySQL 更改表名的方法来批量把旧库的所有表依次遍历,改名为新库的表。

这种方法比第一种要快很多倍,但是没有第一步操作起来那么顺滑,不能一步到位。比如,要把数据库 yttdb_old 改名为 yttdb_new,如果数据库 yttdb_old 里只有磁盘表,那很简单,直接改名即可

alter table yttdb_old.t1 to yttdb_new.t1;

或者写个脚本来批量改,非常简单。但是一般旧库里不只有磁盘表,还包含其他各种对象。这时候可以先考虑把旧库的各种对象导出来,完了在逐一改完表名后导进去。

导出旧库 yttdb_old 下除了磁盘表的其他所有对象(存储函数、存储过程、触发器、事件)

time mysqldump --login-path=root_ytt -t -d -n --setgtid-purged=off --triggers --routines --events yttdb_old > /tmp/yttdb_old_other_object.sqlreal 1m41.901suser 0m1.166ssys 0m0.606s

视图在 MySQL 里被看作是表,因此得先查找出视图名字,再单独导出:

view_list=`mysql --login-path=root_ytt -e "SELECT table_name FROM information_schema.views WHERE table_schema='yttdb_old';" -s | tr '\n' ' '`time mysqldump --login-path=root_ytt --set-gtid-purged=off -- triggers=false yttdb_old $view_list > /tmp/yttdb_old_view_lists.sqlreal 0m0.123suser 0m0.007ssys 0m0.007s

那这些额外的对象成功导出来后,就可以在旧库里删除他们了。当然了,做这些操作之前,建议把旧库的

所有对象,包括表,都备份出来,备份方式很多,这里就不细讲了。 现在我们来依次删除这些对象:(其实除了触发器和视图外,其他的对象也可以不用删除,不过为了让改 名完后旧库清空,就必须得先删掉它们)。

为了清晰期间,我这里每种对象单独删除,也可以直接一次性全部删除。

批量删除存储函数

func_lists=`mysql --login-path=root_ytt -e "SELECT concat('drop function if exists ',routine_name,';') FROM information_schema.routines WHERE routine_schema = 'yttdb_old' AND routine_type = 1 " -ss time mysql --login-path=root_ytt -e "use yttdb_old;$func_lists" real 0m0.048suser 0m0.005ssys 0m0.005s

批量删除存储过程:

trigger_lists=`mysql --login-path=root_ytt -e "SELECT concat('drop trigger if exists yttdb_old.',trigger_name,';') FROM information_schema.TRIGGERS WHERE trigger_schema='yttdb_old'" -ss`time mysql --login-path=root_ytt -e "use yttdb_old;$trigger_lists"real 0m0.050suser 0m0.008ssys 0m0.003s

批量删除触发器:

trigger_lists=`mysql --login-path=root_ytt -e "SELECT concat('drop trigger if exists yttdb_old.',trigger_name,';') FROM information_schema.TRIGGERS WHERE trigger_schema='yttdb_old'" -ss`time mysql --login-path=root_ytt -e "use yttdb_old;$trigger_lists"real 0m0.050suser 0m0.008ssys 0m0.003s

批量删除视图:

view_lists=`mysql --login-path=root_ytt -e "SELECT concat('drop view if exists ',table_name,';') FROM information_schema.VIEWS WHERE table_schema='yttdb_old'" -ss`time mysql --login-path=root_ytt -e "use yttdb_old;$view_lists"real 0m0.070suser 0m0.006ssys 0m0.005s

批量删除事件:

event_lists=`mysql --login-path=root_ytt -e "SELECT concat('drop event if exists ',event_name,';') FROM information_schema.EVENTS WHERE event_schema='yttdb_old'" -ss` time mysql --login-path=root_ytt -e "use yttdb_old;$event_lists"real 0m0.054suser 0m0.011ssys 0m0.000s

完了后利用 rename table old_table to new_table 语句来批量更改表名到新库:(debian-ytt1:3500)|(yttdb_new)>set group_concat_max_len = 18446744073709551615;Query OK, 0 rows affected (0.00 sec)(debian-ytt1:3500)|(yttdb_new)>SELECT CONCAT('rename table ', GROUP_CONCAT(CONCAT(' yttdb_old.',table_name,' to yttdb_new.',table_name)) ) FROM information_schema.TABLES WHERE table_schema = 'yttdb_old' AND table_type = 1 INTO @rename_lists;Query OK, 1 row affected (0.01 sec)(debian-ytt1:3500)|(yttdb_new)>prepare s1 from @rename_lists;Query OK, 0 rows affected (0.00 sec)Statement prepared(debian-ytt1:3500)|(yttdb_new)>execute s1;Query OK, 0 rows affected (55.41 sec)(debian-ytt1:3500)|(yttdb_new)>drop prepare s1;Query OK, 0 rows affected (00.01 sec)

批量更改表名总共才花费 55.41 秒。接下来再把之前导出的其他对象导入新库 yttdb_new:

time mysql --login-path=root_ytt -D yttdb_new < /tmp/yttdb_old_other_object.sqlreal 0m0.222suser 0m0.081ssys 0m0.000stime mysql --login-path=root_ytt -D yttdb_new < /tmp/yttdb_old_view_lists.sqlreal 0m0.158suser 0m0.013ssys 0m0.000s

接下来进行功能验证,验证表数量、触发器、存储过程、存储函数、事件等数目是不是对的上。

古老的方案

其实在 MySQL 早期还有一种方法。

假设 MySQL 部署好了后,所有的 binlog 都有备份,并且二进制日志格式还是 statement 的话,那就可 以简单搭建一台从机,让它慢慢追主机到新的库名,等确切要更改旧库的时候,再直接晋升从机为主机即 可。 这里只需要从机配置一个参数来把旧库指向为新库: replicate-rewrite-db=yttdb_old->yttdb_new 不过这种局限性很大,不具备标准化,不推荐。

总结

其实针对 MySQL 本身改库名,大致就这么几种方法:

如果数据量小,推荐第一种;数据量大,则推荐第二种;数据量巨大,那就非 MySQL 本身能解决的了。

可通过部署第三方 ETL 工具,通过解析 MySQL 二进制日志或其他的方式来把旧库数据直接读取到新库达到改名的目的等等

到此这篇关于MySQL数据库改名的文章就介绍到这了,更多相关MySQL数据库改名内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 安全快速修改Mysql数据库名的5种方法

    1. RENAME DATABASE db_name TO new_db_name这个..这个语法在mysql 5.1.7中被添加进来,到了5.1.23又去掉了.据说有可能丢失数据.还是不要用的好.详见: http://dev.mysql.com/doc/refman/5.1/en/rename-database.html 2.如果所有表都是MyISAM类型的话,可以改文件夹的名字关闭mysqld把data目录中的db_name目录重命名为new_db_name开启mysqld 3.重命名所有的

  • MySQL 修改数据库名称的一个新奇方法

    MySQL在5.1引入了一个rename database操作,但在MySQL5.1.23后又不支持这个命令.可以说是一个实验性的功能,没有在生产中支持过(mysql-5.1 release在mysql-5.1.30),那么生产中我们有时为了追求完美需要改一下库名.怎么操作呢? 这里提供一个变通的方法. 1. 创建出新库名: 复制代码 代码如下: mysql>create database db_v2; 2.生成rename语句,从olddb里迁移,我这里olddb里sbtest; 复制代码 代

  • mysql事件之修改事件(ALTER EVENT)、禁用事件(DISABLE)、启用事件(ENABLE)、事件重命名及数据库事件迁移操作详解

    本文实例讲述了mysql事件之修改事件(ALTER EVENT).禁用事件(DISABLE).启用事件(ENABLE).事件重命名及数据库事件迁移操作.分享给大家供大家参考,具体如下: 我们要知道,MySQL允许我们更改现有事件的各种属性.如果我们要更改现有事件,可以使用ALTER EVENT语句,如下所示: ALTER EVENT event_name ON SCHEDULE schedule ON COMPLETION [NOT] PRESERVE RENAME TO new_event_n

  • MySQL数据库改名的详细方法教程

    目录 前戏 被取消的命令 mysqldump 导入导出 改整库的表名 古老的方案 总结 前戏 有时候生产环境是以项目来命名,有时候会出现更名情况,其实如何安全的更改数据库名,是个非常棘手的问题,特别是针对 MySQL 来数据库来说 被取消的命令 MySQL 之前提供了一个 rename database db_old to db_new 的命令来直接对数据库改名,可能由于实现的功能不完备(比如,这条命令可能是一个超大的事务,或者是由于之前的表很多还是 MyISAM 等),后来 的版本直接取消了这

  • SPSS连接mysql数据库的超详细操作教程

    目录 安装MySQL ODBC驱动 SPSS连接MySQL数据库的步骤 总结 安装MySQL ODBC驱动 官方说法:MySQL ODBC 驱动程序负责在开放式数据库连接 API (ODBC API) 的帮助下访问 MySQL数据库通俗说法:MySQL ODBC负责连接MySQL数据库 注意: 要根据本机安装的MySQL版本下载对应的ODBC驱动程序. MySQL数据库创建表插入数据 create database spss_db charset=utf8; use spss_db; creat

  • Windows Server 2016 MySQL数据库安装配置详细安装教程

    一.下载MySQL 官网地址: https://www.mysql.com/ 下载地址: http://dev.mysql.com/downloads/mysql/ 二.MySQL安装 1.许可协议 License Agreement(许可协议)->I accept the license terms(我接受许可条款)->Next(下一个) 2.选择安装类型 Choosing a Setup Type(选择安装类型)->Custom(自定义)->Next(下一个) 3.选择产品和功

  • RHEL 6平台MySQL数据库服务器的安装方法

    MySQL数据库是Linux操作系统上用得最多的数据库系统,它可以非常方便的与其它服务器集成在一起,如Apache.Vsftpd.Postfix等.下面介绍RHEL 6平台MySQL数据库服务器的安装方法. 1.安装完整的MySQL数据库需要以下几个RPM包文件: perl-DBI-1.609-4.e16.i686.rpm:Perl语言的数据API perl-DBD-MySQL-4.013-3.e16.i686.rpm:MySQL与Perl语言的接口程序包 mysql-5.1.61-4.e16.

  • win10 下安装 mysql 5.7.14 详细图文教程

    1. 下载:http://dev.mysql.com/downloads/mysql/ 2.解压zip文件夹到指定的目录 3.添加环境变量 右击我的电脑->属性->高级系统设置->高级->环境变量-> 在系统变量中找到变量Path,点击编辑,在变量值最后面添加解压路径,路径要到bin文件夹下的路径,如: 4.进入解压路径,修改路径下的my-default配置文件: 5.以管理员权限运行cmd,初始化mysql数据库,这时会创建刚刚配置的data目录和一些数据库系统用的基本表

  • PHP操作mysql数据库分表的方法

    一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.首先,我们需要想好到底分多少个 表,前提当然是满足应用.这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个表,其取值也很好做,就是对10 进行取模.另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了. 好了,先来创建表吧,代码如下: CREATE TABLE `ttlsa_com`.`article_0` ( `i

  • MySQL数据库事务transaction示例讲解教程

    目录 1.什么是事务? 2.和事务相关的语句只有这3个DML语句:insert.delete.update 3.假设所有的业务都能使用1条DML语句搞定,还需要事务机制吗? 4.事务的原理 5.事务的四大特性:ACID 6.关于事务之间的隔离性 1)第一级别:读未提交(read uncommitted) 2)第二级别:读已提交(read committed) 3)第三级别:可重复读(repeatable read) 4)第四级别:序列化读/串行化读(serializable) 7.演示事务的隔离

  • c++连接mysql数据库的两种方法(ADO连接和mysql api连接)

    第一种方法可以实现我当前的需求,通过连接不同的字符串来连接不同的数据库.暂时只连接了mysql,sqlserver,oracle,access.对于access,因为它创建表的SQL语句不太兼容标准SQL语句,需要做一些处理,这里暂时不说.第二种方法只能针对于mysql数据库的连接,不过用这种方法不用安装MyODBC服务器程序. 不管用哪种方法,首先需要安装Mysql数据库,安装方法请看"mysql安装及一些注意点".最好安装一个Navicat for mysql,方便操作mysql数

  • php将图片保存入mysql数据库失败的解决方法

    本文实例分析了php将图片保存入mysql数据库失败的解决方法.分享给大家供大家参考.具体分析如下: 图片保存数据库并不是一个明智的做法,我们多半是把图片保存到服务器,然后把图片地址保存到数据库,这样我们每次只要读出图片地址就可以显示了,但下面我还是来介绍一个图片保存到mysql数据库的问题解决办法,代码如下: 复制代码 代码如下: require 'class/db.php'; $fileName = "a1.jpg"; $fp = fopen($fileName, "r&

  • MySql安装启动两种方法教程详解

    mysql安装启动两种方法如下所示: 方法一(简单版): 1.cmd进入mysql安装的bin目录:mysqld.exe –install 2.net start mysql 服务启动(或者选择计算机->(右键)管理->服务和应用程序->服务->mysql右键启动服务) 3.mysql –uroot –p 回车 4.password留空 回车 方法二: 1.cmd进入到mysql安装目录bin,如:D:\MySQL Server 5.6\bin 2.mysqld --console

随机推荐