3 min read

Docker mysql 忘記密碼處理

mysqli::real_connect(): (HY000/1045): Access denied for user 'root'@'172.19.0.5' (using password: YES)
Docker mysql 忘記密碼處理

某次地端機器重新開機後,不知道什麼原因而無法訪問mysql ,所以紀錄一篇處理方法。

Mysql Version -> 8.0.32


以下是架設mysql 所使用到的檔案

  • docker-compose
  • .env
  • mysql.cnf

可以看到volumes已經有先將檔案掛載到本地機器上,備份的位置也放在.env 裡面

services:
  mysql:
    container_name: mysql
    build:
      context: mysql/mysql8
      args:
        MYSQL_VERSION: ${MYSQL_VERSION}
    ports:
      - ${MYSQL_HOST_PORT}:3306
    volumes:
      - ${CONF_PATH}/mysql/mysql8/conf/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:rw
      - ${BACKUP_PATH}/mysql:/var/lib/mysql:rw
    restart: always
    stdin_open: true
    tty: true
    logging:
      driver: "json-file"
      options:
        max-size: "1g"  # 设置最大日志文件大小为1GB
        max-file: "3"     # 设置最大日志文件数量
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - TZ=${TZ}
    # command: ["mysqld", "--skip-grant-tables"] # 忘記密碼時使用
    networks:
      - backendNet

`

################################################
###       environment config file            ###
################################################

# 各個容器的數據備份, 例如MySQL,Redis..等等,防止容器掛載後數據不見
BACKUP_PATH=/data/var/backup
# 各個服務的配置, 放在當前目錄下,每個服務的conf目錄中
CONF_PATH= ./

############# Timezone for the containers ############
TZ=Asia/Shanghai

#############            MySQL            ############
# 稳定版 8.0.32
MYSQL_VERSION=8.0.32
# 若要將資料庫對外開放 請修改為0.0.0.0
MYSQL_HOST_PORT=3306
# 生產環境請替換密碼
MYSQL_ROOT_PASSWORD=123456
[client]
port                    = 3306
default-character-set   = utf8mb4


[mysqld]

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
skip-log-bin
port                    = 3306

default-storage-engine  = InnoDB
# 关闭严格模式
innodb_strict_mode = 0
default-authentication-plugin   = mysql_native_password
init_connect='SET NAMES utf8mb4'
character-set-server    = utf8mb4
collation-server        = utf8mb4_general_ci

skip-character-set-client-handshake

slow_query_log
long_query_time         = 3
slow-query-log-file     = /data/var/log/mysql/mysql.slow.log
log-error               = /data/var/log/mysql/mysql.error.log

default-time-zone       = '+8:00'
# 允許最大連接數, 預設為151 ,  但改為400 最大支持 16384 , 按服務器需求 若有高併發可以配置大一點,不過得基於硬碟的I/O , 若配置好點的話可以高一點
max_connections         = 400

[mysql]
default-character-set   = utf8mb4

參數說明

而本次使用到的參數為 --skip-grant-tables 是 MySQL 的一個緊急啟動參數
主要功能:

  • 跳過 MySQL 的權限驗證系統
  • 允許任何人無需密碼即可連接到 MySQL 服務器
  • 所有用戶都具有所有權限

註解完環境變量 MYSQL_ROOT_PASSWORD 因為已經有先將數據備份在主機上所以可以直接運行 docker-compose up mysql -d 將會重新創建容器

此時在重新進入容器 docekr exec -it mysql bash 就可以重新獲得root權限


指令說明

訪問到容器後就可以直接運行 mysql -u root

可以先透過 SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; 查詢 root有哪些

從上圖可以看到 root有兩個,其中一個是針對所有host開放,我們將會針對這個root 進行密碼修改。

若要自定義密碼 可以將 123456 改為自己使用的密碼。

FLUSH PRIVILEGES;
ALTER USER 'root'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
EXIT;

最後

改完密碼後要記得在去 docker-compose 把 --skip-grant-tables 拿掉 並且重新進行docker-compose up mysql -d