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

タイトル: データベースへの接続
SEOタイトル: MySQL/PostgreSQL コマンドライン接続完全ガイド

この記事の要点
  • MySQL: mysql -h host -P 3306 -u user -p [dbname]
  • PostgreSQL: psql -h host -U user -d dbname
  • パスワード非対話: MySQL は ~/.my.cnf、PG は ~/.pgpass または PGPASSWORD 環境変数
  • SSL: MySQL --ssl-mode=REQUIRED / PG sslmode=require
  • SSH トンネル経由・Docker exec 経由の典型パターン

MySQL クライアント接続

# 基本形
mysql -h localhost -P 3306 -u root -p mydb

# 短縮形
mysql -uroot -p           # ローカル、root、パスワード対話入力
mysql -uroot -ppassword   # ★ パスワードを直接(履歴に残るので非推奨)

# DB を選んで接続
mysql -uroot -p mydb

# Socket 経由(ローカル接続)
mysql -uroot -p -S /var/run/mysqld/mysqld.sock

# クエリを直接実行
mysql -uroot -p mydb -e "SELECT VERSION();"

# ファイルから実行
mysql -uroot -p mydb < script.sql

# ダンプリストア
mysql -uroot -p mydb < dump.sql
mysqldump -uroot -p mydb > dump.sql

パスワードを安全に渡す

~/.my.cnf に書く

# ~/.my.cnf (chmod 600 必須)
[client]
host=localhost
port=3306
user=root
password=mysecret
default-character-set=utf8mb4

[mysql]
prompt=mysql [\d]>

# これで認証情報なしで接続可能
# $ mysql mydb
# パーミッション設定(他ユーザーに読ませない)
chmod 600 ~/.my.cnf

# 別ファイルを使う
mysql --defaults-file=~/.my-prod.cnf

# 環境変数 (MySQL 8.0+ では非推奨)
export MYSQL_PWD=secret
mysql -uroot mydb     # ★ プロセスリストに見える可能性あり、推奨しない

PostgreSQL クライアント接続

# 基本形
psql -h localhost -p 5432 -U postgres -d mydb

# Unix socket 経由(同一マシン)
psql -d mydb
psql mydb

# クエリを直接実行
psql -U postgres -d mydb -c "SELECT version();"

# ファイルから実行
psql -U postgres -d mydb -f script.sql

# ダンプリストア
pg_dump -U postgres mydb > dump.sql
psql -U postgres mydb < dump.sql

# 接続 URI 形式(PG 9.2+)
psql "postgresql://user:pass@host:5432/dbname?sslmode=require"

~/.pgpass で認証情報を保存

# ~/.pgpass フォーマット
# hostname:port:database:username:password
localhost:5432:mydb:postgres:mysecret
prod-db.example.com:5432:*:admin:prodpass
*:*:*:replication:replpass

# パーミッション必須 (0600)
$ chmod 600 ~/.pgpass

# 環境変数で別ファイル指定
export PGPASSFILE=/secrets/pgpass
# 環境変数による接続
export PGHOST=localhost
export PGPORT=5432
export PGUSER=postgres
export PGDATABASE=mydb
psql    # 引数なしで接続

# 1 回だけパスワード渡す
PGPASSWORD=mysecret psql -U postgres -d mydb

psql の便利コマンド

\l              -- データベース一覧
\c dbname       -- DB 切替
\dt             -- テーブル一覧
\d tablename    -- テーブル定義
\dn             -- スキーマ一覧
\du             -- ユーザー一覧
\df             -- 関数一覧
\dv             -- ビュー一覧
\x              -- 拡張表示切替(縦表示)
\timing         -- 実行時間表示 ON/OFF
\e              -- $EDITOR でクエリ編集
\i file.sql     -- ファイル実行
\copy t TO 'f.csv' CSV HEADER  -- CSV エクスポート
\q              -- 終了
\?              -- メタコマンドヘルプ
\h SELECT       -- SQL 構文ヘルプ

SSL / TLS 接続

MySQL の SSL

# SSL 必須で接続
mysql -h db.example.com -uadmin -p \
  --ssl-mode=REQUIRED

# 証明書検証付き
mysql -h db.example.com -uadmin -p \
  --ssl-mode=VERIFY_IDENTITY \
  --ssl-ca=/etc/mysql/ca.pem

# モード一覧:
# DISABLED         - SSL 不使用
# PREFERRED        - 使えるなら使う(既定)
# REQUIRED         - 必須。証明書チェックなし
# VERIFY_CA        - CA 検証
# VERIFY_IDENTITY  - CA + ホスト名検証(最強)

# 接続状態確認
SHOW STATUS LIKE 'Ssl_cipher';
-- Ssl_cipher | TLS_AES_256_GCM_SHA384

PostgreSQL の SSL

# 接続文字列で指定
psql "host=db.example.com port=5432 dbname=mydb user=admin sslmode=require"

# sslmode の選択肢:
#   disable      - SSL 不使用
#   allow        - 平文 → SSL 試行
#   prefer       - SSL 優先(既定)
#   require      - SSL 必須
#   verify-ca    - CA 検証
#   verify-full  - CA + ホスト名検証

# 証明書ファイル指定
psql "host=db.example.com dbname=mydb user=admin \
      sslmode=verify-full \
      sslrootcert=/etc/ssl/postgres/ca.crt"

# 接続状態確認
SELECT * FROM pg_stat_ssl WHERE pid = pg_backend_pid();

SSH トンネル経由の接続

DB が外部に公開されていない場合(推奨)、踏み台サーバー経由で接続します:

# ローカル 13306 → 踏み台 → DB の 3306 にトンネル
ssh -L 13306:db.internal:3306 -N -f bastion.example.com

# ローカルから普通の mysql で接続
mysql -h 127.0.0.1 -P 13306 -uadmin -p mydb

# PG の場合
ssh -L 15432:pg.internal:5432 -N -f bastion.example.com
psql -h 127.0.0.1 -p 15432 -U admin -d mydb

# 接続テスト後にバックグラウンドの ssh を止める
pkill -f "ssh -L 13306"

# ~/.ssh/config に書く
# Host db-tunnel
#   HostName bastion.example.com
#   LocalForward 13306 db.internal:3306
#   LocalForward 15432 pg.internal:5432
#   User myuser
$ ssh -N -f db-tunnel

Docker コンテナ内の DB に接続

# コンテナ内の mysql クライアントで接続
docker exec -it mysql-container mysql -uroot -p mydb

# ホスト側にクライアントだけある場合
docker run --rm -it --network=host mysql:8 mysql -h 127.0.0.1 -uroot -p

# docker-compose の DB に接続
docker-compose exec db mysql -uroot -p mydb
docker-compose exec db psql -U postgres mydb

# ホスト OS から直接(コンテナのポートを公開している前提)
mysql -h 127.0.0.1 -P 3306 -uroot -p mydb
psql -h 127.0.0.1 -p 5432 -U postgres mydb

# データダンプを取る
docker exec mysql-container mysqldump -uroot -pmysecret mydb > dump.sql
docker exec pg-container pg_dump -U postgres mydb > dump.sql

接続できないときのチェック

症状原因対処
Can't connect to MySQL server on '...'ホスト名 / ポート / FWnc -vz host 3306 で疎通確認
Access denied for user 'x'@'y'ユーザー / パスワード / 接続元 IPSELECT user, host FROM mysql.user
no pg_hba.conf entry for hostPG の認証設定未許可pg_hba.conf に行追加 → SELECT pg_reload_conf()
connection timeoutFW / Security GroupAWS なら SG、Linux なら iptables
SSL connection errorSSL 設定不一致--ssl-mode=DISABLED で一旦切り分け

権限とユーザー作成

-- MySQL
CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppPass123';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'appuser'@'%';
FLUSH PRIVILEGES;

-- 確認
SHOW GRANTS FOR 'appuser'@'%';

-- PostgreSQL
CREATE USER appuser WITH PASSWORD 'AppPass123';
GRANT CONNECT ON DATABASE mydb TO appuser;
GRANT USAGE ON SCHEMA public TO appuser;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO appuser;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO appuser;

-- 確認
\du appuser

FAQ

Q: パスワードをコマンドラインに書きたくない
A: MySQL は ~/.my.cnf、PG は ~/.pgpass に保存。どちらも chmod 600 必須。

Q: 本番 DB に直接接続して大丈夫?
A: SSH トンネル経由 + 読み取り専用ユーザーが鉄則。本番更新は必ずレビュー付きのスクリプトで。

Q: GUI クライアントは何が良い?
A: DBeaver(無料・全 DB 対応)、TablePlus(有料・UI 良)、HeidiSQL(MySQL 系専用)、pgAdmin(PG 公式)が定番。