正确做法是先用SHOW TABLES LIKE 'myapp\_%'查表名,再通过命令替换传给mysqldump:mysqldump -u user -p yourdb $(mysql -Nse "SHOW TABLES LIKE 'myapp\_%'" yourdb) > dump.sql。
MySQL 用 SHOW TABLES LIKE 筛出带前缀的表名
导出特定前缀的表,第一步不是直接 mysqldump,而是先确认哪些表真正在库中匹配。mysql 不支持 mysqldump 命令里直接写通配符(比如 myapp_*),硬写会报错:unknown table 'myapp_*' in database。
正确做法是先查出表名列表:
SHOW TABLES LIKE 'myapp_%';
注意单引号、下划线 _ 是单字符通配符,百分号 % 才是任意长度——想匹配 myapp_user_v1、myapp_order_log,必须用 %;如果误写成 myapp__%(两个下划线),就漏掉所有中间没下划线的表。
-
LIKE区分大小写取决于数据库排序规则(如utf8mb4_0900_as_cs就区分) - 想忽略大小写,统一用小写前缀查询,或改用正则:
SHOW TABLES WHERE Tables_in_yourdb REGEXP '^myapp_' - 结果只是表名列表,不带库名;跨库操作时得先
USE yourdb或在后续 dump 中显式指定库
用 shell 命令拼接表名传给 mysqldump
MySQL 自身不支持通配符导出,得靠 shell 把 SHOW TABLES 的结果转成空格分隔的表名列表,再喂给 mysqldump。
常见错误是直接管道传输出错:
mysql -Nse "SHOW TABLES LIKE 'myapp_%'" yourdb | mysqldump -u user -p yourdb > dump.sql
这行不通——mysqldump 读不到管道里的表名,它只认命令行参数里的表名。
- 正确写法是用命令替换:
mysqldump -u user -p yourdb $(mysql -Nse "SHOW TABLES LIKE 'myapp_%'" yourdb) > dump.sql
-
-N去掉列名,-s强制一行一表,避免空格/换行干扰 - 如果表名含特殊字符(如短横线),加
--skip-quote-names或确保 shell 环境不解析空格(实际中极少遇到,但生产环境建议加引号包裹变量) - 表太多时,命令行长度可能超限(Linux 一般 2MB),这时得改用
--tables+ 文件输入模式
PostgreSQL 怎么办:用 \dt + pg_dump 的 -t 参数
PostgreSQL 没有 LIKE 语法直接筛表,但 \dt 元命令支持 POSIX 正则:\dt 'myapp_*'。不过这只是 psql 里看,不能直接喂给 pg_dump。
pg_dump 的 -t 参数接受模式,但注意:它用的是 SQL LIKE 语义,不是 shell 通配,所以 -t 'myapp_%' 可以,-t 'myapp_*' 会失败。
- 安全写法:
pg_dump -U user -d yourdb -t 'myapp\_%' --schema-only > schema.sql
(注意下划线要转义) - 多个表用多个
-t:pg_dump -t 'myapp_users' -t 'myapp_orders' ...,没法一条命令自动展开 - 真要批量,还是得靠 psql 查表名再拼:
psql -t -c "SELECT tablename FROM pg_tables WHERE schemaname='public' AND tablename LIKE 'myapp_%';" yourdb | xargs -I{} pg_dump -t {} yourdb
导出时漏数据?检查 mysqldump 默认行为
即使表名全对上了,导出文件也可能缺内容——比如没数据、没建表语句、或者外键约束被跳过。
默认 mysqldump 只导结构,不导数据;很多人以为“导出了”其实只有 CREATE TABLE。
- 加
--no-data是明确不要数据,不加才导数据;但如果你加了--no-create-info,就只剩 INSERT,没 CREATE - 跨表依赖(如外键)默认开启
--add-drop-table和--disable-keys,但如果目标库版本低,DISABLE KEYS会报错,得加--skip-disable-keys - 字符集容易丢:显式加
--default-character-set=utf8mb4,否则可能用服务端默认(如 latin1),导入时乱码
通配符选表本身不难,难的是把筛选结果干净地喂进 dump 工具,同时不踩默认参数的坑。尤其是表名带下划线、数量过百、或需要保留部分结构而删减其他内容时,手动拼接或脚本化几乎是唯一靠谱路子。










