mysqldump忽略带通配符的表


8

我需要对包含50个奇数表的数据库进行转储,我想排除其中约有前缀的15个奇数 exam_

我尝试过mysqldump --ignore-table=dbname.exam_* ,甚至尝试过--ignore-table=dbname.exam_% 它没有按预期工作。我不得不使用--ignore-table多次。

编辑:我已经看到了一些列出tables not like tablename_%并传递给的shell脚本mysqldump

但是,我想知道mysqldump或mysql中是否有一个选项,因此无需编写脚本即可执行相同的操作。

编辑添加:最终使用脚本ignore-table=多次转储数据库(不包括表)。


您可以发布您使用的脚本吗?也许在gist.github.com上
rubo77

@ rubo77:我没有该脚本了。这是一个基本的脚本。使用mysql命令,我得到了要排除的表的列表。将该列表硬编码到BASH脚本中,以便在需要时生成转储。对我来说幸运的是,这个清单是不变的。或者,此处发布的解决方案 对于脚本编制可能是有用的。
阿努普

更好的是: TABLES=`mysql --skip-column-names [DB-NAME] -e 'show tables' | grep -v 'exam_'` mysqldump [DB-NAME] $TABLES > mysqldump.sql
anup

Answers:


13

不,文档中没有这样的选项mysqldump,如文档所述

--ignore-table = db_name.tbl_name

不要转储给定的表,必须同时使用
数据库名和表名指定该表。要忽略多个表,请多次使用此选项
。此选项也可用于忽略视图。


mysqldump --all-databases顺便说一句,可能值得创建一个无权访问这些表的mysql dump用户,然后尝试仅查看其是否出错,或者仅跳至下一个dDB
。。– NickW

还没有尝试过,但是听起来不错。至于解决方案,我编写了一个shell脚本来避免使用表。
2013年

@NickW可能有效。但是,如果要获得更大的灵活性,则需要执行单独的查询以获取表名称。请参阅下面的答案。
Buttle Butkus

快速又肮脏的版本:复制数据库。使用phpMyAdmin的Web界面轻松删除您不想看到的表。然后转储,不需要通配符。如果您想执行CLI,并且不介意进行第三步sitepoint.com/community/t/drop-tables-with-wildcard/18537/4
TheSatinKnight

3

您可以从mysql获取所需的表名,然后使用它们来构建mysql dump参数。

在下面的示例中,只需将“ someprefix”替换为您的前缀(例如“ exam_”)即可。

SHOW TABLES查询可以改变,以寻找其他的套表。或者,您可以对INFORMATION_SCHEMA表使用查询以使用更多条件。

#/bin/bash

#this could be improved but it works
read -p "Mysql username and password" user pass

#specify your database, e.g. "mydb"
DB="mydb"

SQL_STRING='SHOW TABLES LIKE "someprefix%";'
DBS=$(echo $SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#next two lines untested, but intended to add a second excluded table prefix
#ANOTHER_SQL_STRING='SHOW TABLES LIKE "otherprefix%";'
#DBS="$DBS""\n"$(echo $ANOTHER_SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#-B is for batch - tab-separated columns, newlines between rows
#-s is for silent - produce less output
#both result in escaping special characters

#but the following might not work if you have special characters in your table names
IFS=$'\n' read -r -a TABLES <<< $DBS

IGNORE="--ignore_table="$DB"."
IGNORE_TABLES=""

for table in $TABLES; do
        IGNORE_TABLES=$IGNORE_TABLES" --ignore_table="$DB"."$table
done

#Now you have a string in $IGNORE_TABLES like this: "--ignore_table=someprefix1 --ignore_table=someprefix2 ..."

mysqldump $DB --routines -u $user -p$pass $IGNORE_TABLES > specialdump.sql

这是在有关获取“ bash中所有表除外”的答案的帮助下构建的:https : //stackoverflow.com/a/9232076/631764

以及有关跳过使用一些bash的表的答案:https : //stackoverflow.com/a/425172/631764


根据所选答案,我编写了一个与您的答案相似的脚本。感谢您提出来。编辑:只是记得我在管道和grep排除模式中使用了两个命令。
anup

0

我认为使用这样做information_schema是一个不错的选择。

select group_concat(concat('--ignore-table=', TABLE_SCHEMA, '.', table_name) SEPARATOR ' ') 
from information_schema.tables 
where TABLE_SCHEMA = 'Actual_DB_NAME' and TABLE_NAME like 'Actual_TABLE_NAME%';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.