MySQL 8.0.42 Docker 开发部署手册

# 复制代码
## 目录
- [概述](#概述)
- [环境准备](#环境准备)
- [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 字符集支持完整 Unicode
  • max_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 -

重要提示:

  1. 本手册中使用的密码为示例密码,在生产环境中请务必使用强密码并定期更换

  2. 根据实际服务器硬件配置调整内存和性能参数

  3. 生产环境部署前请在测试环境充分验证

  4. 建议启用 SSL 连接以保障数据传输安全

  5. 定期监控数据库性能和资源使用情况

    这个详细的部署手册涵盖了从基础部署到高级配置的所有方面,包括性能调优、安全配置、备份恢复、监控日志、故障排除和维护计划等完整内容。手册提供了大量的实用脚本和最佳实践建议,适合在各种环境中使用。```

相关推荐
xhuiting2 小时前
MySQL专题总结(四)—— 高可用
java·数据库·mysql
kjmkq2 小时前
目工业级宽温SSD哪个品牌不掉盘最稳定?宽温环境下的稳定性性技术解析
数据库·存储
Predestination王瀞潞2 小时前
Java EE3-我独自整合(第二章:Spring IoC 入门案例)
数据库·spring·java-ee
大新新大浩浩2 小时前
Deerflow部署-X86架构-在ubuntu2204操作系统上使用docker模式部署
docker·容器·架构
梁山话事人2 小时前
Spring IOC
java·数据库·spring
魔都吴所谓2 小时前
【Linux】Ubuntu22.04 Docker+四大数据库(挂载本地)一键安装脚本
linux·数据库·docker
计算机学姐2 小时前
基于SpringBoot的奶茶店点餐系统【协同过滤推荐算法+数据可视化统计】
java·vue.js·spring boot·mysql·信息可视化·tomcat·推荐算法
又来敲代码了2 小时前
Zrlog博客的系统部署
java·linux·运维·mysql·apache·tornado
麦聪聊数据2 小时前
电商数据运营的最佳实践:WebSQL 如何兼顾数据分析效率与生产库安全
数据库·sql·低代码·restful