高斯数据库 Shell 脚本:批量执行多个 SQL 文件

优化后的高斯数据库 Shell 脚本

#!/bin/bash

# 数据库信息文件路径
DB_INFO_FILE="db_info.txt"

# 要执行的 SQL 文件列表
SQL_LIST_FILE="sql_files.txt"

# 检查数据库信息文件是否存在
if [[ ! -f "$DB_INFO_FILE" ]]; then
    echo "数据库信息文件 $DB_INFO_FILE 不存在!"
    exit 1
fi

# 检查 SQL 文件列表是否存在
if [[ ! -f "$SQL_LIST_FILE" ]]; then
    echo "SQL 文件列表 $SQL_LIST_FILE 不存在!"
    exit 1
fi

# 遍历数据库信息文件
while read -r HOST PORT USER PASSWORD; do
    # 确保读取的字段完整
    if [[ -z "$HOST" || -z "$PORT" || -z "$USER" || -z "$PASSWORD" ]]; then
        echo "数据库信息文件格式不正确,跳过行:$HOST $PORT $USER"
        continue
    fi

    echo "连接到数据库服务器 $HOST:$PORT..."

    # 遍历 SQL 文件列表
    while read -r SQL_FILE; do
        # 检查每个 SQL 文件是否存在
        if [[ ! -f "$SQL_FILE" ]]; then
            echo "SQL 文件 $SQL_FILE 不存在,跳过。"
            continue
        fi

        echo "执行 SQL 文件 $SQL_FILE..."

        # 构造 zsql 命令
        CONNECTION_STRING="${USER}\\${PASSWORD}@${HOST}:${PORT}"
        zsql "$CONNECTION_STRING" -a -f "$SQL_FILE"

        # 检查执行结果
        if [[ $? -eq 0 ]]; then
            echo "SQL 文件 $SQL_FILE 已成功执行到 $HOST:$PORT。"
        else
            echo "SQL 文件 $SQL_FILE 执行到 $HOST:$PORT 失败!"
        fi

        echo "--------------------------------------"
    done < "$SQL_LIST_FILE"

done < "$DB_INFO_FILE"

数据库信息文件 (db_info.txt)

此文件包含数据库服务器信息,每行一个实例:

192.168.1.100 5432 myuser mypassword
192.168.1.101 5432 myuser mypassword
192.168.1.102 5432 myuser mypassword

每列表示:

  1. 数据库主机名或 IP 地址
  2. 数据库端口号
  3. 用户名
  4. 密码

SQL 文件列表 (sql_files.txt)

此文件包含需要执行的 SQL 文件路径,每行一个文件:

create_table.sql
insert_data.sql
update_schema.sql

示例 SQL 文件

create_table.sql

CREATE TABLE IF NOT EXISTS example_table (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

insert_data.sql

INSERT INTO example_table (name) VALUES ('Alice');
INSERT INTO example_table (name) VALUES ('Bob');
INSERT INTO example_table (name) VALUES ('Charlie');

update_schema.sql

ALTER TABLE example_table ADD COLUMN email VARCHAR(255);
UPDATE example_table SET email = CONCAT(name, '@example.com');

脚本执行方式

  1. 确保脚本有执行权限:

    chmod +x create_table_gaussdb.sh
    
  2. 执行脚本:

    ./create_table_gaussdb.sh
    

脚本功能说明

  1. 读取 db_info.txt 文件:逐行读取数据库服务器的连接信息。
  2. 读取 sql_files.txt 文件:逐行读取 SQL 文件路径。
  3. 检查文件存在性:跳过不存在的 SQL 文件。
  4. 生成连接字符串:根据 USER\\PASSWORD@HOST:PORT 格式构造 GaussDB 的 zsql 连接命令。
  5. 执行多个 SQL 文件:对每个 SQL 文件依次运行。
  6. 结果检查:通过 $? 检查 zsql 命令的执行结果,并在终端打印成功或失败信息。

输出示例

成功执行时,终端会显示类似以下信息:

连接到数据库服务器 192.168.1.100:5432...
执行 SQL 文件 create_table.sql...
SQL 文件 create_table.sql 已成功执行到 192.168.1.100:5432。
--------------------------------------
执行 SQL 文件 insert_data.sql...
SQL 文件 insert_data.sql 已成功执行到 192.168.1.100:5432。
--------------------------------------
执行 SQL 文件 update_schema.sql...
SQL 文件 update_schema.sql 已成功执行到 192.168.1.100:5432。
--------------------------------------
连接到数据库服务器 192.168.1.101:5432...
...

改进点

  1. 支持从文件中批量读取多个 SQL 文件路径。
  2. 针对每个数据库逐个执行所有 SQL 文件。
  3. 灵活性增强,适用于复杂的批处理场景。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐