使用mysql和php强制导入新的数据库名称

时间:2011-04-28 07:20:16

标签: php mysql database import

我有一个大型数据库dump.sql文件,我从linux的命令行导入。 .sql转储创建名为“database_name”的数据库。我想从这个.sql文件导入数据库但我想强制它到一个具有不同名称的数据库,因为脚本当前覆盖“database_name”和“database_name”已经存在并且有我无法覆盖的数据。

在.sql文件中查找和替换是最好的选择吗?由于文件是50mb,最好的方法是什么。我不能简单地在那个shiz上使用file_get_contents()吗?我可以吗?

以下是我必须在.sql文件中替换的行:

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `database_name` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `database_name`;

4 个答案:

答案 0 :(得分:9)

使用mysqldump转储数据库时,请使用选项--no-create-db。这将暂停转储文件中的CREATE DATABASE语句 然后用
恢复数据库 mysql -h <host> -u <user> -p <databaseName> < dump.sql
通过这种方式,您可以在任何您喜欢的数据库中恢复数据(但该数据库必须存在!)

答案 1 :(得分:7)

您必须替换.sql文件中的database_name。

您可以使用sed 's/database_name/new_database_name/' dumpFile.sql > newDumpFile.sql

从shell执行此操作

这是我问题的正确答案,但是在另一个答案的评论中由'fab'提供。

注意:正如@Diego在评论中指出的那样,如果字符串'database_name'显示在此.sql转储中的任何其他位置,它也将在那里被替换。您可能希望使用less file_name.sql查看.sql文件的内容,然后使用您的查找/替换更明确。

答案 2 :(得分:0)

唯一可靠的方法是打开文件,找到以下行(从开始大约10到15行):

CREATE DATABASE / !32312 IF NOT NOT EXISTS / old_database_name ...

USE old_database_name;

并将old_database_name替换为两个位置的新名称。我刚用vim的5.9 GB文件做了这个。花了大约15秒。打开文件,3秒。编辑线和30秒。保存文件。不确定任何其他文本编辑器允许你这样做!

答案 3 :(得分:0)

这是一个老问题,但我今天遇到了完全相同的问题。以下是我解决它的方法:

pv 20171212.dump.bz2 | bunzip2 | sed -e '/^\(CREATE DATABASE\|USE\|.*DROP DATABASE\).*`<old db name>`/d' | mysql <new db name>

pv就是为了显示进度条。该行可以写成

bunzip2 20171212.dump.bz2 | sed -e '/^\(CREATE DATABASE\|USE\|.*DROP DATABASE\).*`<old db name>`/d' | mysql <new db name>

sed删除阻止数据库名称更改的行,而不更改转储文件中出现的任何文本。