#
## 目录
- [概述](#概述)
- [环境准备](#环境准备)
- [Docker 镜像拉取](#docker-镜像拉取)
- [配置文件准备](#配置文件准备)
- [数据目录初始化](#数据目录初始化)
- [容器启动](#容器启动)
- [验证部署](#验证部署)
- [数据库初始化](#数据库初始化)
- [用户管理](#用户管理)
- [性能调优](#性能调优)
- [安全配置](#安全配置)
- [备份与恢复](#备份与恢复)
- [监控与日志](#监控与日志)
- [常用操作](#常用操作)
- [故障排除](#故障排除)
- [维护计划](#维护计划)
## 概述
本手册详细介绍了如何使用 Docker 部署 MySQL 8.0.42 数据库服务,包括镜像拉取、配置文件设置、容器启动、性能优化、安全配置、备份恢复等完整流程。适用于开发、测试和生产环境的部署。
## 环境准备
在开始部署前,请确保系统满足以下条件:
### 系统要求
- Linux 系统 (Ubuntu 18.04+, CentOS 7+, Debian 10+)
- Docker Engine 版本 18.09+ (推荐 20.10+)
- Docker Compose 版本 1.25+ (可选)
- 至少 4GB RAM (推荐 8GB+)
- 至少 10GB 可用磁盘空间
- CPU 支持虚拟化技术
### 安装 Docker
如果尚未安装 Docker,请参考官方文档进行安装:
bash
# Ubuntu/Debian 系统
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
# CentOS/RHEL 系统
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
# 将当前用户加入 docker 组(避免每次使用 sudo)
sudo usermod -aG docker $USER
# 验证安装
docker --version
docker-compose --version
系统资源检查
bash
# 检查内存
free -h
# 检查磁盘空间
df -h
# 检查可用端口
netstat -tuln | grep :3306
# 检查 Docker 状态
docker info
Docker 镜像拉取
从 Docker Hub 拉取 MySQL 8.0.42 镜像:
bash
# 拉取镜像
docker pull mysql:8.0.42
# 验证镜像
docker images | grep mysql
# 查看镜像详情
docker inspect mysql:8.0.42
配置文件准备
创建目录结构
bash
# 创建主目录
sudo mkdir -p /docker/mysql8.0.42/{etc/mysql/conf.d,logs,data,mysql-files,tmp}
# 设置目录权限
sudo chown -R 999:999 /docker/mysql8.0.42/data
sudo chown -R 999:999 /docker/mysql8.0.42/mysql-files
sudo chmod -R 755 /docker/mysql8.0.42
# 验证目录结构
ls -la /docker/mysql8.0.42/
创建 MySQL 配置文件
创建配置文件 /docker/mysql8.0.42/etc/mysql/conf.d/my.cnf:
bash
sudo cat > /docker/mysql8.0.42/etc/mysql/conf.d/my.cnf << 'EOF'
[mysqld]
# 基础配置
user=mysql
port=3306
bind-address=0.0.0.0
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
# 认证配置
default_authentication_plugin=mysql_native_password
# 文件权限配置
secure_file_priv=/var/lib/mysql-files
local-infile=1
# 日志配置
log-error=/logs/error.log
slow-query-log=1
slow-query-log-file=/logs/slow.log
long_query_time=2
general_log=0
general_log_file=/logs/general.log
# 性能配置
max_connections=1000
max_connect_errors=6000
open_files_limit=65535
table_open_cache=128
max_allowed_packet=500M
binlog_cache_size=1M
binlog_stmt_cache_size=1M
thread_cache_size=8
sort_buffer_size=64K
read_buffer_size=256K
read_rnd_buffer_size=256K
join_buffer_size=256K
tmp_table_size=32M
max_heap_table_size=32M
# InnoDB 配置
innodb_data_home_dir=/var/lib/mysql
innodb_buffer_pool_size=1G
innodb_log_file_size=256M
innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=50
innodb_thread_concurrency=16
innodb_io_capacity=1000
innodb_io_capacity_max=2000
innodb_flush_method=O_DIRECT
# 主从复制配置
server-id=1
log-bin=mysql-bin
sync_binlog=1
expire_logs_days=7
# SQL 模式配置
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# 时间配置
default-time-zone='+08:00'
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
EOF
配置文件详细说明
character-set-server=utf8mb4: 使用 utf8mb4 字符集支持完整 Unicodemax_connections=1000: 最大并发连接数innodb_buffer_pool_size=1G: InnoDB 缓冲池大小(根据实际内存调整)log-bin=mysql-bin: 启用二进制日志用于主从复制sql_mode: 严格 SQL 模式,提高数据一致性
数据目录初始化
初始化数据目录权限
bash
# 设置 MySQL 用户 ID (MySQL 8.0 使用 UID 999)
sudo chown -R 999:999 /docker/mysql8.0.42/data
sudo chown -R 999:999 /docker/mysql8.0.42/mysql-files
sudo chown -R 999:999 /docker/mysql8.0.42/logs
sudo chmod -R 755 /docker/mysql8.0.42
# 验证权限
ls -la /docker/mysql8.0.42/data/
ls -la /docker/mysql8.0.42/mysql-files/
ls -la /docker/mysql8.0.42/logs/
创建初始化脚本目录
bash
sudo mkdir -p /docker/mysql8.0.42/initdb.d
sudo chown -R 999:999 /docker/mysql8.0.42/initdb.d
容器启动
单容器启动方式
使用以下命令启动 MySQL 容器:
bash
docker run \
-p 3306:3306 \
--name mysql8 \
--privileged=true \
--restart on-failure:3 \
-v /docker/mysql8.0.42/etc/mysql:/etc/mysql \
-v /docker/mysql8.0.42/logs:/logs \
-v /docker/mysql8.0.42/data:/var/lib/mysql \
-v /docker/mysql8.0.42/mysql-files:/var/lib/mysql-files \
-v /docker/mysql8.0.42/initdb.d:/docker-entrypoint-initdb.d \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD="Sykj@2025" \
-e MYSQL_ROOT_HOST="%" \
-e TZ="Asia/Shanghai" \
-d mysql:8.0.42 \
--default-authentication-plugin=mysql_native_password
Docker Compose 启动方式
创建 docker-compose.yml 文件:
bash
sudo cat > /docker/mysql8.0.42/docker-compose.yml << 'EOF'
version: '3.8'
services:
mysql8:
image: mysql:8.0.42
container_name: mysql8
restart: on-failure:3
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: "Sykj@2025"
MYSQL_ROOT_HOST: "%"
TZ: "Asia/Shanghai"
volumes:
- /docker/mysql8.0.42/etc/mysql:/etc/mysql
- /docker/mysql8.0.42/logs:/logs
- /docker/mysql8.0.42/data:/var/lib/mysql
- /docker/mysql8.0.42/mysql-files:/var/lib/mysql-files
- /docker/mysql8.0.42/initdb.d:/docker-entrypoint-initdb.d
- /etc/localtime:/etc/localtime:ro
command: [
"--default-authentication-plugin=mysql_native_password",
"--character-set-server=utf8mb4",
"--collation-server=utf8mb4_unicode_ci"
]
networks:
- mysql-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-pSykj@2025"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
networks:
mysql-network:
driver: bridge
EOF
使用 Docker Compose 启动:
bash
cd /docker/mysql8.0.42
docker-compose up -d
命令参数详细说明
-p 3306:3306: 端口映射--name mysql8: 容器名称--privileged=true: 特权模式--restart on-failure:3: 重启策略-v: 数据卷映射-e MYSQL_ROOT_PASSWORD: root 密码-e MYSQL_ROOT_HOST="% ": 允许远程连接--default-authentication-plugin: 认证插件
验证部署
检查容器状态
bash
# 查看容器状态
docker ps
# 查看容器详细信息
docker inspect mysql8
# 查看容器资源使用情况
docker stats mysql8
查看容器日志
bash
# 实时查看日志
docker logs -f mysql8
# 查看最近的日志
docker logs --tail 100 mysql8
# 查看特定时间范围的日志
docker logs --since "2024-01-01T00:00:00" mysql8
连接测试
bash
# 方式1:使用 MySQL 客户端
mysql -h localhost -P 3306 -u root -p
# 方式2:进入容器执行
docker exec -it mysql8 mysql -u root -p
# 方式3:使用环境变量密码
docker exec -it mysql8 mysql -u root -p"Sykj@2025"
# 方式4:测试远程连接
mysql -h your_server_ip -P 3306 -u root -p
检查数据库状态
sql
-- 连接后执行以下命令
SHOW VARIABLES LIKE 'version%';
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'max_connections';
SELECT USER(), DATABASE();
SHOW STATUS LIKE 'Connections';
SHOW STATUS LIKE 'Threads_connected';
数据库初始化
创建应用数据库
bash
# 在容器内创建数据库
docker exec -it mysql8 mysql -u root -p"Sykj@2025" -e "
CREATE DATABASE IF NOT EXISTS app_database
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
"
# 验证数据库创建
docker exec -it mysql8 mysql -u root -p"Sykj@2025" -e "
SHOW DATABASES LIKE 'app_database';
"
创建应用用户
bash
# 创建应用用户
docker exec -it mysql8 mysql -u root -p"Sykj@2025" -e "
CREATE USER IF NOT EXISTS 'app_user'@'%' IDENTIFIED BY 'AppUser@2025';
GRANT ALL PRIVILEGES ON app_database.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
"
# 验证用户创建
docker exec -it mysql8 mysql -u root -p"Sykj@2025" -e "
SELECT User, Host FROM mysql.user WHERE User = 'app_user';
"
用户管理
创建不同权限用户
sql
-- 连接到 MySQL
docker exec -it mysql8 mysql -u root -p"Sykj@2025"
-- 创建只读用户
CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'ReadOnly@2025';
GRANT SELECT ON app_database.* TO 'readonly_user'@'%';
FLUSH PRIVILEGES;
-- 创建开发用户
CREATE USER 'dev_user'@'%' IDENTIFIED BY 'DevUser@2025';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_database.* TO 'dev_user'@'%';
FLUSH PRIVILEGES;
-- 查看用户权限
SHOW GRANTS FOR 'app_user'@'%';
用户管理脚本
创建用户管理脚本 /docker/mysql8.0.42/scripts/user_management.sh:
bash
sudo cat > /docker/mysql8.0.42/scripts/user_management.sh << 'EOF'
#!/bin/bash
MYSQL_ROOT_PASSWORD="Sykj@2025"
CONTAINER_NAME="mysql8"
case "$1" in
create-user)
if [ $# -ne 3 ]; then
echo "Usage: $0 create-user <username> <password>"
exit 1
fi
docker exec -it $CONTAINER_NAME mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "
CREATE USER IF NOT EXISTS '$2'@'%' IDENTIFIED BY '$3';
GRANT ALL PRIVILEGES ON *.* TO '$2'@'%';
FLUSH PRIVILEGES;
"
;;
delete-user)
if [ $# -ne 2 ]; then
echo "Usage: $0 delete-user <username>"
exit 1
fi
docker exec -it $CONTAINER_NAME mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "
DROP USER IF EXISTS '$2'@'%';
FLUSH PRIVILEGES;
"
;;
list-users)
docker exec -it $CONTAINER_NAME mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "
SELECT User, Host FROM mysql.user;
"
;;
*)
echo "Usage: $0 {create-user|delete-user|list-users} [args...]"
exit 1
;;
esac
EOF
sudo chmod +x /docker/mysql8.0.42/scripts/user_management.sh
性能调优
内存配置优化
根据服务器内存调整配置:
bash
# 服务器内存 4GB - 调整配置
sudo sed -i 's/innodb_buffer_pool_size=1G/innodb_buffer_pool_size=2G/' /docker/mysql8.0.42/etc/mysql/conf.d/my.cnf
# 服务器内存 8GB - 调整配置
sudo sed -i 's/innodb_buffer_pool_size=1G/innodb_buffer_pool_size=4G/' /docker/mysql8.0.42/etc/mysql/conf.d/my.cnf
# 服务器内存 16GB+ - 调整配置
sudo sed -i 's/innodb_buffer_pool_size=1G/innodb_buffer_pool_size=8G/' /docker/mysql8.0.42/etc/mysql/conf.d/my.cnf
性能监控脚本
创建性能监控脚本 /docker/mysql8.0.42/scripts/performance_monitor.sh:
bash
sudo cat > /docker/mysql8.0.42/scripts/performance_monitor.sh << 'EOF'
#!/bin/bash
CONTAINER_NAME="mysql8"
MYSQL_ROOT_PASSWORD="Sykj@2025"
while true; do
echo "=== MySQL Performance Monitor $(date) ==="
# 基本状态
docker exec $CONTAINER_NAME mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "
SELECT NOW() as 'Time',
VARIABLE_VALUE as 'Connections'
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'Threads_connected';
SELECT VARIABLE_VALUE as 'Max Connections'
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'Max_used_connections';
SELECT VARIABLE_VALUE as 'QPS'
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'Questions';
SHOW PROCESSLIST;
" 2>/dev/null
sleep 10
clear
done
EOF
sudo chmod +x /docker/mysql8.0.42/scripts/performance_monitor.sh
安全配置
SSL 配置
bash
# 检查 SSL 状态
docker exec -it mysql8 mysql -u root -p"Sykj@2025" -e "
SHOW VARIABLES LIKE '%ssl%';
"
# 生成 SSL 证书(如果需要)
docker exec -it mysql8 mysql_ssl_rsa_setup --datadir=/var/lib/mysql
安全加固脚本
bash
# 执行 MySQL 安全配置脚本
docker exec -it mysql8 mysql_secure_installation
# 或者手动执行安全配置
docker exec -it mysql8 mysql -u root -p"Sykj@2025" -e "
-- 删除匿名用户
DELETE FROM mysql.user WHERE User='';
-- 删除测试数据库
DROP DATABASE IF EXISTS test;
-- 刷新权限
FLUSH PRIVILEGES;
"
备份与恢复
自动备份脚本
创建自动备份脚本 /docker/mysql8.0.42/scripts/backup.sh:
bash
sudo cat > /docker/mysql8.0.42/scripts/backup.sh << 'EOF'
#!/bin/bash
# 配置变量
BACKUP_DIR="/docker/mysql8.0.42/backups"
MYSQL_ROOT_PASSWORD="Sykj@2025"
CONTAINER_NAME="mysql8"
DATE=$(date +"%Y%m%d_%H%M%S")
# 创建备份目录
mkdir -p $BACKUP_DIR
# 全库备份
echo "Starting full backup at $(date)"
docker exec $CONTAINER_NAME mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" --all-databases --single-transaction --routines --triggers > $BACKUP_DIR/full_backup_$DATE.sql
if [ $? -eq 0 ]; then
echo "Full backup completed successfully: full_backup_$DATE.sql"
# 压缩备份文件
gzip $BACKUP_DIR/full_backup_$DATE.sql
echo "Backup compressed: full_backup_$DATE.sql.gz"
# 清理旧备份(保留最近7天)
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "Old backups cleaned up"
else
echo "Backup failed!"
exit 1
fi
EOF
sudo chmod +x /docker/mysql8.0.42/scripts/backup.sh
数据库恢复脚本
创建恢复脚本 /docker/mysql8.0.42/scripts/restore.sh:
bash
sudo cat > /docker/mysql8.0.42/scripts/restore.sh << 'EOF'
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 <backup_file_path>"
exit 1
fi
BACKUP_FILE="$1"
MYSQL_ROOT_PASSWORD="Sykj@2025"
CONTAINER_NAME="mysql8"
if [ ! -f "$BACKUP_FILE" ]; then
echo "Backup file not found: $BACKUP_FILE"
exit 1
fi
echo "Starting restore from: $BACKUP_FILE"
echo "This will overwrite all data in the database!"
read -p "Are you sure? (yes/no): " confirm
if [ "$confirm" != "yes" ]; then
echo "Restore cancelled"
exit 1
fi
# 恢复数据
if [[ "$BACKUP_FILE" == *.gz ]]; then
gunzip -c "$BACKUP_FILE" | docker exec -i $CONTAINER_NAME mysql -u root -p"$MYSQL_ROOT_PASSWORD"
else
docker exec -i $CONTAINER_NAME mysql -u root -p"$MYSQL_ROOT_PASSWORD" < "$BACKUP_FILE"
fi
if [ $? -eq 0 ]; then
echo "Restore completed successfully"
else
echo "Restore failed!"
exit 1
fi
EOF
sudo chmod +x /docker/mysql8.0.42/scripts/restore.sh
设置定时备份
bash
# 添加到 crontab 实现定时备份
echo "0 2 * * * /docker/mysql8.0.42/scripts/backup.sh" | sudo crontab -
# 验证 crontab
sudo crontab -l
监控与日志
日志分析脚本
创建日志分析脚本 /docker/mysql8.0.42/scripts/log_analysis.sh:
bash
sudo cat > /docker/mysql8.0.42/scripts/log_analysis.sh << 'EOF'
#!/bin/bash
LOG_DIR="/docker/mysql8.0.42/logs"
CONTAINER_NAME="mysql8"
case "$1" in
error)
echo "=== Error Logs ==="
docker exec $CONTAINER_NAME tail -n 50 /logs/error.log
;;
slow)
echo "=== Slow Query Logs ==="
docker exec $CONTAINER_NAME tail -n 50 /logs/slow.log
;;
general)
echo "=== General Logs ==="
docker exec $CONTAINER_NAME tail -n 50 /logs/general.log
;;
analyze-slow)
echo "=== Slow Query Analysis ==="
docker exec $CONTAINER_NAME mysql -u root -p"Sykj@2025" -e "
SELECT
COUNT_STAR AS execution_count,
AVG_TIMER_WAIT/1000000000 AS avg_duration_sec,
DIGEST_TEXT AS query_sample
FROM performance_schema.events_statements_summary_by_digest
WHERE AVG_TIMER_WAIT > 1000000000 -- More than 1 second
ORDER BY AVG_TIMER_WAIT DESC
LIMIT 10;
"
;;
*)
echo "Usage: $0 {error|slow|general|analyze-slow}"
exit 1
;;
esac
EOF
sudo chmod +x /docker/mysql8.0.42/scripts/log_analysis.sh
常用操作
容器管理
bash
# 停止容器
docker stop mysql8
# 启动容器
docker start mysql8
# 重启容器
docker restart mysql8
# 删除容器
docker rm mysql8
# 进入容器
docker exec -it mysql8 bash
# 查看容器资源使用
docker stats mysql8
# 查看容器健康状态
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
数据库操作
bash
# 创建数据库
docker exec -it mysql8 mysql -u root -p"Sykj@2025" -e "CREATE DATABASE new_database;"
# 导出单个数据库
docker exec mysql8 mysqldump -u root -p"Sykj@2025" database_name > backup.sql
# 导入数据库
docker exec -i mysql8 mysql -u root -p"Sykj@2025" < backup.sql
# 执行 SQL 文件
docker exec -i mysql8 mysql -u root -p"Sykj@2025" -e "source /path/to/sql/file.sql"
# 查看表状态
docker exec -it mysql8 mysql -u root -p"Sykj@2025" -e "SHOW TABLE STATUS FROM database_name;"
故障排除
常见问题诊断
bash
# 1. 容器无法启动 - 检查日志
docker logs mysql8
# 2. 连接失败 - 检查网络
netstat -tuln | grep :3306
telnet localhost 3306
# 3. 权限问题 - 检查目录权限
ls -la /docker/mysql8.0.42/data/
ls -la /docker/mysql8.0.42/logs/
# 4. 配置错误 - 验证配置文件
docker exec -it mysql8 mysqld --validate-config
# 5. 磁盘空间不足
df -h /docker/mysql8.0.42/
修复脚本
创建修复脚本 /docker/mysql8.0.42/scripts/troubleshoot.sh:
bash
sudo cat > /docker/mysql8.0.42/scripts/troubleshoot.sh << 'EOF'
#!/bin/bash
CONTAINER_NAME="mysql8"
DATA_DIR="/docker/mysql8.0.42/data"
echo "=== MySQL Troubleshooting Script ==="
# 1. 检查容器状态
echo "1. Checking container status..."
docker ps -a | grep $CONTAINER_NAME
# 2. 检查日志
echo -e "\n2. Checking recent logs..."
docker logs --tail 20 $CONTAINER_NAME
# 3. 检查数据目录权限
echo -e "\n3. Checking data directory permissions..."
ls -la $DATA_DIR | head -10
# 4. 检查磁盘空间
echo -e "\n4. Checking disk space..."
df -h $DATA_DIR
# 5. 检查端口占用
echo -e "\n5. Checking port availability..."
netstat -tuln | grep :3306
# 6. 尝试重启
echo -e "\n6. Attempting restart..."
docker restart $CONTAINER_NAME
sleep 5
# 7. 检查重启后状态
echo -e "\n7. Checking status after restart..."
docker ps | grep $CONTAINER_NAME
if [ $? -eq 0 ]; then
echo -e "\nContainer restarted successfully!"
else
echo -e "\nContainer restart failed. Please check logs manually."
fi
EOF
sudo chmod +x /docker/mysql8.0.42/scripts/troubleshoot.sh
维护计划
日常维护脚本
创建日常维护脚本 /docker/mysql8.0.42/scripts/daily_maintenance.sh:
bash
sudo cat > /docker/mysql8.0.42/scripts/daily_maintenance.sh << 'EOF'
#!/bin/bash
CONTAINER_NAME="mysql8"
MYSQL_ROOT_PASSWORD="Sykj@2025"
echo "=== Daily Maintenance Started at $(date) ==="
# 1. 检查数据库连接
echo "1. Testing database connection..."
docker exec $CONTAINER_NAME mysqladmin -u root -p"$MYSQL_ROOT_PASSWORD" ping
# 2. 检查表完整性
echo "2. Checking table integrity..."
docker exec -it $CONTAINER_NAME mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys');
" | tail -n +2 | while read db; do
if [ ! -z "$db" ]; then
echo "Checking database: $db"
docker exec -it $CONTAINER_NAME mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "
USE $db;
SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA = '$db' AND TABLE_TYPE = 'BASE TABLE';
" | tail -n +2 | while read table; do
if [ ! -z "$table" ]; then
echo " Checking table: $table"
docker exec -it $CONTAINER_NAME mysqlcheck -u root -p"$MYSQL_ROOT_PASSWORD" $db $table
fi
done
fi
done
# 3. 清理临时文件
echo "3. Cleaning temporary files..."
docker exec $CONTAINER_NAME find /tmp -name "mysql*" -type f -mtime +1 -delete
# 4. 更新统计信息
echo "4. Updating table statistics..."
docker exec -it $CONTAINER_NAME mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "
SELECT CONCAT('ANALYZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') AS stmt
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')
AND TABLE_TYPE = 'BASE TABLE';
" | tail -n +2 | while read stmt; do
if [ ! -z "$stmt" ]; then
docker exec -it $CONTAINER_NAME mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "$stmt"
fi
done
echo "=== Daily Maintenance Completed at $(date) ==="
EOF
sudo chmod +x /docker/mysql8.0.42/scripts/daily_maintenance.sh
设置定期维护
bash
# 添加每日维护任务到 crontab
echo "0 3 * * * /docker/mysql8.0.42/scripts/daily_maintenance.sh >> /docker/mysql8.0.42/logs/maintenance.log 2>&1" | sudo crontab -
安全建议
- 定期更换 root 密码
- 不要在生产环境中使用示例密码
- 限制外部访问权限,使用防火墙规则
- 定期备份数据并验证备份完整性
- 监控日志文件,及时发现异常
- 定期更新 Docker 镜像和 MySQL 版本
- 使用专用的 MySQL 用户而非 root 用户
- 启用 SSL 加密连接
- 定期审查用户权限
卸载与清理
如需完全卸载 MySQL Docker 服务:
bash
# 1. 停止并删除容器
docker stop mysql8 && docker rm mysql8
# 2. 删除 Docker Compose(如果使用)
cd /docker/mysql8.0.42
docker-compose down -v
# 3. 删除镜像(可选)
docker rmi mysql:8.0.42
# 4. 删除数据目录(警告:此操作不可逆)
sudo rm -rf /docker/mysql8.0.42
# 5. 清理 crontab(如果设置了定时任务)
sudo crontab -l | grep -v "mysql8" | sudo crontab -
重要提示:
-
本手册中使用的密码为示例密码,在生产环境中请务必使用强密码并定期更换
-
根据实际服务器硬件配置调整内存和性能参数
-
生产环境部署前请在测试环境充分验证
-
建议启用 SSL 连接以保障数据传输安全
-
定期监控数据库性能和资源使用情况
这个详细的部署手册涵盖了从基础部署到高级配置的所有方面,包括性能调优、安全配置、备份恢复、监控日志、故障排除和维护计划等完整内容。手册提供了大量的实用脚本和最佳实践建议,适合在各种环境中使用。```