Linux下用Bash Shell脚本和mysql命令行程序实现带多组参数和标签的MySQL数据库批量数据导出程序

news/2025/3/18 12:04:46/

Linux下用Bash Shell脚本连接到MySQL数据库,用SELECT @@secure_file_priv或者SHOW QUERY VARIABLE LIKE 'secure_file_priv’取得secure_file_priv变量的值,值为Linux的目录,如果获取的值为空,则输出提示信息让用户配置my.cnf文件中的secure_file_priv变量的值,否则打印输出这个值,说明输出文件到这个目录,并且实现一个基于多个带标签SQL模板作为配置文件和多组参数的Bash Shell脚本、SELECT INTO OUTFILE语句和mysql命令行程序,实现根据不同的输入参数,自动批量地将MySQL数据库的数据导出为字段用引号包裹以及带逗号分隔的CSV文件和到指定目录上,标签和多个参数(以“_”分割)为组成导出数据文件名,文件已经存在则覆盖原始文件。Bash Shell脚本需要异常处理,输出带时间戳和每个运行批次和每个导出文件作业运行状态的日志文件,每天单独一个带日期的和.log扩展名日志文件,放在logs子目录中,参数全部设置在json配置文件中。

bash">#!/bin/bash
set -eo pipefail# 读取配置文件
CONFIG_FILE="config.json"# 解析JSON配置
parse_config() {jq -r '.database | "\(.host) \(.user) \(.password) \(.database)"' "$CONFIG_FILE" | read host user password databasetemplate_dir=$(jq -r '.export.template_dir' "$CONFIG_FILE")output_dir=$(jq -r '.export.output_dir' "$CONFIG_FILE")log_dir=$(jq -r '.logging.log_dir' "$CONFIG_FILE")mapfile -t tasks < <(jq -c '.export.tasks[]' "$CONFIG_FILE")
}# 初始化日志系统
setup_logging() {mkdir -p "$log_dir"log_file="${log_dir}/$(date +%Y%m%d).log"touch "$log_file"
}# 日志记录函数
log() {local status=$1local message=$2echo "[$(date '+%Y-%m-%d %T')] [${current_task}] [${status}] ${message}" >> "$log_file"
}# 检查secure_file_priv配置
check_secure_file_priv() {local secure_file_priv=$(mysql -h"$host" -u"$user" -p"$password" -sN -e "SELECT @@secure_file_priv;")if [[ -z "$secure_file_priv" || "$secure_file_priv" == "NULL" ]]; thenlog "ERROR" "secure_file_priv未配置,请修改my.cnf文件"exit 1elselog "INFO" "secure_file_priv配置为:${secure_file_priv}"if [[ ! "$output_dir" =~ ^$secure_file_priv ]]; thenlog "ERROR" "输出目录必须在secure_file_priv路径下"exit 1fifi
}# 执行数据导出
export_data() {local label=$1local params=(${2//_/ })local template_file="${template_dir}/${label}.sql"local output_file="${output_dir}/${label}_${2}.csv"# 处理SQL模板if [[ ! -f "$template_file" ]]; thenlog "ERROR" "模板文件不存在:${template_file}"return 1fi# 替换模板参数sql_query=$(<"$template_file")for i in "${!params[@]}"; doparam_name="param$((i+1))"param_value="${params[$i]//\'/\\\'}"sql_query=${sql_query//\{\{${param_name}\}\}/${param_value}}done# 构建完整SQL语句sql_query+=" INTO OUTFILE '${output_file}' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n'"# 执行导出log "INFO" "开始导出:${output_file}"if mysql -h"$host" -u"$user" -p"$password" -D"$database" -e "$sql_query" 2>> "$log_file"; thenlog "SUCCESS" "导出成功"elselog "ERROR" "导出失败"return 1fi
}# 主执行流程
main() {parse_configsetup_loggingcheck_secure_file_privmkdir -p "$output_dir"for task in "${tasks[@]}"; dolabel=$(jq -r '.label' <<< "$task")mapfile -t params_list < <(jq -cr '.params[] | join("_")' <<< "$task")for params in "${params_list[@]}"; docurrent_task="${label}_${params}"log "INFO" "开始处理任务"if export_data "$label" "$params"; thenlog "INFO" "任务处理完成"elselog "ERROR" "任务处理失败"fidonedone
}main

配套的config.json示例:

{"database": {"host": "localhost","user": "root","password": "your_password","database": "test_db"},"export": {"template_dir": "./sql_templates","output_dir": "/var/lib/mysql-files/exports","tasks": [{"label": "users","params": [["active", "2023"],["inactive", "2022"]]},{"label": "orders","params": [["pending"],["completed"]]}]},"logging": {"log_dir": "./logs","log_level": "INFO"}
}

SQL模板示例(sql_templates/users.sql):

SELECT * 
FROM users 
WHERE status = '{{param1}}'
AND YEAR(created_at) = '{{param2}}'

脚本特点:

  1. 安全验证:自动检查MySQL的secure_file_priv配置
  2. 模板引擎:支持带{{param}}占位符的SQL模板
  3. 批量处理:支持多任务多参数批量执行
  4. 日志系统
    • 每天生成独立日志文件
    • 包含时间戳和任务状态
    • 自动创建日志目录
  5. 错误处理
    • 自动捕获并记录错误
    • 模板文件存在性检查
    • MySQL执行错误处理
  6. 文件管理
    • 自动创建输出目录
    • 文件名自动生成(标签_参数1_参数2.csv)
    • 自动覆盖已有文件

使用说明:

  1. 将配置文件保存为config.json
  2. 创建sql_templates目录并放置SQL模板文件
  3. 确保MySQL用户有FILE权限和目标目录写入权限
  4. 通过chmod +x script.sh添加执行权限
  5. 使用./script.sh执行脚本

注意事项:

  1. MySQL的secure_file_priv目录需要提前配置
  2. 确保JSON配置文件的语法正确
  3. SQL模板中的参数占位符使用双大括号格式{{param}}
  4. 输出目录必须位于secure_file_priv指定的路径下
  5. 建议在生产环境中使用配置文件权限限制(如chmod 600 config.json)

http://www.ppmy.cn/news/1580066.html

相关文章

openai-agents 中custom example agent

代码 pip show openai-agentsName: openai-agents Version: 0.0.4 Summary: OpenAI Agents SDK Home-page: https://github.com/openai/openai-agents-python Author: Author-email: OpenAI <supportopenai.com> License-Expression: MIT Location: d:\soft\anaconda\e…

大模型GGUF和LLaMA的区别

GGUF&#xff08;Gigabyte-Graded Unified Format&#xff09;和LLaMA&#xff08;Large Language Model Meta AI&#xff09;是两个不同层面的概念&#xff0c;分别属于大模型技术栈中的不同环节。它们的核心区别在于定位和功能&#xff1a; 1. LLaMA&#xff08;Meta的大语言…

深度学习正则化技术之权重衰减法、暂退法(通俗易懂版)

一、影响模型泛性的因素有&#xff1f;什么是正则化技术&#xff1f;有什么用&#xff1f; 通常&#xff0c;影响模型泛化能力的因素有&#xff1a; 可调节参数的个数&#xff1a;可调节的参数过少&#xff0c;会造成模型过于简单&#xff0c;欠拟合&#xff1b;过多&#xf…

Github 2025-03-14 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2025-03-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10Apache Pulsar - 灵活的分布式消息平台 创建周期:2838 天开发语言:Java协议类型:Apache License 2.0Star数量:13693 个Fork数量:…

NET进行CAD二次开发之二

本文主要针对CAD 二次开发入门与实践:以 C# 为例_c# cad-CSDN博客的一些实践问题做一些补充。 一、DLL介绍 在 AutoCAD 中,accoremgd.dll、acdbmgd.dll 和 acmgd.dll 都是与.NET API 相关的动态链接库,它们在使用.NET 语言(如 C#、VB.NET)进行 AutoCAD 二次开发时起着关…

低压电工证考试常见题型有哪些?有哪些答题技巧

低压电工证考试分为理论考试和实操考试两部分。理论考试题型有选择题、判断题&#xff1b;实操考试则是考核实际操作能力。以下是常见题型及答题技巧&#xff1a; 理论考试 选择题&#xff1a;包括单选题和多选题。单选题要求从多个选项中选择一个正确答案&#xff0c;多选题…

C++设计模式-外观模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析

一、基本介绍&#xff1a;复杂系统的"服务总台" 1.1 模式定义 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过为多个复杂的子系统提供一个统一的高层接口&#xff0c;使这些子系统更易于使用。比如银行大堂的引导台&#…

C3P0数据库连接池技术详解及实战

1. 引言 在现代Java开发中&#xff0c;数据库访问是至关重要的一环。传统的JDBC连接方式由于频繁创建和销毁数据库连接&#xff0c;导致性能低下&#xff0c;资源占用过多。为了解决这一问题&#xff0c;数据库连接池&#xff08;Connection Pool&#xff09;技术应运而生。 C…