如何轻松将多个 sql 文件导入 MySQL 数据库?
Posted
技术标签:
【中文标题】如何轻松将多个 sql 文件导入 MySQL 数据库?【英文标题】:How to easily import multiple sql files into a MySQL database? 【发布时间】:2012-02-18 11:39:18 【问题描述】:我有几个 sql
文件,我想将它们一次导入到 mysql 数据库中。
我去phpMyAdmin
,访问数据库,点击import
,选择一个文件并导入。如果我有多个文件,则需要很长时间。
我想知道是否有更好的方法来导入多个文件,例如一个文件将导入其他文件或类似文件。
我正在使用WAMP
,我想要一个不需要在我的计算机上安装其他程序的解决方案。
【问题讨论】:
脚本可以让你做到这一点,但你需要学习它。您可以用 php 本身或其他脚本语言(如 ruby 或 python)编写一些东西。您甚至可以在批处理文件中执行此操作。 【参考方案1】:最简单的解决方案是将每个 sql 文件复制/粘贴到一个中。
你不能为文件导入添加一些sql标记(导入的文件将在你的计算机中,而不是在服务器中,我不认为MySQL管理一些导入标记 用于外部 sql 文件)。
【讨论】:
是的,这是一个简单的解决方案,我知道,但我不想这样做,因为我需要将文件分开:每个文件都是我系统的一部分,如果我想在编码后修改三个部分我想在不复制和粘贴的情况下导入它们。无论如何,如果没有更好的方法,请解决,谢谢 一种简单的方法是创建一个包含所有 SQL 文件的脚本(例如,在 linux 或 unix 上使用cat
)
不是最简单的。根据桌子的大小,您可能会遇到麻烦。【参考方案2】:
在Windows中,打开终端,进入内容文件夹并写入:
copy /b *.sql all_files.sql
这会将所有文件连接到一个文件中,使用 PhpMyAdmin 可以非常快速地导入。
在 Linux 和 macOS 中,正如@BlackCharly 指出的那样,这会成功:
cat *.sql > .all_files.sql
重要提示:直接执行它应该会很顺利,但由于系统将文件添加到自身,它可能最终导致您陷入循环,大量输出文件变得越来越大。为避免这种情况,有两种可能的解决方案。
A) 将结果放在一个单独的目录中以确保安全(感谢@mosh):
mkdir concatSql
cat *.sql > ./concatSql/all_files.sql
B) 将它们连接到具有不同扩展名的文件中,然后更改名称。 (感谢@William Turrell)
cat *.sql > all_files.sql1
mv all_files.sql1 all_files.sql
【讨论】:
不同的表编码怎么样? @Alexufo,你是什么意思? sql 转储文件可能有不同的编码。将 cp1251 和 utf 8 合并到一个文件后会怎样? 如果 all_files.sql 已经存在,这可能导致文件的递归复制没有结束!将结果放在单独的目录中以确保安全。 五年后来到Windows,导入大约100个表就迷路了。你只是白天。 谢谢【参考方案3】:这是我找到的最简单的方法。
在 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 的命令在功能上是相同的。 在不好的情况下,这可能会给您的字符集带来一些麻烦,还是我错了?如果cat
命令输出损坏的 utf-8 字符,这些字符将通过管道传输到您的 mysql 命令中,对吧?!
@suther 是的,你是对的。它会在下一个 UTF-8 编码文件的 BOM 出现的行上给你一个错误。 ("ERROR 1064 (42000) at line nnn: You have an error in your SQL syntax")【参考方案4】:
我知道这已经有两年多了...但我一直在寻找一种方法来做到这一点,并且对发布的解决方案并不太满意(它工作正常,但我想了解更多信息,因为导入发生)。将所有 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)。
【讨论】:
这是一个很好的解决方案,我输入更多信息,如果您的文件夹名称有空格,我们会添加双引号。示例:for /f %f in ('dir /b "C:\Bitbucket\db\Aron\March 9\turl_trevin\"*.sql') do mysql --user=root --password=root test 【参考方案5】:像这样进入mysql shell。
mysql --host=localhost --user=username --password --database=db
然后使用 source 命令和分号分隔命令。
源文件1.sql;源文件2;源文件3;
【讨论】:
当您有 40 多个表并使用数据库导入时,这并不容易。 您可以将它们全部归为一个文件并解决问题。【参考方案6】:转到 cmd
输入命令提示符 C:\users\Usersname>cd [.sql 表文件夹路径] 按回车 例如:C:\users\Usersname>cd E:\project\database
键入命令提示符 C:\users\Usersname>[.sql 文件夹的驱动器(目录)名称] 按回车 例如:C:\users\Usersname>E:
键入命令提示符以将所有 .sql 文件(表)合并到一个文件中 复制 /b *.sql newdatabase.sql 按回车 例如:E:\project\database>copy /b *.sql newdatabase.sql
您可以看到将多个 .sql(file) 表文件合并到目录文件夹中的单个文件中 例如:E:\project\database
【讨论】:
【参考方案7】:将此文件另存为 .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) 使用数据库名称。
【讨论】:
不错!但是没有密码怎么办?就像为测试导入本地数据库一样...我尝试了 -p() 和 -p('') 没有成功。 我得到了这样的结果,但总是按“回车”提示没有密码:@echo off title Mysql Import Script for %%a in (*) do ( echo Importing File : %%a C: \xampp\mysql\bin\mysql.exe -u root -p MYDB 【参考方案8】:只需在命令提示符下键入以下命令,它将所有 sql 文件绑定到单个 sql 文件中,
c:/xampp/mysql/bin/sql/ type *.sql > OneFile.sql;
【讨论】:
【参考方案9】:只需输入:
cat *.sql |mysql -uroot -p
mysql会依次导入所有的sql文件
【讨论】:
【参考方案10】:您也可以使用 for 循环来执行此操作:
#!/bin/bash
for i in *.sql
do
echo "Importing: $i"
mysql your_db_name < $i
wait
done
Source
【讨论】:
是的,我更喜欢这样的循环而不是导入一个大的 sql 文件,因为如果一个或多个 .sql 文件在导入时失败,然后采取相应的行动,更容易解决。【参考方案11】:在windows中打开windows powershell并转到sql文件所在的文件夹,然后运行此命令
cat *.sql | C:\xampp\mysql\bin\mysql.exe -u username -p databasename
【讨论】:
【参考方案12】:从多个 SQL 文件导入一个数据库。
第 1 步:转到文件夹并创建具有执行权限的文件“import-script.sh”
(授予文件权限为chmod u+x import-script.sh
)
#!/bin/bash
for i in *.sql
do
echo "Importing: $i"
mysql -u USERNAME -pPASSWORD DBNAME < $i
wait
done
主要是 -p 和 PASSWORD 没有加空格。
第 2 步: 然后在您的终端中运行此命令 ./import-script.sh
【讨论】:
以上是关于如何轻松将多个 sql 文件导入 MySQL 数据库?的主要内容,如果未能解决你的问题,请参考以下文章
怎样将Linux下MySQL数据库导入到Windows的MySQL中