当数据库某张数据量非常大的表进行其他操作,需要先进行导出时;
先用linux进入操作环境,
1.添加一个export_mysql_batches.sh脚本文件,
#!/bin/bash
# 数据库连接配置
DB_HOST="36.33.0.138:3306"
DB_USER="devuser"
DB_PASS="rntec@mes1"
DB_NAME="rntec"
TABLE="prod_line_oper_log_history"
# 分批设置
BATCH_SIZE=100000
OUTPUT_DIR="/home/output" # 设置输出目录
# 创建输出目录
mkdir -p "$OUTPUT_DIR"
# 获取总行数
TOTAL_ROWS=$(mysql -h$DB_HOST -u$DB_USER -p$DB_PASS -e "SELECT COUNT(*) FROM $DB_NAME.$TABLE" -s)
# 计算总批次数
BATCHES=$(( ($TOTAL_ROWS + $BATCH_SIZE - 1) / $BATCH_SIZE ))
# 记录开始时间
START_TIME=$(date +"%Y-%m-%d %H:%M:%S")
echo "[$START_TIME] 开始导出 $TABLE 表数据,共 $TOTAL_ROWS 行,分 $BATCHES 批导出..."
# 循环分批导出
for (( i=0; i<$BATCHES; i++ ))
do
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
OFFSET=$(( $i * $BATCH_SIZE ))
OUTPUT_FILE="$OUTPUT_DIR/${TABLE}_batch_$(printf "%04d" $i).sql"
echo "[$CURRENT_TIME] 正在导出第 $((i+1))/$BATCHES 批 (OFFSET $OFFSET)..."
mysqldump -h$DB_HOST -u$DB_USER -p$DB_PASS \
--no-create-info \
--no-tablespaces \
--skip-triggers \
--compact \
--where="1 LIMIT $BATCH_SIZE OFFSET $OFFSET" \
$DB_NAME $TABLE > "$OUTPUT_FILE"
# 检查文件是否生成成功
if [ -s "$OUTPUT_FILE" ]; then
echo "成功导出到 $OUTPUT_FILE"
else
echo "警告: $OUTPUT_FILE 为空或未创建"
fi
done
# 记录结束时间
END_TIME=$(date +"%Y-%m-%d %H:%M:%S")
echo "[$END_TIME] 所有批次导出完成!文件保存在 $OUTPUT_DIR"
2.修改数据库连接参数和表名;
3.给脚本执行权限:chmod +x export_mysql_batches.sh;
4.使用 nohup ./export_mysql_batches.sh & 让脚本在后台运行。