最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Docker MySQL 8.0.45性能優(yōu)化配置文檔方式

 更新時間:2026年05月22日 09:13:41   作者:周易宅  
文章主要討論了MySQL 8.0.4 Docker容器在特定服務(wù)器環(huán)境中的優(yōu)化過程,首先描述了當(dāng)前配置和參數(shù),接著分析了優(yōu)化前的配置,發(fā)現(xiàn)存在嚴(yán)重的資源浪費,隨后,文章詳細(xì)介紹了優(yōu)化后的參數(shù)配置,包括InnoDB緩存、連接與線程配置、內(nèi)存在存臨時表、慢查詢?nèi)罩镜鹊鹊恼{(diào)整
  • 環(huán)境:Docker mysql8 容器
  • 服務(wù)器:192.168.65.100

一、硬件環(huán)境

項目配置
CPU4 核
內(nèi)存7.7 GB(可用 ~6.5 GB)
磁盤97 GB
Docker 資源限制無限制(CPU=0, Mem=0)
MySQL 版本8.0.45(官方鏡像)

二、配置文件架構(gòu)

宿主機                         容器內(nèi)
──────────────────────────────────────────
/data/mysql8/conf/  ──bind──? /etc/mysql/conf.d/
  ├── max_allowed_packet.cnf       (由 my.cnf 中 !includedir 自動加載)
  └── performance.cnf

/data/mysql8/data/  ──bind──? /var/lib/mysql/

所有配置通過 docker inspect mysql8 確認(rèn)掛載正確,容器重啟/重建均不丟失。

三、參數(shù)持久化方案

3.1 為什么 SET GLOBAL 不持久

MySQL 中修改參數(shù)有兩種方式:

方式示例生效范圍容器重啟后
SET GLOBALSET GLOBAL max_allowed_packet=512M;當(dāng)前運行實例,內(nèi)存中? 丟失,恢復(fù)默認(rèn)值
配置文件max_allowed_packet=512M 寫入 my.cnf啟動時讀取,全局生效? 永久生效

因此所有性能參數(shù)必須寫入配置文件,而非僅靠 SET GLOBAL

3.2 Docker 綁定掛載 → 持久化

MySQL 官方鏡像的 my.cnf 末尾有指令:

!includedir /etc/mysql/conf.d/

這意味著放在 /etc/mysql/conf.d/ 目錄下的任何 .cnf 文件都會被自動加載。

關(guān)鍵:該目錄通過 Docker bind mount 映射到宿主機,因此文件在宿主機上創(chuàng)建即可持久化:

宿主機文件                     掛載關(guān)系        容器內(nèi)加載路徑
────────────────────────────────────────────────────────────
/data/mysql8/conf/     ──bind mount──?  /etc/mysql/conf.d/
  └─ performance.cnf                      └─ 被 my.cnf 的 !includedir 自動加載

docker inspect 驗證掛載配置:

docker inspect mysql8 --format '{{json .Mounts}}' | python3 -m json.tool

輸出示例:

[
    {
        "Type": "bind",
        "Source": "/data/mysql8/conf",
        "Destination": "/etc/mysql/conf.d",
        "RW": true
    },
    {
        "Type": "bind",
        "Source": "/data/mysql8/data",
        "Destination": "/var/lib/mysql",
        "RW": true
    }
]

? Source = 宿主機目錄,文件存這里就永遠(yuǎn)不會丟。

3.3 創(chuàng)建持久化配置(完整操作)

# Step 1: 在宿主機創(chuàng)建配置文件
cat > /data/mysql8/conf/performance.cnf << 'EOF'
[mysqld]
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 2
innodb_log_file_size = 256M
# ... 其他參數(shù) ...
max_allowed_packet = 512M
EOF

# Step 2: 驗證容器內(nèi)可見
docker exec mysql8 cat /etc/mysql/conf.d/performance.cnf

# Step 3: 優(yōu)雅關(guān)閉 + 重啟(innodb_log_file_size 變更需額外處理)
docker exec mysql8 mysql -uroot -p -e "SET GLOBAL innodb_fast_shutdown=0;"
docker exec mysql8 rm -f /var/lib/mysql/ib_logfile*
docker restart mysql8

# Step 4: 驗證參數(shù)已從配置文件加載
docker exec mysql8 mysql -uroot -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
# 預(yù)期: 2147483648 (2G)

3.4 持久化驗證

重啟容器后確認(rèn)參數(shù)來自配置文件而非默認(rèn)值:

# 重啟
docker restart mysql8

# 驗證關(guān)鍵參數(shù)仍為優(yōu)化值
docker exec mysql8 mysql -uroot -p -e "
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'innodb_log_file_size';
SHOW VARIABLES LIKE 'max_allowed_packet';
"
驗證點默認(rèn)值(重啟后如未持久化)持久化后期望
innodb_buffer_pool_size134217728 (128M)2147483648 (2G)
innodb_log_file_size50331648 (48M)268435456 (256M)
max_allowed_packet67108864 (64M)536870912 (512M)

如果重啟后值與期望不符,說明配置文件未被正確加載,檢查:

  1. docker inspect 確認(rèn)掛載路徑正確
  2. docker exec mysql8 ls /etc/mysql/conf.d/ 確認(rèn)文件存在
  3. docker exec mysql8 mysqld --verbose --help 2>/dev/null | grep -A1 "conf.d" 確認(rèn) !includedir 生效

3.5 當(dāng)前已持久化的配置文件

/data/mysql8/conf/
├── max_allowed_packet.cnf    # [mysqld] max_allowed_packet=512M
└── performance.cnf           # [mysqld] 全部 InnoDB/連接/緩存優(yōu)化參數(shù)

兩個文件互不沖突,MySQL 會按文件名字母順序加載(后加載的同名參數(shù)覆蓋先加載的)。

四、優(yōu)化前現(xiàn)狀分析

MySQL 8.0.45 官方鏡像的全部默認(rèn)參數(shù),運行在 7.7GB 服務(wù)器上存在嚴(yán)重浪費:

關(guān)鍵問題默認(rèn)值浪費程度
Buffer Pool 僅 128M7.7GB 總內(nèi)存利用率 1.6%?? 嚴(yán)重
Redo Log 僅 50M高寫入場景頻繁 checkpoint?? 中等
IO 容量僅 200未利用 SSD 吞吐能力?? 中等
每次事務(wù)都刷盤開發(fā)/測試環(huán)境過度安全?? 中等
線程緩存僅 9頻繁創(chuàng)建/銷毀線程?? 輕微
慢查詢?nèi)罩娟P(guān)閉無法排查性能問題?? 輕微

五、優(yōu)化參數(shù)詳解

4.1 InnoDB 核心優(yōu)化

參數(shù)說明優(yōu)化前優(yōu)化后影響
innodb_buffer_pool_size數(shù)據(jù)和索引緩存,最重要的性能參數(shù)128M2G緩存命中率從 ~30% 提升至 95%+,減少磁盤 IO
innodb_buffer_pool_instancesBuffer Pool 分區(qū)數(shù)12多核并發(fā)訪問時減少鎖競爭
innodb_log_file_sizeRedo Log 單個文件大小50M256M減少 checkpoint 頻率,寫入更平滑
innodb_log_buffer_sizeRedo Log 內(nèi)存緩沖區(qū)16M64M批量寫入磁盤,減少小 IO
innodb_io_capacity后臺 IO 操作吞吐上限2001000充分利用磁盤吞吐能力
innodb_io_capacity_max緊急情況下 IO 上限20003000突發(fā) IO 允許更高吞吐
innodb_flush_log_at_trx_commit事務(wù)日志刷盤策略12?? 1=每次提交刷盤(最安全),2=每秒刷盤(平衡)
innodb_flush_method數(shù)據(jù)文件刷盤方式fsyncO_DIRECT繞過 OS 緩存,避免雙重緩存

innodb_flush_log_at_trx_commit 重要說明

值為 0:每秒寫入日志并刷盤(性能最高,可能丟 1 秒數(shù)據(jù))
值為 1:每次提交都寫入并刷盤(最安全,性能最低)  ← 默認(rèn)
值為 2:每次提交寫入,每秒刷盤(平衡方案)        ← 當(dāng)前
  • 當(dāng)前選擇 2 的理由: 這是開發(fā)/內(nèi)部使用環(huán)境,對極端數(shù)據(jù)安全性要求不高,
  • 每秒最多丟失 1 秒事務(wù)數(shù)據(jù)可接受,但寫性能提升 5~10 倍。
  • 如需最高安全性可改為 1。

內(nèi)存分配分析

服務(wù)器總內(nèi)存:     7.7 GB
系統(tǒng)預(yù)留:         ~1.0 GB
其他服務(wù):         ~3.0 GB
MySQL Buffer Pool: 2.0 GB
剩余可用:         ~1.7 GB

4.2 連接與線程

參數(shù)說明優(yōu)化前優(yōu)化后
max_connections最大連接數(shù)151300
thread_cache_size線程緩存932
wait_timeout非交互連接超時(秒)28800 (8h)3600 (1h)
interactive_timeout交互連接超時(秒)28800 (8h)3600 (1h)

wait_timeout 設(shè)為 3600s 可自動清理長時間空閑連接,避免連接數(shù)耗盡。

4.3 表緩存

參數(shù)說明優(yōu)化前優(yōu)化后
table_open_cache打開表緩存數(shù)量40004000
table_definition_cache表定義緩存20004000

當(dāng)前 126 張表,4000 足夠。每張表打開消耗約 4KB,總消耗約 16MB。

4.4 內(nèi)存臨時表與排序

參數(shù)說明優(yōu)化前優(yōu)化后備注
tmp_table_size內(nèi)存臨時表大小16M64M超過此值轉(zhuǎn)為磁盤臨時表
max_heap_table_sizeMEMORY 引擎表最大大小16M64M與 tmp_table_size 保持一致
sort_buffer_size排序緩沖區(qū)256K512K每個需要排序的會話分配
join_buffer_sizeJOIN 緩沖區(qū)256K512K每個需要 JOIN 的會話分配
read_buffer_size順序讀緩沖區(qū)128K256K全表掃描時使用
read_rnd_buffer_size隨機讀緩沖區(qū)256K512KORDER BY 后讀取使用

sort_buffer_sizejoin_buffer_sizeper-session(每個連接)的,

不要設(shè)太大。當(dāng)前值在 300 連接上限下最壞情況內(nèi)存占用:300 × (512K+512K+256K+512K) ≈ 525MB。

4.5 Binlog 日志

參數(shù)說明優(yōu)化前優(yōu)化后
log_bin啟用二進制日志ONON
binlog_formatbinlog 格式ROWROW
sync_binlogbinlog 刷盤頻率1 (每次)1 (保持)
binlog_cache_size事務(wù) binlog 緩存32K1M
binlog_expire_logs_secondsbinlog 自動清理30天7天

binlog_expire_logs_seconds 從 30 天縮短到 7 天,減少磁盤占用。

4.6 監(jiān)控與診斷

參數(shù)說明優(yōu)化前優(yōu)化后
slow_query_log慢查詢?nèi)罩鹃_關(guān)OFFON
long_query_time慢查詢閾值(秒)102
slow_query_log_file慢查詢?nèi)罩韭窂?/td>默認(rèn)/var/lib/mysql/slow.log

超過 2 秒的查詢會被記錄,便于后續(xù)排查和優(yōu)化。

4.7 其他

參數(shù)說明優(yōu)化前優(yōu)化后
max_allowed_packet最大數(shù)據(jù)包64M512M

導(dǎo)入 127MB 的 test.sql 時遇到 ERR 2006 MySQL server has gone away,就是此參數(shù)過小導(dǎo)致。

512M 足以應(yīng)對大型 INSERT 語句。

六、完整配置文件

以下為 /data/mysql8/conf/performance.cnf 的實際內(nèi)容:

[mysqld]

# ===== InnoDB 核心優(yōu)化 =====
# Buffer Pool: 最重要參數(shù),設(shè)為可用內(nèi)存 60-70%
# 當(dāng)前服務(wù)器 7.7G 總內(nèi)存,分配 2G 給 MySQL
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 2

# Redo Log: 增大減少 checkpoint 頻率
innodb_log_file_size = 256M
innodb_log_buffer_size = 64M

# IO 容量: SSD 推薦 1000-2000,HDD 保持 200
innodb_io_capacity = 1000
innodb_io_capacity_max = 3000

# 刷新策略: 1=每次刷盤(最安全), 2=每秒刷盤(平衡)
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

# ===== 連接與線程 =====
thread_cache_size = 32
max_connections = 300
wait_timeout = 3600
interactive_timeout = 3600

# ===== 表緩存 =====
table_open_cache = 4000
table_definition_cache = 4000

# ===== 臨時表 =====
tmp_table_size = 64M
max_heap_table_size = 64M

# ===== 排序與 JOIN 緩沖 (per-session) =====
sort_buffer_size = 512K
join_buffer_size = 512K
read_buffer_size = 256K
read_rnd_buffer_size = 512K

# ===== 慢查詢?nèi)罩?=====
slow_query_log = ON
long_query_time = 2
slow_query_log_file = /var/lib/mysql/slow.log

# ===== Binlog =====
binlog_cache_size = 1M
binlog_expire_logs_seconds = 604800

# ===== 其他 =====
max_allowed_packet = 512M

七、變更 innodb_log_file_size 的特殊步驟

修改 innodb_log_file_size 時,MySQL 不會自動調(diào)整已存在的 redo log 文件,

必須手動刪除舊文件后重啟:

# 1. 優(yōu)雅關(guān)閉 MySQL (完整刷盤)
docker exec mysql8 mysql -uroot -p -e "SET GLOBAL innodb_fast_shutdown=0;"

# 2. 刪除舊 redo log 文件
docker exec mysql8 rm -f /var/lib/mysql/ib_logfile*

# 3. 重啟容器(會自動創(chuàng)建新大小的 redo log)
docker restart mysql8

跳過步驟 2 會導(dǎo)致 MySQL 啟動失敗,報錯 redo log size mismatch。

八、驗證優(yōu)化效果

# 確認(rèn)所有參數(shù)已生效
docker exec mysql8 mysql -uroot -p -e "
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'innodb_log_file_size';
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
SHOW VARIABLES LIKE 'innodb_io_capacity';
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'max_allowed_packet';
"

預(yù)期輸出:

參數(shù)
innodb_buffer_pool_size2147483648 (2G)
innodb_log_file_size268435456 (256M)
innodb_flush_log_at_trx_commit2
innodb_io_capacity1000
slow_query_logON
max_allowed_packet536870912 (512M)

九、優(yōu)化效果預(yù)估

指標(biāo)優(yōu)化前優(yōu)化后
Buffer Pool 命中率~30%95%+
寫入吞吐量基準(zhǔn)值5~10 倍
Checkpoint 頻率頻繁低頻
慢查詢可見性2 秒以上自動記錄
最大并發(fā)連接151300
binlog 磁盤占用30 天7 天

十、后續(xù)建議

定期查看慢查詢?nèi)罩?/strong>:

docker exec mysql8 mysqldumpslow /var/lib/mysql/slow.log

監(jiān)控 Buffer Pool 命中率

SHOW STATUS LIKE 'Innodb_buffer_pool_read%';
-- read_requests / (reads + read_requests) 應(yīng) > 95%

根據(jù)業(yè)務(wù)增長調(diào)整:如果表數(shù)據(jù)量增長到接近 2G,考慮酌情增大 innodb_buffer_pool_size

磁盤 I/O 壓力大時:可提升 innodb_io_capacity 到 2000

  • 配置文件路徑: /data/mysql8/conf/performance.cnf
  • 目標(biāo)服務(wù)器: 192.168.65.100
  • 容器名稱: mysql8

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 徹底解決Docker拉取鏡像超時問題及分析

    徹底解決Docker拉取鏡像超時問題及分析

    Docker拉取鏡像常因網(wǎng)絡(luò)延遲、加速器失效等問題失敗,解決方案包括配置多源鏡像加速器、關(guān)閉IPv6、更換DNS、驗證加速器連通性、離線導(dǎo)入或skopeo工具,以解決中國大陸用戶的連接問題
    2025-09-09
  • docker實踐之容器的導(dǎo)入與導(dǎo)出

    docker實踐之容器的導(dǎo)入與導(dǎo)出

    Docker技術(shù)為IT界帶來了巨大的改變,它使得云服務(wù)可以用來共享應(yīng)用和工作流程自動化,使得應(yīng)用可以用組件快速組合,消除了開發(fā)、品質(zhì)保證、產(chǎn)品環(huán)境間的摩擦。這篇文章我們將詳細(xì)的介紹docker容器的導(dǎo)入與導(dǎo)出,感興趣的朋友們下面來一起看看吧。
    2016-10-10
  • Docker掛載目錄失敗問題解決方法

    Docker掛載目錄失敗問題解決方法

    在使用Docker時,可能會遇到掛載目錄失敗的問題,這通常是由于路徑錯誤或權(quán)限問題導(dǎo)致,解決這一問題的方法包括檢查掛載路徑、使用正確的交互路徑、避免掛載宿主機的非空目錄等,需要的朋友可以參考下
    2024-10-10
  • 安裝Docker GPU版本的過程及遇到坑的解決

    安裝Docker GPU版本的過程及遇到坑的解決

    本文主要介紹了安裝Docker GPU版本的過程及遇到坑的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • 手把手教你docker部署(使用docker-compose)教程

    手把手教你docker部署(使用docker-compose)教程

    使用 Docker Compose 可以輕松、高效的管理容器,下面這篇文章主要給大家介紹了關(guān)于手把手教你docker部署(使用docker-compose)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Docker 教程之Docker Hub詳細(xì)介紹

    Docker 教程之Docker Hub詳細(xì)介紹

    這篇文章主要介紹了Docker 教程之Docker Hub詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • docker mysql啟動時執(zhí)行初始化sql

    docker mysql啟動時執(zhí)行初始化sql

    這篇文章主要介紹了docker mysql啟動時執(zhí)行初始化sql問題,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • Docker Consul概述以及集群環(huán)境搭建步驟(圖文詳解)

    Docker Consul概述以及集群環(huán)境搭建步驟(圖文詳解)

    本文主要介紹了Docker-Consul概述以及集群環(huán)境搭建步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Docker鏡像制作詳解介紹

    Docker鏡像制作詳解介紹

    這篇文章主要介紹了 Docker鏡像制作詳解介紹的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 已有docker鏡像構(gòu)建過程分析(使用示例)

    已有docker鏡像構(gòu)建過程分析(使用示例)

    docker history命令用于查看指定鏡像的歷史層信息,它顯示了鏡像創(chuàng)建過程中的每一層,包括創(chuàng)建時間、創(chuàng)建者、大小和注釋等信息,本文介紹已有docker鏡像構(gòu)建過程分析,感興趣的朋友一起看看吧
    2024-12-12

最新評論

兴仁县| 胶州市| 永德县| 七台河市| 广灵县| 舒城县| 宁都县| 沾化县| 鹤峰县| 漳州市| 安吉县| 昌黎县| 闻喜县| 文安县| 满洲里市| 亳州市| 葫芦岛市| 双江| 渭南市| 民县| 滁州市| 通化县| 玉溪市| 广州市| 宣武区| 上林县| 张掖市| 民权县| 陇南市| 新安县| 同仁县| 长治市| 广昌县| 渑池县| 江津市| 鸡泽县| 灌南县| 南康市| 山丹县| 获嘉县| 神木县|