mysqldump 备份单表必须指定数据库名,如 mysqldump mydb users > users.sql;仅用表名会报“no database selected”错误。常用参数:--no-data(只导结构)、--no-create-info(只导数据)、--single-transaction(InnoDB一致性快照,防锁表)。

mysqldump 备份单表时必须指定数据库名
直接运行 mysqldump table_name 会报错 mysqldump: no database selected。MySQL 要求 mysqldump 必须明确知道表属于哪个库,哪怕只导一个表,也得带上库名:mysqldump mydb users > users.sql。
常见错误是误以为“表级备份”可以脱离库上下文,结果卡在命令语法上。实际中建议始终用 database.table 形式显式指定,避免歧义。
只导结构不导数据用 --no-data,只导数据用 --no-create-info
表级备份常用于迁移结构或重放数据,这两个参数控制输出内容边界:
-
--no-data:生成CREATE TABLE语句,不含INSERT -
--no-create-info:跳过建表语句,只输出INSERT(需确保目标库已有同名表) - 搭配
--skip-triggers或--skip-routines可排除触发器/存储过程,防止跨环境冲突
例如迁移用户数据到测试库但保留原表结构:mysqldump --no-create-info mydb users > users_data.sql。
大表备份加 --single-transaction 防锁表,但仅对 InnoDB 有效
默认 mysqldump 执行 FLUSH TABLES WITH READ LOCK,会阻塞写入。对线上业务表,必须加 --single-transaction 启用一致性快照——但这只在 InnoDB 表上生效。
MyISAM 表无法使用该参数,强行加会导致警告并退回到全局读锁;如果遇到 MyISAM 表且不能停写,只能考虑 mysqlhotcopy(已弃用)或文件系统快照。
安全做法是先确认引擎:SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA='mydb' AND TABLE_NAME='users';。
恢复单表要先创建库,且注意字符集和 SQL 模式差异
用 mysql mydb 恢复前,<code>mydb 必须存在。如果备份文件里没有 CREATE DATABASE,直接恢复会报 Unknown database 'mydb'。
更隐蔽的问题是字符集不一致:若源库用 utf8mb4_unicode_ci,目标库默认是 latin1_swedish_ci,导入后中文变问号;建议在恢复命令里显式指定:mysql --default-character-set=utf8mb4 mydb 。
另外,若备份时启用了 STRICT_TRANS_TABLES,而目标实例未启用,某些非法数据可能插入失败——检查 sql_mode 是否匹配比看数据更重要。










