如何用脚本批量创建MySQL数据库?

wen 实用脚本 2

本文目录导读:

如何用脚本批量创建MySQL数据库?

  1. Shell脚本方法
  2. Python脚本方法
  3. 生成批量SQL脚本
  4. 批量创建带用户的数据库
  5. 使用配置文件批量导入
  6. 使用建议

我来介绍几种批量创建MySQL数据库的脚本方法:

Shell脚本方法

基本Shell脚本

#!/bin/bash
# MySQL连接参数
MYSQL_USER="root"
MYSQL_PASS="your_password"
MYSQL_HOST="localhost"
# 要创建的数据库列表
databases=(
    "db_test1"
    "db_test2"
    "db_test3"
    "db_development"
    "db_production"
)
# 创建数据库
for db in "${databases[@]}"
do
    mysql -u $MYSQL_USER -p$MYSQL_PASS -h $MYSQL_HOST -e "CREATE DATABASE IF NOT EXISTS $db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
    if [ $? -eq 0 ]; then
        echo "数据库 $db 创建成功"
    else
        echo "数据库 $db 创建失败"
    fi
done

带参数的灵活脚本

#!/bin/bash
# 从文件读取数据库名
DB_LIST_FILE="databases.txt"
MYSQL_USER="root"
MYSQL_PASS="your_password"
# 创建数据库函数
create_database() {
    local db_name=$1
    mysql -u $MYSQL_USER -p$MYSQL_PASS -e "CREATE DATABASE IF NOT EXISTS \`$db_name\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
    return $?
}
# 从文件读取数据库列表
if [ -f "$DB_LIST_FILE" ]; then
    while IFS= read -r db_name; do
        if [ ! -z "$db_name" ]; then
            create_database "$db_name" && echo "创建成功: $db_name" || echo "创建失败: $db_name"
        fi
    done < "$DB_LIST_FILE"
else
    echo "数据库列表文件不存在: $DB_LIST_FILE"
    exit 1
fi

databases.txt 文件内容示例:

db_project1
db_project2
db_project3
db_test
db_staging

Python脚本方法

使用mysql-connector-python

#!/usr/bin/env python3
import mysql.connector
from mysql.connector import Error
# MySQL连接配置
config = {
    'user': 'root',
    'password': 'your_password',
    'host': 'localhost'
}
# 要创建的数据库列表
databases = [
    'db_app1',
    'db_app2', 
    'db_app3',
    'db_analytics',
    'db_backup'
]
def create_databases():
    try:
        # 连接MySQL
        connection = mysql.connector.connect(**config)
        cursor = connection.cursor()
        for db_name in databases:
            try:
                # 创建数据库
                create_query = f"CREATE DATABASE IF NOT EXISTS `{db_name}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
                cursor.execute(create_query)
                print(f"数据库 {db_name} 创建成功")
            except Error as e:
                print(f"数据库 {db_name} 创建失败: {e}")
    except Error as e:
        print(f"MySQL连接失败: {e}")
    finally:
        if 'connection' in locals() and connection.is_connected():
            cursor.close()
            connection.close()
if __name__ == "__main__":
    create_databases()

使用SQLAlchemy

from sqlalchemy import create_engine, text
from sqlalchemy.exc import SQLAlchemyError
# 数据库连接字符串
db_url = "mysql+mysqlconnector://root:your_password@localhost"
# 要创建的数据库
databases = ['db_test1', 'db_test2', 'db_test3']
def create_databases():
    try:
        # 创建引擎
        engine = create_engine(db_url)
        with engine.connect() as connection:
            for db_name in databases:
                try:
                    # 创建数据库
                    query = text(f"CREATE DATABASE IF NOT EXISTS `{db_name}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")
                    connection.execute(query)
                    print(f"数据库 {db_name} 创建成功")
                except SQLAlchemyError as e:
                    print(f"数据库 {db_name} 创建失败: {e}")
    except SQLAlchemyError as e:
        print(f"连接MySQL失败: {e}")
if __name__ == "__main__":
    create_databases()

生成批量SQL脚本

#!/bin/bash
# 生成批量SQL文件
OUTPUT_FILE="create_databases.sql"
# 数据库列表
databases=(
    "db_202401"
    "db_202402"
    "db_202403"
    "db_202404"
)
# 写入SQL文件
echo "-- 批量创建数据库脚本" > $OUTPUT_FILE
echo "-- 生成时间: $(date)" >> $OUTPUT_FILE
echo "" >> $OUTPUT_FILE
for db in "${databases[@]}"
do
    echo "CREATE DATABASE IF NOT EXISTS \`$db\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" >> $OUTPUT_FILE
done
echo "SQL脚本已生成: $OUTPUT_FILE"
echo "执行: mysql -u root -p < $OUTPUT_FILE"

批量创建带用户的数据库

#!/bin/bash
# 创建数据库和用户
create_db_with_user() {
    local db_name=$1
    local db_user=$2
    local db_pass=$3
    mysql -u root -p${MYSQL_PASS} <<EOF
CREATE DATABASE IF NOT EXISTS \`$db_name\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '$db_user'@'localhost' IDENTIFIED BY '$db_pass';
GRANT ALL PRIVILEGES ON \`$db_name\`.* TO '$db_user'@'localhost';
FLUSH PRIVILEGES;
EOF
}
# 定义数据库、用户、密码对应关系
declare -A db_config=(
    ["app_db1"]="user1:pass1"
    ["app_db2"]="user2:pass2" 
    ["app_db3"]="user3:pass3"
)
# 批量创建
for db in "${!db_config[@]}"; do
    IFS=':' read -r user pass <<< "${db_config[$db]}"
    create_db_with_user "$db" "$user" "$pass"
    echo "数据库 $db 和用户 $user 创建完成"
done

使用配置文件批量导入

config.json

{
  "mysql": {
    "host": "localhost",
    "user": "root",
    "password": "your_password"
  },
  "databases": [
    {"name": "db_test1", "charset": "utf8mb4", "collation": "utf8mb4_unicode_ci"},
    {"name": "db_test2", "charset": "utf8mb4", "collation": "utf8mb4_unicode_ci"},
    {"name": "db_test3", "charset": "latin1", "collation": "latin1_swedish_ci"}
  ]
}
#!/usr/bin/env python3
import json
import mysql.connector
# 读取配置文件
with open('config.json', 'r') as f:
    config = json.load(f)
# 连接MySQL
connection = mysql.connector.connect(**config['mysql'])
cursor = connection.cursor()
# 批量创建数据库
for db in config['databases']:
    query = f"CREATE DATABASE IF NOT EXISTS `{db['name']}` CHARACTER SET {db['charset']} COLLATE {db['collation']}"
    cursor.execute(query)
    print(f"数据库 {db['name']} 创建完成")
cursor.close()
connection.close()

使用建议

  1. 安全方面

    • 不要在脚本中硬编码密码,使用环境变量或配置文件
    • 限制脚本执行权限(chmod 700 script.sh
    • 使用IF NOT EXISTS避免重复创建错误
  2. 灵活扩展

    • 使用配置文件管理数据库列表
    • 添加错误处理和日志记录
    • 支持不同的字符集和排序规则
  3. 执行方式

    • 可以先测试运行(dry-run模式)
    • 支持回滚操作
    • 记录执行日志

选择哪种方法取决于你的具体需求和环境,Shell脚本适合简单的场景,Python脚本则有更好的错误处理和灵活性。

抱歉,评论功能暂时关闭!