1.

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

編集
この記事の要点
  • 基本: mysql -u USER -p でパスワード対話入力。-h ホスト指定、-P ポート、-D 既定 DB
  • SQL ファイル実行: mysql -u root -p dbname < init.sql(リダイレクト)
  • ワンライナー: mysql -u root -p -e "SELECT NOW();" dbname
  • パスワード自動入力~/.my.cnf(パーミッション 600)に書く。コマンドラインに -pXXX を渡すと履歴・ps から漏れる
  • SSL 強制--ssl-mode=REQUIRED(MySQL 5.7+)。リモート接続は基本 TLS を要求すべき
  • mysqladmin は管理コマンド: ping / status / shutdown / flush-hosts など

基本: mysql コマンドの最小構成

MySQL に接続するための CLI クライアントが mysql(または互換の mariadb)です。最も基本の形は次の通り:

# ローカルホストの 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

パスワードは -p直後に空白なしで書くと引数として渡せますが、ps コマンドや bash history から見えてしまうのでまず使いません:

# ❌ 危険: 他ユーザーが ps で見える
mysql -u root -pSecret123 myapp

# ✅ 推奨: 対話入力(履歴に残らない)
mysql -u root -p myapp

主要オプション一覧

オプション意味
-u USER / --userユーザー名-u root
-p / --passwordパスワード(対話入力 or 引数)-p
-h HOST / --host接続先ホスト-h db.example.com
-P PORT / --portポート番号(既定 3306)-P 3307
-D DB / --database既定 DB-D myapp
-e SQL / --executeSQL を実行して即終了-e "SELECT NOW()"
--protocol=TCPUNIX ソケットを使わず TCP 強制ローカルでも TCP で繋ぐ
--ssl-mode=REQUIREDTLS 必須リモート接続で推奨
--default-character-setクライアント側文字コード--default-character-set=utf8mb4
-S /path/to/sockUNIX ソケットパス-S /var/run/mysqld/mysqld.sock
-v / -vv / -vvvverbose(実行結果詳細)スクリプト実行の確認に
--batch / -Bタブ区切り出力(パイプ向き)シェル連携

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

初期化スクリプトやマイグレーションをシェルリダイレクトで流し込むのが基本パターンです:

# 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

ワンライナー: -e で SQL を直接実行

シェルスクリプトやワンライナー用途では -e オプションが便利:

# テーブル一覧
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 <= CURDATE();
EOF

~/.my.cnf でパスワードを安全に保存

cron / バッチでパスワード入力を省略したい場合、ホームディレクトリの ~/.my.cnfに書きます。パーミッションは必ず 600に:

cat > ~/.my.cnf < backup.sql

セクション [client] は mysql / mysqldump / mysqladmin など共通設定。chmod 600 を忘れると MySQL 自身が「unsecure」と警告を出します。

SSL / TLS で接続する

リモート DB 接続では平文を避け TLS を必須にします:

# 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 'Ssl_cipher'"
# Ssl_cipher | TLS_AES_256_GCM_SHA384 のように出れば TLS
--ssl-mode動作
DISABLEDTLS を使わない(平文)
PREFERRED可能なら TLS、無理なら平文(既定値・脆弱)
REQUIREDTLS 必須。証明書検証はしない
VERIFY_CATLS + CA 検証
VERIFY_IDENTITYTLS + CA 検証 + ホスト名検証(最も厳密)

mysqladmin: 管理用コマンド

SQL を流すのではなく、サーバー自体を操作する管理コマンドが mysqladmin:

# サーバーが生きているか
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 'NewSecret123'

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

# 安全にシャットダウン
mysqladmin -u root -p shutdown

UNIX ソケット vs TCP

ローカル接続では既定で UNIX ソケット(/var/run/mysqld/mysqld.sock 等)が使われ、TCP より高速です。明示的に TCP を強制したい場合:

# ソケット指定(明示)
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

接続できないときのトラブルシューティング

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

FAQ

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

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

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

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. DB接続コマンド
  2. データベース一覧の確認
  3. テーブル一覧の確認
  4. テーブル定義の確認
  5. DBの設定確認
  6. テーブルスペースの容量の確認および拡張
  7. データ型
  8. 複数カラムのUPDATE
  9. カラムの追加/削除/変更
  10. 自動番号付け (autoincrement) する方法
  11. インデックスの作成
  12. シーケンスおよびインクリメント(ID列)の違いと確認方法
  13. create table文の生成
  14. 特定スキーマの全テーブルの全カラム情報を取得する方法
  15. 【DB2】エラー一覧
  16. 【DB2】テーブル定義からCREATE TABLE文を生成する方法