こうなる原因のほとんどは HOST 指定のミスです。MariaDB はユーザー名と HOST の組み合わせで接続を識別するため、
'appuser'@'localhost' と 'appuser'@'127.0.0.1' は別ユーザーとして扱われます。どちらか片方しか存在しなければ、もう一方で接続しようとした際に必ず「Access denied」が返ります。この記事では、Rocky Linux 9.4 / MariaDB 10.5.22 の実機を使い、mysql CLI からの接続手順・CREATE USER 構文・HOST パターンの使い分け・認証プラグインとパスワード設定を実行例とともに解説します。
動作確認環境: Rocky Linux 9.4 / MariaDB 10.5.22(MariaDB 10.6、10.11 LTS、11.x でも同様の手順で動作)
この記事のポイント
・CREATE USER 'user'@'host' IDENTIFIED BY 'pass' でユーザーを作成できる
・localhost(UNIX ソケット)と 127.0.0.1(TCP)は別エントリ—接続方式に合わせて使い分ける
・MariaDB 10.4 以降の root は unix_socket 認証が既定—sudo mysql でパスワードなしにログイン可
・作成後は SELECT User,Host,plugin FROM mysql.user; で必ず確認する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
MariaDB のユーザーは「名前+HOST」で識別される
MariaDB(および MySQL)では、ユーザーを「ユーザー名 + 接続元 HOST」の組み合わせで管理します。同じユーザー名でも HOST が異なれば別のアカウントです。たとえば次の 2 行は別のユーザーです。
'appuser'@'localhost' -- localhost 経由(UNIX ソケット)でのみ接続可 'appuser'@'127.0.0.1' -- TCP/IP ループバックでのみ接続可
host=127.0.0.1 で接続してきたとき、'appuser'@'localhost' しか作っていなければ拒否されます。「ユーザーは作った、パスワードも合っている、なのに接続できない」という状況の大半がこれです。まずはこの仕組みを頭に入れた上で、ユーザー作成の手順を見ていきましょう。
mysql CLI でユーザーを作成する基本手順
1. 管理者権限で MariaDB に接続する
まず管理者(root)で MariaDB に接続します。MariaDB 10.4 以降は root に unix_socket 認証が設定されているため、sudo mysql で接続できます。[rocky@sv01 ~]$ sudo mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 10 Server version: 10.5.22-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
mysql -u root -p を使います。どちらでログインするかは後述の「認証プラグインの確認」を参照してください。2. CREATE USER でユーザーを作成する
構文は次のとおりです。CREATE USER 'ユーザー名'@'HOST' IDENTIFIED BY 'パスワード';
appuser を作成する例を示します。MariaDB [(none)]> CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'P@ssw0rd_2024'; Query OK, 0 rows affected (0.001 sec)
validate_password プラグイン)の制約か、同名のユーザーが既に存在している可能性があります。3. GRANT で権限を付与する
ユーザーを作っただけでは何もできません。対象データベースへの権限を GRANT で付与します。# 特定データベース(appdb)への全権限 MariaDB [(none)]> GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; Query OK, 0 rows affected (0.001 sec) # 読み取りのみ許可する場合 MariaDB [(none)]> GRANT SELECT ON appdb.* TO 'appuser'@'localhost'; Query OK, 0 rows affected (0.001 sec)
mysql.user テーブルを直接 INSERT/UPDATE した場合にのみ FLUSH PRIVILEGES; が必要になります。4. 接続テストで確認する
ユーザーが正しく作れたか、別ターミナルから接続テストします。[rocky@sv01 ~]$ mysql -u appuser -p appdb Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 14 Server version: 10.5.22-MariaDB MariaDB Server MariaDB [appdb]>
HOST パターンの使い分け
HOST に指定できる値は 5 種類あります。用途によって使い分けてください。① localhost(UNIX ソケット接続)
'user'@'localhost' は UNIX ソケット(/var/lib/mysql/mysql.sock)を経由した接続にのみ一致します。TCP を使わないため、-h 127.0.0.1 を指定した接続には一致しません。ローカルの CLI ツールや PHP の PDO(host=localhost)はこちらを使います。② 127.0.0.1(TCP ループバック)
'user'@'127.0.0.1' は TCP/IP で 127.0.0.1 に接続する場合にのみ一致します。アプリ側が DB_HOST=127.0.0.1 のような TCP 接続を使う場合はこちらが必要です。③ 特定 IP アドレス
'user'@'192.168.10.20' のように指定すると、その IP からの接続だけ許可できます。複数台あるアプリサーバーのうち特定の 1 台だけに権限を絞りたい場合に使います。④ サブネット指定(CIDR は使えない)
'user'@'192.168.10.%' のようにワイルドカード % を使うとサブネット全体を許可できます。MariaDB は CIDR 表記(192.168.10.0/24)に対応していないため、サブネット単位の許可はこの書き方が唯一の方法です。⑤ %(全ホスト許可)
'user'@'%' はあらゆる接続元を許可します。プライベートネットワーク内に限定されている開発環境のみ使用し、インターネットに面したサーバーでは避けてください。複数の HOST からアクセスを許可する場合は、同じユーザー名で HOST ごとにエントリを追加します。
-- ローカル CLI と TCP ループバックの両方を許可する例 CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'P@ssw0rd_2024'; CREATE USER 'appuser'@'127.0.0.1' IDENTIFIED BY 'P@ssw0rd_2024'; GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'127.0.0.1';
認証プラグインとパスワード設定の実務ポイント
MariaDB 10.4 以降の root は unix_socket 認証が既定
MariaDB 10.4 から、root ユーザーのデフォルト認証プラグインがunix_socket に変わりました。これにより sudo mysql でパスワードなしにログインできる一方、mysql -u root -p では「Access denied」になる場合があります。現在の root の認証プラグインを確認するには次のクエリを使います。
MariaDB [(none)]> SELECT User, Host, plugin FROM mysql.user WHERE User='root'; +------+-----------+-------------+ | User | Host | plugin | +------+-----------+-------------+ | root | localhost | unix_socket | +------+-----------+-------------+ 1 row in set (0.001 sec)
plugin 列が unix_socket であれば、OS の root(または sudo 可能なユーザー)でのみログインできます。パスワード認証に変更したい場合は次の手順で切り替えられます。root をパスワード認証に切り替える手順
MariaDB [(none)]> ALTER USER 'root'@'localhost' -> IDENTIFIED VIA mysql_native_password USING PASSWORD('NewRootP@ss2024'); Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.000 sec)
mysql -u root -p でパスワードが使えるようになります。作成済みユーザーのパスワードを変更する
MariaDB [(none)]> ALTER USER 'appuser'@'localhost' IDENTIFIED BY '新しいパスワード'; Query OK, 0 rows affected (0.001 sec)
SET PASSWORD 構文でも可能ですが、ALTER USER の方が SQL 標準に近く、MariaDB 10.4 以降では推奨されています。作成済みユーザーの確認と権限の表示
ユーザーを作ったあとは必ず確認してください。mysql.user テーブルをクエリすることで全ユーザーの HOST と認証プラグインを一覧できます。MariaDB [(none)]> SELECT User, Host, plugin FROM mysql.user; +-------------+-----------+-----------------------+ | User | Host | plugin | +-------------+-----------+-----------------------+ | root | localhost | unix_socket | | appuser | localhost | mysql_native_password | | appuser | 127.0.0.1 | mysql_native_password | | mariadb.sys | localhost | mysql_native_password | +-------------+-----------+-----------------------+ 4 rows in set (0.001 sec)
SHOW GRANTS を使います。MariaDB [(none)]> SHOW GRANTS FOR 'appuser'@'localhost'; +----------------------------------------------------------------+ | Grants for appuser@localhost | +----------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON `appdb`.* TO `appuser`@`localhost` | +----------------------------------------------------------------+ 1 row in set (0.000 sec)
DROP USER を使います。HOST ごとに作ったユーザーは HOST ごとに DROP する必要があります。'appuser'@'localhost' を DROP しても 'appuser'@'127.0.0.1' は残ります。MariaDB [(none)]> DROP USER 'appuser'@'localhost'; Query OK, 0 rows affected (0.001 sec)
トラブルシュート
「Access denied for user 'xxx'@'localhost' (using password: YES)」が出る
パスワードが間違っているか、'xxx'@'localhost' のユーザーエントリが存在しない状態です。まず SELECT User, Host FROM mysql.user WHERE User='xxx'; でエントリが存在するか確認してください。MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE User='appuser'; +---------+-----------+ | User | Host | +---------+-----------+ | appuser | 127.0.0.1 | +---------+-----------+ 1 row in set (0.000 sec)
'appuser'@'localhost' が存在せず、'appuser'@'127.0.0.1' しかありません。この状態では mysql -u appuser -p appdb(UNIX ソケット接続)はすべて拒否されます。'appuser'@'localhost' を追加するか、mysql -h 127.0.0.1 -u appuser -p appdb で TCP 接続すれば解決します。「Access denied for user 'xxx'@'localhost' (using password: NO)」が出る
パスワードなしで接続を試みている、または unix_socket プラグインの認証が必要な状態です。mysql -u xxx -p でパスワード入力を求めるか、sudo mysql で試してください。ユーザーは存在するのに特定 DB にアクセスできない
ユーザーは作成されているが GRANT が漏れているケースです。SHOW GRANTS FOR 'user'@'host'; で権限一覧を確認し、対象 DB への GRANT を追加してください。MariaDB [(none)]> SHOW GRANTS FOR 'appuser'@'localhost'; +--------------------------------------------+ | Grants for appuser@localhost | +--------------------------------------------+ | GRANT USAGE ON *.* TO `appuser`@`localhost`| +--------------------------------------------+ 1 row in set (0.000 sec)
GRANT USAGE のみの場合は「接続はできるが権限は何もない」状態です。GRANT 文で必要な権限を追加してください。本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| ユーザーを作成する | CREATE USER 'user'@'host' IDENTIFIED BY 'pass'; |
| DB への全権限を付与する | GRANT ALL PRIVILEGES ON db.* TO 'user'@'host'; |
| 読み取り権限のみ付与する | GRANT SELECT ON db.* TO 'user'@'host'; |
| ユーザー一覧と認証プラグインを確認 | SELECT User,Host,plugin FROM mysql.user; |
| 特定ユーザーの権限を確認 | SHOW GRANTS FOR 'user'@'host'; |
| パスワードを変更する | ALTER USER 'user'@'host' IDENTIFIED BY '新パスワード'; |
| ユーザーを削除する | DROP USER 'user'@'host'; |
| unix_socket 認証でログイン(root 既定) | sudo mysql |
| TCP 接続でログイン | mysql -h 127.0.0.1 -u user -p db |
>> Linux Master Pro Seminar の詳細はこちら
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:MariaDB vs MySQLをLinuxでsysbenchベンチマーク比較|セルフホスト選択の判断基準
- この記事の属するカテゴリ:データーベース管理へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます