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

某次地端機器重新開機後,不知道什麼原因而無法訪問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
。
