プログラミング

macにMySQLをインストールして動かしてみた

2020-07-11

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を動かしてみるのはこのくらいで良いでしょう。

深掘りしだすとキリがないので、何かプロジェクトを始めるまでの導入としてデータベースをある程度操作・管理できるようになれば、ひとまずは十分だと思います。

-プログラミング

© 2022 ヂまるBlog