凌晨的备份脚本跑完,db.sql 只有 1KB,打开一看是 mysqldump: Got error: 1044: Access denied。mysql dump 出问题,多数时候卡在权限和参数上,不是磁盘满了。1045 是账号密码错,1044 是库级权限不够,两个错误码别搞混。

单库导出的基本写法:

mysqldump -u root -p --single-transaction --routines --triggers --result-file=db.sql dbname

InnoDB 表加 --single-transaction 能拿到一致性快照,且不锁表;MyISAM 不支持事务,只能靠 --lock-tables。库里两种引擎混用,备份时间要挑低峰。

恢复别直接覆盖生产库

先建空库,再进 mysql 客户端执行 source /data/db.sql。文件大时用 --quick 导,别一次性读进内存。字符集用 --default-character-set=utf8mb4,和源库保持一致,否则中文变问号。

几个参数的实际区别

--databases 会在文件里写 CREATE DATABASE 和 USE,恢复时不用先建库;只写库名则不带。--routines 和 --triggers 分别管存储过程、触发器,默认不带,丢了很麻烦。

--ignore-table 可以跳过日志表,格式是 库名.表名,多个就写多次。大表多的库,备份前先看 information_schema 里的数据量,心里有数。

定时任务里的密码问题

脚本里直接写 -p密码 会留在 history 和进程列表里。用 --defaults-extra-file 指向一个权限 600 的配置文件,把账号密码放进去,相对稳妥。

文件大可以加 --compress,网络传输省时间,CPU 会多耗一点。备份完一定做一次恢复演练。mysql dump 出来的文件能不能用,只有真正导回去才知道,别等出事才验证,这一步最值钱,也最容易省。