mysqldump不能直接指定多个分库分表;它仅支持单库多表(db table1 table2)或全库备份(--databases db1 db2),跨库分散表需逐库构造命令或脚本聚合;排除日志表应结合information_schema查询与shell过滤生成--ignore-table参数,格式为db_name.table_name且大小写敏感。

mysqldump 能否直接指定多个分库分表?
不能。mysqldump 原生不支持“按表名通配符跨库导出”或“一次命令精确指定若干个分散在不同库中的表”。它只接受 --databases db1 db2(全库)或 db_name table1 table2(单库多表)这种结构。所谓“分库分表”的物理表如果分布在 order_db_01、user_db_02 等多个库中,就必须逐库构造命令,或用脚本聚合。
如何排除日志类表(如 *_log、*_history)?
靠 --ignore-table 手动列太脆弱,尤其表数量多时易漏。更可靠的方式是结合 mysql 查询 + shell 过滤生成待备份表列表,再喂给 mysqldump。关键点:
-
--ignore-table必须写成db_name.table_name格式,大小写敏感,且每个表需单独一个参数 - 日志表通常有命名规律,可用
LIKE匹配:SELECT table_schema, table_name FROM information_schema.tables WHERE table_name LIKE '%_log' OR table_name LIKE '%_history' - 实际执行前建议先用
echo检查生成的--ignore-table参数串是否符合预期
推荐的分库分表备份脚本骨架
以下 shell 片段可复用,核心是:先查出所有目标库,再对每个库查出需保留的表(排除日志表),最后拼成 mysqldump 命令:
#!/bin/bash
USER="backup_user"
PASS="xxx"
HOST="127.0.0.1"
PORT="3306"
<h1>指定要备份的库名(分库后缀)</h1><p>TARGET_DB_PATTERNS=("order<em>db</em>%", "user<em>db</em>%", "pay<em>db</em>%")</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill10629" title="kashen-mysql DDLtoExcel"><img
src="https://img.php.cn/upload/skill/001/246/273/6adaf20e352aa140.jpg" alt="kashen-mysql DDLtoExcel" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill10629" title="kashen-mysql DDLtoExcel" class="overflowclass">kashen-mysql DDLtoExcel</a>
<p class="overflowclass">解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。</p>
</div>
<a rel="nofollow" href="/xiazai/skill10629" title="kashen-mysql DDLtoExcel" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><h1>构建 --ignore-table 列表(全局排除日志表)</h1><p>IGNORE_LIST=$(mysql -u$USER -p$PASS -h$HOST -P$PORT -Nse "
SELECT CONCAT('--ignore-table=', table_schema, '.', table_name)
FROM information_schema.tables
WHERE (table_name LIKE '%_log' OR table_name LIKE '%_history')
AND table_schema LIKE 'order<em>db</em>%'
OR table_schema LIKE 'user<em>db</em>%'
OR table_schema LIKE 'pay<em>db</em>%'
")</p><h1>对每个匹配的库,导出其非日志表</h1><p>for pattern in "${TARGET_DB_PATTERNS[@]}"; do
DBS=$(mysql -u$USER -p$PASS -h$HOST -P$PORT -Nse "
SELECT schema_name FROM information_schema.schemata
WHERE schema_name LIKE '$pattern'"
)
for db in $DBS; do</p><h1>获取该库下所有非日志表</h1><pre class="brush:php;toolbar:false;">TABLES=$(mysql -u$USER -p$PASS -h$HOST -P$PORT -Nse "
SELECT table_name FROM information_schema.tables
WHERE table_schema='$db'
AND table_name NOT LIKE '%_log'
AND table_name NOT LIKE '%_history'"
)
if [ -n "$TABLES" ]; then
echo "Dumping $db: $TABLES"
mysqldump -u$USER -p$PASS -h$HOST -P$PORT $db $TABLES $IGNORE_LIST > "/backup/${db}_$(date +%Y%m%d).sql"
fi
done done
容易被忽略的权限与性能问题
备份账号至少需要:SELECT(所有目标表)、LOCK TABLES(默认启用,若加 --single-transaction 可降级为 RELOAD)、SHOW VIEW(如有视图)。另外:
- 大表导出时务必加
--single-transaction避免锁表,但仅对 InnoDB 有效;MyISAM 表仍会锁 -
mysqldump默认不导出CREATE DATABASE语句,若目标库可能不存在,需加--databases并显式列出库名 - 排除日志表后,
mysqldump仍会读取其元数据(information_schema 查询开销小),但不会导出数据 —— 这点常被误认为“没生效”
真正麻烦的是跨库表依赖(比如分库后公共字典表在 sys_db),这类表得单独加到备份列表里,脚本里不处理,得人工核对。










