代码之家  ›  专栏  ›  技术社区  ›  Trevor

mysqldump在单个命令中转储整个结构,但只转储选定表中的数据

  •  30
  • Trevor  · 技术社区  · 16 年前

    我的数据库有3个表:表1、表2和表3

    • 所有表的转储结构
    • 仅转储表1和表2的数据,忽略表3中的数据

    mysqldump -u user -p -d db > db_structure.sql
    mysqldump -u user -p db --ignore-table=db.table3 > table1_and_table2_data.sql
    

    按照转储顺序导入它们(结构,然后是表1和表2中的数据)

    5 回复  |  直到 16 年前
        1
  •  44
  •   Cfreak    6 年前

    不能将它们组合在一个命令中,但可以同时执行两个命令并输出到同一文件。

    mysqldump -u user -p --no-data db > structure.sql; mysqldump -u user -p db table1 table2 >> structure.sql
    

    为了避免必须输入两次密码,您可以执行以下操作 -ppassword (注意缺少空间!)。也使用 --no-data 在第一个命令中,否则您也会得到数据-当您只处理一个数据库时,不需要d。

        2
  •  7
  •   0xC0000022L    15 年前

    考虑到您可能希望通过管道将输出传输到另一个命令(如我所做),而不是在下一个命令中重定向到一个文件并附加到该文件,您可以尝试(根据stask示例修改):

    (mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\
    your_command
    

    ... 就我而言:

    (mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\
    gzip -9 > filename.sql.gz
    

    将这两个mysqldump命令括在括号中会创建一个子shell,我们将其输出导入gzip,然后将其重定向到一个文件中。

        3
  •  0
  •   stask    16 年前

    我认为你不可能一个命令就能做到。但您肯定可以将输出合并到一个文件中。为什么不将其包装在一些shell脚本中,该脚本执行以下操作:

    mysqldump -u $1 -p$2 -d db > dump.sql && mysqldump -u $1 -p$2 db --ignore-table=db.table3 >> dump.sql
    

    您将使用两个参数运行此脚本:用户名和密码。

        4
  •  0
  •   Tristan    10 年前

    它实际上非常简单,在不需要数据的表上使用--where子句,并给它一个始终为false的条件。例如,在foo和gah上加载数据,在bar上仅加载模式:

    mysqldump -u ... -p... myDatabase foo bar --where='1=2' gah > myfile.sql
    

    是的,你可以在一条线上完成。

        5
  •  0
  •   Eduardo Cuomo Sajjad Ali Khan    9 年前

    您可以删除 INSERT INTO ... 第部分:

    mysqldump \
      --opt \
      -u ${DB_USER} -p${DB_PASS} \
      ${DB_NAME} \
      | grep -v 'INSERT INTO `table3`' \
      | grep -v 'INSERT INTO `table4`'