【软件部署】使用docker部署MySQL单实例
使用docker 在云主机部署MySQL单实例,数据持久化,配置文件可便捷管理。仅展示当前各主版本的最新子版本的配置。可作为标准默认配置使用。应将my.cnf和deploy.sh放在同一目录。
·
说明
使用docker 在云主机部署MySQL单实例,数据持久化,配置文件可便捷管理。仅展示当前各主版本的最新子版本的配置。可作为标准默认配置使用。
应将my.cnf和deploy.sh放在同一目录。
MySQL5
my.cnf
# 适配 MySQL 5.7.44 的配置文件 (my.cnf)
# 核心配置段,MySQL 5.7 必须指定 [mysqld]
[mysqld]
# ===================== 基础字符集配置 =====================
# MySQL 5.7 中 utf8mb4 需显式指定,且参数名是下划线格式
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci
# 解决客户端连接字符集问题
init_connect = 'SET NAMES utf8mb4'
# ===================== 连接相关配置 =====================
# 最大连接数,5.7 支持 10000(需系统资源足够)
max_connections = 10000
# 最大连接错误数,防止暴力破解
max_connect_errors = 100000
# 连接超时配置(秒)
wait_timeout = 600
interactive_timeout = 600
# 禁用DNS解析,提升连接速度(5.7 推荐配置)
skip_name_resolve = 1
# ===================== InnoDB 核心配置 =====================
# 缓冲池大小,根据服务器内存调整(1G 适合低配服务器)
innodb_buffer_pool_size = 1G
# 日志文件大小,5.7 建议不超过 4G,256M 是合理值
innodb_log_file_size = 256M
# 事务提交时日志刷新策略(2 兼顾性能和数据安全)
innodb_flush_log_at_trx_commit = 2
# 刷新方式,5.7 推荐 O_DIRECT(需系统支持)
innodb_flush_method = O_DIRECT
# 自动扩展表空间(5.7 默认开启,但显式指定更稳妥)
innodb_file_per_table = 1
# 事务隔离级别(5.7 默认 REPEATABLE-READ)
transaction_isolation = REPEATABLE-READ
# ===================== 查询缓存(5.7 废弃) =====================
# MySQL 5.7 中 query_cache 已废弃,显式禁用(避免警告)
query_cache_type = 0
query_cache_size = 0
# ===================== 慢查询日志配置 =====================
# 开启慢查询日志
slow_query_log = 1
# 慢查询日志文件路径(容器内路径,无需修改)
slow_query_log_file = /var/lib/mysql/mysql-slow.log
# 慢查询阈值(秒),超过 2 秒记录
long_query_time = 2
# 记录未使用索引的查询(便于优化)
log_queries_not_using_indexes = 1
# ===================== 二进制日志(主从/备份) =====================
# 服务器ID(单机也需指定,避免警告)
server-id = 1
# 开启二进制日志
log_bin = mysql-bin
# 二进制日志格式(ROW 格式适合数据同步)
binlog_format = ROW
# 二进制日志过期时间(天)
expire_logs_days = 7
# 二进制日志缓存大小
binlog_cache_size = 1M
# 避免重复记录日志(5.7 推荐)
log_slave_updates = 0
# ===================== 其他基础配置 =====================
# 默认存储引擎
default-storage-engine = InnoDB
# SQL 模式(5.7 推荐宽松模式,避免严格校验导致业务报错)
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 临时表大小
tmp_table_size = 64M
max_heap_table_size = 64M
deploy.sh 执行该脚本,完成部署
#!/bin/bash
# MySQL 5.7.44 单实例部署脚本
# 依赖当前目录下的 my.cnf 配置文件
# 定义变量,便于后续维护
CONTAINER_NAME="mysql5-single"
MYSQL_IMAGE="mysql:5.7.44"
MYSQL_PORT="3306"
ROOT_PASSWORD="root123456"
CONF_FILE="./my.cnf"
# 检查my.cnf配置文件是否存在
if [ ! -f "${CONF_FILE}" ]; then
echo -e "\033[31m错误:当前目录未找到 ${CONF_FILE} 配置文件!\033[0m"
exit 1
fi
# 停止并删除已存在的同名容器(避免冲突)
if [ "$(docker ps -aq --filter name=${CONTAINER_NAME})" ]; then
echo "发现已存在的 ${CONTAINER_NAME} 容器,正在停止并删除..."
docker stop ${CONTAINER_NAME} > /dev/null 2>&1
docker rm ${CONTAINER_NAME} > /dev/null 2>&1
fi
# 启动MySQL容器(核心命令,修复换行和注释问题)
echo "开始启动 ${CONTAINER_NAME} 容器..."
docker run -d \
--name ${CONTAINER_NAME} \
--restart unless-stopped \
-p ${MYSQL_PORT}:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=${ROOT_PASSWORD} \
-e MYSQL_ROOT_HOST=% \
-v mysql5-data:/var/lib/mysql \
-v $(pwd)/${CONF_FILE}:/etc/mysql/conf.d/my.cnf \
--health-cmd='mysqladmin ping -h127.0.0.1 -P3306 -uroot -p"${MYSQL_ROOT_PASSWORD}" --silent' \
--health-interval=10s \
--health-timeout=5s \
--health-retries=3 \
--health-start-period=30s \
${MYSQL_IMAGE}
# 检查容器启动状态
if [ "$(docker ps -aq --filter name=${CONTAINER_NAME} --filter status=running)" ]; then
echo -e "\033[32m成功:${CONTAINER_NAME} 容器启动完成!\033[0m"
echo "容器信息:"
docker ps --filter name=${CONTAINER_NAME} --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
else
echo -e "\033[31m失败:${CONTAINER_NAME} 容器启动失败!\033[0m"
echo "容器日志:"
docker logs ${CONTAINER_NAME} 2>&1 || echo "无容器日志(容器未创建)"
exit 1
fi
MySQL8
my.cnf
[mysqld]
# --- 基础设置 ---
user = mysql
port = 3306
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
datadir = /var/lib/mysql
# --- 连接与安全 ---
max_connections = 500
max_allowed_packet = 64M
skip-name-resolve # 禁用DNS解析,提高Docker环境下的连接速度
# --- MySQL 8.4 身份验证相关 ---
# MySQL 8.0+ 默认使用 caching_sha2_password
# 如果你的旧版客户端不支持,可以按需调整(8.4 依然支持该默认值)
# authentication_policy = caching_sha2_password
# --- 缓存与内存优化 (基于 2GB-4GB 内存环境) ---
innodb_buffer_pool_size = 1G # 建议设置为物理内存的 50%-70%
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1 # 最安全设置,若追求性能可设为 2
innodb_flush_method = O_DIRECT
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 2
# --- 二进制日志 (Binlog) ---
server-id = 1
binlog_expire_logs_seconds = 604800 # 日志保留7天
binlog_format = ROW
# --- 临时表与缓存 ---
tmp_table_size = 32M
max_heap_table_size = 32M
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
deploy.sh 执行脚本,完成部署
# 1. create data volume
docker volume create mysql8-data
docker volume create mysql8-log
# 2. deploy
docker run -d \
--name mysql8-single \
--restart=unless-stopped \
--health-cmd="mysqladmin ping -uroot -p\$MYSQL_ROOT_PASSWORD --silent" \
--health-interval=10s \
--health-timeout=5s \
--health-retries=3 \
--health-start-period=30s \
-p 3306:3306 \
-v $(pwd)/my.cnf:/etc/mysql/my.cnf \
-v mysql8-data:/var/lib/mysql \
-v mysql8-log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=root123456 \
-e MYSQL_ROOT_HOST=% \
-e TZ=Asia/Shanghai \
-e LANG=C.UTF-8 \
mysql:8.4.7
MySQL9
my.cnf
[mysqld]
# --- 基础设置 ---
user = mysql
port = 3306
datadir = /var/lib/mysql
# 禁用DNS解析,Docker环境必备,极大提升连接速度
skip-name-resolve
# --- 字符集与排序规则 ---
# MySQL 9 默认就是 utf8mb4,显式指定确保一致性
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
# --- 安全与兼容性 ---
# 注意:MySQL 9 已移除 default_authentication_plugin 参数
# 默认即使用 caching_sha2_password
max_connections = 1000
max_allowed_packet = 64M
# --- 内存优化 (按4GB空闲内存优化,若内存小请调低) ---
# 建议设置为物理内存的 50%-70%
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1 # 生产环境安全首选
innodb_flush_method = O_DIRECT
innodb_lock_wait_timeout = 50
# --- 日志设置 (Docker 优化) ---
# 错误日志保持默认,输出到 stderr 以便 docker logs 查看
# 慢查询日志:记录执行时间超过 2 秒的 SQL
slow_query_log = 1
long_query_time = 2
slow_query_log_file = /var/log/mysql/slow.log
# --- 二进制日志 (Binlog/集群基础) ---
server-id = 1
# 自动清理 7 天前的日志 (单位:秒)
binlog_expire_logs_seconds = 604800
# MySQL 9 默认 binlog_format 就是 ROW,无需额外指定
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
deploy.sh 执行部署脚本即可,
# 创建数据存储卷
docker volume create mysql9-data
# 创建日志存储卷
docker volume create mysql9-log
docker run -d \
--name mysql9-single \
--restart=unless-stopped \
--health-cmd="mysqladmin ping -uroot -p\$MYSQL_ROOT_PASSWORD --silent" \
--health-interval=10s \
--health-timeout=5s \
--health-retries=3 \
--health-start-period=30s \
-p 3306:3306 \
-v $(pwd)/my.cnf:/etc/mysql/conf.d/my.cnf:ro \
-v mysql9-data:/var/lib/mysql \
-v mysql9-log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=root123456 \
-e MYSQL_ROOT_HOST=% \
-e TZ=Asia/Shanghai \
-e LANG=C.UTF-8 \
mysql:9.5.0
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)