如何轻松地将多个sql文件导入MySQL数据库?


72

我有几个sql文件,我想一次所有文件导入MySQL数据库。

我转到PHPMyAdmin,访问数据库,单击import,选择一个文件并将其导入。当我有多个文件时,需要很长时间。

我想知道是否有更好的方法导入多个文件,例如一个文件将导入其他文件或类似文件。

我正在使用WAMP,我想要一个不需要在计算机上安装其他程序的解决方案


脚本将允许您执行此操作,但是您需要学习它。您可以用php本身或其他脚本语言(如ruby或python)编写内容。您甚至可以在批处理文件中执行此操作。
Toby Allen

Answers:


138

Windows中,打开一个终端,转到内容文件夹并输入:

copy /b *.sql all_files.sql

这样可以将所有文件连接在一起,从而可以非常快地使用PhpMyAdmin导入。

LinuxmacOS中,正如@BlackCharly指出的,这可以解决问题:

cat *.sql  > .all_files.sql

重要说明:直接执行该操作应该会顺利进行,但最终可能会陷入一个循环,由于系统将文件本身添加到文件中,因此输出文件越来越大。为了避免这种情况,有两种可能的解决方案。

A)将结果放在一个单独的目录中以确保安全(感谢@mosh):

mkdir concatSql
cat *.sql  > ./concatSql/all_files.sql

B)将它们连接到具有不同扩展名的文件中,然后更改其名称。(感谢@威廉·特瑞尔)

cat *.sql  > all_files.sql1
mv all_files.sql1 all_files.sql

2
那不同的表编码呢?
Alexufo 2015年

@Alexufo,你是什么意思?
Chococroc 2015年

sql转储文件可能具有不同的编码。将cp1251和utf 8合并到一个文件中会怎样?
Alexufo 2015年

如果all_files.sql已经存在,则可能导致文件的递归复制而没有结束!为了安全起见,请将结果放在单独的目录中。
mosh,

五年后才进入Windows,因此无法导入约100张桌子。你只是一天天造出来的。<b>谢谢</ b>
手工艺者

60

这是我发现的最简单的方法。

在Windows(PowerShell)中:

cat *.sql | C:\wamp64\bin\mysql\mysql5.7.21\bin\mysql.exe -u user -p database

您将需要在WAMP - MySQL上面插入路径,我已经使用了我的系统路径。

在Linux(Bash)中:

cat *.sql | mysql -u user -p database


将mysql.exe的路径添加到Windows系统路径中可能会有所帮助,这样Linux和Windows的命令在功能上是相同的。
TolMera

在糟糕的情况下,这可能会给您带来字符集麻烦,还是我错了?如果cat命令输出的utf-8字符损坏,这些字符将通过管道传递到mysql命令中,对吧?
6

@suther是的,你是对的。这将在出现下一个UTF-8编码文件的BOM的行上给您带来错误。(“ nnn行出现错误1064(42000):您的SQL语法有错误”))
foolo

12
  1. 转到cmd

  2. 在命令提示符下键入C:\ users \ Usersname> cd [.sql表文件夹路径]
    按Enter
    例如:C:\ users \ Usersname> cd E:\ project \ database

  3. 键入命令提示符
    C:\ users \ Usersname> [。sql文件夹的驱动器(目录)名称]
    按Enter
    例如:C:\ users \ Usersname> E:

  4. 键入命令提示符以将所有.sql文件(表)置于单个文件
    副本中/ b * .sql newdatabase.sql
    按Enter
    :EX:E:\ project \ database> copy / b * .sql newdatabase.sql

  5. 您可以在目录文件夹中看到将多个.sql(file)表文件合并为一个文件,
    例如:E:\ project \ database


7

我知道已经过了两年多了...但是我一直在寻找一种方法来做,并且对发布的解决方案不太满意(它很好用,但是随着导入的进行,我需要更多信息) 。将所有SQL文件合并到一个时,您不会获得任何进度更新。

因此,我一直在寻找答案,并认为这可能是发布我所发现的东西的好地方,供以后寻找相同答案的人使用。这是Windows中的命令行,它将从一个文件夹中导入多个SQL文件。您可以在mysql.exe所在的目录中从命令行运行此命令。

for /f %f in ('dir /b <dir>\<mask>') do mysql --user=<user> --password=<password> <dbname> < <dir>\%f

以一些假定的值(例如):

for /f %f in ('dir /b c:\sqlbackup\*.sql') do mysql --user=mylogin --password=mypass mydb < c:\sqlbackup\%f

如果文件夹中有两组SQL备份,则可以将* .sql更改为更特定的名称(例如mydb _ *。sql)。


这是一个很好的解决方案,我输入了更多信息,以防万一您的文件夹名称中有空格,我们会添加双引号。示例:对于/ f%f,在('dir / b“ C:\ Bitbucket \ db \ Aron \ March 9 \ turl_trevin \” *。sql')中执行mysql --user = root --password = root test <“ C :\ Bitbucket \ db \ Aron \ March 9 \ turl_trevin“ \%f
Dylan B

4

像这样输入mysql shell。

mysql --host = localhost --user =用户名--password --database = db

然后,使用source命令和分号分隔命令。

源文件1.sql; 源文件2; 源文件3;


当您拥有40多个表并进行数据库导入时,这并不容易。
MarceloAgimóvel18年

您可以将它们全部合并到一个文件中,并解决问题。
马库斯·泽勒

3

只需输入:

cat *.sql |mysql -uroot -p

和mysql将依次导入所有的sql文件



2

将此文件另存为.bat并运行,更改括号内的变量...

@echo off
title Mysql Import Script
cd (Folder Name)
 for %%a in (*) do (
     echo Importing File  : %%a 
     mysql -u(username) -p(password)  %%~na < %%a
)
pause

如果只有一个数据库修改(%%〜na)使用数据库名称。


1
真好!但是,如果没有密码怎么办?就像本地数据库导入测试一样...我尝试了-p()和-p('')但没有成功。
MarceloAgimóvel18年

我是这样的,但总是打“ enter”来告知没有密码:@echo off标题(%)中的%% a的Mysql导入脚本(echo Importing File:%% a C:\ xampp \ mysql \ bin \ mysql .exe -u root -p MYDB <%% a)暂停
MarceloAgimóvel,

1

最简单的解决方案是将每个sql文件复制/粘贴到一个文件中。

您不能为文件导入添加一些sql标记(导入的文件将在您的计算机中,而不是在服务器中,并且我认为MySQL不会为外部sql文件管理某些导入标记)。


2
是的,这是一个简单的解决方案,我知道,但是我不想这样做,因为我需要将文件分开:每个文件都是系统的一部分,如果我想在编码后修改三部分我想将它们导入而无需复制和粘贴。无论如何,如果没有更好的方法,请提供解决方案,谢谢
Chococroc 2012年

一种简单的方法是创建一个包含所有SQL文件的脚本(例如,cat在Linux或Unix上使用)
BlackCharly

不是最简单的。根据表的大小,您可能会遇到麻烦。
MarceloAgimóvel18年

0

只需在命令提示符下键入以下命令,它将所有sql文件绑定到单个sql文件中,

c:/xampp/mysql/bin/sql/ type *.sql > OneFile.sql;

0

在Windows中,打开Windows Powershell并转到sql文件所在的文件夹,然后运行此命令

cat *.sql |  C:\xampp\mysql\bin\mysql.exe -u username -p databasename
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.