从一个 MySQL 数据库中导出指定的一系列表到 CSV 文件
#!/bin/bash
# MySQL 连接信息
HOST="xxx.xxx.x.xxx"
DB="xxx"
USER="xxx"
PASS="xxx"
PORT=xxx
# 输出目录
OUTPUT_DIR="mysql_exports"
# 创建输出目录(如果不存在)
mkdir -p "$OUTPUT_DIR"
# 要导出的表列表
TABLES=(
"user"
"student"
)
# 遍历表并导出为 CSV
for TABLE in "${TABLES[@]}"
do
echo "Exporting $TABLE..."
mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASS" "$DB" -e "SELECT * FROM $TABLE" | \
sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > "$OUTPUT_DIR/$TABLE.csv"
if [ $? -eq 0 ]; then
echo "Successfully exported $TABLE to $OUTPUT_DIR/$TABLE.csv"
else
echo "Failed to export $TABLE"
fi
done
echo "Export process completed."
这段 Bash 脚本的主要功能是从一个 MySQL 数据库中导出指定的一系列表到 CSV 文件。
#!/bin/bash
指定了该脚本应该使用 /bin/bash
解释器来执行。
MySQL 连接信息
HOST="xxx.xxx.x.xxx"
DB="xxx"
USER="xxx"
PASS="xxx"
PORT=xxx
这些变量定义了连接到 MySQL 数据库所需的参数:
HOST
: 数据库服务器的 IP 地址。DB
: 要操作的数据库名称。USER
: 连接到数据库的用户名。PASS
: 用户的密码。PORT
: 数据库监听的端口。
输出目录
OUTPUT_DIR="mysql_exports"
定义了导出文件将要保存的目录名。
创建输出目录
mkdir -p "$OUTPUT_DIR"
这条命令确保输出目录存在。如果目录不存在,则会创建它;如果已经存在,则不会报错。
要导出的表列表
TABLES=(
"user"
"student"
)
这是一个数组,包含了所有需要从数据库中导出的表的名字。
导出表为 CSV
for TABLE in "${TABLES[@]}"
do
echo "Exporting $TABLE..."
mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASS" "$DB" -e "SELECT * FROM $TABLE" | \
sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > "$OUTPUT_DIR/$TABLE.csv"
if [ $? -eq 0 ]; then
echo "Successfully exported $TABLE to $OUTPUT_DIR/$TABLE.csv"
else
echo "Failed to export $TABLE"
fi
done
这部分是一个 for 循环,遍历 TABLES
数组中的每个表,并执行以下操作:
- 打印消息:告知用户正在导出哪个表。
- 执行 SQL 查询:使用
mysql
命令行工具连接到数据库并执行SELECT * FROM $TABLE
查询,获取表中所有的数据。 - 格式化输出:使用
sed
命令对输出进行处理,将其转换成 CSV 格式。具体来说:s/\t/","/g
将制表符替换为逗号和双引号(CSV 的字段分隔符)。s/^/"/
在每行的开始添加一个双引号。s/$/"/
在每行的末尾添加一个双引号。s/\n//g
移除行尾的换行符(这个部分可能不是必要的,取决于实际的输出格式)。
- 重定向输出:将格式化后的数据写入到
$OUTPUT_DIR/$TABLE.csv
文件中。 - 检查状态:使用
$?
获取上一条命令的退出状态码。如果状态码为 0,表示命令成功执行,否则表示有错误发生。 - 打印结果:根据命令是否成功执行,打印相应的成功或失败消息。
为什么使用 ${TABLES[@]}
?
-
遍历所有元素:
${TABLES[@]}
会将数组TABLES
中的所有元素作为一个列表返回,这样可以在for
循环中逐个处理每个元素。- 例如,如果有一个数组
TABLES=("user" "student")
,使用for TABLE in "${TABLES[@]}"
会依次将user
和student
赋值给变量TABLE
。
-
保留空格和特殊字符:
- 使用
${TABLES[@]}
可以确保数组中的每个元素都被正确处理,即使元素中包含空格或其他特殊字符。 - 如果不使用
[@]
,而是直接使用$TABLES
,则只会返回数组的第一个元素,或者将整个数组作为一个字符串返回,这可能会导致意外的行为。
- 使用