跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

mysql备份脚本执行失败如何排查_分析mysqldump日志文件

mysqldump报错默认不写入日志,需显式重定向stderr(如2>dump.err)才能捕获错误;常见错误包括权限不足、锁超时、表名非法、磁盘满等;--log-error无效于客户端错误,脚本中应检查$?并校验变量。 mysql dump 报错时日志里看不到具体错误? 默认情况下
mysqldump
错误直接输出到 stderr,不写入日志文件——你看到的“空日志”或“只有成功语句”,大概率是因为没捕获 stderr。要真看报错,必须显式重定向:
mysqldump -u root -p db_name 2>&1 > backup.sql
或者更稳妥地分开记录:
mysqldump -u root -p db_name > backup.sql 2> dump.err
。否则
dump.err
为空,
backup.sql
可能是截断的半成品,还带不了上下文。 常见 dump.err 中的关键错误信息怎么读 打开
dump.err
后别从头扫,先搜这几类关键词:
Access denied for user
:账号没权限,重点查
SELECT
、
LOCK TABLES
、
SHOW VIEW
权限,不是光有
USAGE
就行
Couldn't execute 'SELECT ...': Lock wait timeout exceeded
:表被长事务锁住,不是加
--single-transaction
就能绕过,得确认 MySQL 版本支持(5.6+)、引擎是 InnoDB,且没在执行 DDL
Unknown table 'xxx' in information_schema
:库名或表名含特殊字符(比如中划线、空格),必须用反引号包裹,但
mysqldump
自动加的反引号有时会失效,可试加
--skip-quote-names
再手动处理
Got errno 32 on write
:磁盘满或
backup.sql
所在目录不可写,注意检查
df -h
和父目录权限,不是 MySQL 用户权限问题 为什么加了 --log-error 还没日志?
mysqldump
的
--log-error
参数只控制「服务端错误日志」的路径,它不接管客户端自身的报错(比如连接失败、参数错误、权限拒绝)。这个参数实际作用非常有限,日常排查基本用不上。真正该盯的是命令行重定向结果,而不是依赖它。另外,如果用了
--defaults-extra-file
指定配置文件,记得检查该文件里有没有意外覆盖了
user
或
password
,这类静默覆盖会导致
Access denied
却不提示哪行配置出问题。 MySQL(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载 备份脚本里如何让错误立刻中断并暴露出来 别靠肉眼翻日志,脚本里加两行就稳得多: 用
set -e
让任意命令失败直接退出(注意兼容性,部分老 shell 需用
set -o errexit
) 执行后立刻检查
$?
:
mysqldump -u $USER -p$PASS mydb > out.sql 2> err.log
if [ $? -ne 0 ]; then echo "Dump failed"; cat err.log; exit 1; fi
关键点:
mysqldump
成功时返回 0,但部分错误(如部分表导出失败)可能仍返回 0 —— 此时得靠
err.log
是否为空或 grep 错误关键词来兜底 最常被忽略的是:脚本里用了变量传密码,但变量为空时
mysqldump
会交互式等输入,导致卡住;务必在执行前校验
[ -z "$PASS" ]
并提前报错。

相关文章