测试和生产脚本样例参考
# 脚本样例
# 测试环境导出批量表
#!/bin/bash
# MySQL 连接配置
MYSQL_USER="your_username"
MYSQL_PASSWORD="your_password"
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
# 需要导出的表
TABLES=(
"c_aa"
"c_bb"
"c_cc"
"c_dd"
)
# 输出目录
OUTPUT_DIR="./mysql_exports"
mkdir -p "$OUTPUT_DIR"
# 获取所有以 ga 开头的数据库名
DBS=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -h"$MYSQL_HOST" -P"$MYSQL_PORT" -e "SHOW DATABASES LIKE 'ga%';" -s --skip-column-names)
# 遍历每个数据库
for DB in $DBS; do
echo "导出数据库:$DB"
DB_OUTPUT_DIR="$OUTPUT_DIR/$DB"
mkdir -p "$DB_OUTPUT_DIR"
for TABLE in "${TABLES[@]}"; do
echo " 导出表:$TABLE"
mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -h"$MYSQL_HOST" -P"$MYSQL_PORT" "$DB" "$TABLE" > "$DB_OUTPUT_DIR/${TABLE}.sql"
done
done
echo "导出完成。文件保存于 $OUTPUT_DIR"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 生产环境导出批量表
#!/bin/bash
# MySQL数据库批量导出脚本
# 用于导出ga开头数据库中指定表的数据和结构
# 配置区域 - 请根据实际情况修改
MYSQL_USER="your_username"
MYSQL_PASSWORD="your_password"
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
# 数据库服务器列表 - 请根据实际情况修改
DB_SERVERS=(
"server1.example.com"
"server2.example.com"
"server3.example.com"
)
# 需要导出的表列表
TABLES=(
"c_aa"
"c_bb"
"c_cc"
"c_dd"
)
# 输出目录
OUTPUT_DIR="./mysql_exports"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
# 创建输出目录
mkdir -p "$OUTPUT_DIR"
# 日志文件
LOG_FILE="$OUTPUT_DIR/export_log_$TIMESTAMP.txt"
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 检查mysqldump命令是否存在
check_mysqldump() {
if ! command -v mysqldump &> /dev/null; then
log "错误: mysqldump命令未找到,请安装MySQL客户端工具"
exit 1
fi
}
# 获取ga开头的数据库列表
get_ga_databases() {
local host=$1
mysql -h "$host" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" \
-e "SHOW DATABASES LIKE 'ga%';" -s -N 2>/dev/null
}
# 检查表是否存在
table_exists() {
local host=$1
local database=$2
local table=$3
local count=$(mysql -h "$host" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" \
-e "SELECT COUNT(*) FROM information_schema.tables
WHERE table_schema = '$database' AND table_name = '$table';" -s -N 2>/dev/null)
[[ "$count" == "1" ]]
}
# 导出单个表
export_table() {
local host=$1
local database=$2
local table=$3
local output_file=$4
log "导出表: $host -> $database.$table"
# 导出表结构和数据
mysqldump -h "$host" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" \
--single-transaction \
--routines \
--triggers \
--events \
--add-drop-table \
--create-options \
--extended-insert \
--quick \
--lock-tables=false \
"$database" "$table" > "$output_file" 2>/dev/null
if [ $? -eq 0 ]; then
local file_size=$(du -h "$output_file" | cut -f1)
log "成功导出: $output_file (大小: $file_size)"
return 0
else
log "导出失败: $host -> $database.$table"
rm -f "$output_file"
return 1
fi
}
# 导出所有数据库的函数
export_all_databases() {
local host=$1
local host_clean=$(echo "$host" | sed 's/[^a-zA-Z0-9]/_/g')
local host_dir="$OUTPUT_DIR/${host_clean}_$TIMESTAMP"
mkdir -p "$host_dir"
log "开始处理服务器: $host"
# 测试连接
if ! mysql -h "$host" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" \
-e "SELECT 1;" &>/dev/null; then
log "错误: 无法连接到数据库服务器 $host"
return 1
fi
# 获取ga开头的数据库
local databases=$(get_ga_databases "$host")
if [ -z "$databases" ]; then
log "警告: 在服务器 $host 上未找ga开头的数据库"
return 0
fi
log "在服务器 $host 上找到的ga开头数据库: $(echo $databases | tr '\n' ' ')"
local total_tables=0
local exported_tables=0
# 遍历每个数据库
while IFS= read -r database; do
[ -z "$database" ] && continue
log "处理数据库: $database"
local db_dir="$host_dir/$database"
mkdir -p "$db_dir"
# 遍历每个需要导出的表
for table in "${TABLES[@]}"; do
total_tables=$((total_tables + 1))
if table_exists "$host" "$database" "$table"; then
local output_file="$db_dir/${table}.sql"
if export_table "$host" "$database" "$table" "$output_file"; then
exported_tables=$((exported_tables + 1))
fi
else
log "跳过: 表 $database.$table 不存在"
fi
done
done <<< "$databases"
log "服务器 $host 处理完成: 成功导出 $exported_tables/$total_tables 个表"
}
# 主函数
main() {
log "开始MySQL数据库批量导出任务"
log "输出目录: $OUTPUT_DIR"
log "时间戳: $TIMESTAMP"
# 检查必要工具
check_mysqldump
# 检查配置
if [ "$MYSQL_USER" == "your_username" ]; then
log "错误: 请先修改脚本中的数据库连接配置"
exit 1
fi
local total_servers=${#DB_SERVERS[@]}
local processed_servers=0
# 处理每个数据库服务器
for server in "${DB_SERVERS[@]}"; do
export_all_databases "$server"
processed_servers=$((processed_servers + 1))
log "进度: $processed_servers/$total_servers 服务器已处理"
echo
done
log "所有导出任务完成!"
log "导出文件位置: $OUTPUT_DIR"
log "日志文件: $LOG_FILE"
# 显示导出文件统计
local total_files=$(find "$OUTPUT_DIR" -name "*.sql" | wc -l)
local total_size=$(du -sh "$OUTPUT_DIR" 2>/dev/null | cut -f1)
log "统计: 共导出 $total_files 个SQL文件,总大小: $total_size"
}
# 清理函数
cleanup() {
log "脚本被中断,正在清理..."
exit 1
}
# 设置中断处理
trap cleanup INT TERM
# 执行主函数
main "$@"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# 主要区别对比
特性 | mysql_export_chatgpt.sh | mysql_export_claude.sh |
---|---|---|
多服务器支持 | ❌ 仅支持单台服务器(localhost) | ✅ 支持多台数据库服务器 |
日志记录 | ❌ 无日志功能 | ✅ 有详细日志记录(含时间戳、输出文件大小等) |
表存在性检查 | ❌ 无(直接导出,表不存在会报错) | ✅ 每个表都检查是否存在,避免错误 |
导出参数 | 基础导出,仅结构+数据 | 使用 --routines --triggers --events --quick 等,支持更多导出选项 |
错误处理 | ❌ 无明确错误处理 | ✅ 明确处理连接失败、导出失败等情况 |
输出组织 | 每个数据库一个目录 | 每个服务器+数据库为独立目录(含时间戳) |
日志文件输出 | ❌ 无 | ✅ 有独立 .txt 日志文件 |
脚本健壮性 | 较基础,适合临时用 | 健壮、模块化,适合生产使用 |
中断处理 | ❌ 无 | ✅ 使用 trap 捕获 INT TERM 信号进行清理 |


上次更新: 2025/05/27, 16:35:40
← shell脚本模块集合 指针→