【備忘録】MYSQL初期パスワード再設定でエラーを繰り返した話。


>## はじめに

 MYSQLインストールの際、
 rootユーザの初期パスワードの設定間違いという痛恨のミスをしてしまった。
 パスワード再設定時の実行コマンドに不明点が多く大変な時間がかかってしまった。
以下にトライ&エラーの経緯を記録しておく。
**【重要】 <br>2025/05/26時点で、個人保有MACで発生した個別事象の為、
対策方法が全ユーザにとって万能な対策ではないということにご留意ください。**


>## 【前提】MySQLログイン時のrootユーザのパスワードエラー

### 事象
`ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)`

**「rootユーザーでMySQLにログインしようとしたが、パスワードが正しくない、または権限が不足しているためアクセスが拒否された」**

### 原因

初期パスワードの設定ミス
(キーボードの入力方式が日本語だった、あるいは単純に入力ミスの可能性が高い→入力値が非表示のため確認不可)

### 対策
調べた結果、rootパスワードの再設定手順は以下のとおりであった。

#### 1.  権限チェックなしでMySQLを起動
#### 2.  パスワードなしでMySQLにログイン
#### 3.  rootパスワードの再設定


>## 権限無しでのMySQL起動がうまくできない

### 1.【権限チェックなしでMySQLを起動】コマンドを実行するもエラー

<br>参照したサイト内のコマンドをまずは実行したが、エラー。その後、トライ&エラーを繰り返す事となった。<br>
下記に実行したコマンドとエラーをリスト化して記載する


>### 実行コマンドとエラー詳細リスト

以下の順番にてコマンド修正とエラーを繰り返した。


|実行順|判定|実行コマンド|エラー表示|内容|
|---|---|---|---|---|
|1|X|sudo service mysql start| sudo: service: command not found|`service`コマンドはLinux用のコマンド**で、**macOSには標準で存在しません**|
|2|X|brew mysqld_safe --skip-grant-tables \&|Unknown command: brew mysqld_safe| `brew mysqld_safe` というコマンドは存在しません。|
|3|X|/opt/homebrew/opt/mysql/bin/mysqld_safe --skip-grant-tables &|zsh: no such file or directory: /opt/homebrew/opt/mysql/bin/mysqld_safe` |そのパスに `mysqld_safe` ファイルが存在しない|
|4|X|/opt/homebrew/opt/mysql/bin/mysqld_safe --skip-grant-tables --datadir=/opt/homebrew/var/mysql &|---|macOSでHomebrew版MySQLを「--skip-grant-tables」で起動したい場合`sudo`をつけて実行する事|
|5|X|**sudo** /opt/homebrew/opt/mysql/bin/mysqld_safe --skip-grant-tables --datadir=/opt/homebrew/var/mysql **&**|suspended (tty output) sudo～|プロセスが**一時停止（サスペンド）状態**になっています。認証無しモードで接続しても通常通り認証が行われてしまい、パスワードなしログインができません `mysqld_safe --skip-grant-tables` をバックグラウンド実行（`&`付き）した場合、**標準出力が端末に接続されているためzsh(シェル)によって自動停止される**ことがあります|
|6|☓|フォアグラウンドでmysqld_safeを実行|sudo: /opt/homebrew/opt/mysql/bin/mysqld_safe: command not found|そのパスに **mysqld_safe ファイルが存在しない**ことを意味します。|
|7|◯|フォアグラウンドで以下コマンドを実行<br>**`/opt/homebrew/Cellar/mysql@8.4/8.4.5/bin/mysqld`**|エラー無く実行できた|ーーー|



### まとめ
- [X] `service`コマンドはLinux用のコマンド**で、**macOSには標準で存在しない**
- [X] `mysqld_safe`ではなく`mysqld`を明示して実行した<br>⇒ **インストールしたMySQLのバージョンやインストール方法（Homebrew経由かどうか）** によって`mysql_safe`の有無が変わる<br>
  ⇒存在しない場合は`mysqld`を利用する
- [X]  **mysqldをフォアグラウンドで実行** → バックグラウンド実行だとシェルに停止されてしまいNGなため。
- [X]  **作業用にもう一つターミナルを開く** → そこで`MySQLに権限チェックなしログイン`が可能となる ~~ここまでクソメンドかった~~
- [X]  フォアグラウンド実行は、コマンドの処理を見ながら進めたいときや、バックグラウンド実行で問題が起きる場合に特に有効な方法




　　
>## 正しいパスワード変更手順

### 1. MySQLサーバーを停止

```bash
brew services stop mysql
```
---

### 2. パスワード認証をスキップしてmysqldを起動

ターミナルで下記コマンドを**フォアグラウンドで実行**(末尾に&をつけない場合に、フォアグラウンド実行となる)：

```bash
/opt/homebrew/Cellar/mysql@8.4/8.4.5/bin/mysqld --skip-grant-tables --datadir=/opt/homebrew/var/mysql
```

- **このコマンドを実行したターミナルはそのままにしておく**

---

### 3. 新しいターミナルウィンドウを開く

- `Command + N` で新しいターミナルウィンドウを開く

---

### 4. パスワードなしでMySQLにログイン

```bash
mysql -u root
```

---

### 5. rootパスワードの再設定

MySQLプロンプトで次のコマンドを実行します（例：新しいパスワードを `newpassword` に変更する場合）：

```sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';
FLUSH PRIVILEGES;
```
---

### 6. mysqldプロセスを停止

- フォアグラウンドで動かしていたmysqldのターミナルで `Ctrl+C` を押して停止

---

### 7. MySQLサーバーを通常モードで起動

```bash
brew services start mysql
```
---

### 8. 新しいパスワードでログイン確認

```bash
mysql -u root -p
```

- ログインを確認⇒OK


---

>## 終わりに

初期パスワード設定は、
『失敗のしやすさ』と『再設定の難易度の高さ』のバランスが悪い(私だけ？)。
シェルコマンド上で、入力値の見えないまま同じキーボード配列を２回繰り返し叩く操作は
ちょっと気を抜いたブラインドタッチで簡単に失敗する（私だけ？？）。
それに対して、再設定の難易度は異常で、所見ではまず無理。
シェルコマンド知識や、MYSQLのインストールバージョンなどによる実行コマンドの変化
など様々な予備知識が求められる。
それらを持ち合わせていない私のような初学者はおおよそ１時間～２時間は、
容易に時間が溶けることになる。

<details><summary> 今回の教訓 (↓open)</summary>

### **初期パスワード登録は　絶対に　油断するな**




</details>











># その他エラー  指定されたMySQLのバージョンが古い

下記のしょうもないエラーにも遭遇したので併せて記載しておく
これは【Progate】の更新されていない古い内容を脳死でそのまま受け入れ実行したことに起因するエラーとなる

### 事象

Homebrew で `mysql@5.7` をインストールしようとした際に表示された

```
Error: mysql@5.7 has been disabled because it is not supported upstream! It was disabled on 2024-08-01.
```
### 原因

**MySQL 5.7 の公式サポートが終了し、Homebrew でも2024年8月1日をもって formula（パッケージ）が無効化されたため**

### 対策 　
MySQLを新しいバージョンをインストールする
安定運用やサポートを重視して8.4系を利用