MySQL导入后指定数据库为空,原数据库自动创建的问题咨询
嘿,这个问题我之前也碰到过,本质是mysqldump导出的SQL文件自带了「创建原数据库」和「切换到原数据库」的指令,直接覆盖了你在导入命令里指定的目标库。
问题根源
默认情况下,用mysqldump导出整个数据库(比如你的foo_db)时,生成的SQL文件开头会包含类似这样的语句:
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `foo_db` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; USE `foo_db`;
当你执行mysql -u root -p db_name < foo_dump.sql时,虽然命令里指定了要导入到db_name,但SQL文件里的USE foo_db会强制MySQL切换到原数据库,所有表和数据都会被导入到foo_db中,而你提前指定的db_name因为没有被SQL文件的语句引用,自然就保持为空了。
解决办法
这里给你三个实用的解决方案:
修改导出的SQL文件
直接打开foo_dump.sql,找到开头的CREATE DATABASE和USE语句,把其中的foo_db替换成你想要的db_name,保存后重新执行导入命令即可。导出时避免生成创建数据库的语句
如果以后再导出数据库,想跳过自动创建原库的步骤,可以在mysqldump命令中添加--no-create-db参数,比如:mysqldump -u root -p --no-create-db foo_db > foo_dump.sql这样导出的SQL文件只会包含表结构和数据,不会有
CREATE DATABASE和USE语句。此时你需要提前手动创建好db_name,再执行导入命令,数据就会正确进入指定库了。交互式导入指定数据库
先登录MySQL控制台:mysql -u root -p切换到目标数据库:
USE db_name;再执行导入命令:
source foo_dump.sql;注意:如果SQL文件里依然有
USE foo_db语句,还是会切换到原库,所以这个方法最好配合前两种方法一起使用。
内容的提问来源于stack exchange,提问作者Sylar

