将多个.sql转储文件从shell导入到mysql数据库中
我有一堆的.sql
文件的目录,我的服务器上的每个数据库的mysql转储。
例如
database1-2011-01-15.sql database2-2011-01-15.sql ...
实际上有相当多的
我需要创build一个shell脚本或单行可能会导入每个数据库。
我在Linux Debian机器上运行。
我认为有一些方法可以将ls的结果转化为一些find命令或其他东西。
任何帮助和教育是非常感激。
编辑
所以最终我想自动将一个文件一次导入到数据库中。
例如,如果我手动在一个它会这样做:
mysql -u root -ppassword < database1-2011-01-15.sql
cat *.sql | mysql
cat *.sql | mysql
? 你需要以任何特定的顺序吗?
如果你有太多的处理方式,那就试试这样的:
find . -name '*.sql' | awk '{ print "source",$0 }' | mysql --batch
这也解决了通过pipe道传递脚本input的一些问题,尽pipe在Linux下你不应该有任何stream水线处理的问题。 这种方法的mysql
是, mysql
实用程序读取每个文件,而不是从stdin
读取。
单行阅读所有.sql
文件并导入它们:
for SQL in *.sql; do DB=${SQL/\.sql/}; echo importing $DB; mysql $DB < $SQL; done
唯一的技巧是bash子串replace去掉.sql
来获取数据库名称。
在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文件上工作,但是比起使用gunzipping慢得多,然后在未压缩的文件上运行。
我说的很大 ,但是我猜所有事都是相对的。 花了大约6-8分钟为我分配一个2000表,200MB的转储文件。
前一段时间我创build了一个脚本来完成这个工作,我完全自主地调用了“myload”。 它将SQL文件加载到MySQL中。
这是在GitHub上
简单直接, 允许你指定mysql的连接参数,并且会立即解压缩gzip的sql文件。 它假定每个数据库都有一个文件,文件名的底部是所需的数据库名称。
所以:
myload foo.sql bar.sql.gz
将创build(如果不存在)名为“foo”和“bar”的数据库,并将sql文件导入到每个。
对于进程的另一端,我编写了这个脚本(mydumpall) ,它为每个数据库(或由名称或正则expression式指定的一些子集)创build对应的sql(或sql.gz)文件。
我不记得mysqldump的语法,但它会是这样的
find . -name '*.sql'|xargs mysql ...