MacOSにMySQLをインストールして、ある程度動かしてみましたので、初めてのMySQL的な感じでシェアしておきます。
ググって出てくる情報を見ていたら、なんだか頭ごなしな説明が多かったようなので、理解しつつヘルプ見ながら操作ができるようになれる感じの説明を目標にまとめてみました。
ググって出てくる情報:
「こうしてこうしてこうします。ね、簡単でしょ?」
そんな説明では理解できない。
想定する読者
- MacOSで作業したい方
- Oracle・PostgreSQL・SQLiteなど、なんらかのデータベースを操作したことがある方
- 簡単な英語のヘルプが読める方
MySQLのインストール
mac環境ならMySQLもhomebrewでインストールできます。
(homebrew使ったことがない方はHomebrewのインストール - Qiitaを参考にインストールしましょう。)
brewでmysqlをsearchして、どれをインストールすればいいのか調べてみましょう。
色々と出てきますね…
> brew search mysql
==> Formulae
automysqlbackup mysql-client@5.7 mysql-search-replace
mysql mysql-connector-c++ mysql@5.6
mysql++ mysql-connector-c++@1.1 mysql@5.7
mysql-client mysql-sandbox mysqltuner
==> Casks
mysql-connector-python mysql-utilities navicat-for-mysql
mysql-shell mysqlworkbench sqlpro-for-mysql
> brew info mysql
mysql: stable 8.0.19 (bottled)
Open source relational database management system
https://dev.mysql.com/doc/refman/8.0/en/
とりあえずmysqlだけで大丈夫そうです。
ということでmysqlをインストールします。
> brew install mysql
インストールしたら、サーバーを起動してみます。
サーバーの起動はmysql.serverコマンドで行います。
> mysql.server start
Starting MySQL
. SUCCESS!
(ちなみにmysql.serverの存在は、man mysqlしても出てきません。)
ひと昔前や、Windowsでmysqlを使ったことがある方はmysqldというコマンドでサーバーを起動していた、という方も多いかと思います。
mysqldとmysql.server、いったい何が違うんだ?と疑問に思う方も多いはず。
ケンヂまるももちろん疑問に思って調べたところ、分かりやすく解説してくれているページがあったので紹介しておきます。
>> mysqld、mysqld_safe、mysql.serverによるMySQLサーバー起動の違い
結局のところ、mysql.serverからmysqldを呼び出すんですね。
すごく分かりやすかったです。
と、いうわけで、mysql.serverがインストールされる環境では、sqlサーバーの起動や停止はmysql.serverコマンドで行いましょう。
mysql -hとするといくつかあるコマンドのヘルプを確認できます。
> mysql.server -h
Usage: mysql.server
{start|stop|restart|reload|
force-reload|status} [ MySQL server options ]
ここからMacとかあまり関係ない話になっていく
mysqlコマンドでサーバーに接続してみる
とりあえずmysqlコマンドで接続してみようかと軽い気持ちでmysqlとだけ入力してもダメみたいです。
> mysql
ERROR 1045 (28000): Access denied for user 'dimaru'@'localhost' (using password: NO)
メッセージを見るに、もしmysqlのユーザーにdimaruユーザーがパスワードなしで作成されていればログインできていたっぽい。
ログインの仕方については、実はbrew install mysqlした時にこんな感じで案内されていました。
We've installed your MySQL database without a root password. To secure it run:
mysql_secure_installation
MySQL is configured to only allow connections from localhost by default
To connect run:
mysql -uroot
というわけで接続するにはmysql -urootとします。
> mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.19 Homebrew
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
これでMySQLデータベースを使う準備ができました。
コマンドなどの調べ方
MySQLでデータベースを操作する時のコマンドなどはどうやって調べればいいのでしょうか?
毎回ググらなくても大丈夫です。
help contentsと入力しましょう。
mysql> help contents
You asked for help about help category: "Contents"
For more information, type 'help <item>', where <item> is one of the following
categories:
Account Management
Administration
Components
Compound Statements
Contents
Data Definition
Data Manipulation
Data Types
Functions
Geographic Features
Help Metadata
Language Structure
Plugins
Storage Engines
Table Maintenance
Transactions
User-Defined Functions
Utility
カテゴリ名の一覧が出てきます。
上から二番目のAdministrationのヘルプを見てみましょう。
mysql> help administration
〜略
SHOW CREATE TABLE
SHOW CREATE TRIGGER
SHOW CREATE USER
SHOW CREATE VIEW
SHOW DATABASES
SHOW ENGINE
SHOW ENGINES
SHOW ERRORS
〜略
なるほど、show なんたらというコマンドがあるということが分かりますね。
では、データベースの一覧を見てみましょう。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
まだ何もデータベースを作っていないはずなのに、既に4つのデータベースが存在するようです。
ここで出てくる4つのデータベースは、MySQLがシステム的に使うものなので、削除してはいけないそうです。
あまりGoogle先生に頼りすぎず、ヘルプやマニュアルも見れるようになると解決力がついてくる。
データベースを作ってみる
自分用のデータベースを作ってみます。
Data Definitionのヘルプを見てみましょう。
mysql> help Data Definition
〜略
CREATE DATABASE
〜略
CREATE DATABASEの説明は、helpコマンドに渡すことで確認することができます。
mysql> help create database
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] ...
〜略
create databaseの使い方がわかったところで、自分用のデータベースを作ってみましょう。
mysql> create database sample;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sample |
| sys |
+--------------------+
5 rows in set (0.00 sec)
create databaseした後にshow databasesで確認すると、確かに自分で作ったデータベースがありますね。
作ったデータベースに切り替えるには、use db_nameです。
help説明はutilityに入っているようですね。
mysql> help utility
You asked for help about help category: "Utility"
For more information, type 'help <item>', where <item> is one of the following
topics:
DESC
DESCRIBE
EXPLAIN
HELP STATEMENT
USE
mysql> help use
Name: 'USE'
Description:
Syntax:
USE db_name
〜略
自分で作ったデータベースに切り替えて、テーブル一覧を見てみましょう。
mysql> use sample;
Database changed
mysql> show tables;
Empty set (0.01 sec)
テーブルはまだ作っていないので、1つも無いですね。
テーブルを作ってみる
エンジニアならcreate table文でテーブルを作ることは知っている人も多いとは思いますが、一応説明も見ておきましょう。
data definitionのカテゴリにあります。
mysql> help data definition
〜略
CREATE TABLE
〜略
create tableの構文を確認しておきたいので、help create tableで説明を見てみましょう。
mysql> help create table
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
〜略
かなり長ったらしい説明が出てきます。
各データ型の説明はリンク先を見てねとなっていて、出力される説明を読んだだけでは全て把握することはできないようです。w
読むのは諦めてSQLの基本をググってcreate table文を入力してみましょう。
mysql> create table sample(id int auto_increment unique key, name varchar(8));
Query OK, 0 rows affected (0.01 sec)
作ったテーブルはshow tablesで見れます。
テーブルが作れていることの確認と、作ったフィールドの確認もしておきましょう。
mysql> help show
〜略
SHOW [FULL] TABLES [FROM db_name] [like_or_where]
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where]
〜略
mysql> show tables;
+------------------+
| Tables_in_sample |
+------------------+
| sample |
+------------------+
1 row in set (0.01 sec)
mysql> show columns from sample;
+-------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(8) | YES | | NULL | |
+-------+------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)
テーブルの作成ができました。
データベース名もテーブル名も同じsampleという名前で作ってしまうのは、ブログ記事としてどうなのか。
(わかりにくくてごめんなさいなのか。)
データをINSERTしてみる
作ったテーブルにデータを入れる構文、つまりSQL的な構文のヘルプはhelp data manipulationで見れるようです。
mysql> help data manipulation
You asked for help about help category: "Data Manipulation"
For more information, type 'help <item>', where <item> is one of the following
topics:
CALL
DELETE
DO
DUAL
HANDLER
IMPORT TABLE
INSERT
INSERT DELAYED
INSERT SELECT
JOIN
LOAD DATA
LOAD XML
REPLACE
SELECT
UNION
UPDATE
テーブルが空なので何かデータを挿入したいですね。
insert文のヘルプを見てから、実際に先ほど作ったテーブルに行を入れてみます。
mysql> help insert
Name: 'INSERT'
Description:
Syntax:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
[ON DUPLICATE KEY UPDATE assignment_list]
〜略
mysql> insert sample (name) values ('ケンヂまる');
Query OK, 1 row affected (0.00 sec)
(idフィールドはauto_incrementで作成されているので何も指定せずにinsertすれば自動的に連番がついていきます。)
挿入したデータを確認しましょう。
mysql> select * from sample;
+----+-----------------+
| id | name |
+----+-----------------+
| 1 | ケンヂまる |
+----+-----------------+
1 row in set (0.00 sec)
ちゃんと入っていますね。
ユーザーを作成してみる
ユーザーを新たに作成してパスワードを設定しましょう。
ユーザー関連のヘルプはhelp Account Managementで見ることができます。
mysql> help Account Management
You asked for help about help category: "Account Management"
For more information, type 'help <item>', where <item> is one of the following
topics:
ALTER RESOURCE GROUP
ALTER USER
CREATE RESOURCE GROUP
CREATE ROLE
CREATE USER
DROP RESOURCE GROUP
DROP ROLE
DROP USER
GRANT
RENAME USER
REVOKE
SET DEFAULT ROLE
SET PASSWORD
SET RESOURCE GROUP
SET ROLE
mysql> help create user;
Name: 'CREATE USER'
Description:
Syntax:
CREATE USER [IF NOT EXISTS]
user [auth_option] [, user [auth_option]] ...
DEFAULT ROLE role [, role ] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH resource_option [resource_option] ...]
[password_option | lock_option] ...
user:
(see )
auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED BY RANDOM PASSWORD
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
| IDENTIFIED WITH auth_plugin AS 'auth_string'
}
userの部分の説明が(see )となっていてバグっているため、13.7.1.3 CREATE USER Statementを見ましょう。
kendimaruユーザーを作成してログインし直し、データベース一覧を確認してみると、mysql・performance_schema・sysデータベースが見えなくなっています。
(ユーザー作成)
mysql> create user 'kendimaru'@'localhost'
-> identified by 'my-password';
Query OK, 0 rows affected (0.00 sec)
(いったんrootユーザーを抜ける)
mysql> exit
Bye
(作ったユーザーでログイン)
> mysql -ukendimaru -p
Enter password:
mysql> show databases; (データベース一覧を表示)
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
小規模なプロジェクトなら全てrootユーザーでええやんという思いもありますが、rootユーザー以外のユーザーを作成するメリットとして、このようにうっかりシステムレベルのデータベースを消してしまうことを防ぐことができます。
どんだけうっかりさんなんだ。
おわり
とりあえずMacでMySQLを動かしてみるのはこのくらいで良いでしょう。
深掘りしだすとキリがないので、何かプロジェクトを始めるまでの導入としてデータベースをある程度操作・管理できるようになれば、ひとまずは十分だと思います。