数据库mysqldump导出 老是出错的解决办法

Posted on 2026-01-18 22:35  黔人阿诺  阅读(2)  评论(0)    收藏  举报
 
#数据库mysqldump导出 老是出错的解决办法
#大表导出 防超时关健配置
[mysqld]
 net_read_timeout = 600
 net_write_timeout = 600
 wait_timeout = 28800
 interactive_timeout = 28800
 max_execution_time = 0     #最关健
 
######【导出代码开始】#######
#!/bin/bash
#database_mysqldump.sh
#chmod +x database_mysqldump.sh
#nohup ./database_mysqldump.sh > /dev/null 2>&1 & 
 
DATE=$(date +%Y-%m-%d_%H-%M-%S)
LOGDIR="/www/wwwroot/mysql/db/logs"
mkdir -p "$LOGDIR"
 
# 执行 mysqldump 不压缩
mysqldump \
  --opt --hex-blob --single-transaction --quick --skip-lock-tables \
  --routines --events --triggers --skip-add-locks --skip-comments \
  --max-allowed-packet=2G --net-buffer-length=16M \
  --default-character-set=utf8mb4 --force \
  --lock-tables=false \
  --host=localhost --port=3306 \
  --user=root --password='密码' 数据库名 \
  2> "$LOGDIR/backup_detail_${DATE}.log" \
  > "$LOGDIR/../${DATE}.sql"   # 这里不进行压缩,直接输出为 .sql 文件
 
# 备份完成后记录
echo "Backup finished at $(date)" >> "$LOGDIR/backup_main_${DATE}.log" 
######【导出代码结束】#######
# backup_detail_${DATE}.log  为错误信息 如果没有错误说明成功
#"$LOGDIR/backup_main_${DATE}.log" 成功信息 + 上面没有错误 =成功 (最好在按下面提示再确认)
 
#开始 
chmod +x database_mysqldump.sh
nohup ./database_mysqldump.sh > /dev/null 2>&1 &
 
 
[root@localhost ~]# 
[root@localhost db]# chmod +x database_mysqldump.sh
[root@localhost db]# nohup ./database_mysqldump.sh > /dev/null 2>&1 &
[1] 389284
[root@localhost db]# 
 
#下面为检查 检测 
ps aux | grep mysqldump 
 
#超时会在有多行的表上出错如下 
mysqldump: Error 3024: Query execution was interrupted, maximum statement execution time exceeded when dumping table `cache` at row: 20545622
mysqldump: Error 3024: Query execution was interrupted, maximum statement execution time exceeded when dumping table `member` at row: 4301385
 
 
#信息确认 查 db.sql所有 的表名 【大SQL会卡死】
grep -oP "CREATE TABLE `\K[^`]+" db.sql > table_list.txt
#兼容性更高
grep "CREATE TABLE \`" database.sql | awk -F'`' '{print $2}' > table_list.txt
 
 
#信息确认 查 db.sql所有最后几项 的表名 【防卡死】
#按字节读取最后 1GB
tail -c 1G database.sql | grep "CREATE TABLE \`" | cut -d'`' -f2
#方法 B:按行读取最后 N 行(例如 20000 行)
tail -n 20000 database.sql | grep "CREATE TABLE \`" | cut -d'`' -f2