タイトル: データベースへの接続
SEOタイトル: MySQL/PostgreSQL コマンドライン接続完全ガイド
| この記事の要点 |
|
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 '...' | ホスト名 / ポート / FW | nc -vz host 3306 で疎通確認 |
Access denied for user 'x'@'y' | ユーザー / パスワード / 接続元 IP | SELECT user, host FROM mysql.user |
no pg_hba.conf entry for host | PG の認証設定未許可 | pg_hba.conf に行追加 → SELECT pg_reload_conf() |
connection timeout | FW / Security Group | AWS なら SG、Linux なら iptables |
SSL connection error | SSL 設定不一致 | --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 公式)が定番。