【问题标题】:Manipulating giant MySQL dump files操作巨大的 MySQL 转储文件
【发布时间】:2010-09-22 00:44:31
【问题描述】:

获取单个表的数据、删除单个表或将整个转储文件分解为每个包含单个表的文件的最简单方法是什么?我通常最终会做很多 vi 正则表达式修改,但我敢打赌,使用 awk/perl 等有更简单的方法来做这些事情。Google 结果的第一页带回了一堆不工作的 perl 脚本。

【问题讨论】:

    标签: mysql linux backup restore


    【解决方案1】:

    当我需要从 sql 转储中提取单个表时,我会使用 grep、head 和 tail 的组合。

    例如:

    grep -n "CREATE TABLE" dump.sql
    

    这会为您提供每个表的行号,因此如果您的表在第 200 行,而后面的表在第 269 行,我会这样做:

    head -n 268 dump.sql > tophalf.sql
    tail -n 69 tophalf.sql > yourtable.sql
    

    我想你可以扩展这些原则来敲出一个脚本,将整个事情分成每个表一个文件。

    有人想试试吗?

    另一点可能有助于启动 bash 循环:

    grep -n "CREATE TABLE " dump.sql  | tr ':`(' '  ' | awk '{print $1, $4}'
    

    这为您提供了一个很好的行号和表名列表,例如:

    200 FooTable
    269 BarTable
    

    【讨论】:

    • head 的输出可以简单地通过管道传输到 tail - 这不是一个坏主意
    • 非常有趣的解决方案,但 maatkit 可以做同样的事情,甚至更多:D
    【解决方案2】:

    如果可以的话,请使用mysqldump -T 为自己省去很多麻烦。

    来自documentation

    --tab=path, -T 路径

    生成制表符分隔的数据文件。对于每个转储表,mysqldump 创建一个包含 CREATE TABLE 语句的 tbl_name.sql 文件 创建表和一个 tbl_name.txt 文件,其中包含其 数据。选项值是写入文件的目录。

    默认情况下,.txt 数据文件使用制表符格式化 在列值和每行末尾的换行符之间。这 可以使用 --fields-xxx 和 --lines-terminated-by 选项。

    注意
    只有在 mysqldump 运行在 与 mysqld 服务器相同的机器。您必须拥有 FILE 权限, 并且服务器必须具有在目录中写入文件的权限 你指定的。

    【讨论】:

      【解决方案3】:

      This shell script 将获取您想要的表并将它们传递给splitted.sql

      它能够理解正则表达式,因为我添加了 sed -r 选项。

      MyDumpSplitter 还可以将转储拆分为单独的表转储。

      【讨论】:

        【解决方案4】:

        Maatkit 似乎非常适合 mk-parallel-dumpmk-parallel-restore

        【讨论】:

        • 这些工具都已被弃用,不适合在备份中使用。
        【解决方案5】:

        我在那个方面有点晚了,但如果它可以帮助任何人,我不得不拆分一个巨大的 SQL 转储文件,以便将数据导入另一个 Mysql 服务器。 我最终做的是使用系统命令拆分转储文件。

        split -l 1000 import.sql split_file

        上面会每1000行拆分sql文件。

        希望这对某人有所帮助

        【讨论】:

          猜你喜欢
          • 2013-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多