20200529のMySQLに関する記事は14件です。

主要なRDBをdocker上で動かしてみる

動機

RDB毎のSQLの違いを試したくなったのですが、Oracle Databaseのインストールが面倒くさかったのと、ローカルPCの環境を汚したくなかったので、docker上で各種RDBを動かそうと思いました。

対象としてRDBは、Oracle、SQLServer、DB2、MySQL、PostgreSQLです。

前提

dockerのインストールやコマンドのオプションとかは公式ページやQiitaで紹介されているので、自身の覚書程度にしています。

ホストOS

cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"

docker インストール

インストール手順

詳細は省略
https://docs.docker.com/engine/install/ubuntu/

一般ユーザでdockerコマンドを使えるようにする

sudo gpasswd -a <一般ユーザid> docker
sudo chmod 666 /var/run/docker.sock

Oracle

参考URL

oracle databaseはdockerイメージが配布されていないので、ビルドするところから。

https://github.com/oracle/docker-images/tree/master/OracleDatabase/SingleInstance

ビルドスクリプトをgithubから取得

cd ${HOME}/prj/DB/oracle/
git clone https://github.com/oracle/docker-images

ビルド

マシンパワー、ネットワークによりますが、1時間くらいかかりました。

cd ${HOME}/prj/DB/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles
./buildDockerImage.sh -v 18.4.0 -x

コンテナを起動前の準備

ホスト側にoradataのディレクトリを作ります。このときパーミッションは777とします。これをしておかないと、コンテナ内部からホスト側へのファイル書き込みができないので。

mkdir -p ${HOME}/prj/DB/oracle/oradata
chmod 777 $HOME/prj/DB/oracle/oradata

コンテナを起動

参考URLにある、コンテナ起動書式は、次なのですが、ORACLE_PWDを指定すると、 Password cannot be null. Enter password: のエラーメッセージとなってしまい起動しないです。
privilaged=trueを入れてみたけど、状況は変わりませんでした。

docker run --name <container name> \
-p <host port>:1521 -p <host port>:5500 \
-e ORACLE_PWD=<your database passwords> \
-e ORACLE_CHARACTERSET=<your character set> \
-v [<host mount point>:]/opt/oracle/oradata \
oracle/database:18.4.0-xe

うまく動いた例。

docker run --name my-oracle \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_CHARACTERSET=AL32UTF8 \
-v $HOME/prj/DB/oracle/oradata:/opt/oracle/oradata \
-d oracle/database:18.4.0-xe

コンテナ起動状況を確認

docker logs -f my-oracle

次のようなメッセージが出ています。「SYSTEM」ユーザのパスワードが出ていますので、覚えておきます。

ORACLE PASSWORD FOR SYS AND SYSTEM: 650d4f293b8fb05e
Specify a password to be used for database accounts. Oracle recommends that the password entered should be at least 8 characters in length, contain at least 1 uppercase character, 1 lower case character and 1 digit [0-9]. Note that the same password will be used for SYS, SYSTEM and PDBADMIN accounts:
Confirm the password:

次のメッセージが表示されたらOK。

#########################
DATABASE IS READY TO USE!
#########################

コンテナに入り、簡単な動作確認

docker exec -it --user root my-oracle bash -p
コンテナ内部
bash-4.2# su oracle
[oracle@hostname /]$ sqlplus SYSTEM/650d4f293b8fb05e

SQL*Plus: Release 18.0.0.0.0 - Production on Fri May 29 12:45:51 2020
Version 18.4.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Last Successful login time: Thu May 28 2020 12:54:45 +00:00

Connected to:
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0

SQL> select table_name from all_table

省略

SQL> exit

Disconnected from Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
[oracle@hostname /]$ exit
exit
exit
bash-4.2# exit

コンテナの停止と次回以降の開始

docker stop my_oracle
docker start my_oracle

SQL Server

参考URL

https://hub.docker.com/_/microsoft-mssql-server

コンテナを起動

docker run -it --name my-sqlserver \
-e 'ACCEPT_EULA=Y' \
-e 'SA_PASSWORD=yourStrong(!)Password' \
-e 'MSSQL_PID=Express' \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2017-latest

コンテナ起動状況を確認

docker logs -f my-sqlserver

次のメッセージが表示されたらOK。

SQL Server is now ready for client connections. This is an informational message; no user action is required.

コンテナに入り、簡単な動作確認

docker exec -it --user root my-sqlserver bash -p
コンテナ内部
root@hostname:/# /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U sa -P 'yourStrong(!)Password'
1> SELECT table_catalog,table_schema,table_name,table_type FROM information_schema.tables;
2> go

省略

1> exit
root@hostname:/# exit

コンテナの停止と次回以降の開始

docker stop my-sqlserver
docker start my-sqlserver

DB2

参考URL

https://hub.docker.com/r/ibmcom/db2

コンテナを起動前の準備

次のディレクトリを作っておきます。

mkdir -p ${HOME}/prj/DB/db2

コンテナを起動

docker run -it --name my-db2 \
--privileged=true \
-p 50000:50000 \
-e LICENSE=accept \
-e DB2INST1_PASSWORD=db2 \
-e DBNAME=testdb \
-v $HOME/prj/DB/db2:/database \
-d ibmcom/db2:latest

コンテナ起動状況を確認

docker logs -f my-db2

次のメッセージが表示されたらOK。

(*) Setup has completed.

コンテナに入り、簡単な動作確認

docker exec -it --user root my-db2 bash -c "su - db2inst1"

db2 コマンドに -t オプションをつけること。これをしておかないと、SQL文の改行ができないので。

コンテナ内部
[db2inst1@hostname ~]$ db2 -t
(c) Copyright IBM Corporation 1993,2007
Command Line Processor for DB2 Client 11.5.0.0

You can issue database manager commands and SQL statements from the command 
prompt. For example:
    db2 => connect to sample
    db2 => bind sample.bnd

For general help, type: ?.
For command help, type: ? command, where command can be
the first few keywords of a database manager command. For example:
 ? CATALOG DATABASE for help on the CATALOG DATABASE command
 ? CATALOG          for help on all of the CATALOG commands.

To exit db2 interactive mode, type QUIT at the command prompt. Outside 
interactive mode, all commands must be prefixed with 'db2'.
To list the current command option settings, type LIST COMMAND OPTIONS.

For more detailed help, refer to the Online Reference Manual.

db2 => connect to testdb;

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.0.0
 SQL authorization ID   = DB2INST1
 Local database alias   = TESTDB

db2 => select
db2 (cont.) => tabname
db2 (cont.) => from
db2 (cont.) => syscat.tables;

省略

db2 => quit;
DB20000I  The QUIT command completed successfully.
[db2inst1@hostname ~]$ exit

コンテナの停止と次回以降の開始

docker stop my-db2
docker start my-db2

MySQL

参考URL

https://hub.docker.com/_/mysql

コンテナを起動

docker run -it --name my-mysql -e MYSQL_ROOT_PASSWORD=mysql -d mysql:latest

コンテナ起動状況を確認

docker logs -f my-mysql

次のメッセージが表示されたらOK。

/usr/sbin/mysqld: ready for connections. Version: '8.0.20'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.

コンテナに入り、簡単な動作確認

docker exec -it --user root my-mysql bash -p
コンテナ内部
root@hostname:/# mysql -u root -h localhost -p
Enter password: mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.20 MySQL Community Server - GPL

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> SELECT table_catalog,table_schema,table_name,table_type FROM information_schema.tables;

省略

mysql> exit
Bye
root@hostname:/# exit

コンテナの停止と次回以降の開始

docker stop my-mysql
docker start my-mysql

PostgreSQL

参考URL

https://hub.docker.com/_/postgres

コンテナを起動

docker run -it --name my-postgres -e POSTGRES_PASSWORD=postgres -d postgres:latest

コンテナ起動状況を確認

docker logs -f my-postgres

次のメッセージが表示されたらOK。

database system is ready to accept connections

コンテナに入り、簡単な動作確認

docker exec -it --user root my-postgres bash -p
コンテナ内部
root@hostname:/# psql -h localhost -p 5432 -U postgres
psql (12.3 (Debian 12.3-1.pgdg100+1))
Type "help" for help.

postgres=# SELECT table_catalog,table_schema,table_name,table_type FROM information_schema.tables;

省略

postgres=# exit
root@hostname:/# exit

コンテナの停止と次回以降の開始

docker stop my-postgres
docker start my-postgres
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLでクロス集計する

はじめに

今回はこちらの続きとなります。
前回の記事では、とりあえず新着したニュースを数えただけでしたが、今回はそれに加えてニュースのカテゴリごとに新着数を出した表を作りたいと思います。
googleスプレッドシートのピボットテーブルでは以下のように作成されます。
Screenshot from 2020-05-29 17-49-05.png
ピボットテーブルを使えば、追加で列要素にカテゴリを選択することで簡単に表を作ることができます。
このように行と列でデータをグループ化して表にしたものを「クロス集計」といいます。
今回はmysqlでクロス集計をするという内容になります。

こちらの記事を参考にさせていただきました。

MySQLでクロス集計してみた

mysqlでクロス集計

DBにはあらかじめニュースの新着日時が「published_at」で、カテゴリが「category」として保存されています。
Screenshot from 2020-05-29 18-08-28.png

今回は「経済」「国際」「政治」「エンタメ」「スポーツ」の5つのカテゴリに絞ってクロス集計してみます。

以下今回のsql文です。

select
  date_format(published_at, '%Y-%m-%d') as 年月日,
  date_format(published_at, '%H') as 時間,
  count(case when category='経済' then 1 else null end) as 経済,
  count(case when category='国際' then 1 else null end) as 国際,
  count(case when category='政治' then 1 else null end) as 政治,
  count(case when category='エンタメ' then 1 else null end) as エンタメ,
  count(case when category='スポーツ' then 1 else null end) as スポーツ
from 
  articles
group by 
  年月日, 時間
with rollup

表には「年月日」、「時間」、それぞれのカテゴリを表示させたいので、selectですべてのフィールドを選んでいきます。
それぞれのカテゴリごとのニュース数はcountで集計します。countの中はcase式で条件を指定しており、categoryが該当のカテゴリ名であれば「1」、そうでなければnullにし、それらをカウントするという形でニュース数を数えています。
また選択するフィールドはasによってエイリアスを指定しています。エイリアスを指定することでフィールドの見出しもスッキリし、年月日と時間についてはgroup byでグループ化を指定する際に簡単に書くことができます。

以下実行結果です。

+------------+--------+--------+--------+--------+--------------+--------------+
| 年月日     | 時間   | 経済   | 国際   | 政治   | エンタメ     | スポーツ     |
+------------+--------+--------+--------+--------+--------------+--------------+
| 2020-05-23 | 06     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-23 | NULL   |      0 |      0 |      0 |            0 |            0 |
| 2020-05-24 | 11     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-24 | 19     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-24 | 20     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-24 | NULL   |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | 03     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | 08     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | 10     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | 11     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | 12     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | 13     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | 15     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | 17     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | 19     |      0 |      0 |      1 |            0 |            0 |
| 2020-05-25 | 20     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | 21     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | 22     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-25 | NULL   |      0 |      0 |      1 |            0 |            0 |
| 2020-05-26 | 00     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-26 | 05     |      0 |      0 |      3 |            0 |            0 |
| 2020-05-26 | 06     |      0 |      0 |      3 |            0 |            0 |
| 2020-05-26 | 07     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-26 | 08     |      0 |      0 |      2 |            0 |            0 |
| 2020-05-26 | 09     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-26 | 10     |      0 |      0 |      1 |            0 |            0 |
| 2020-05-26 | 11     |      0 |      0 |      1 |            0 |            0 |
| 2020-05-26 | 12     |      0 |      0 |      1 |            0 |            0 |
| 2020-05-26 | 14     |      0 |      0 |      1 |            0 |            0 |
| 2020-05-26 | 15     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-26 | 16     |      0 |      0 |      1 |            0 |            0 |
| 2020-05-26 | 17     |      0 |      1 |      3 |            0 |            0 |
| 2020-05-26 | 18     |      0 |      0 |      1 |            0 |            0 |
| 2020-05-26 | 19     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-26 | 20     |      0 |      0 |      1 |            0 |            0 |
| 2020-05-26 | 21     |      0 |      2 |      2 |            0 |            0 |
| 2020-05-26 | 22     |      0 |      0 |      3 |            0 |            2 |
| 2020-05-26 | 23     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-26 | NULL   |      0 |      3 |     23 |            0 |            2 |
| 2020-05-27 | 00     |      1 |      1 |      0 |            1 |            0 |
| 2020-05-27 | 01     |      1 |      0 |      0 |            1 |            0 |
| 2020-05-27 | 02     |      0 |      0 |      0 |            1 |            0 |
| 2020-05-27 | 03     |      0 |      0 |      1 |            1 |            1 |
| 2020-05-27 | 04     |      1 |      0 |      3 |            1 |            0 |
| 2020-05-27 | 05     |      5 |      0 |      0 |            1 |            1 |
| 2020-05-27 | 06     |      6 |      1 |      3 |           11 |            9 |
| 2020-05-27 | 07     |      1 |      0 |      1 |            1 |            5 |
| 2020-05-27 | 08     |      2 |      1 |      3 |            3 |            6 |
| 2020-05-27 | 09     |      3 |      0 |      0 |            6 |            2 |
| 2020-05-27 | 10     |      1 |      5 |      2 |            6 |            3 |
| 2020-05-27 | 11     |      6 |      4 |      4 |            9 |            9 |
| 2020-05-27 | 12     |      2 |      5 |      2 |           15 |           13 |
| 2020-05-27 | 13     |      3 |      5 |      1 |            9 |            5 |
| 2020-05-27 | 14     |      1 |      4 |      4 |            3 |            6 |
| 2020-05-27 | 15     |      0 |      3 |      0 |            5 |            0 |
| 2020-05-27 | 16     |      0 |      1 |      1 |            0 |            1 |
| 2020-05-27 | 17     |      0 |      1 |      3 |            0 |            1 |
| 2020-05-27 | 18     |      1 |      1 |      1 |            0 |            0 |
| 2020-05-27 | 19     |      1 |      1 |      2 |            6 |            1 |
| 2020-05-27 | 20     |      2 |      4 |      4 |            7 |            3 |
| 2020-05-27 | 21     |      4 |      4 |      1 |            5 |            1 |
| 2020-05-27 | 22     |      0 |      2 |      1 |            6 |            4 |
| 2020-05-27 | 23     |      0 |      0 |      1 |            2 |            2 |
| 2020-05-27 | NULL   |     41 |     43 |     38 |          100 |           73 |
| 2020-05-28 | 00     |      0 |      2 |      0 |            3 |            3 |
| 2020-05-28 | 01     |      0 |      2 |      1 |            2 |            0 |
| 2020-05-28 | 02     |      1 |      0 |      0 |            1 |            1 |
| 2020-05-28 | 03     |      1 |      1 |      0 |            3 |            0 |
| 2020-05-28 | 04     |      1 |      2 |      0 |            3 |            0 |
| 2020-05-28 | 05     |      6 |      1 |      0 |            5 |            5 |
| 2020-05-28 | 06     |     10 |      4 |      4 |           14 |            8 |
| 2020-05-28 | 07     |      1 |      4 |      0 |           10 |            4 |
| 2020-05-28 | 08     |      7 |      4 |      5 |            9 |           14 |
| 2020-05-28 | 09     |      4 |      2 |      1 |            9 |           17 |
| 2020-05-28 | 10     |      3 |      2 |      1 |           17 |            6 |
| 2020-05-28 | 11     |      0 |      4 |      5 |           10 |           15 |
| 2020-05-28 | 12     |      0 |      2 |      0 |            9 |            7 |
| 2020-05-28 | 14     |      0 |      0 |      0 |            0 |            0 |
| 2020-05-28 | 15     |      1 |      1 |      0 |            0 |            0 |
| 2020-05-28 | 16     |      0 |      0 |      0 |            0 |            2 |
| 2020-05-28 | 17     |      0 |      0 |      0 |            0 |            2 |
| 2020-05-28 | 18     |      0 |      1 |      0 |            0 |            0 |
| 2020-05-28 | 19     |      0 |      2 |      0 |            0 |            0 |
| 2020-05-28 | 20     |      0 |      0 |      0 |            2 |            0 |
| 2020-05-28 | 21     |      0 |      0 |      0 |            1 |            0 |
| 2020-05-28 | NULL   |     35 |     34 |     17 |           98 |           84 |
| NULL       | NULL   |     76 |     80 |     79 |          198 |          159 |
+------------+--------+--------+--------+--------+--------------+--------------+

クロス集計できました。

課題

クロス集計は一応できましたが、今回はカテゴリを5つのみに絞って修正しています。現実のデータの種類というのはもっと多いことがあるはずです。(ちなみに今回のcategoryは20種類以上あります)
その種類の数だけ先程のsql文を打つのは相当めんどくさいですし、間違いも起こります。
グループ化するデータの種類の数だけきちんと出力でき、かつ簡便な方法を見つけたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 7 MySQL Tutorial: Build Login and User Authentication System

Create a secure PHP 7 user authentication and login system with MySQL database using procedural programming approach.

click here to read more:
https://www.positronx.io/build-php-mysql-login-and-user-authentication-system/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 7 Upload & Store File/Image in MySQL Database Tutorial

how to upload files and images in MySQL Database. and how to implement file upload validation before sending it to a web server.

click here to read more:
https://www.positronx.io/php-upload-store-file-image-in-mysql-database/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Build PHP 7 User Registration (Signup) Form with MySQL

Learn how to create a basic PHP 7 user registration system, add PHP validation in registration form, securely hash password and store the user information in the MySQL database.

click here to read more:
https://www.positronx.io/build-php-user-registration-signup-form-with-mysql/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Equalumがやって来た!(展開編1)

さて、ストリーミングが簡単に出来る事は判った・・・

前回の検証で、Equalumを使う事により「実に呆気なく」データのストリーミング処理が実現出来る事は判りましたので、今回は少し本格的な展開を意識して「ストリーミング処理」にインテリジェント(?)を付けてみたいと思います。

image.png

何が使えるのか??

今回試用しているバージョンでは、以下のメニューが選択できるようになっていました。
image.png
データベースやSQLに詳しい方であれば、「なーるほどね!」という項目かと思います。
では、取り急ぎ前回作成した「シンプル・ストリーミング」に「フィルタリング」の機能を付けてみたいと思います。

image.png
次に必要な項目を設定しますが、データの流れを指示する必要がありますので、矢印をドラッグアンドドロップして今回の流れに変更します。
image.png

次にFilterのEditボタンを選択して条件を設定します。
image.png

今回は、特定の店舗の売り上げ状況に関する抽出テーブルを作ってみます。今回は「旭町」での販売状況を抽出してみます。
image.png
[Input Schema]から「Shop」を選択し条件の「旭町」を設定して、左下の[OK]を選択します。
前回作成したDBにデータが残っていますので、この段階でフィルターの[Preview]を選択すると、フィルタリングされた結果が出てきます(試運転ですね)
image.png
無事に静的なフィルタリングはOKの様なので、下流側にターゲットのテーブルを用意して前回のツールを走らせてみます(走らせる前に、念のため既存のテーブルを削除して、全くデータが挿入されていない状況からスタートします)下流側のターゲットに関しては、前回の検証で確認したEqualumお任せの全カラムテーブル化作戦で名前を変えた受け側を作り、そのテーブルに向ってストリーミングしながら「旭町」の情報のみを挿入する事にしました。
image.png
前回検証した「シンプルケース」とは波形が全く異なる挙動を示しているのが興味深いと思います。
DBeaverを使って上流側に自動挿入されたデータを確認してみると、想定通りにデータが挿入されている事が判ります。
image.png
では、下流側のテーブルを確認してみます。
image.png
想定通りに、「旭町」のデータのみが挿入されている事が確認できました。

少し応用的な事を・・・

フィルターを複数掛ける事も可能ですので、ロジックに気を付けながら先ほどのフィルター設定の部分を変更してみます。

image.png
相変わらず、上流側のソースに対しては自動生成ツールのアクセスに比例して、300回のイベント処理が立ち上がっていますが、下流側に対しては、先ほどの1支店抽出以上に対象となるデータが少なくなりますので、辛うじて判る波形が確認出来ます。
image.png
DBeaverで下流側のデータを確認してみました。
image.png
無事に作業が行われている事が判ります。

今回のまとめ

今回は、前回に引き続いて基本的なストリーミング処理に「フィルター機能」を加えてみました。次回は少し負荷を加えて追試してみたいと思います。とりあえず取れる情報を押さえた上で、ストリーミングしながら最終系に持ってくるという事が比較的簡単に出来るイメージは持って頂けたかと思います。無いデータは「あの手この手で高度な統計・数学的手法で」近似値を持ってくる事は可能だと思いますが、IoT的な仕組みやビジネス自体が高速に動くような場合では、従来型の電子帳簿のアプローチでは間に合わなくなる可能性も出てくるかと思います。

Equalumを使ってデータを積極的に動かす事により、データでデータを創っていくというより高度なデータドリブン環境が構築できると思いますので、ぜひ検討してみて頂ければと思います。

柔軟性の為の速さ

これは、データを諦めずに「変化に強いデータ・ドリブン環境」を実現する上で非常に重要なポイントになる事を明確に示しているという事なのかもしれません。

謝辞

本検証は、Equalum社の特別の許可を得て実施しています。この貴重な機会を設定して頂いたEqualum社に対して感謝の意を表すると共に、本内容とEqualum社の公式ホームページで公開されている内容等が異なる場合は、Equalum社の情報が優先する事をご了解ください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLのホストを範囲指定(サブネット単位)する際に気を付けること

はじめに

MySQLにユーザを登録する際に、ホストを範囲指定したい(192.168.1.0 ~ 192.168.1.255など)

前提

CentOS7
MySQL5.6

問題

/27 (/255.255.255.224)のホストで登録したユーザがアクセス拒否になる。

192.168.XXX.XXX/255.255.255.224
(ちなみにCIDR形式では登録できません)

対応

公式のドキュメントを確認すると、以下のサブネットマスク以外は正常に機能しないようです。

  • /255.0.0.0 (/8)
  • /255.255.0.0 (/16)
  • /255.255.255.0 (/24)
  • /255.255.255.255 (/32)

/24に修正したら、正常にユーザがアクセスできました。

192.168.XXX.XXX/255.255.255.0

参考
MySQL 5.6 リファレンスマニュアル 6.2.3 アカウント名の指定

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails dbして�WebサーバーからMySQLのCLIに繋ぐときのメモ

この記事について

自分用メモです。

メモ

# RAILS_ENVには環境名を入れる
# dbはdbconsoleでも可。
RAILS_ENV=production bundle exec rails db
> passwordを入力

# デフォルトの出力だと見にくいのでlessで結果を見る
mysql> pager less -n -i -S

# 見たいdatabaseに切り替える
mysql> use `hoge-database`;

# 見たい結果を得るためのクエリ
mysql> select * from hoge_table;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails dbして�Webサーバー等からMySQLのCLIに繋ぐ

この記事について

自分用メモです。

メモ

# RAILS_ENVには環境名を入れる
# dbはdbconsoleでも可。
RAILS_ENV=production bundle exec rails db
> passwordを入力

# デフォルトの出力だと見にくいのでlessで結果を見る
mysql> pager less -n -i -S

# 見たいdatabaseに切り替える
mysql> use `hoge-database`;

# 見たい結果を得るためのクエリ
mysql> select * from hoge_table;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails dbしてWebサーバー等からMySQLのCLIに繋ぐ

この記事について

自分用メモです。

メモ

# RAILS_ENVには環境名を入れる
# dbはdbconsoleでも可。
RAILS_ENV=production bundle exec rails db
> passwordを入力

# デフォルトの出力だと見にくいのでlessで結果を見る
mysql> pager less -n -i -S

# 見たいdatabaseに切り替える
mysql> use `hoge-database`;

# 見たい結果を得るためのクエリ
mysql> select * from hoge_table;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails + MySQLで作ったアプリをherokuにデプロイする

※rails初心者向けの記事です。

herokuのデータベース

herokuはデフォルトのデータベース(以下DB)はPostgreSQLです。
なのでMySQLで作ったアプリをherokuにデプロイするときは次の2つがあります。

① DBをPostgreSQLに変更してherokuにデプロイ
こちらのサイトに大変お世話になりました。本記事では取り扱いません。
【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】

② DBをMySQLのままherokuにデプロイ
本記事ではこちらの方法についての備忘録です。

この記事でやること

  • ClearDBアドオンを追加
  • Gemとデータベースをチェック
  • MySQLからMySQL2に変更

ClearDBアドオンを追加

ClearDB はクラウド上で提供されている MySQL データベースです。
クレジットカード必須。
データ容量5MBの最小構成であれば無料で使えます。(2020年5月現在)
詳しくは公式で。

参考 : HerokuでMySqlの設定をする

ターミナル
$ heroku addons:add cleardb

Gemとデータベースをチェック

まずはGemの確認

Gemfile
# Use mysql as the database for Active Record
  gem 'mysql2', '0.5.3'

mysql2を使っていることがわかりました。
そして以下を実行。

ターミナル
$ heroku config | grep CLEARDB_DATABASE_URL

CLEARDB_DATABASE_URL:  mysql://ユーザー名:パスワード@ホスト/データベース名?reconnect=true

このコマンドにより、自分のmysqlの情報を知ることができました。

ちなみにこのデータをSequelProに紐付けることでデータベースをGUI操作できます。
201862herokuでMySQL環境作ってやんよ!!!

MySQLからMySQL2に変更

Gemと合わせるためにmysqlからmysql2に変えましょう。

ターミナル
$ heroku config:set  DATABASE_URL='mysql2://ユーザー名:パスワード@ホスト/データベース名?reconnect=true'

詰まった方はこちらを参考に
HerokuでMySQLを使おうとして詰まったところ

参考

お世話になりました。
HerokuでMySqlの設定をする
HerokuでMySQLを使おうとして詰まったところ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysqlデータベース作成と権限の付与

laravelプロジェクトでデータベース構築

  • 概要:laravelのプロジェクトでデータベースを作成して、権限を与えてあげるまで

mysqlに接続

terminalから以下で接続できます。
接続されると mysql>となり、待機状態になります。

bash
$mysql -uroot 

laravelのenvファイルに設定を記入する

laravelの環境設定ファイルがenvファイルです。こちらにdbの接続情報を記入します。

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dbuser
DB_USERNAME=dbuser@localhost
DB_PASSWORD=dbpassword

データベースの作成

mysql>create database dbuser;

データベースが作成されたか確認

以下のコマンドを入力すると一覧が確認できる

mysql>show databases;

データベースに権限を与える

データベースユーザー作成とアクセス権限付与します。

mysql>GRANT ALL PRIVILEGES ON dbname.* TO dbuser@'localhost' IDENTIFIED BY 'dbpassword';

既に、ユーザーを作成している場合などは上記の作成を分けることもできます。

(データベースユーザー作成)
mysql> CREATE USER dbuser@localhost IDENTIFIED BY 'dbpassword';

(データベースに対するユーザーのアクセス権限付与)
mysql> GRANT ALL PRIVILEGES ON dbname.* TO dbuser@'localhost;

参考

MySQL のデータベースユーザーとデータベースアクセス権限

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベースにsqlファイルをインポートする

sqlファイルをインポートする

データベースにダウンロードしたsqlのファイルをインポートする必要があったので、備忘録として残します。

インポートコマンド

sqlのことをよく分かっていなかったので、sqlをインポートする時はデータベースに接続して、やると思っていましたが、zshやbashなどのシェルスクルプト上で実行します。

bash
[~/user]$mysql -u username -p database_name < file.sql

file.sqlはプロジェクトのディレクトリでなくて、ダウンロードなど、どこに置いても良いが、importする際はパスを指定してあげないといけないです。
ファイルをドラックしてterminalに持ってくると、そのファイルの絶対パスが自動で入るので便利です。

ハマったこと

すでに書きましたが、データベースに接続してインポートするものだと思いこんでいたので、何度やってもsyntaxエラーになってしまいました。あと、インポートするファイルのパスも指定しないと、当然、no such file と怒られます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

nuxt.js(vuetify)+Rails(api)+mysql on dockerでHelloWorld!!

前書き

railsとvue.jsを同一コンテナ内で環境構築することはやったことがあったんですが、フロントエンドとバックエンドのコンテナを分けるのが最近のトレンドだと耳にしたのでHelloWorldに挑戦してみました!
こちらの記事を参考にさせていただきました!ありがとうございました!
参考→https://qiita.com/at-946/items/08de3c9d7611f62b1894
postgresqlからmysql、nuxt.jsをnpmからyarn、railsのコンテナをalpineからdebianに変更しています。

今回作る環境

ruby:2.6.5
rails:6.0.3
mysql:8.0
nuxt.js(yarn)
vuetify

コンテナの準備

ディレクトリ構成

/
/
|--front/
|    |--Dockerfile
|--back/
|    |--Dockerfile
|    |--Gemfile
|    |--Gemfile.lock #空ファイル
|    |--entrypoint.sh
|--docker-compose.yml

フロントコンテナ内のDockerfile

front/Dockerfile
FROM node:12.5.0-alpine

ENV HOME="/myapp" \
    LANG=C.UTF-8 \
    TZ=Asia/Tokyo

WORKDIR ${HOME}

RUN apk update && \
    apk upgrade && \
    npm install -g npm && \
    npm install -g @vue/cli

ENV HOST 0.0.0.0
EXPOSE 3000

バックコンテナ内のDockerfile

back/Dockerfile
FROM ruby:2.6.5
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update -qq \
    && apt-get install -y nodejs yarn \
    && mkdir /myapp
ENV HOME="/myapp" \
    LANG=C.UTF-8 \
    TZ=Asia/Tokyo
WORKDIR ${HOME}
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . ${HOME}

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

Gemfile

back/Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 6.0.3', '>= 6.0.3.1'
back/entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
docker-compose.yml
version: '3'
services:
  db:
    container_name: db
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
#3307にしているのは筆者の環境では3306がpc自体のMySQLで使われているためです。3306:3306の方がいいかもです。
    ports:
      - '3307:3306' 
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
  back:
    container_name: back
    build: back/
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - ./back:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
    command: bundle exec rails server -b 0.0.0.0
  front:
    container_name: front
    build: front/
    command: yarn dev
    volumes:
      - ./front:/myapp
    ports:
      - 8080:3000
   #depends_onでbackコンテナへのリンクを張っています。
    depends_on:
      - back
volumes:
  mysql-data:
    driver: local

ここまで写し終わったら

$ docker-compose build

これでdockerimageが作成され、コンテナの準備ができました!

nuxt.jsのHelloWorld

参考記事とほとんど変わらないので書くのがはばかられますが、少し違うので一応書いておきます。
まずはnuxt.jsのアプリを作成します。
途中の選択画面でエンターだけでなくスペースを押す必要がある項目もあるので注意してください。

$ docker-compose run --rm front npx create-nuxt-app

? Project name                   --> myapp  # アプリ名
? Project description            --> myapp  # アプリの説明
? Author name                    --> me     # アプリの作成者
? Choose the package manager     --> Yarn
? Choose UI framework            --> Vuetify
? Choose custom server framework --> None
? Choose Nuxt.js modules         --> Axios
? Choose linting tools           --> -
? Choose test framework          --> None
? Choose rendering mode          --> Universal (SSR)

これでnuxtアプリの完成です!
フロントコンテナを立ち上げて確認してみましょう!

$ docker-compose up front

http://localhost:8080にアクセスしていい感じになってたらいい感じです。(語彙)

(参考)ホットリロードがうまくいかない時は冒頭の参考記事に解決法が記載されているのでそちらを参考にしてください。
https://qiita.com/at-946/items/08de3c9d7611f62b1894

Rails(Api)のHelloWorld

apiモードでrailsアプリを作ります。

$ docker-compose run --rm back rails new . -f -d mysql --api

次にDBを接続します。

back/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %>
  host: <%= ENV.fetch("MYSQL_HOST", "db") %>

ドメイン許可の設定をします。行頭に追記してください。
(ここに2日かかりました。これを書きたいがためにこの記事を書いたと言っても過言ではないです。)

config/environments/development.rb
Rails.application.config.hosts << 'back'
##省略##

以降は参考記事と全く同じなので省略します。(サボれるところはサボる主義です。)

gitの設定

axiosでpostできたら、次にgitの設定をします。
railsはnewするときにgit initしてしまうのでbackディレクトリだけgit管理される状況になってしまいます。

/
$ cd ./back
back/
$ sudo rm -rf .git
$ cd ..

sudoはいらないかもです。
この後に

$ git init

を打って完了です。

セキュリティ的にいいのかはわからないんですが、

.gitignore
 #.nuxt 
 #dist 
 #sw.* 
 #node_modules/ 
 #jspm_packages/

と、この5つをコメントアウトしておかないと他のパソコンでdocker-compose upが使えなかったので参考にしてみてください。

あとがき

いやー、ハマりましたね。ただやっぱなんとなくこの構成かっこいい、、かっこよくない?
というわけで参考になれば嬉しいです。よろしければLGTMお願いします!(露骨な媚び)
それではまた!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む