【问题标题】:Import Multiple .sql dump files into mysql database from shell从 shell 将多个 .sql 转储文件导入 mysql 数据库
【发布时间】:2011-06-10 03:07:54
【问题描述】:

我有一个目录,里面有一堆 .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

【问题讨论】:

    标签: mysql linux shell


    【解决方案1】:

    cat *.sql | mysql?你需要它们以任何特定的顺序吗?

    如果您有太多的方法无法处理,请尝试以下方法:

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

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

    【讨论】:

    • 最后我使用了 cat *.sql 但按字母分解,所以没有太多信息。例如猫*.sql | mysql -u root -ppass
    • 我使用了ls -1 *.sql | awk '{ print "source",$0 }' | mysql --batch -u {username} -p{password} {dbname} ,因为我已经按顺序命名了我的 sql 文件并希望按该顺序执行
    • @Luracast 我使用ls -1 *.sql | awk '{ print "source",$0 }' | mysql --batch -u {username} -p {dbname} 让它工作。当实际提示输入密码时,需要在控制台中输入密码,而不是在命令本身中输入密码。 MySQL 不接受命令中的密码。
    • @satya 我相信如果你使用--password=PA55w0rd而不是-p,你可以在命令行输入密码。我已经有一段时间没有修改 MySQL 了,但我很确定这会奏效。
    • @D.Shawley 和@satya - 您可以在命令行中输入密码,使用 -p 省略空格。例如mysql -u me -pPA55w0rd
    【解决方案2】:

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

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

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

    【讨论】:

    • 就像一个魅力,谢谢!比我接受的答案更好。
    【解决方案3】:

    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 压缩,然后在未压缩文件上运行它要慢得多。

    我说巨大,但我想一切都是相对的。对我来说,拆分一个 2000 表、200MB 的转储文件大约需要 6-8 分钟。

    【讨论】:

      【解决方案4】:

      我不记得 mysqldump 的语法,但应该是这样的

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

      【讨论】:

      • 通过做一些研究,这也是我想出的。例如找 。 -name '*.sql' | xargs mysql -u root -ppassword 可以吗?
      • 和 -h host 如果您在远程服务器上并且可能还需要指定数据库名称
      • 在每个备份文件中都引用了数据库,因此上面的单行已经工作并且它是本地主机
      【解决方案5】:

      我前段时间创建了一个脚本来精确地执行此操作,我将其(完全没有创意地)称为“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)文件。

      【讨论】:

        猜你喜欢
        • 2016-08-21
        • 2012-02-18
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 2023-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多