从Shell导入多个.sql转储文件到MySQL数据库

42
我有一个目录,里面有许多以 .sql 为后缀的文件,这些文件是 MySQL 导出服务器上每个数据库的结果。例如:
database1-2011-01-15.sql
database2-2011-01-15.sql
...

实际上有相当多的数据库。

我需要创建一个Shell脚本或单行代码,可以导入每个数据库。

我正在运行Linux Debian机器。

我认为有一些方法可以将ls的结果传递到某个find命令或其他命令中。

非常感谢任何帮助和指导。

编辑

所以我最终想要自动将一个文件导入到数据库中。

例如,如果我手动导入一个文件,它会是:

mysql -u root -ppassword < database1-2011-01-15.sql
5个回答

78

cat *.sql | mysql?你需要按照特定的顺序吗?

如果你有太多的文件需要处理,可以尝试以下方法:

find . -name '*.sql' | awk '{ print "source",$0 }' | mysql --batch

这种方法还可以绕过通过管道传递脚本输入时遇到的一些问题,尽管在Linux下您不应该遇到任何管道处理的问题。 这种方法的好处是mysql实用程序会读取每个文件而不是从stdin读取。


10
我使用了命令 ls -1 *.sql | awk '{ print "source",$0 }' | mysql --batch -u {username} -p{password} {dbname},因为我将我的 SQL 文件按顺序进行了命名,希望按照这个顺序依次执行它们。 - Arul Kumaran
1
@Luracast 我使用 ls -1 *.sql | awk '{ print "source",$0 }' | mysql --batch -u {username} -p {dbname} 让它正常工作。密码需要在控制台中实际提示输入时输入,而不是在命令本身中输入。MySQL 不接受命令中的密码。 - Satya Kalluri
1
@satya 我相信如果你使用 --password=PA55w0rd 而不是 -p,你可以在命令行上输入密码。虽然我已经有一段时间没有玩过 MySQL 了,但我相当确定这会起作用。 - D.Shawley
2
@D.Shawley 和 @satya - 你们可以在命令行中使用 -p 输入密码,只需省略空格即可。例如:mysql -u me -pPA55w0rd - David Woods
--batch 真的必要吗? - e18r
显示剩余2条评论

19

用一行代码读取所有的 .sql 文件并导入它们:

for SQL in *.sql; do DB=${SQL/\.sql/}; echo importing $DB; mysql $DB < $SQL; done

唯一的技巧是使用Bash子字符串替换来删除 .sql 以获取数据库名称。


非常好,谢谢!对我来说比被采纳的答案更有效。 - Swader

10

http://kedar.nitty-witty.com/blog/mydumpsplitter-extract-tables-from-mysql-dump-shell-script有一段非常棒的脚本,可以将一个巨大的mysqldump文件分割成每个表的单独文件。然后您可以运行这个非常简单的脚本来从这些文件中加载数据库:

for i in *.sql
do
  echo "file=$i"
  mysql -u admin_privileged_user --password=whatever your_database_here < $i
done

mydumpsplitter甚至可以处理.gz文件,但它比先使用gunzip解压缩文件再在未压缩的文件上运行mydumpsplitter要慢得多。

我说“巨大”,但我想一切都是相对的。对于我来说,分割一个含有2000个表、大小为200MB的转储文件大约需要6-8分钟。


3

我不记得mysqldump的语法,但它应该是类似于这样的:

 find . -name '*.sql'|xargs mysql ...

从我所做的一些研究来看,这也是我的结论。例如,find . -name '*.sql' | xargs mysql -u root -ppassword 这样行得通吗? - Derek Organ
如果您正在远程服务器上,并且可能还需要指定数据库名称,则使用-h主机。 - Navi
1
数据库在每个备份文件中都有引用,因此上面的单行已经起作用了,它是本地主机。 - Derek Organ

3

我一段时间前创建了一个脚本,可以精确地做到这一点,我把它称为(完全没有创意的)“myload”。它将SQL文件加载到MySQL中。

在GitHub上这是它

它简单而直接;允许您指定mysql连接参数,并将即时解压缩gzip格式的sql文件。它假定您每个数据库都有一个文件,并且文件名的基础是所需的数据库名称。

所以:

myload foo.sql bar.sql.gz

将创建名为“foo”和“bar”的数据库(如果不存在),并将sql文件导入到每个数据库中。

对于该过程的另一侧,我编写了this script (mydumpall),它为每个数据库(或通过名称或正则表达式指定的某些子集)创建相应的sql(或sql.gz)文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接