必须加--databases选项,否则mysqldump会误将首个表名当数据库名;正确写法为mysqldump -u user -p --databases db1 --tables t_user t_order > backup.sql,且--tables仅作用于前一个--databases指定的单库,跨库需分次执行。

只备份指定表时必须加 --databases 选项
直接执行 mysqldump -u user -p db1 table1 table2 看似合理,但实际会失败:mysqldump 会把 table1 当作数据库名,table2 当作表名,而 db1 反被忽略。根本原因是 mysqldump 的语法解析规则——不带 --databases(或 -B)时,它只接受「一个数据库名 + 零个或多个表名」的结构,且**表名列表必须紧跟在数据库名之后、中间不能有其他选项**。
正确写法是显式带上 --databases:
mysqldump -u backup -p --databases db1 --tables t_user t_order > db1_partial.sql
注意这里 --databases db1 和 --tables t_user t_order 是两个独立参数,顺序不能颠倒;--tables 会覆盖默认行为,强制只导出列出的表,即使库中还有其他表。
--tables 参数不支持跨库备份
--tables 只作用于紧邻其前的单个数据库(由 --databases 指定),无法一次备份 db1.t1 和 db2.t2。若强行写成:
mysqldump -u backup -p --databases db1 db2 --tables t1 t2
结果只会备份 db1 中的 t1 和 t2(如果存在),db2 的表完全被忽略——因为 --tables 不具备“按库分组”的语义。
跨库部分备份只能分多次执行:
mysqldump -u backup -p --databases db1 --tables t1 > db1_t1.sqlmysqldump -u backup -p --databases db2 --tables t2 > db2_t2.sql
或者用脚本循环处理,避免手动拼接错误。
备份用户权限必须覆盖目标表
即使你指定了 --tables t_user t_order,如果备份账号对其中某张表没有 SELECT 权限,mysqldump 会直接报错退出,例如:
mysqldump: Got error: 1142: SELECT command denied to user 'backup'@'localhost' for table 't_config'
这不是警告,而是中断性错误。MySQL 8.0 默认启用 sql_mode=STRICT_TRANS_TABLES,权限校验更严格。解决方法只有两个:
- 给备份账号授予对应表的
SELECT权限:GRANT SELECT ON db1.t_user TO 'backup'@'localhost'; - 改用更高权限账号(如
root),但不推荐用于日常备份任务
注意:SHOW VIEW、TRIGGER 权限也建议一并赋予,否则视图或触发器可能无法完整导出。
导出文件不含 CREATE DATABASE,恢复时需手动建库
用 --databases db1 --tables t1 t2 备份出来的 SQL 文件里,开头**没有 CREATE DATABASE 或 USE db1 语句**。这是设计如此:因为 --databases 仅控制导出范围,不控制输出格式;真正决定是否生成 CREATE DATABASE 的是「是否在 --databases 后面显式列出数据库名」这一动作本身——但 --tables 会抑制该行为。
所以恢复时不能直接 mysql -u user -p ,否则会报错 <code>Unknown database 'db1'。必须先确保目标库存在:
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS db1 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci";
再导入:
mysql -u user -p db1 <p>这个细节极易被忽略,尤其当备份脚本和恢复脚本由不同人维护时。</p>











