この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:atom
更新日時:2026-06-11 07:07:02

タイトル: DB接続コマンド
SEOタイトル: mysql コマンドで DB に接続する方法(オプション全網羅 / SSL / ワンライナー実行)

この本文には実行可能なタグ等が含まれるため、安全のためHTMLソースとして表示しています。本文データは変更していません。

<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;background:#fffbea;border:1px solid #f4c430;margin:1em 0;width:100%"><tr><td style="background:#f4c430;color:#000;font-weight:bold;padding:8px">この記事の要点</td></tr><tr><td style="padding:10px"><ul><li><strong>基本</strong>: <code>mysql -u USER -p</code> でパスワード対話入力。<code>-h</code> ホスト指定、<code>-P</code> ポート、<code>-D</code> 既定 DB</li><li><strong>SQL ファイル実行</strong>: <code>mysql -u root -p dbname < init.sql</code>(リダイレクト)</li><li><strong>ワンライナー</strong>: <code>mysql -u root -p -e "SELECT NOW();" dbname</code></li><li><strong>パスワード自動入力</strong>は <code>~/.my.cnf</code>(パーミッション 600)に書く。コマンドラインに <code>-pXXX</code> を渡すと履歴・ps から漏れる</li><li><strong>SSL 強制</strong>は <code>--ssl-mode=REQUIRED</code>(MySQL 5.7+)。リモート接続は基本 TLS を要求すべき</li><li><strong>mysqladmin</strong> は管理コマンド: <code>ping</code> / <code>status</code> / <code>shutdown</code> / <code>flush-hosts</code> など</li></ul></td></tr></table>
<h2>基本: mysql コマンドの最小構成</h2>

<p>MySQL に接続するための CLI クライアントが <code>mysql</code>(または互換の <code>mariadb</code>)です。最も基本の形は次の通り:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-bash"># ローカルホストの root で接続(パスワード対話入力)
mysql -u root -p

# 既定 DB を指定して接続(=ログイン直後に USE dbname される)
mysql -u root -p -D myapp

# ホスト・ポートを指定(リモート DB)
mysql -h db.example.com -P 3306 -u app_user -p myapp</code></pre>
<p>パスワードは <code>-p</code> の<strong>直後に空白なし</strong>で書くと引数として渡せますが、<strong>ps コマンドや bash history から見えてしまう</strong>のでまず使いません:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-bash"># ❌ 危険: 他ユーザーが ps で見える
mysql -u root -pSecret123 myapp

# ✅ 推奨: 対話入力(履歴に残らない)
mysql -u root -p myapp</code></pre>
<h2>主要オプション一覧</h2>

<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;width:100%">
<thead><tr style="background:#e3f2fd"><th>オプション</th><th>意味</th><th>例</th></tr></thead>
<tbody>
<tr><td><code>-u USER</code> / <code>--user</code></td><td>ユーザー名</td><td><code>-u root</code></td></tr>
<tr><td><code>-p</code> / <code>--password</code></td><td>パスワード(対話入力 or 引数)</td><td><code>-p</code></td></tr>
<tr><td><code>-h HOST</code> / <code>--host</code></td><td>接続先ホスト</td><td><code>-h db.example.com</code></td></tr>
<tr><td><code>-P PORT</code> / <code>--port</code></td><td>ポート番号(既定 3306)</td><td><code>-P 3307</code></td></tr>
<tr><td><code>-D DB</code> / <code>--database</code></td><td>既定 DB</td><td><code>-D myapp</code></td></tr>
<tr><td><code>-e SQL</code> / <code>--execute</code></td><td>SQL を実行して即終了</td><td><code>-e "SELECT NOW()"</code></td></tr>
<tr><td><code>--protocol=TCP</code></td><td>UNIX ソケットを使わず TCP 強制</td><td>ローカルでも TCP で繋ぐ</td></tr>
<tr><td><code>--ssl-mode=REQUIRED</code></td><td>TLS 必須</td><td>リモート接続で推奨</td></tr>
<tr><td><code>--default-character-set</code></td><td>クライアント側文字コード</td><td><code>--default-character-set=utf8mb4</code></td></tr>
<tr><td><code>-S /path/to/sock</code></td><td>UNIX ソケットパス</td><td><code>-S /var/run/mysqld/mysqld.sock</code></td></tr>
<tr><td><code>-v</code> / <code>-vv</code> / <code>-vvv</code></td><td>verbose(実行結果詳細)</td><td>スクリプト実行の確認に</td></tr>
<tr><td><code>--batch</code> / <code>-B</code></td><td>タブ区切り出力(パイプ向き)</td><td>シェル連携</td></tr>
</tbody>
</table>

<h2>SQL ファイルを流し込む(リダイレクト)</h2>

<p>初期化スクリプトやマイグレーションを<strong>シェルリダイレクト</strong>で流し込むのが基本パターンです:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-bash"># init.sql を myapp DB に流し込む
mysql -u root -p myapp < init.sql

# 結果を別ファイルに書き出す
mysql -u root -p myapp < query.sql > result.txt

# 1 行ずつ実行内容を表示しながら(デバッグ用)
mysql -u root -p -v myapp < migrations.sql

# ダンプファイル復元
mysql -u root -p myapp < dump.sql
gunzip < dump.sql.gz | mysql -u root -p myapp</code></pre>
<h2>ワンライナー: -e で SQL を直接実行</h2>

<p>シェルスクリプトやワンライナー用途では <code>-e</code> オプションが便利:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-bash"># テーブル一覧
mysql -u root -p -e "SHOW TABLES" myapp

# 件数取得 → 変数に格納
COUNT=$(mysql -u root -p -N -B -e "SELECT COUNT(*) FROM users" myapp)
echo "ユーザー数: $COUNT"

# -N: ヘッダー行を出さない
# -B / --batch: タブ区切り出力(カラム揃え用記号を除去)
# これらを併用すると shell で扱いやすい純粋なテキストになる

# 複数 SQL をセミコロン区切り
mysql -u root -p -e "SHOW DATABASES; SELECT VERSION();"

# ヒアドキュメントで複数行
mysql -u root -p myapp <<EOF
SELECT id, name FROM users WHERE deleted_at IS NULL;
SELECT COUNT(*) FROM orders WHERE created_at >= CURDATE();
EOF</code></pre>
<h2>~/.my.cnf でパスワードを安全に保存</h2>

<p>cron / バッチでパスワード入力を省略したい場合、<strong>ホームディレクトリの <code>~/.my.cnf</code></strong>に書きます。<strong>パーミッションは必ず 600</strong>に:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-bash">cat > ~/.my.cnf <<EOF
[client]
user=root
password=Secret123
host=localhost

[mysqldump]
user=root
password=Secret123
EOF

chmod 600 ~/.my.cnf

# これで mysql コマンドはオプションなしで接続できる
mysql myapp
mysqldump myapp > backup.sql</code></pre>
<p><strong>セクション <code>[client]</code></strong> は mysql / mysqldump / mysqladmin など共通設定。<code>chmod 600</code> を忘れると MySQL 自身が「unsecure」と警告を出します。</p>

<h2>SSL / TLS で接続する</h2>

<p>リモート DB 接続では平文を避け TLS を必須にします:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-bash"># TLS 必須(証明書検証なし)
mysql -h db.example.com -u app -p --ssl-mode=REQUIRED

# サーバー証明書を CA で検証
mysql -h db.example.com -u app -p \
      --ssl-mode=VERIFY_CA \
      --ssl-ca=/etc/mysql/ca-cert.pem

# サーバー証明書の CN/SAN も検証
mysql -h db.example.com -u app -p \
      --ssl-mode=VERIFY_IDENTITY \
      --ssl-ca=/etc/mysql/ca-cert.pem

# 接続が TLS かを確認
mysql -e "SHOW STATUS LIKE &apos;Ssl_cipher&apos;"
# Ssl_cipher | TLS_AES_256_GCM_SHA384 のように出れば TLS</code></pre>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;width:100%">
<thead><tr style="background:#e3f2fd"><th><code>--ssl-mode</code></th><th>動作</th></tr></thead>
<tbody>
<tr><td><code>DISABLED</code></td><td>TLS を使わない(平文)</td></tr>
<tr><td><code>PREFERRED</code></td><td>可能なら TLS、無理なら平文(既定値・脆弱)</td></tr>
<tr><td><code>REQUIRED</code></td><td>TLS 必須。証明書検証はしない</td></tr>
<tr><td><code>VERIFY_CA</code></td><td>TLS + CA 検証</td></tr>
<tr><td><code>VERIFY_IDENTITY</code></td><td>TLS + CA 検証 + ホスト名検証(最も厳密)</td></tr>
</tbody>
</table>

<h2>mysqladmin: 管理用コマンド</h2>

<p>SQL を流すのではなく、サーバー自体を操作する管理コマンドが <code>mysqladmin</code>:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-bash"># サーバーが生きているか
mysqladmin -u root -p ping
# → mysqld is alive

# 統計情報
mysqladmin -u root -p status
mysqladmin -u root -p extended-status

# 接続中スレッド一覧(= SHOW PROCESSLIST)
mysqladmin -u root -p processlist

# パスワード変更
mysqladmin -u root -p password &apos;NewSecret123&apos;

# ホストブロック解除(後述)
mysqladmin -u root -p flush-hosts

# 安全にシャットダウン
mysqladmin -u root -p shutdown</code></pre>
<h2>UNIX ソケット vs TCP</h2>

<p>ローカル接続では既定で UNIX ソケット(<code>/var/run/mysqld/mysqld.sock</code> 等)が使われ、TCP より高速です。明示的に TCP を強制したい場合:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-bash"># ソケット指定(明示)
mysql -u root -p -S /var/run/mysqld/mysqld.sock

# TCP 強制(ループバック 127.0.0.1)
mysql -u root -p -h 127.0.0.1 -P 3306

# ↑ -h localhost だと自動的にソケット、127.0.0.1 だと TCP

# プロトコル明示
mysql -u root -p --protocol=TCP -h localhost
mysql -u root -p --protocol=SOCKET</code></pre>
<h2>接続できないときのトラブルシューティング</h2>

<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;width:100%">
<thead><tr style="background:#fff3e0"><th>症状</th><th>原因</th><th>対処</th></tr></thead>
<tbody>
<tr><td><code>ERROR 2002 (HY000): Can't connect to local MySQL server through socket</code></td><td>サーバー停止 / ソケットパス違い</td><td><code>systemctl status mysql</code>、<code>-S</code> でパス指定</td></tr>
<tr><td><code>ERROR 1045 (28000): Access denied for user</code></td><td>ユーザー名/パスワード/ホスト権限</td><td>権限テーブル確認、<code>'user'@'host'</code> のホスト部一致</td></tr>
<tr><td><code>ERROR 2003 (HY000): Can't connect to MySQL server</code></td><td>ポート閉鎖 / bind-address</td><td>サーバーの <code>bind-address=0.0.0.0</code>、FW 開放</td></tr>
<tr><td><code>ERROR 1130 (HY000): Host '...' is not allowed</code></td><td>該当 IP に権限付与なし</td><td><code>CREATE USER 'user'@'%' ...</code> + GRANT</td></tr>
<tr><td><code>Unknown database 'foo'</code></td><td>DB 名タイポ</td><td><code>SHOW DATABASES</code></td></tr>
</tbody>
</table>

<h2>FAQ</h2>

<p><strong>Q: パスワードに記号が含まれていて引数で渡しにくい</strong><br />
A: <code>~/.my.cnf</code> に記述するのが最も安全。引数渡しが必要なら<code>-p"Pass!@#"</code>のようにシェルでクォート。</p>

<p><strong>Q: スクリプトから接続テストしたい</strong><br />
A: <code>mysqladmin -u root -p ping</code> または <code>mysql -e "SELECT 1"</code> の終了コードで判定。</p>

<p><strong>Q: 文字化けする</strong><br />
A: クライアントは <code>--default-character-set=utf8mb4</code>、サーバーは <code>character-set-server=utf8mb4</code>、テーブルも <code>utf8mb4</code> で統一。</p>