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

Der*_*gan 39 mysql linux shell

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

例如

database1-2011-01-15.sql
database2-2011-01-15.sql
...
Run Code Online (Sandbox Code Playgroud)

实际上有很多.

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

我在Linux Debian机器上运行.

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

任何帮助和教育都非常感谢.

编辑

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

例如,如果我在一个上手动完成它将是:

mysql -u root -ppassword < database1-2011-01-15.sql
Run Code Online (Sandbox Code Playgroud)

D.S*_*ley 75

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

如果你有太多的方法来处理这种方式,那么尝试以下方法:

find . -name '*.sql' | awk '{ print "source",$0 }' | mysql --batch
Run Code Online (Sandbox Code Playgroud)

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

  • 我用过`ls -1*.sql | awk'{print"source",$ 0}'| mysql --batch -u {username} -p {password} {dbname}`因为我按顺序命名了我的sql文件并想按顺序执行 (10认同)
  • @ D.Shawley和@satya - 您可以在命令行输入密码-p,只需省略空格即可.例如`mysql -u me -pPA55w0rd` (2认同)

Ron*_*nie 17

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

for SQL in *.sql; do DB=${SQL/\.sql/}; echo importing $DB; mysql $DB < $SQL; done
Run Code Online (Sandbox Code Playgroud)

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


小智 9

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
Run Code Online (Sandbox Code Playgroud)

mydumpsplitter甚至可以在.gz文件上运行,但它比先解压缩要快得多,然后在未压缩的文件上运行它.

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