20190327のMySQLに関する記事は6件です。

Elastic IPでアクセスできない

cc960b0264ecbbee6f87298e4c9357e5 (1).png

nginxを導入した際
Elastic IPでアクセスをしてこうなった方いらっしゃると思います。
その時の解決方法を記載したいと思います。

原因だった場所はここ
image.png
awsのインスタンスのセキュリティグループ
自分の場合はHTTPタイプを追加していなかった為アクセスができませんでした。
参考になるページが見つからなかった為、この記事で助かることを祈っています。

この作業が終わったら、しっかりとmysql,nginxのrestartを実行しましょう。

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

�GCP無料枠で作成したGCEでMySQL8が起動しない

前提

GCP無料枠でLAMP環境を作りたかったので、Always Freeが適用されるf1-microのGCEインスタンスを1つ作った。
Apache, PHPと順調だったがMySQLが起動しない問題が発生。

  • Apache2.4→OK
  • PHP7.3→OK
  • MySQL8→NG

ステータスとログを見るとこんな。

$ sudo systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 水 2019-03-27 17:20:32 JST; 3min 44s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 5380 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=1/FAILURE)
  Process: 5359 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 5380 (code=exited, status=1/FAILURE)
   Status: "SERVER_BOOTING"
    Error: 2 (そのようなファイルやディレクトリはありません)

 3月 27 17:20:27 foo systemd[1]: Starting MySQL Server...
 3月 27 17:20:32 foo systemd[1]: mysqld.service: main process exited, code=exited, status=1/FAILURE
 3月 27 17:20:32 foo systemd[1]: Failed to start MySQL Server.
 3月 27 17:20:32 foo systemd[1]: Unit mysqld.service entered failed state.
 3月 27 17:20:32 foo systemd[1]: mysqld.service failed.
/var/log/mysqld.log
2019-03-27T08:20:30.330935Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.15) starting as process 5380
2019-03-27T08:20:32.149509Z 0 [ERROR] [MY-012681] [InnoDB] mmap(137428992 bytes) failed; errno 12
2019-03-27T08:20:32.149575Z 1 [ERROR] [MY-012956] [InnoDB] Cannot allocate memory for the buffer pool
2019-03-27T08:20:32.149603Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
2019-03-27T08:20:32.149649Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2019-03-27T08:20:32.149842Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2019-03-27T08:20:32.162764Z 0 [ERROR] [MY-010119] [Server] Aborting
2019-03-27T08:20:32.164035Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.15)  MySQL Community Server - GPL.

あーこれは、、

Cannot allocate memory for the buffer pool

メモリが足りてないのか。
image.png
無料枠なのでメモリが0.6GBなんだよね。。
そりゃMySQL起動しないわ。

スワップ領域を作成する

とりあえず今の状態。
初期状態では何も設定されていません。

$ free -m
              total        used        free      shared  buff/cache   available
Mem:            587         174         246           4         166         302
Swap:             0           0           0

スワップ領域はデバイスもしくはファイルに対して設定できる。
今回はファイル方式を選択。2GBもあれば十分だろう。

ちなオプションの意味。↓

  • if=NUL(0x00)で埋める
  • of=スワップファイルのパス
  • bs=ブロックサイズ
  • count=個数 (スワップサイズ=bs*count)

https://www.atmarkit.co.jp/ait/articles/1711/30/news027.html

$ sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
2048+0 レコード入力
2048+0 レコード出力
2147483648 バイト (2.1 GB) コピーされました、 55.3209 秒、 38.8 MB/秒

$ sudo mkswap /swapfile
スワップ空間バージョン1を設定します、サイズ = 2097148 KiB
ラベルはありません, UUID=e5fe830c-15f5-42d6-9207-806b8e261e74

$ sudo swapon /swapfile
swapon: /swapfile: 安全でない権限 0644 を持ちます。 0600 がお勧めです。

$ sudo chmod 600 /swapfile

$ swapon -s
Filename                Type        Size    Used    Priority
/swapfile                               file    2097148 0   -2

パーミッション600にしないと警告が出るもよう。

$ free -m
              total        used        free      shared  buff/cache   available
Mem:            587         170          46           4         370         303
Swap:          2047           0        2047

スワップが設定されたことを確認。
永続化する。

vim /etc/fstab

# 以下の行を追加
/swapfile swap swap defaults 0 0

もう一度MySQLを起動してみる

$ sudo systemctl start mysqld.service
$ sudo systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2019-03-27 18:27:22 JST; 13s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 6497 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 6519 (mysqld)
   Status: "SERVER_OPERATING"
   CGroup: /system.slice/mysqld.service
           └─6519 /usr/sbin/mysqld

 3月 27 18:27:09 foo systemd[1]: Starting MySQL Server...
 3月 27 18:27:22 foo systemd[1]: Started MySQL Server.

キタ━━━━(゚∀゚)━━━━!!

以上、無料枠のGCEでMySQLを動かすときは注意しましょうというお話でした。

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

トランザクションストレージエンジンを調べてたらアバウトにmysqlを全部知ることになった話

トランザクションストレージエンジンを調べていたら

これを理解するためには殆どMySQLの全容を必然的に知ることになる、そんな気がしました。
MySQLにデータを入れる、というのがよく聞く話だと思います。筆者も前までそんなイメージでした。しかし、データ管理のシーケンスは、そんな単純なものではありませんでした。

以下、MySQLのシーケンスです。

クライアントからのリクエスト
     ↓
コネクタ and コネクションプール
     ↓
 パーサ and キャッシュ
     ↓
  オプティマイザ
     ↓
  ストレージエンジン
     ↓
  ストレージファイル

結構後の方に知りたいストレージエンジンが出てくるんですね。

というわけで、上から1個1個潰していくことにします。

コネクタとコネクションプール

コネクタは、様々なプログラミング言語からアクセスするためのドライバ

コネクションプールとは、接続待機している状態のプロセス(コネクション)を一定数確保(プール)させているところ。ここでプールされているコネクションは、接続のリクエストが来たら順次使用できるようになっていて、接続する際の負荷を軽減させる仕組みです。ストックしているコネクションを上回るアクセスが来た場合、空きができるまで、クライアントのリクエストは待機状態になります。

パーサとキャッシュ

無事にコネクションプールから、コネクションを渡されたクライアントのデータは、パーサとキャッシュに来ます。
パーサとは、SQLクエリの解析を行います。mysqlのコマンドラインツールから打ち込んだクエリはここで解析されるんですね。

キャッシュとは、SQLクエリとその結果をストックしてくれます。

オプティマイザ

パーサで解析されたクエリを最適化します。

ストレージエンジン

ようやく本題です。
ストレージエンジの役割を先に書きますと、

  • データ変換
  • インデックス
  • メモリ利用
  • トランザクション
  • 同時実行性(排他制御)
  • ユニークファンクション(MyISAMの空間情報インデックスなど)

上記が主だった機能です。インデックスやトランザクション、排他制御といった中核を担う機能を持ってるんですね。

このエンジンには大別して2種類ある

トランザクションストレージエンジン

トランザクション機能をサポートしている
代表格かつ、mysqlのdefault-storage-engineがInnodb

非トランザクションストレージエンジン

トランザクション機能をサポートしていない
以前はmysqlのdefault-storage-engineだったMyISAM

ストレージエンジンソフトウェアは、他にもいっぱいある

Memory
Archive
NDBCLUSTER
CSV
Merge
Federated
Example
Blackhole

などなど・・・それぞれにユニークファンクションがある。

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

DBeaverでSSHポートフォワーディングしてAWS EC2のMySQLに接続

概要

SSIA

環境

  • 開発端末
    • Mac
  • サーバ
    • AWS Linux 2
    • MySQL 8.0.15

目的

  • AWSにDBを置いて3306で通信すると、暗号化されてないので危険
  • そこで暗号化ですよ
  • そこでSSHポートフォワーディングですよ
    • SSHトンネリングと言った方が想像しやすいが、googleabilityはポートフォワーディングの方が上

手順

  • AWS EC2にMySQLをインストール
  • インスタンスにSSH接続 ssh -i "mylara-db.pem" ec2-user@50.198.199.200
  • mysqlコマンド実行してから
CREATE DATABASE IF NOT EXISTS `mylaradb` COLLATE 'utf8_general_ci';
CREATE USER 'mylara'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Mylara-Password1234';
GRANT ALL ON `mylaradb`.* TO `mylara`@`localhost`;

※ mysql_native_passwordは本題と関係ないです

  • 開発端末にDBeaverをインストール
  • 接続設定

スクリーンショット 2019-03-27 2.04.40.png
スクリーンショット 2019-03-27 2.05.50.png

結果

接続成功

スクリーンショット 2019-03-27 2.19.36.png

Hope this helps.

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

Flyway で MySQL のバージョン管理をしてみる in docker-compose

背景

デプロイやらローカル環境やらでいくつか不便なことが発生している今日この頃。

  1. アプリをデプロイするたびに、DBの変更差分をSVNのログから目視で探していた。
  2. viewの更新を手作業で実行しており、稀に誤って全tableを初期化する事態が発生していた。
  3. それぞれの環境でどこまでDBの変更が適用されているのかよくわからない。
  4. 作業者の開発環境のDBに差分を適用することが面倒。
  5. デプロイ作業の自動化を進めたい。

といった問題の対応策として flyway を検討してみる。
※ ビルドツールなんてものは存在しない環境なのでプラグインは使えません。

最終的な姿はこちら

構成

  • DB
    • MySQL 8.0.15
  • Flyway

    • Flyway Community Edition 5.2.4 by Boxfuse
  • 最終的なDirectory構成

sample-flyway
│  docker-compose.yml
│
├─flyway
│  ├─conf
│  │      flyway.conf
│  └─sql
│          V0.000__Baseline.sql
│          V1.001__Create_table_test.sql
│          V1.002__Insert_table_test.sql
│          V2.001__Create_person_table.sql
└─mysql
    └─initdb.d
            schema.sql

DBの準備

まずは MySQL 単体で動作確認する。

docker-compose.yml
version: '3.4'

services:
  mysqldb:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: sample_db
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: pass

起動して接続できることを確認する。

[sample-flyway]$ docker-compose up -d mysqldb
Creating network "sampleflyway_default" with the default driver
Creating sampleflyway_mysqldb_1 ... done

[sample-flyway]$ docker-compose ps
       Name                     Command             State          Ports
-------------------------------------------------------------------------------
sampleflyway_mysqldb_1   docker-entrypoint.sh mysqld   Up      3306/tcp, 33060/tcp

[sample-flyway]$ docker-compose exec mysqldb mysql -u root -p -e 'show databases;'
Enter password:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample_db          |
| sys                |
+--------------------+

DBが動くことを確認。

Flywayの準備

docker-compose.ymlflyway の記述を追加する。

docker-compose.yml
version: '3.4'

services:
  mysqldb:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: sample_db
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: pass
  # === ココカラ ===
  migratedb:
    image: boxfuse/flyway:latest
    volumes:
      - ./flyway/sql:/flyway/sql
      - ./flyway/conf:/flyway/conf
    depends_on:
      - mysqldb
    command: migrate
  # === ココマデ ===

設定ファイルを用意する。

flyway.conf
flyway.url=jdbc:mysql://mysqldb:3306/sample_db
flyway.user=root
flyway.password=pass

差分のSQLを用意する。

V1.001__Create_table_test.sql
CREATE TABLE v1_difference_application (id INT);
V1.002__Insert_table_test.sql
INSERT INTO v1_difference_application VALUES(100);
INSERT INTO v1_difference_application VALUES(101);
V2.001__Create_person_table.sql
CREATE TABLE person (id INT NOT NULL, name VARCHAR(100) NOT NULL);

マイグレーションしてみる。

[sample-flyway]$ docker-compose run --rm migratedb
Starting sampleflyway_mysqldb_1 ... done
Flyway Community Edition 5.2.4 by Boxfuse
Successfully validated 3 migrations (execution time 00:00.039s)
Creating Schema History table: `sample_db`.`flyway_schema_history`
Current version of schema `sample_db`: << Empty Schema >>
Migrating schema `sample_db` to version 1.001 - Create table test
Migrating schema `sample_db` to version 1.002 - Insert table test
Migrating schema `sample_db` to version 2.001 - Create person table
Successfully applied 3 migrations to schema `sample_db` (execution time 00:00.358s)

成功した。DBを確認する。

[sample-flyway]$ docker-compose exec mysqldb mysql -u root -p -D sample_db -e 'select * from v1_difference_application;'
Enter password:
+------+
| id   |
+------+
|  100 |
|  101 |
+------+

マイグレーションできた。よかった。
docker-compose down で停止しておく。

新規作成以外の場合はどうする?

既存システムの場合は既にテーブルやデータが作られてしまっているので、上記手順では「既にデータベースが作られてるよ」と言われマイグレーションできない。
そのため、ベースラインとして既にある構造の分を設定することで、そこからの差分を管理してもらうことができる。

docker-compose up -d mysqldb でDBを起動しておく。

既存DBのSQLを追加

V0.000__Baseline.sql
CREATE TABLE init_table (id INT);

migratedb サービスの commandinfo で上書きして初期状態を確認する。

[sample-flyway]$ docker-compose run --rm migratedb info
Starting sampleflyway_mysqldb_1 ... done
Flyway Community Edition 5.2.4 by Boxfuse
Schema version: << Empty Schema >>

+-----------+---------+---------------------+------+--------------+---------+
| Category  | Version | Description         | Type | Installed On | State   |
+-----------+---------+---------------------+------+--------------+---------+
| Versioned | 0.000   | Baseline            | SQL  |              | Pending |
| Versioned | 1.001   | Create table test   | SQL  |              | Pending |
| Versioned | 1.002   | Insert table test   | SQL  |              | Pending |
| Versioned | 2.001   | Create person table | SQL  |              | Pending |
+-----------+---------+---------------------+------+--------------+---------+

StatePending になっている。
ベースラインを設定してみる。

[sample-flyway]$ docker-compose run --rm migratedb baseline -baselineVersion=0_000 -baselineDescription=Baseline
Starting sampleflyway_mysqldb_1 ... done
Flyway Community Edition 5.2.4 by Boxfuse
Creating Schema History table: `sample_db`.`flyway_schema_history`
Successfully baselined schema with version: 0.000


[sample-flyway]$ docker-compose run --rm migratedb info
Starting sampleflyway_mysqldb_1 ... done
Flyway Community Edition 5.2.4 by Boxfuse
Schema version: 0.000

+-----------+---------+---------------------+----------+---------------------+----------+
| Category  | Version | Description         | Type     | Installed On        | State    |
+-----------+---------+---------------------+----------+---------------------+----------+
|           | 0.000   | Baseline            | BASELINE | 2019-03-26 06:57:18 | Baseline |
| Versioned | 1.001   | Create table test   | SQL      |                     | Pending  |
| Versioned | 1.002   | Insert table test   | SQL      |                     | Pending  |
| Versioned | 2.001   | Create person table | SQL      |                     | Pending  |
+-----------+---------+---------------------+----------+---------------------+----------+

Baseline が設定できた。
マイグレートしてみる。

[sample-flyway]$ docker-compose run --rm migratedb
Starting sampleflyway_mysqldb_1 ... done
Flyway Community Edition 5.2.4 by Boxfuse
Successfully validated 4 migrations (execution time 00:00.065s)
Current version of schema `sample_db`: 0.000
Migrating schema `sample_db` to version 1.001 - Create table test
Migrating schema `sample_db` to version 1.002 - Insert table test
Migrating schema `sample_db` to version 2.001 - Create person table
Successfully applied 3 migrations to schema `sample_db` (execution time 00:00.241s)


[sample-flyway]$ docker-compose run --rm migratedb info
Starting sampleflyway_mysqldb_1 ... done
Flyway Community Edition 5.2.4 by Boxfuse
Schema version: 2.001

+-----------+---------+---------------------+----------+---------------------+----------+
| Category  | Version | Description         | Type     | Installed On        | State    |
+-----------+---------+---------------------+----------+---------------------+----------+
|           | 0.000   | Baseline            | BASELINE | 2019-03-26 06:57:18 | Baseline |
| Versioned | 1.001   | Create table test   | SQL      | 2019-03-26 06:57:59 | Success  |
| Versioned | 1.002   | Insert table test   | SQL      | 2019-03-26 06:57:59 | Success  |
| Versioned | 2.001   | Create person table | SQL      | 2019-03-26 06:57:59 | Success  |
+-----------+---------+---------------------+----------+---------------------+----------+

StateSuccess になった。よかった。

+alpha

  1. k8sの初期化コンテナにするとか
  2. CI/CDツールでコミット検知して自動マイグレーションするとか

してみると楽しいかもしれない。

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

[備忘録] RDSで外部サーバからアクセス許可する方法

経緯

開発環境でVagrantを使用していて、EC2を経由せず、ローカル環境からRDSを接続し
データベースの操作を行いたいと思ったから。
今回はMySQLを例に書いていきます。

RDSとは

「Amazon Relational Database Service (通称:RDS)」はAmazonの提供する、リレーショナルデータベース構築サービスことです。
より詳しい情報は下にリンクを貼っておきます。
https://dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-aws-re-entering-rds/#overview

RDSの設定

設定にパブリックアクセシビリティという項目があるので「はい」に変更する。
新規設定のときは「[詳細設定]の設定」、既存DBの設定変更のときは設定変更を選択後の一覧画面に表示される。
下の画像は新規設定の時の画面です。
スクリーンショット 2019-03-26 23.45.38.png

セキュリティグループの設定

MySQLに紐づくセキュリティグループの設定を行う。
VPCセキュリティグループのリンクをクリックする。
スクリーンショット 2019-03-27 0.15.06.png

セキュリティグループに接続許可するサーバーや接続したい場所のIPアドレスを追加する。
※今回は、「0.0.0.0」にしてますが、これは全てのIPアドレスからの接続許可することになるので、現在使用しているIPのみ許可する方がセキュリティ的にいいと思います。
スクリーンショット 2019-03-27 0.50.49.png

MySQLに接続できるか確認

vagrant@localhost
$ mysql -h RDSのエンドポイント -P 3306 -u ユーザ名 -p
Enter password:パスワード

スクリーンショット 2019-03-27 1.22.50.png
接続できた!!

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