我有一个目录,其中有一堆.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
答案 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中。
简单直接;允许您指定mysql连接参数,并将动态解压缩gzip的sql文件。它假定每个数据库都有一个文件,文件名的基础是所需的数据库名称。
所以:
myload foo.sql bar.sql.gz
将创建名为“foo”和“bar”的数据库(如果不存在),并将sql文件导入每个数据库。
对于该过程的另一方,我编写了this script (mydumpall),为每个数据库(或通过名称或正则表达式指定的某个子集)创建相应的sql(或sql.gz)文件。