针对1C512M小机Docker部署MySQL 8.4 LTS的优化,需重点关注内存控制与参数精简:通过mem_limit:256m限制容器内存,调整innodb-buffer-pool-size=64M适配小内存,关闭二进制日志(–skip-log-bin)及性能模式(–performance-schema=off)减少资源消耗。同时优化字符集、表缓存等配置,并限制最大连接数为30避免过载。

docker compose 文件

version: '3'
services:

  # Mysql
  mysql:
    image: mysql:8.4
    mem_limit: 256m # 还有其他程序故限制 256m
    restart: always
    volumes:
      - ./mysql_data:/var/lib/mysql/
    environment:
      MYSQL_ROOT_PASSWORD: "5be43724-f79e-4b26-81f8-********"
      MYSQL_DATABASE: "dev"
      MYSQL_USER: "dev"
      MYSQL_PASSWORD: "5be43724-f79e-4b26-81f8-********"
      TZ: Asia/Shanghai 
    command: [
      # 关闭二进制日志,主从 数据恢复功能将不可用, 与"--disable-log-bin"参数二选一
      "--skip-log-bin", 
      # 设置utf8字符集
      "--character-set-server=utf8mb4",
      "--collation-server=utf8mb4_unicode_ci",
      # InnoDB 恢复 0正常启动,不强制恢复 1-6启用
      "--innodb-force-recovery=0",
      # 慢日志 x 秒
      "--long-query-time=5",
      "--slow-query-log=0",
      "--slow-query-log-file=/var/lib/mysql_log/mysql-slow.log",
      # 禁用性能数据采集,节省内存但无法进行性能分析
      "--performance-schema=off",
      # 仅记录最后一次死锁信息,减少日志冗余
      "--innodb-print-all-deadlocks=OFF",
      # InnoDB引擎的核心参数,直接影响读写性能
      "--innodb-buffer-pool-size=64M",
      "--innodb-log-buffer-size=8M",
      # 将全局表缓存分割为多个独立分区,减少多线程访问时的锁竞争。每个线程仅需锁定一个分区,提升高并发场景下的性能。
      "--performance-schema-max-table-instances=100",
      # 缓存表结构定义(.frm文件),减少元数据解析开销。与table_open_cache不同,它仅缓存表结构而非数据文件,不占用文件描述符。
      "--table-definition-cache=100",
      # 控制所有线程同时打开的表的数量上限
      "--table-open-cache=100",
      # 最大连接数
      "--max-connections=30",
    ]
    ports:
      - "0.0.0.0:30601:3306"
    networks:
      - infra

  adminer:
    image: adminer
    mem_limit: 128m
    restart: always
    ports:
      - "0.0.0.0:30901:8080"
    depends_on:
      - mysql
    networks:
      - infra

networks:
  infra:

内存占用

仅运行MySQL adminer 是内存状态140M左右,若再运行其他程序会动态减少占用至 40~60M的内容占用。