◀ 5.

MySQL/MariaDBのDB選択|USEと接続・既定DBの違い

▶

元の用途:接続済みMySQLで既定DBを選ぶ

この記事の元のUSE データベース名;は、同じ接続の既定DBを選ぶ操作です。別サーバーへログインし直す操作ではありません。先にサーバーへ接続し、必要ならDB一覧を確認します。通常title/URL/親カテゴリを変えずにこの用途を戻しています。

サーバーへ接続した同一セッションでUSEにより既定DBを選ぶ流れ

同名の表がある2つのDBで確認する

以下は隔離検体の2DBにitemsを用意した読取例です。実データを作る手順ではなく、cwiki_w29_a/bは対象に置換します。CREATE/INSERTは別の検体準備として分離しています。SELECTの対象が変わることを、更新SQLではなく保存済みの目印で確認します。

USE cwiki_w29_a;
SELECT DATABASE() AS default_database, CONNECTION_ID() AS connection_id;
SELECT id, note FROM items ORDER BY id;
SELECT id, note FROM cwiki_w29_b.items ORDER BY id;
SELECT DATABASE() AS still_default_database;

検体では非修飾itemsはfrom_a、cwiki_w29_b.itemsはfrom_bを返しました。最後のDATABASE()はaのままで、修飾名を使ったSELECTだけでは既定DBは変わりません。USEの前後で接続IDも変わりませんでした。bへUSEすると以降の非修飾itemsがbを参照します。

新しい接続・失敗・接続poolを区別する

  • 初期DBを指定しない新規接続ではDATABASE()がNULLになり、非修飾SHOW TABLESは1046になりました。DBをFROMで指定する読取は、権限があれば既定DB未選択でも実行できます。
  • 検体の管理用接続で存在しないDBのUSEは1049、readerで権限がないDBは1044になり、失敗前に選んだaはそのままでした。エラーは権限/接続条件にも依存するため、コードだけで全対象の存在/不存在を断定しません。失敗を無視して書込みを続けず、戻り値と接続状態を確認します。
  • 別接続のUSEは他の接続の既定DBを変えません。CLIで変えたDBがアプリの全接続へ反映されるわけではありません。
  • 接続pool/再接続では接続ごとの初期化/再利用規約を確認します。今回の2接続検体は全driver/全poolの初期化動作を保証しません。

識別子とデータ値を混同しない

DB名は識別子です。SQL値用のplaceholderへDB名を渡せば任意識別子も安全に使える、とは考えません。固定の許可済みDB名/接続設定を使い、入力からUSE文を文字列連結しません。MySQL/MariaDBの名前の引用とPG等の接続先変更の文法も分けます。識別子のquoteだけでは、そのDBを選んでよい認可の代わりになりません。

選択後に確認するもの

SELECT DATABASE();と接続IDを必要な範囲で確認し、表/ビューの一覧や定義へ進みます。USEは表データの変更やschema作成ではなく、権限の追加でもありません。DBを選べても全表のSELECT/更新が許可されたとは限りません。

既存の一般接続・他製品例について

以下のMySQL/PG/SSH/Docker接続資料は補足として保持します。PGのpsql \cはMySQLのUSEとは異なる接続操作です。パスワード平文の引数/URI/環境変数、TLS停止、設定上書き、dumpへの上書き/リストア、広いpkill、ユーザー/権限変更は、DB選択のために行いません。MySQL/PGのTLSやpassfileもOS/driver/版によって条件が異なり、0600だけで秘密情報の全保護が完了したとは扱いません。

既存の接続・一覧資料(製品別の補足)

この記事の要点
  • MySQL: mysql -h host -P 3306 -u user -p [dbname]
  • PostgreSQL: psql -h host -U user -d dbname
  • パスワード非対話: MySQL は ~/.my.cnf、PG は ~/.pgpass等をOS/版の条件と運用規約に合わせる。環境変数/URIへ秘密値を安易に置かない
  • SSL: MySQL --ssl-mode=REQUIRED / PG sslmode=require
  • SSH トンネル経由・Docker exec 経由の典型パターン

MySQL クライアント接続

旧例の注意:MySQLへのサーバー接続資料です。USEによるDB選択とは別です。平文passwordやSQL/dumpの実行・ファイル上書きを選択確認のために行いません。

# 基本形
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 に書く

旧例の注意:固定root/passwordの設定例です。既存設定を書き換えず、ファイル権限だけで全保護と扱いません。「引数なし」は認証なしの意味ではありません。

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

[mysql]
prompt=mysql [\d]>

# これで認証情報なしで接続可能
# $ mysql mydb

旧例の注意:defaults-fileとsecretの供給はOS/版に合わせます。MYSQL_PWDを新しい推奨方法にせず、環境変数やログへの露出にも注意します。

# パーミッション設定(他ユーザーに読ませない)
chmod 600 ~/.my.cnf

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

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

PostgreSQL クライアント接続

旧例の注意:PGのpsqlは別接続操作です。URIのpasswordやdump上書き/復元をUSEの手順にしません。PGの実接続は今回の検証外です。

# 基本形
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 で認証情報を保存

旧例の注意:PG passfileの照合順/対象とOS別の保護を確認します。wildcardを必要以上に広げず、秘密値をソースに残しません。

# ~/.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

旧例の注意:PGの環境変数はプロセス/運用の露出条件を確認します。PGPASSWORDを無条件の推奨とせず、ログ/共有コマンドへ入れません。

# 環境変数による接続
export PGHOST=localhost
export PGPORT=5432
export PGUSER=postgres
export PGDATABASE=mydb
psql    # 引数なしで接続

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

psql の便利コマンド

旧例の注意:psql専用のメタコマンドで、SQL driverへ送信できる共通SQLではありません。\cによる接続とUSEを区別します。

\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

旧例の注意:MySQL CLIのモードです。CA/名前検証と暗号化を区別し、証明書/対応版を確認します。SHOW STATUSはSQLとして別に実行します。

# 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

旧例の注意:PGのTLS設定はMySQLのオプションとは別です。requireを名前検証成功の保証とせず、pg_stat_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 が外部に公開されていない場合(推奨)、踏み台サーバー経由で接続します:

旧例の注意:既存転送やSSH設定を変更せず、広いpkillパターンも実行しません。トンネルだけでDB側TLS/認可/全区間保護が完了したとは扱いません。

# ローカル 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 に接続

旧例の注意:Dockerのhost network/公開portや資格情報を自動変更しません。固定password引数のdumpや出力先の上書きは接続選択の確認に不要です。

# コンテナ内の 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'ユーザー / パスワード / 接続元 IP接続先/提示利用者と照合アカウント/認証方式を確認。一覧のためにmysql.*権限を追加しない
no pg_hba.conf entry for hostPG の認証設定未許可接続先/対象DB/アカウント・接続元/TLSと既存ポリシーを管理者が確認。認証設定を自動変更しない
connection timeoutFW / Security GroupAWS なら SG、Linux なら iptables
SSL connection errorSSL 設定不一致TLSを停止せず、CA/接続名/期限/対応版と拒否理由を確認

権限とユーザー作成

旧例の注意:CREATE USER/GRANT/ALTER DEFAULT PRIVILEGESは管理操作で、USEの準備ではありません。%や既定権限の追加、FLUSHを本番へ自動適用しません。

-- 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(対象製品/driver/版とlicenseを個別確認)、TablePlus(有料・UI 良)、HeidiSQL(対応製品/版を確認)、pgAdmin(PG 公式)が定番。

元の書式付きコマンド

元例の注意:元のコマンド表示です。DB名は置換箇所で、既定DB/接続先/権限を確認します。表一覧は未選択ならFROM指定を使い、USEはサーバーへの再接続とは区別します。

use データベース名

検証範囲と一次資料

新規の小規模MySQL8.4.13/MariaDB11.8.9検体の同一接続/別接続、限定権限と各製品の同梱CLIで検証した範囲です。全言語driver/GUI/接続pool/実SSH経路/各OSの導入や証明書運用・PG/Oracle/SQL Serverの旧例の実行成功を保証しません。本番のschema/認証/設定を変更していません。

子ページ

子ページはありません

同階層のページ
  1. MySQLの起動(Windows)
  2. MySQLの起動、停止、再起動(Linux)
  3. MYSQL への接続
  4. データベース一覧の表示
  5. データベースへの接続
  6. テーブル一覧を表示
  7. テーブル定義を確認
  8. ユーザーおよびパスワード一覧の確認

最近更新/作成されたページ