- 投稿日:2019-03-27T19:38:14+09:00
Elastic IPでアクセスできない
- 投稿日:2019-03-27T18:59:11+09:00
�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.log2019-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
メモリが足りてないのか。
無料枠なのでメモリが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を動かすときは注意しましょうというお話でした。
- 投稿日:2019-03-27T16:14:19+09:00
トランザクションストレージエンジンを調べてたらアバウトに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などなど・・・それぞれにユニークファンクションがある。
- 投稿日:2019-03-27T02:25:36+09:00
DBeaverでSSHポートフォワーディングしてAWS EC2のMySQLに接続
概要
SSIA
環境
- 開発端末
- Mac
- サーバ
- AWS Linux 2
- MySQL 8.0.15
目的
- AWSにDBを置いて3306で通信すると、暗号化されてないので危険
- そこで暗号化ですよ
- 3306通信を暗号化することはできるらしい
- しかしWebサーバ <-> DBサーバを暗号化すると処理遅延が生じる。避けたい
- SSL通信用に別のDBユーザを作るのも面倒
- そこで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をインストール
- 接続設定
結果
接続成功
Hope this helps.
- 投稿日:2019-03-27T01:05:51+09:00
Flyway で MySQL のバージョン管理をしてみる in docker-compose
背景
デプロイやらローカル環境やらでいくつか不便なことが発生している今日この頃。
- アプリをデプロイするたびに、DBの変更差分をSVNのログから目視で探していた。
- viewの更新を手作業で実行しており、稀に誤って全tableを初期化する事態が発生していた。
- それぞれの環境でどこまでDBの変更が適用されているのかよくわからない。
- 作業者の開発環境のDBに差分を適用することが面倒。
- デプロイ作業の自動化を進めたい。
といった問題の対応策として
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.sqlDBの準備
まずは MySQL 単体で動作確認する。
docker-compose.ymlversion: '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.ymlにflywayの記述を追加する。docker-compose.ymlversion: '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.confflyway.url=jdbc:mysql://mysqldb:3306/sample_db flyway.user=root flyway.password=pass差分のSQLを用意する。
V1.001__Create_table_test.sqlCREATE TABLE v1_difference_application (id INT);V1.002__Insert_table_test.sqlINSERT INTO v1_difference_application VALUES(100); INSERT INTO v1_difference_application VALUES(101);V2.001__Create_person_table.sqlCREATE 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.sqlCREATE TABLE init_table (id INT);
migratedbサービスのcommandをinfoで上書きして初期状態を確認する。[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 | +-----------+---------+---------------------+------+--------------+---------+
StateがPendingになっている。
ベースラインを設定してみる。[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 | +-----------+---------+---------------------+----------+---------------------+----------+
StateがSuccessになった。よかった。+alpha
- k8sの初期化コンテナにするとか
- CI/CDツールでコミット検知して自動マイグレーションするとか
してみると楽しいかもしれない。
- 投稿日:2019-03-27T00:58:32+09:00
[備忘録] 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/#overviewRDSの設定
設定にパブリックアクセシビリティという項目があるので「はい」に変更する。
新規設定のときは「[詳細設定]の設定」、既存DBの設定変更のときは設定変更を選択後の一覧画面に表示される。
下の画像は新規設定の時の画面です。
セキュリティグループの設定
MySQLに紐づくセキュリティグループの設定を行う。
VPCセキュリティグループのリンクをクリックする。
セキュリティグループに接続許可するサーバーや接続したい場所のIPアドレスを追加する。
※今回は、「0.0.0.0」にしてますが、これは全てのIPアドレスからの接続許可することになるので、現在使用しているIPのみ許可する方がセキュリティ的にいいと思います。
MySQLに接続できるか確認
vagrant@localhost$ mysql -h RDSのエンドポイント -P 3306 -u ユーザ名 -p Enter password:パスワード









