从shell导入多个.sql转储文件到mysql数据库

时间:2011-01-16 21:00:58

标签: mysql linux shell

我有一个目录,其中有一堆.sql个文件,我的服务器上的每个数据库都有mysql转储。

e.g。

database1-2011-01-15.sql
database2-2011-01-15.sql
...

实际上有很多。

我需要创建一个shell脚本或单行,可能会导入每个数据库。

我在Linux Debian机器上运行。

我认为有一些方法可以将ls的结果输入到某些find命令或其他内容中。

非常感谢任何帮助和教育。

修改

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

E.g。如果我手动完成它,那就是:

mysql -u root -ppassword < database1-2011-01-15.sql

5 个答案:

答案 0 :(得分:75)

cat *.sql | mysql?你是否需要任何特定的顺序?

如果你有太多不能处理这种方式,那么尝试类似:

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

这也解决了通过管道传递脚本输入的一些问题,尽管在Linux下管道处理不应该有任何问题。这种方法的好处是mysql实用程序读入每个文件而不是从stdin读取。

答案 1 :(得分:17)

读取所有.sql个文件的单行并导入它们:

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

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

答案 2 :(得分:7)

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文件上运行,但它比先解压缩要快得多,然后在未压缩的文件上运行它。

我说巨大的,但我想一切都是相对的。我花了大约6-8分钟为我分割了2000个表,200MB的转储文件。

答案 3 :(得分:3)

我不记得mysqldump的语法,但它会是这样的

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

答案 4 :(得分:3)

我前段时间创建了一个脚本来完成这个,我称之为(完全没有创造性地)“myload”。它将SQL文件加载到MySQL中。

Here it is on GitHub

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

所以:

myload foo.sql bar.sql.gz

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

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