4〜5月といえば新人研修の時期ですね。
近頃はエンジニア以外も SQL の研修をする機会が増えているかと思います。
ただそういった方面に疎い方を含めて、研修の参加者全員に事前に環境構築をしておいてもらうというのはハードルが高いときがあります。
上記の課題を解決するために、全員が一切の事前準備をせずに研修の開始数分で等しく環境を用意できる方法を説明します。使うものはブラウザだけです。
(この例では、 https://dev.mysql.com/doc/index-other.html にある sakila database
というサンプルデータ使います)
事前に必要なもの
これだけは事前に管理者(担当者)が用意してください。
- AWS アカウント (一つあれば良い)
- 研修の参加者がログインするための IAM (Cloud9 が使えれば良い)
ワークショップ開始時にやること
参加者が自分の Cloud9 environment を作成する
AWS Web コンソールにログインしたら https://ap-northeast-1.console.aws.amazon.com/cloud9/ を開きます。
Create environment
を選択します。
適当な名前を付けます。他の人と重複しないように。
設定は何も変更しません。
この後 Create Environment
を選択してしばらく待ちます。
Cloud9 environment に入ったらやること
Terminal のフォントサイズ変更 (任意)
フォントサイズは Preferences から変更できます。
Terminal でやること
mysql の設定ファイルを用意する
mysql は ver8.0 よりデフォルトの認証方式が変わりました。これを旧方式に変更するため、下記の設定ファイルを事前に用意しておく必要があります。
$ mkdir config
$ touch config/my.cnf
そして my.cnf
の中身は下記をコピペして保存します。
[mysqld]
default_authentication_plugin=mysql_native_password
mysql を用意する
ポート 3306 で既に MariaDB が稼働しているので、ポート 3307 で mysql を稼働させます。
$ docker run --name mysql -v ~/environment/config:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d -p 3307:3306 mysql:8.0
(ref: https://medium.com/@crmcmullen/how-to-run-mysql-8-0-with-native-password-authentication-502de5bac661)
※ Docker コンテナーを削除したいときは下記のコマンドで。
$ docker rm -f mysql
サンプルデータを用意する
シードデータをダウンロードします。
$ curl -OL http://downloads.mysql.com/docs/sakila-db.zip && unzip ./sakila-db.zip
mysql にログインして、シードデータをインポートします。
$ mysql -h 127.0.0.1 -P 3307 -uroot -proot
(稀に失敗するので、何回か試す)
ログインが成功すると、
$ mysql>
このような表示に切り替わります。 source
コマンドでシードデータをインポートしましょう。
$ mysql> source sakila-db/sakila-schema.sql;
$ mysql> source sakila-db/sakila-data.sql;
(ref: https://dev.mysql.com/doc/sakila/en/sakila-installation.html)
ここまででサンプルデータの準備は完了です。
他に適当なデータがあればそれを使うと良いでしょう。
開始からここまでに要する時間は数分です。
SQL 実践
sakila
データベースにあるテーブルに対して適当なクエリを投げます。
$ mysql> use sakila;
$ mysql> show full tables;
+----------------------------+------------+
| Tables_in_sakila | Table_type |
+----------------------------+------------+
| actor | BASE TABLE |
| actor_info | VIEW |
| address | BASE TABLE |
| category | BASE TABLE |
| city | BASE TABLE |
| country | BASE TABLE |
| customer | BASE TABLE |
| customer_list | VIEW |
| film | BASE TABLE |
| film_actor | BASE TABLE |
| film_category | BASE TABLE |
| film_list | VIEW |
| film_text | BASE TABLE |
| inventory | BASE TABLE |
| language | BASE TABLE |
| nicer_but_slower_film_list | VIEW |
| payment | BASE TABLE |
| rental | BASE TABLE |
| sales_by_film_category | VIEW |
| sales_by_store | VIEW |
| staff | BASE TABLE |
| staff_list | VIEW |
| store | BASE TABLE |
+----------------------------+------------+
23 rows in set (0.00 sec)
$ mysql> select * from actor limit 10;
+----------+------------+--------------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+--------------+---------------------+
| 1 | PENELOPE | GUINESS | 2006-02-15 04:34:33 |
| 2 | NICK | WAHLBERG | 2006-02-15 04:34:33 |
| 3 | ED | CHASE | 2006-02-15 04:34:33 |
| 4 | JENNIFER | DAVIS | 2006-02-15 04:34:33 |
| 5 | JOHNNY | LOLLOBRIGIDA | 2006-02-15 04:34:33 |
| 6 | BETTE | NICHOLSON | 2006-02-15 04:34:33 |
| 7 | GRACE | MOSTEL | 2006-02-15 04:34:33 |
| 8 | MATTHEW | JOHANSSON | 2006-02-15 04:34:33 |
| 9 | JOE | SWANK | 2006-02-15 04:34:33 |
| 10 | CHRISTIAN | GABLE | 2006-02-15 04:34:33 |
+----------+------------+--------------+---------------------+
10 rows in set (0.00 sec)
この Sakila というデータベースが なんなのか についてはこのように説明されています。
Sakilaサンプルデータベースは当初、MySQL ABドキュメントチームの元メンバーであるMike Hillyerによって開発され、書籍、チュートリアル、記事、サンプルなどの例に使用できる標準スキーマを提供することを目的としています。
(from: https://dev.mysql.com/doc/sakila/en/sakila-introduction.html)
研修が終わったら
研修が終わったら、参加者は自分が作った Cloud9 environment を削除します。
ちなみに、研修で使う程度なら Cloud9 のコストはタダみたいなものなので、SQL 以外にも有用な場面は色々あります。