LoginSignup
78
91

More than 3 years have passed since last update.

MySQLをMacのターミナルで操作するときのメモ

Last updated at Posted at 2020-01-22

毎度てんやわんやするので整理メモを残します。
随時更新します。

ご指摘・代替案等ありましたらコメントいただけますと幸いです。

環境状況

  • Mac OSCatalina 10.15.2
  • MySQL 8.0.19(Homebrewでbrew install mysqlして入れたもの)
  • ターミナルでの作業

懸念点

・/usr/local/opt配下に"mysql"と"mysql@8.0"がある
(バージョンはどちらも同じ)
→ 以前ポート番号が0になって接続できなかったことがあり、そのときの原因はこの見る先の問題かも?と想定(mysqladmin shutdownにて解決)

・何回もインストールし直している
どこかでなにやらやばいことになってないか不安:thinking:

(追記)
何をやっても動かなくなったので一からやり直しました
どうしよう!困った時のMac上のMySQLのアンインストール&再インストール、動作確認手順 | Qiita
MacでMySQL5.7をアンインストールする | Qiita
MySQL8.0をmacOSにインストールする方法 | プログラミング入門ナビ

知識

個人的に覚えておきたいこと:writing_hand:

  • MySQLの設定は/etc/my.cnf参考 - Qiita
  • MySQL 8.0では、ホストサーバーにログインしないでも設定値の変更から再起動で反映までコマンドでできるようになった(参考 - スマートスタイル TECH BLOG
  • 基本的にSQLは大文字でも小文字でも大丈夫
    • 小文字だとダメだったときがあるけど、それはそもそも文を間違えてた可能性もある
  • Macのターミナルでコマンドが実行できない&改行しかできない地獄に陥ったときはcontrol + c
    • /Cでも\cでもcommand + cでもなくcontrol + c
  • MySQL 8.0からユーザ作成と権限付与は別々でちゃんと行わないといけなくなった
  • rootは元々パスワードがついていないので付けた方がいい(参考 - CodeCampus
  • MySQL内で設定を変えたら、基本的には一回出る

☆ MySQLの状態を調べる
(MySQL内から状態を見るパターンは後述)
・情報を見たいとき
$ brew info mysql
・バージョン確認
$ mysql --version
参考 - Qiita

コマンド実行

☆ 文頭の違い
$:通常のターミナルでの操作
mysql>:MySQLにログインしてからの操作 → 文末に;がないと実行されない

基本操作

MySQLの起動

$ mysql.server start

$ mysql.server start --skip-grant-tables
→ パスワードなしでログインできる

MySQLにログイン(実行、接続とも)

$ mysql -u root -p

「ユーザ名:root」で接続します、パスワードは後で聞いて」という意味
らしい(抜粋元 - プロエンジニア
このコマンドの後、パスワードが聞かれるので入力する(打ったパスワードは画面に表示されない)

MySQLからログアウト

mysql> exit

quitでも\qでも可

MySQLの停止(終了とも)

$ mysql.server stop

バッテリーを消耗しやすいため、使わないときは停止させておいた方がいいらしい

MySQLの再起動

$ mysql.server restart

MySQLの自動起動

$ brew services start mysql

Homebrewの機能(多分)
重複起動させたりしてわけわからんことになるので、
調べながらやってるビギナーなうちはやらない方がいいと思った
何度も事故った:head_bandage:

☆ 止めたいときは
$ brew services stop mysql

参考 - Qiita

MySQL関連

どうなってるか見る

mysql> show variables like 'version'; #バージョン確認
mysql> show status; #セッション統計情報の表示
mysql> show status like "Threads_connected"; #現在の同時接続数を表示

参考 - Qiita

ユーザ関連

前述のログインするユーザに関連

rootだとなんでもできてしまってこわいので、
必要に応じて別途DBを利用するユーザを作っておいた方がいい

現在のユーザ確認

mysql> SELECT user(); # ログイン中のユーザ表示
mysql> SHOW GRANTS; # 現在ログイン中ユーザの権限確認

ユーザ一覧の表示

mysql> SELECT user, host FROM mysql.user;

mysqlというデータベースにあるuserテーブルにアクセス
他にもいろんなカラムがある

ユーザの作成

mysql> CREATE USER '[作成したいユーザ名]'@'[ホスト名]' IDENTIFIED BY '[指定したいパスワード]';

ホスト名には、MySQLへ接続するホストを指定する
ホスト名の代わりにIPアドレスやlocalhostを指定することも可(参考 - プロエンジニア

ユーザの削除

mysql> DROP USER '[削除したいユーザ名]'@'[ホスト名]';

ユーザの権限付与

mysql> GRANT [権限] ON [適用対象のデータベース].[適用対象のテーブル] TO '[権限付与するユーザ名]'@'[ホスト名]';
mysql> FLUSH PRIVILEGES; # 権限の変更をデータベースに反映

<Point 1>
検索すると以下のような書き方がよく出てくる

GRANT [権限] ON [適用対象のデータベース].[適用対象のテーブル] TO '[権限付与するユーザ名]'@'[ホスト名]' IDENTIFIED BY '[パスワード]';

が、MySQL 8.0の場合ユーザ作成と権限付与は別で行わないといけないので、文末にIDENTIFIED BY '[パスワード]'を書いて実行すると構文エラーになる1:space_invader:

<Point 2>
権限の書き方、種類、権限付与により操作を許可するDBやテーブルの書き方は、以下参考URLの該当項目を参照
MySQLでユーザを作成し、権限を設定する方法 | プロエンジニア

対象ユーザの権限を確認

mysql> SHOW GRANTS FOR '[ユーザ名]'@'[ホスト名]';

対象ユーザのパスワード変更

mysql> UPDATE mysql.user SET password=password('[新パスワード]') WHERE user='[対象ユーザ]';
mysql> FLUSH PRIVILEGES; # 権限変更を反映

対象ユーザの権限を削除

mysql> REVOKE [権限] ON [適用対象のデータベース].[適用対象のテーブル] FROM '[権限を削除するユーザ名]'@'[ホスト名]';
mysql> FLUSH PRIVILEGES; # 権限変更を反映

データベース関連

ほぼ抜粋
Macでmysqlを扱う方法 | Qiita
※自分の実行結果に修正・追記予定

データベース確認

mysql> SHOW databases; #データベース一覧を表示
mysql> USE [データベース名] #使用するデータベースを選択(セミコロン不要)
mysql> CREATE database [データベース名]; #データベースの作成
mysql> DROP database [データベース名]; #データベースの削除

テーブル確認

mysql> SHOW tables; # テーブル一覧を表示
mysql> SHOW tables status; # テーブル一覧のステータス情報を表示
mysql> DESC [テーブル名]; # カラム一覧を表示
mysql> SHOW full columns FROM [テーブル名]; # カラム一覧を表示、Collation付き。

※Collation:照合順序。MySQLでは文字コードとソート順を持っており、ソート順の部分がCollationと呼ばれている。DB単位、テーブル単位、カラム単位で設定可能である。

インデックス確認

mysql> SHOW index FROM [テーブル名]; # 特定のテーブル

mysql> USE information_schema;
mysql> SELECT * FROM statistics WHERE TABLE_SCHEMA = [データベース名]; # 特定のデータベース

参考 - Qiita

mysqladminコマンド

管理操作を実行するためのクライアント
MySQL サーバの稼動状況を確認したり、MySQL サーバを停止したりできる
参考 - MySQL 逆引きリファレンス

MySQLにログインしていない状態で使う
$ mysqladmin ~

このひとがいつ使うなんなのかわからなくてしっちゃかめっちゃかになったりした
mysql> ~の処理とごちゃまぜに書いてあるサイトが多くて混乱したので、
実際に使うときはしっかり区別する

☆ パスワード送信オプション

-u [ユーザー名] -p ← これのこと
後述のmysqladminコマンドを実行する際、
パスワードを設定しているユーザが対象である場合は文末に記述する
そうしないと権限エラーになる

(例)$ mysqladmin ping -u root -p

パスワードを設定していないユーザであれば書かなくてもいける
(以下パスワード送信オプションの記述は省略します)

MySQL サーバが起動中であるかを確認

$ mysqladmin ping 

MySQLサーバを起動していない場合は、
パスワードを設定していても$ mysqladmin pingでわかる(エラー内容から)

MySQL サーバの状態を表示

$ mysqladmin status
$ mysqladmin extended-status #詳細情報

ユーザーのパスワードを変更

$ mysqladmin password [新パスワード] -u [ユーザー名] -p

<Point 1>
[新パスワード]の部分はそのままパスワードを書く
いつもみたいに'pass12345'とか書くと、パスワードがpass12345ではなく'pass12345'になる
(シングルクォーテーションもパスワードになっちゃう)

<Point 2>
コマンドの履歴を記載するログファイルに
パスワードが残ってしまうらしいので、セキュリティ的にはよろしくない
参考 - CodeCampus

mysqladmin コマンドのヘルプを表示

$ mysqladmin -?

※パスワード送信オプション不要

実行中のプロセスの一覧を表示

$ mysqladmin processlist

プロセス(処理中の接続)を強制的に停止

$ mysqladmin kill [プロセスID]

<Point 1>
プロセスID の一覧はmysqladmin processlistで調べられる

<Point 2>
強制的に終了するプロセスを,(カンマ)区切りで複数指定できる
その際、カンマの後ろに半角スペースを含めてはいけない:no_good:
1111, 2222, 3333, ...のように書くとコマンドが正しく実行されなくなる

(正解例)1111,2222,3333, ...

気を付けたいポイント

・「同じ処理内容に見えるけど、書き方が全然違う」ときはなんらかの違う理由があるので、適当にやらずにちゃんと違いを理解する
→ 適当にやると余計なもの同士ががっちゃんこしたりする

・ターミナル系でコケるとき、基本的に「何をするコマンドなのか」をわかっていないのが原因なので、わからないことを分解して調べる

・エラーメッセージは丸々ググる前に英文を理解してから

・書いてある通りにやってできなかったらバージョンの違いを確認する


  1. つまり、この書き方はユーザ作成と権限付与をまとめてやってるやつ 

78
91
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
78
91