【问题标题】:Mysqldump only tables with certain prefix / Mysqldump wildcards?Mysqldump 仅具有某些前缀/ Mysqldump 通配符的表?
【发布时间】:2011-07-13 05:46:21
【问题描述】:

我正在清理这个庞大而混乱的数据库。它包含 500 多个表,这是将 Magento Enterprise 与 Joomla 结合到一个数据库中的结果。

更糟糕的是,有一组 70 多个 Joomla 表根本没有使用。这些都以bak_为前缀。

删除这些bak_ 表很容易,但我想先“备份”它们(看看我在那里做了什么?)。在我的脑海中,我可以想象这样一个命令:

mysqldump -u username -p mydatabase bak_*

但这不起作用。最好的方法是什么?谢谢!

编辑:是的,我可以明确列出要包含的 70 个表或要排除的 ~430 个表,但如果可能的话,我正在寻找更好的方法。

【问题讨论】:

  • 答案是通过查询选择该表并使用 mysqldump 传递该查询,因为 mysqldump 不支持正则表达式,谢谢祝你好运
  • 我想你的问题的答案在这里:stackoverflow.com/questions/2949330/…
  • @minaz 给出的答案显然比当前标记为最佳的答案要好。如果您当然同意,将有助于将其标记为更好。

标签: mysql mysqldump


【解决方案1】:

您可以在命令行上一个接一个地指定表名,但不能使用通配符。 mysqldump databasename table1 table2 table3

你也可以使用--ignore-table,如果这样更短的话。

另一个想法是将表格放入文件中

mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'bak_%'" > tables.txt 

编辑文件并将所有数据库放在一行中。然后做

mysqldump dbname `cat tables.txt` > dump_file.sql

要将表格放在一行中(不推荐),您可以执行以下操作

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"

【讨论】:

  • 但无论哪种方式,我都必须列出要忽略的 70 个表或要包含的 430 个表。这是我试图避免做的事情。我的问题应该更清楚,但感谢您的回答。这会起作用的,是的;)
  • 另一个想法是将表格放入一个文件中,例如mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txt 编辑该文件并将所有数据库放在一行中。然后做mysqldump dbname `cat tables.txt`
  • 我最终只是删除了 bak_ 表,但我仍然使用它来获取表列表。然后我用逗号将它们放在一起,创建了一个大的 DROP TABLE 语句gawk '{print $1"," }' tables.txt > baktables.sql。谢谢!
  • 有什么方法可以在单行中做到这一点?即:不使用临时文件作为中介?
  • 这样就可以了mysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
【解决方案2】:

这是一个简单的方法:

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]

【讨论】:

  • 它应该是 show tables like "<prefix>\_%" 因为 _ 也是一个通配符并且应该被转义......否则你可能会遇到具有相同前缀的表的问题,如 bak_ 和 bak2_匹配bak_%
  • 您可以将 -N 传递给 mysql,而无需运行 grep 来过滤掉 Tables_in 行。
  • 为我工作,但使用 mysql -NB。
  • 如果show tables like "bak\_%" 什么都不返回,所有的数据库都被转储。有什么办法可以防止这种情况发生?
【解决方案3】:

我最喜欢的:

mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql

所有答案都采用几乎相同的方法,但这是最简洁的语法。

【讨论】:

  • 对于那些好奇的人,这些标志是 -B 批处理 -e 执行 -s 静默模式(较少输出)dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html
  • 我喜欢这个。我已经多次回来这里抢这个sn-p!
  • 小问题:您可能需要为 mysqldump 和 mysql 命令填写用户名和密码参数。如果 mysql 调用失败,mysqldump 默认转储整个数据库,这可能会很大,尤其是在您倾向于只转储数据子集的情况下。
  • 这不起作用mysql -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" -N -e 'show databases like "auth\_%"' | xargs mysqldump -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" > test
【解决方案4】:

这对我有用

mysqldump -u USER -p DATABASE $(mysql -u USER -p -D DATABASE -Bse "show tables like 'PREFIX%'") > /tmp/DATABASE.sql

【讨论】:

    【解决方案5】:

    另一个使用mysql -sN … 提取表名列表的单行器,然后在“for ... in ...” shell 循环中使用每个项目来删除它们:

    for f in `mysql dbname -sN -e "SHOW TABLES LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done
    

    或(扩展版)

    for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done
    

    或者使用“group_concat”连接*表的名称,如果它们足够短的话:

    tables=`mysql dbname -srN -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ',') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'  AND TABLE_NAME LIKE 'bak\_%' "`; mysql dbname -rsN -e "DROP TABLE $tables"
    

    *一些限制,如“group_concat_max_len”的值(通常等于 1024,参见您的 70 个表)可能会干扰。


    原理相同,但用于转储除以“bak_”开头的表之外的所有表:

    for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND NOT(TABLE_NAME LIKE 'bak\_%') "` ; do mysqldump -u [u] -p dbname "$f" >> dump_dbname.sql; done
    

    【讨论】:

      【解决方案6】:

      已经有很多好的答案了,但我是带着这样的变化来到这里的:

      mysql MY_DATABASE -N -u MY_MYSQLUSER -p -e 'show tables like "%MY_LIKE_CODE%";' |
      xargs mysqldump MY_DATABASE -u MY_MYSQLUSER -p |
      gzip > ~/backup/`date +%Y%m%d:::%H:%M:%S-MY_DAMP.sql.gz`
      

      通过此操作,我通过掩码 like %mask% 从数据库将表转储到单个文件。 希望有人会觉得它有用。

      【讨论】:

        【解决方案7】:

        从 MySQL 5.7 开始,mysqlpump 工具支持使用模式过滤表名。

        请注意,它是一个半生不熟的工具,因此您需要确保它支持所需的功能,并且能够正确执行它们(例如,从 MySQL 5.7.12 开始,触发器导出已损坏)。

        【讨论】:

        • 原来“mysqlpump”不是错字。 dev.mysql.com/doc/refman/5.7/en/mysqlpump.html。是的, --include-tables abc% 选项确实允许使用通配符指定要转储的表。但似乎没有办法让 mysqlpump 排除视图。是的,确实是半生不熟。
        • 我随机遇到了段错误(mysql 8),所以它可能比发布版本更 alpha
        【解决方案8】:

        在此处其他一些不错的答案的基础上,我创建了 shell 脚本以使其更加容易。该脚本在输出中生成 3 个文件 - 一个包含所有表的结构,一个包含所有非排除表的数据,一个包含所有“排除”表的数据(如果你真的不这样做,你可以注释掉)不需要它)。然后你可以使用你需要的。

        #!/bin/bash
        
        echo -n "DB Password: "
        read -s PASSWORD
        
        HOST=yourhostname.com
        USER=youruser
        DATABASE=yourdatabase
        
        MAIN_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES WHERE Tables_in_dashboard NOT LIKE 'bigtable_%';")
        STATS_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES LIKE 'bigtable_%';")
        
        echo "Dumping structure..."
        mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-data | gzip > structure.sql.gz
        
        echo "Dumping main data..."
        mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $MAIN_TABLES | gzip > data.sql.gz
        
        echo "Dumping big table data..."
        mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $STATS_TABLES | gzip > big_table_data.sql.gz
        

        【讨论】:

          【解决方案9】:

          我的解决方案:

          mysqldump -u username -p mydatabase `mysql -B --disable-column-names -u username -p mydatabase -e "SHOW TABLES LIKE 'bak\_%'" | sed ':a;N;$!ba;s/\n/ /g'`
          

          【讨论】:

          • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请编辑您的答案以添加一些解释,包括您所做的假设。
          【解决方案10】:
          mysql DATABASE -u USERNAME -p -e 'show tables like "PREFIX%"' | grep -v Tables_in | xargs mysqldump DATABASE -u USERNAME -p > DUMP.sql
          

          【讨论】:

          • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请编辑您的答案以添加一些解释,包括您所做的假设。
          猜你喜欢
          • 1970-01-01
          • 2010-09-30
          • 1970-01-01
          • 2011-07-03
          • 2016-12-07
          • 2012-07-25
          • 2010-09-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多