OSCオンライン北海道

MySQL開発最新動向

Machiko Ikoma/生駒 眞知子
MySQL GBU, Oracle JapanJune, 2020

Safe harbor statement
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリア
ルやコード、機能を提供することをコミットメント（確約）するものではないため、購買決定を行う際の判断材料になさらないで下さい。
オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。
文中の社名、商品名等は各社の商標または登録商標である場合があります。

2

Copyright © 2020, Oracle and/or its affiliates.

アジェンダ

3

1

MySQL 8.0最新動向

2

MySQLバージョンアップ方法

3

MySQL on Docker

Copyright © 2020, Oracle and/or its affiliates.

MySQL History
2015

8.0

Document Store,
New Data Dictionary,Enterprise
DataMasking

5.7

2010
2005

2000
4.0

5.0

パーティショニング
タスクスケジューラ

5.1

3.23

5.6
InnoDB++,GIS Support,
QRP,
Instrinc TablesMultiThreaded Sls,
MultiSourceRpl,
Group Rpl

5.5

memcached API
GTID
マルチスレッド
スレーブ

Fulltext index(MyISAM)
ストアドプロシージャ
トリガ
View
Information_SCHEMAMyISAM
InnoDB
Replication

MySQL
4

Copyright ©︎ 2020 Oracle and/or its affiliates.

SUN

InnoDBをデフォルト
準同期Replication
PERFORMANCE_SCHEMA

OracleMySQLのリリースサイクル
開発途上版も公開(DMR/RC)
フィードバックを反映し、正式版としてリリース(GA)••例）MySQL 8.0の場合

DMR
8.0.05GARC
8.0.3

Copyright © 2020, Oracle and/or its affiliates

8.0.11(2018/4/19)

8.0.20(2020/4/27)

様々なワークロードに対応

{}
KVS

JSON

Cloud
In-memory

セキュリティ
冗長性

構造化
データ
GIS

6Copyright ©︎ 2020 Oracle and/or its affiliates.

開発ツール

操作性

徐々に広がっているMySQL 8.0
April 2018 (8.0 GA)
MySQL 5.54%

August 2019MySQL 5.53%

MySQL 8.05%

MySQL 8.026%

MySQL 5.624%

MySQL 5.625%

MySQL 5.766%

MySQL 5.747%

7Copyright © 2020, Oracle and/or its affiliates.

MySQLのライフサイクル
GAから最長８年間バグ修正、パッチ、アップデートを提供
サポート概要24時間365日サポート
無制限インシデント
ナレッジベース
メンテナンス・リリース、バグ修正、パッチ、アップデートの提供
MySQL コンサルティング・サポート

8Premier(1-5年)•••

Extended(6-8年)•••

Sustain(9年以降)
••
•

•

•

既存のもの

•

•

•

MySQL VersionGA(YYYY-MM)

Premier

Extended

Sustain

5.1

2008-122013-12x○

5.5

2010-12

2015-122018-12○

5.6

2013-022018-022021-02

予定

5.7

2015-102020-102023-10予定

8.0

2018-042023-042026-04

予定

Copyright ©︎ 2020 Oracle and/or its affiliates.

MySQL 8.0 : Webアプリケーション開発効率向上を実現Mobile Friendly

Developer First

位置情報ベースのサービス向けの機能強化と絵文字を含めたユニコード対応

ハイブリッド型のデータモデルとアクセスAPIによる開発柔軟性

Data Driven

Scalable & Stable

アプリケーションデータ分析による運用中サービス改良支援

9Copyright © 2020, Oracle and/or its affiliates.

24x7
at Scale

アクセス集中時の処理改良、セキュリティと耐障害性強化

MySQL 8.0 : モバイルアプリとの親和性

GIS(空間図形情報)
サポートの強化

ユニコードをデフォルトキャラクタセット• 位置情報ベースのサービスとの連携の改良• utf8mb4 がデフォルトのキャラクタセットに• MySQL 5.7 にて Boost.Geometry ライブラ

• ユニコード文字列の処理性能が16倍以上向上するケースも• MySQL 8.0 にて球面座標と測地座標系(SRS)• Unicode 9.0 をサポート• UCA(Unicode照合アルゴリズム)ベースの新しイリーを統合
サポート

い各言語用の照合

10

Copyright © 2020, Oracle and/or its affiliates.

MySQL 8.0 : アプリケーション開発者に柔軟性をデータ型{}

SQL 関数();

JSON データ型

JSON 関数リレーショナルなテーブルと非構造データとシームレスに統合。さらに MySQL
8.0 では更新性能の最適化

JSON データの参照更新のための各種 SQL 関数を実装。
MySQL 8.0 では JSONデータを SQL で分析するための変換関数も追加

11

Copyright ©︎ 2020, Oracle and/or its affiliates.

ハイブリッドAPI

MySQL X
DevAPISQL と CRUD なNoSQL のハイブリッド
APIによる開発柔軟性

JSON

12

Copyright © 2020, Oracle and/or its affiliates.

JSONデータ型
 ネイティブJSONデータ型 (バイナリ形式)
 Insert時のJSON構文バリデーション機能
 組み込みJSON関数 (保存、検索、更新、操作)

外部サイト/SNSモバイルデバイスコマース/ポータルその他

REST/JSON ドキュメントにインデックス設定し高速アクセス
 SQLとの統合を容易にする、新しいインライン構文
 utf8mb4の文字セットとutf8mb4_binの照合 「🐬」(data JSON);

 サイズはmax_allowed_packetの値で制限 (Default:4MB)
mysql> select feature from NEW57.features where json_extract(feature,'$.properties.STREET') = 'MARKET' limit 1¥G************** 1. row **************
feature: {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[-122.39836263491878, 37.79189388899312, 0], [122.39845248797837, 37.79233030084018, 0], [-122.39768507706792, 37.7924280850133, 0], [-122.39836263491878,37.79189388899312, 0]]]}, "properties": {"TO_ST": "388", "BLKLOT": "0265003", "STREET": "MARKET", "FROM_ST": "388", "LOT_NUM":"003", "ST_TYPE": "ST", "ODD_EVEN": "E", "BLOCK_NUM": "0265", "MAPBLKLOT": "0265003"}}

13

Copyright © 2020, Oracle and/or its affiliates.

JSON Functions
MySQL 5.7 and 8.0

JSON_ARRAY_APPEND()

JSON_MERGE[_PRESERVE]()

JSON_PRETTY()

JSON_ARRAY_INSERT()

JSON_OBJECT()

JSON_STORAGE_SIZE()

JSON_ARRAY()

JSON_QUOTE()

JSON_STORAGE_FREE()

JSON_CONTAINS_PATH()

JSON_REMOVE()

JSON_ARRAYAGG()

JSON_CONTAINS()

JSON_REPLACE()

JSON_OBJECTAGG()

JSON_DEPTH()

JSON_SEARCH()

JSON_MERGE_PATCH()

JSON_EXTRACT()

JSON_SET()

JSON_TABLE()

JSON_INSERT()

JSON_TYPE()

JSON_KEYS()

JSON_UNQUOTE()

JSON_LENGTH()

JSON_VALID()

14

Copyright © 2020, Oracle and/or its affiliates.

JSON + Generated Columns[NEW57]> CREATE TABLE `T_JSON` (`id` int(11) NOT NULL AUTO_INCREMENT,`feature` json NOT NULL,`feature_type` varchar(30) GENERATED ALWAYS AS (json_unquote(feature->"$.type")) VIRTUAL,`feature_street` varchar(30) GENERATED ALWAYS AS (json_extract(`feature`,‘$.properties.STREET’)) VIRTUAL,PRIMARY KEY (`id`),
KEY `idx_feature_street` (`feature_street`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;[NEW57]> alter table features add index idx_feature_type(`feature_type`);
Query OK, 0 rows affected (6.14 sec)
Records: 0 Duplicates: 0 Warnings: 0
生成列に対し,オンラインでインデックスを追加。
→ 高速なJSONデータの検索が可能に!!

インデックス利用で処理が 1.25秒 → 0.06秒[NEW57]> explain select distinct(feature_type) from features;+----+-------------+----------+------------+-------+------------------+------------------+---------+------+--------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key| key_len | ref | rows | filtered | Extra|+----+-------------+----------+------------+-------+------------------+------------------+---------+------+--------+----------+-------------+| 1 | SIMPLE| features | NULL| index | idx_feature_type | idx_feature_type | 123| NULL | 199013 | 100.00 | Using index |+----+-------------+----------+------------+-------+------------------+------------------+---------+------+--------+----------+-------------+

15

Copyright © 2020, Oracle and/or its affiliates.

MySQL Document Store: SQL + NoSQL = MySQL
開発者にとっての柔軟性統合されたAPIX DevAPI
SQL + CRUD API

MySQL
8.0
Relational
Tables16

Copyright © 2020, Oracle and/or its affiliates.

データ管理の信頼性と柔軟性
データ同期不要 & JOINも可能

運用効率の向上
単一データベース運用{ } JSONDocuments

MySQL 8.0 : データ分析処理の効率向上
共通テーブル式 (CTEs)

Window 関数• サブクエリの導出表 (derived table) の代替• WITH 句と呼ばれることも• 分析処理 SQL 文の可読性や処理性能の向上、階層構造データ利用にも• ランキング作成などの分析処理用途でユーザーからの追加要望の多かった機能• 検索対象のレコードと周辺データとの関連を集計や分析

WITH tickets_filtered AS (SELECT tickets.*, seats.doc
FROM tickets
INNER JOIN seats ON
tickets.seat_id = seats.id
WHERE tickets.event_id = 3)
SELECT * FROM tickets_filtered
WHERE doc->"$.section" = 201¥G17

Copyright © 2020, Oracle and/or its affiliates.

SELECT name, dept_id, salary,RANK() OVER w AS `rank`
FROM employee
WINDOW w AS
(PARTITION BY dept_id
ORDER BY salary DESC);Window関数

18

Copyright ©︎ 2020, Oracle and/or its affiliates.

MySQL8.0以前では(window関数を使わず実現)
Sales Table

19

Copyright © 2020, Oracle and/or its affiliates.

国別のTopセールスマンを出力

Window関数での使用例
Sales Table

20

Copyright © 2020, Oracle and/or its affiliates.

国別のTopセールスマンを出力

実行計画での比較
Before MySQL 8.0

Notes:営業担当者の詳細を取得するために、メインテーブルと結合するサブクエリ（REDでマークされた）21

Copyright © 2020, Oracle and/or its affiliates.

In MySQL 8.0

おまけ（2ndを出力する場合は……）
SQL

22

EXPALIN

Copyright © 2020, Oracle and/or its affiliates.

Window 関数

ランキング

分析

集計

• ROW_NUMBER()• FIRST_VALUE()• COUNT()• RANK()• LAST_VALUE()• MAX()• DENSE_RANK()• NTH_VALUE()• MIN()• NTILE()• LAG()• SUM()• PERCENT_RANK()• LEAD()• AVG()• CUME_DIST()• BIT_OR(),BIT_AND(),
BIT_XOR()• VARIANCE(),STDDEV()

23Copyright © 2020, Oracle and/or its affiliates.

MySQL 8.0 : セキュリティの強化

SQLロールの実装

ログファイルの透過的暗号化

Easier to manage user and applications
rights and SQL standard compliant

AES 256 encryption of REDO, and UNDO Log
in addition to tablespace files

メタデータ変更がアトミックに

パスワード管理強化

New InnoDB based data dictionary
enables ACL statements atomic andreliable

Establish password-reuse policy with
Password History, and faster with caching

動的権限
Provides finer grained administrative level
access controls for less use of root user
for less use of root user
24

Copyright © 2020, Oracle and/or its affiliates.

OpenSSLをダイナミックリンク
MySQL Community Edition to use OpenSSL,and all binaries are dynamically linked

MySQLのバージョンアップ方法

25

Copyright © 2020, Oracle and/or its affiliates.

バージョンアップ手法• インプレースアップグレード• 新環境へのデータ移行（ロジカルアップグレード）- mysqldump

26

Copyright © 2020, Oracle and/or its affiliates.

インプレースアップグレード• 実施方法• MySQLサーバーのバイナリを新しいバージョンに入れ替えて、mysql_upgradeを実行する• 備考• 旧環境のデータベースを直接アップグレードする• 別筐体で実施したい場合は、コールドバックアップを取得して別筐体にリストアし、その後新しいバージョンのMySQLバイナリからmysql_upgradeを実行する• 1つ先のメジャーバージョンへバージョンアップ可能- リスクをより低くするためには、まずそのバージョン内で最新のマイナーバージョンまでインプレースアップグレードした後で、次のメジャーバージョンにインプレースアップグレードする（例：MySQL 5.6.30 --> 5.6.45 --> 5.7.27 --> 8.0.17）

27

Copyright © 2020, Oracle and/or its affiliates.

インプレースアップグレード• MySQL 5.5から5.6へのバージョンアップ時は、データ移行によるアップグレードを推奨- インプレースアップグレードでは、テーブル等のオブジェクトが再編成されません- MySQL 5.6ではDATETIME型の内部フォーマットが変更されたため、オブジェクトを再編成しないと新しいフォーマットになりません

https://dev.mysql.com/doc/refman/5.6/en/upgrade-binary-package.html

28

Copyright © 2020, Oracle and/or its affiliates.

mysql_upgrade
mysql_upgradeを実行すると、全てのデータベースの全てのテーブルに対して、現在のバージョンのMySQLサーバーとの非互換性を調べ、修復を試みる（システムテーブルも含む）• MySQL 8.0 Reference Manual / 4.4.5 mysql_upgrade — Check and Upgrade MySQL Tables- https://dev.mysql.com/doc/refman/8.0/en/mysql-upgrade.html- 8.0.16よりmysql_upgradeは廃止になりました• MySQL 5.7 Reference Manual / 4.4.7 mysql_upgrade — Check and Upgrade MySQL Tables- https://dev.mysql.com/doc/refman/5.7/en/mysql-upgrade.html• MySQL 5.6 Reference Manual / 4.4.7 mysql_upgrade — Check and Upgrade MySQL Tables- https://dev.mysql.com/doc/refman/5.6/en/mysql-upgrade.html• MySQL 5.6 リファレンスマニュアル / 4.4.7 mysql_upgrade — MySQL テーブルのチェックとアップグレード- https://dev.mysql.com/doc/refman/5.6/ja/mysql-upgrade.html

29

Copyright © 2020, Oracle and/or its affiliates.

新環境へのデータ移行• 実施方法• 旧環境とは別に新環境のMySQLデータベースを作成し、そこにデータを入れる• 備考• 旧環境のデータベースを残したまま新しい環境を作成可能• 新環境のMySQLデータベースに必要なユーザーを作成後、mysqldumpで取得したユーザーデータをロードする• 2つ以上先のメジャーバージョンへも直接移行可能＊データ移行時にテーブル等のオブジェクトが再編成されるというメリットがある

30

Copyright © 2020, Oracle and/or its affiliates.

MySQL on Docker

31

Copyright © 2020, Oracle and/or its affiliates.

Dockerコンテナを使う理由• アプリケーションスタック全体のプロビジョニングを迅速に行える• 初期状態への復帰が容易• 柔軟なスケーリング
32

Copyright ©︎ 2020, Oracle and/or its affiliates.

MySQLのDockerイメージ
入手先
••
•

Docker Hub
GitHubMy Oracle Support (Enterprise Edition)

対応バージョン
•••5.6 (5.6.48)
5.7 (5.7.30)
8.0 (8.0.20)

対応OS
•33

Linux
https://dev.mysql.com/doc/refman/8.0/en/deploy-mysql-nonlinux-docker.html
Copyright © 2020, Oracle and/or its affiliates.

Let’s try!!
0. Dockerのインストール
https://hub.docker.com/_/docker
1. MySQLのDockerイメージをダウンロード
docker pull mysql/mysql-server:<tag><tag>:バージョンを指定 (5.6,5.7,8.0等)ex) docker pull mysql/mysql-server:latest

2. イメージの確認
docker images
3. MySQLのDockerコンテナを起動
docker run --name=<container_name> -d <image_name:tag>ex) docker run --name=mysql0 -d mysql/mysql-server:latest
34

Copyright © 2020, Oracle and/or its affiliates.

Let’s try!!
4. Dockerコンテナ一覧を確認
docker ps
5. rootの初期パスワードを確認
ex) docker logs mysql0 2>&1 | grep GENERATED
出力例) [Entrypoint] GENERATED ROOT PASSWORD: EzANjozaBGatJ3kAf0w94L[@pPI
6. mysqlログイン、パスワード変更
docker exec -it mysql0 mysql –u root –p※パスワードは手順5で確認した初期パスワードを指定する
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY ‘<password>’;ex) ALTER USER 'root'@'localhost' IDENTIFIED BY ‘Welcome1!’;35

Copyright ©︎ 2020, Oracle and/or its affiliates.

その他操作コマンド実行例➢ Dockerコンテナのシェルを使う
docker exec -it mysql0 bash
シェル上でmysql実行も可能➢ Dockerコンテナの停止・起動/再起動
停止：docker stop mysql0
起動：docker start mysql0
再起動：docker restart mysql0➢ Dockerコンテナの削除
docker stop mysql0
docker rm mysql036

Copyright © 2020, Oracle and/or its affiliates.

サンプルデータベース➢ 以下ページの”Example Databases”部分からサンプルデータベースをダウンロード可能
MySQL Documentation: Other MySQL Documentation
http://dev.mysql.com/doc/index-other.html➢ 実体はSQLスクリプトファイルであるためテキストエディタで内容を確認可能
world database• MySQL研修や認定試験の問題などでも利用されているサンプルデータベース
world_x database• WorldにJSONデータを追加したサンプルデータベース
sakila database• world databaseよりも多くのテーブルが存在• geometryデータ型も含まれている(addressテーブルのlocation列)
37

Copyright © 2020, Oracle and/or its affiliates.

サンプルデータベースのインストール例(world_x)
1. Dockerコンテナ側にダウンロードしたファイルをコピー
docker cp <ファイルパス> <コンテナID>:<コピー先のファイルパス>ex) docker cp /Users/mikoma/Downloads/world_x-db/world_x.sql d4075bd36c83:/tmp/

2. シェルを利用してsqlファイルを実行
docker exec -it mysql0 bash
bash-4.2# mysql -u root -p < /tmp/world_x.sql
3. インストールされたことを確認
bash-4.2# mysql -u root –p
mysql> show databases;
38

Copyright ©︎ 2020, Oracle and/or its affiliates.

MySQL on Kubernetes➢ Kubernetes上でのMySQL InnoDB Cluster構築について解説
https://my-mysqlid.blogspot.com/2020/05/➢ MySQL Operator• Kubernetes上のMySQL InnoDB Cluster運用を自動化• 単一コマンドでKubernetes上にMySQL InnoDB Clusterを作成/スケール/削除• MySQL InnoDB Clusterの自動修復(自動障害検出、自動回復)• データのバックアップ、リストア
https://github.com/oracle/mysql-operator

39

Copyright © 2020, Oracle and/or its affiliates.

これでいいのかな…チューニングがうまくいかない…
MySQL Support
•••
•

24x7
MySQL GBUによるサポート体制
バグ修正、パッチ、アップデートの提供
MySQL コンサルティング・サポート
••
•
•

40

「クエリ・レビュー」「パフォーマンス・ チューニング」「レプリケーション・レビュー」「パーティショニング・レビュー」

Copyright © 2020, Oracle and/or its affiliates.

MySQL Standard Edition

MySQLプログラムがインストールされたサーバー数でカウントされます。

MySQL Standard Edition （1サーバー)24万円 / 1年
41

Copyright ©︎ 2020, Oracle and/or its affiliates.

【MySQL お問い合わせ窓口】
0120-065556【受付時間】
平日 9:00-12:00/13:00-17:00(祝日及び年末年始休業日を除きます)
MySQL-Sales_jp_grp@oracle.com

42

Copyright © 2020, Oracle and/or its affiliates.

もう少しMySQLを知りたくなったら…
参考書籍

43

Copyright © 2020, Oracle and/or its affiliatesもう少しMySQLを知りたくなったら…
MySQLのWebサイトよりチェック！

https://www.mysql.com/jp/news-and-events/web-seminars/

44

Copyright © 2020, Oracle and/or its affiliates

MySQL入門セミナー
これからMySQLに触れる方を対象に定期的に実施しているセミナーです。
2020年

内容

6月

インストール(1)WindowsにおけるMySQLインストール

インストール(2)LinuxにおけるMySQLインストール

アーキテクチャ基礎

MySQLアーキテクチャの基礎

レプリケーション(1)MySQLレプリケーションの基礎

レプリケーション(2)機能解説：InnoDB Replica Set

レプリケーション(3)機能解説：InnoDB Cluster

バージョンアップ(1)バージョンアップ基礎知識

バージョンアップ(2)MySQL8.0バージョンアップ時の注意事項

セキュリティ

セキュリティ機能解説

チューニングチューニング方法解説

7月

8月
未定

45

Copyright ©︎ 2020 Oracle and/or its affiliates.

※内容、スケジュールは予告なく変更する場合がございます。