备份单个数据库时必须指定数据库名,漏写会报错“Got error: 1046: No database selected”;标准格式为mysqldump -u root -p 数据库名 > backup.sql,-p后不可有空格,数据库名含特殊字符需用反引号包裹。

备份单个数据库时,mysqldump 命令必须带数据库名,不能漏掉
漏掉数据库名会报错 mysqldump: Got error: 1046: No database selected。命令格式固定为:mysqldump -u root -p 数据库名 > backup.sql。注意:-p 后**不能有空格**,否则会被当作密码的一部分;如果省略密码(即只写 -p),执行后会交互式提示输入,更安全。
- 确保当前用户对目标数据库有
SELECT权限,否则导出中断或缺失表 - 若数据库名含特殊字符(如短横线
-),需用反引号包裹:mysqldump -u root -p `my-db` > backup.sql - 导出文件默认不含
CREATE DATABASE语句,恢复时需手动建库或加--databases参数
只备份指定表,表名必须跟在数据库名后面,顺序不能颠倒
mysqldump 的参数顺序是刚性的:用户名、密码、数据库名、**然后才是表名列表**。写成 mysqldump -u root -p users orders test_db 是错的,会导致 Unknown database 'users' 错误。
- 正确写法:
mysqldump -u root -p test_db users orders > tables_backup.sql - 多个表之间用空格分隔,**不能用逗号或引号包裹**(除非表名含空格,才用反引号:
`user info`) - 如果某张表不存在,
mysqldump默认继续导出其余表,但会输出警告;加--force可抑制错误退出
导出结构不带数据,或只导数据不建表,靠 --no-data 和 --no-create-info
日常运维中常需要分离结构与数据。比如迁移前校验表结构,或重放某段时间的变更日志——这时不能让 CREATE TABLE 和 INSERT 混在一起。
- 仅结构(无数据):
mysqldump -u root -p --no-data test_db > schema_only.sql - 仅数据(跳过建表语句):
mysqldump -u root -p --no-create-info test_db users > data_only.sql - 二者都不要?那不如直接
SELECT INTO OUTFILE,mysqldump不支持“纯裸数据”模式
大表备份卡住或失败,加 --single-transaction 和 --quick
InnoDB 表在不加事务控制时,mysqldump 可能锁表或内存溢出,尤其在高并发写入场景下。默认行为对一致性没保障,容易导出半截数据。
-
--single-transaction:对 InnoDB 表开启一致性快照,避免锁表(MyISAM 不支持) -
--quick:逐行读取而非缓存整表,防 OOM;和--single-transaction配合最稳妥 - 别用
--lock-tables(默认开启),它会让整个数据库只读,线上环境慎用
CREATE DATABASE 语句是否存在——这些细节决定一次备份到底能不能救回来。


















