MySQL 8.0 Lab版から再帰共通テーブル式(再帰共通表式)が使えるらしい

いままで、MySQLでは再帰共通テーブル式再帰共通表式)というものが利用できなかったようですが、MySQL 8.0 Lab版から利用可能とのこと。

Oracle DatabaseやSQL Serverなどでは前々から普通に使えていたようです。

 

MySQL 8.0 Lab版: MySQLの (再帰)共通テーブル式(CTE) | Yakst

⇩  まだ開発段階で、本番環境では使うのは控えた方が良いようですね。 

MySQL Labs

Warning! For testing purposes only!

These binaries were created by MySQL testing servers.

They are NOT FIT FOR PRODUCTION.

They are provided solely for testing purposes, to try the latest bug fixes and generally to keep up with the development.

  • Please, DO NOT USE THESE BINARIES IN PRODUCTION.
  • Instead, install them on a spare server.
  • If you are looking for production ready binaries, please visit MySQL Downloads.
  • MySQL Software is provided under the GPL License

MySQL :: MySQL Labs

※ 2017年9月に、RC版がリリースされたようです。

第26回 MySQL 8.0 RC版リリース,PostgreSQL10.0リリース間近,RC1版リリース:OSSデータベース取り取り時報|gihyo.jp … 技術評論社

 

 

再帰共通テーブル式再帰共通表式)とは?

CTE(Common Table Expression)と書いて、『再帰共通テーブル式再帰共通表式)』と読む、その心は?

共通テーブル式 (CTE) は、単一の SELECT、INSERT、UPDATE、DELETE、CREATE VIEW の各ステートメントの実行スコープ内で定義される一時結果セットと考えることができます。CTE は、オブジェクトとして格納されず、クエリが実行されている間しか保持されない点で、派生テーブルに似ています。派生テーブルと異なるのは、CTE では自己参照が可能であり、同じクエリ内で複数回参照が可能なことです。

CTE は次の目的に使用します。

  • 再帰クエリの作成。詳細については、「共通テーブル式を使用する再帰クエリ」を参照してください。

  • 通常の用法でビューを使用する必要がない場合、つまり、メタデータにビューの定義を保存する必要がない場合のビューの代用。

  • スカラー サブセレクトから派生される列、または非決定的であるか外部からアクセスされる関数による、グループ化の実現。

  • 同じステートメント内での結果テーブルの複数回の参照。

CTE を使用すると、複雑なクエリが読みやすくなり、メンテナンスが容易になります。クエリは、独立した、複数の論理的な構成ブロックに分割できます。このような単純なブロックを組み合わせて、より複雑な中間処理用の CTE を作成し、最終的な結果セットを生成することができます。

CTE は、関数やストアド プロシージャ、トリガー、ビューなどのユーザー定義ルーチン内に定義できます。

Microsoft TechNet - 共通テーブル式の使用

う、う~ん...分からんですね。 

いまさらMySQL 8.0で共通テーブル式(CTE : Common Table Expressions) - Qiita

漢(オトコ)のコンピュータ道: MySQL 8.0.0 Development Milestone Release登場!!

⇧  MySQL 8.0については上記サイト様が詳しいです。

 

ま、とりえあずMySQL 8.0 RC版をインストールしてみますか~。

MySQL 8.0 RC版をインストール前に

インストールの前に、

Windows 上では、MySQL Server は Windows サービスとして実行することができます。

複数の MySQL サービスをセットアップするには、各インスタンスが、インスタンスごとに一意でなければならないほかのパラメータを使用することに加えて、異なるサービス名を使用するようにする必要があります。

複数のサービスをセットアップするにはいくつかの方法があります。これらのいずれかを試行する前に、既存の MySQL サービスがあればシャットダウンして削除してください。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.3.2.2 Windows サービスとして複数の MySQL インスタンスの起動

そう、私のマシーン(PC、つまりWindows 10 Home)には 、すでにMySQL 5.7.18がインストールされ、Windowsのサービスとして起動しているのであった。(xamppにMaria DBが入っていますが、MySQLじゃないということで考慮しなくて良いのかもしれないがよく分からずです。)

なので、この複数のMySQLインスタンスの起動を試みるには、いま動いているサービスを停止、削除する必要があるようです。まずは、起動してるサービスの確認。

Tech TIPS:scコマンドでWindows OSのサービスを確認/一覧/開始/停止する - @IT

sc query

f:id:ts0818:20171103193909j:plain

スクロールしていくと、MySQL57というサービス名で起動しています。

f:id:ts0818:20171103193926j:plain

『net stop [サービス名]』でサービスを停止できるようです。

net stop MySQL57

f:id:ts0818:20171103194350j:plain

オウ痛っ!コマンドプロンプトを管理者権限で起動しないとまずかったですね、 『コマンド プロンプト』上で右クリックし『管理者として実行(A)』。

f:id:ts0818:20171103194622j:plain

今度は、止まりましたね。

f:id:ts0818:20171103194832j:plain

作成したWindowsサービスを完全に削除する方法 | minto.tech

 ⇧  上記サイト様を参考に、MySQL57サービスを削除します。

sc delete MySQL57

f:id:ts0818:20171103195351j:plain

一瞬で削除されましたね...。 

MySQL 8.0 RC版をインストール

MySQL開発最新動向

⇧  上記サイト様によると、MySQL 8.0のRC版が出ているようです。上記サイト様の『GA、DMR、RC、Labって何?』によりますと、

  • GA(General Available/General Availability)
  • DMR(Development Milestone Releases)
    • – 開発途上版
    • – 年に2~4回程度リリース予定
    • http://dev.mysql.com/downloads/ からダウンロード可能
      ⇒Development Releases タブを選択
  • RC(Release Candidate)
    • – リリース候補版
    • – RCリリース後、バグを修正してからGAがリリースされる
    • http://dev.mysql.com/downloads/ からダウンロード可能
      ⇒Development Releases タブを選択
  • Lab Releases
    • – DMRよりも先進的/実験的な機能を実装した、実験版 (Laboratory:実験室)
    • – Lab Releasesでリリースされた機能がDMR、GAに取り込まれる 保証はないが、反響の大きな機能はDMRに取り込まれる
    • http://labs.mysql.com/ からダウンロード可能

ちなみに、

MySQL InnoDB Clusterという、

コンポーネントの組み合わせから構成さ れるMySQLの高可用性フレームワークも存在するみたいですね。

 

ということで、MySQL 8.0 RC版をインストールしていきたいと思います。 

https://www.mysql.com/ にアクセスし、『DOWNLOADS』を選択。

f:id:ts0818:20171103205256j:plain

MySQL Downloads」のページに遷移したらば、下の方にスクロールし

f:id:ts0818:20171103205432j:plain

MySQL Community Edition(GPL)」の『Community (GPL)Downloads』を選択。

f:id:ts0818:20171103205524j:plain

MySQL Community Downloads」のページに遷移したらば、『MySQL COmmunity ServerGPL)』を選択。

f:id:ts0818:20171103205708j:plain

「Download MySQL Community Server」のページに遷移したらば、下の方にスクロールし、『Development Releases』のタブを選択。

f:id:ts0818:20171103205816j:plain

「Recommend Download:」となっている、「MySQL Installer for Windows」のバナーっぽい画像をクリックだと、既にインストールしてるMySQLを上書きしてしまう感じになってしまうので、「Other Download:」のZipファイルをDownloadします。

WindowsにzipファイルのMySQLをインストールする方法

f:id:ts0818:20171103224607j:plain

一番下の「No thanks. just start my download.」を選択。

f:id:ts0818:20171103224646j:plain

Downloadが始まります。

f:id:ts0818:20171103224734j:plain

ちょっと脱線して、ちなみに、バージョンを指定してダウンロードする場合は、「Download MySQL Community Server」のページの「Archived versions >>」のリンクで選べますが、

f:id:ts0818:20171103221846j:plain

旧いバージョンをインストールするのは非推奨とか出ますが、実際に開発するとなったら旧いバージョンを使っていくのは致し方ないとは思われます。

f:id:ts0818:20171103222434j:plain

それでは、本題に戻りまして、 

Downloadが完了したら、「ダウンロード」フォルダで、ダウンロードされたzipファイルを選択し右クリック、「すべて展開(T)」を選択します。

f:id:ts0818:20171103230322j:plain

「C:¥Program File」を展開先として「フォルダーの選択」。

f:id:ts0818:20171103230244j:plain

 「展開(E)」。

f:id:ts0818:20171103230735j:plain

「続行(C)」。

f:id:ts0818:20171103230808j:plain

展開されます。

f:id:ts0818:20171103230838j:plain

「C:¥Program File¥mysql-8.0.3-rc-winx64」に配置されました。

f:id:ts0818:20171103230850j:plain

 前にインストーラーでインストールしたMySQL(『MySQL 5.7.18』)は、「MySQL Server 5.7」以外にもいろいろ入っていたんですが、

f:id:ts0818:20171103231245j:plain

 zipファイルだと本当に、MySQL Serverオンリーっぽいですね。

 

MySQLをサービスとして起動するための設定

WindowsのサービスとしてMySQLを起動するには、2つ方法があるようで、 

  1. いずれかの標準オプションファイル内ですべてのサービスのオプションを指定
  2. 各サーバーのオプションを別々のファイルに指定し、サービスをインストールするときに --defaults-file を使用して、使用するファイルを各サーバーに指示

のどちらかを使うということみたいです。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.3.2.2 Windows サービスとして複数の MySQL インスタンスの起動

ただ、公式だの説明だと、「.cnf」ファイルを使ってますが、WindowsMySQLインストーラーでインストールすると、「C:¥ProgramData¥MySQL¥MySQL Server 5.7¥my.ini」にコンフィグファイル(設定ファイル)ができると思うんですが。

オプションファイルの設置場所 - オプションファイル(my.ini/my.cnf) - MySQLの使い方

 ⇧  上記サイト様の説明によると、設定ファイルの読み込みに優先順位があるみたいですね。

とりえあず、別々の設定ファイルを利用するということで、MySQL 5.7.18のほうは「C:¥ProgramData¥MySQL¥MySQL Server 5.7¥my.ini」があるので、MySQL 8.0用の設定ファイルを作成していきたいと思います。

f:id:ts0818:20171104160513j:plain

設定ファイルができています。

f:id:ts0818:20171104160635j:plain

設定ファイル編集をメモ帳以外でコマンドプロンプトから行うのは、いろいろ設定がひつようみたいなので、普通にテキストエディタから編集します。

この際、テキストエディタを管理者権限で起動しておく必要があります。

f:id:ts0818:20171104081139j:plain

すると、エラー。

f:id:ts0818:20171104081559j:plain

サクラエディタに「権限レベルの異なるエディタ云々」と言われた - 城州研

⇧  上記サイト様によると、サクラエディタが常駐モードになっているらしい。

テキスト関連ソフト/サクラエディタの常駐をオフする方法 - Windowsと暮らす

⇧  上記サイト様によると、サクラエディタの設定で常駐モードをオフにできるらしい。

⇩  常駐は、常にタスクトレイに居座ってる状態みたいです。

f:id:ts0818:20171104083054j:plain

タスクマネージャーでプロセスを強制終了する方法でもいけるみたいですが、毎回タスクマネージャーを開いて強制終了する必要があるようです。

今回は、サクラエディタの設定で。とりあえず、前回開いていた権限でサクラエディタを起動し、「設定(C)...」>「共通設定(C)...」を選択。

f:id:ts0818:20171104082723j:plain

「タスクトレイ」の「タスクトレイに常駐(R)」のチェックを外します。

f:id:ts0818:20171104082913j:plain

「OK」をクリック。 

f:id:ts0818:20171104083012j:plain

今度は普通に、管理者権限で起動できました。「ファイル(F)」>「開く(O)...」を選択。

f:id:ts0818:20171104083516j:plain

「C:¥Program Files¥mysql-8.0.3-rc-winx64¥my.cnf」を選択します。

f:id:ts0818:20171104161033j:plain

編集できる状態で開けました。

f:id:ts0818:20171104161114j:plain

MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.3.2.2 Windows サービスとして複数の MySQL インスタンスの起動

を参考に設定していきます。 「basedir」はbinフォルダを含むフォルダで大丈夫かと。「enable-named-pipe」は「--enable-named-pipe」オプションを使えるようにするってことですかね?

MySQL はすべての Windows プラットフォームで TCP/IP をサポートしています。Windows 上の MySQL は、サーバーを --enable-named-pipe オプション付きで起動した場合は名前付きパイプもサポートします。一部のユーザーで、名前付きパイプを使用した際に MySQL サーバーのシャットダウンに関する問題が生じたため、このオプションは明示的に使用する必要があります。多くの Windows 構成において、名前付きパイプは TCP/IP より遅いため、デフォルトではプラットフォームにかかわらず TCP/IP が使用されます。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 2.3.5.3 MySQL サーバータイプの選択

「socket」は、Windowsの場合は特に関係ないってことですかね?

 クライアントからMySQLサーバーに接続する場合、MySQLサーバーがローカルマシンでUnixなら、ソケット通信で接続できます。 サーバーが他のマシンになる場合は、TCP/IPなどで接続することになります。

MySQL クライアントからサーバーへの接続

ということで、こんな感じの設定。

f:id:ts0818:20171104182439j:plain

文字コードを「UTF-8」で保存したいので、 

f:id:ts0818:20171104161641j:plain

文字コードセット(C):」で「UTF-8」を指定。 

f:id:ts0818:20171104161713j:plain

「保存(S)」。

f:id:ts0818:20171104161728j:plain

「はい(Y)」。

f:id:ts0818:20171104161739j:plain

UTF-8」で利用する機会が多い場合は、サクラエディタの設定でデフォルトの文字コードを変更しておいたほうが良いかもです。

サクラエディタのデフォルト文字コードをUTF-8に変更する - 半地下備忘録

 

MySQLをサービスとして起動

 

各サービスに対して Windows が正しい実行可能プログラムを登録するようにするために、完全なサーバーパス名を使用して、サービスを次のようにインストールします。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.3.2.2 Windows サービスとして複数の MySQL インスタンスの起動

ということで、windowsにサービスとして登録ですが、このままだとエラーになります。

C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld --install mysqld57 --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"
C:\Program Files\mysql-8.0.3-rc-winx64\bin\mysqld --install mysqld80 --defaults-file="C:\Program Files\mysql-8.0.3-rc-winx64\my.cnf"

半角空白のフォルダを含む場合は、「"」でパスを囲まないといけないのですが、それ以外にも「MS-DOS8.3形式で短縮する」という方法があるようです。

Windows でパスに空白を含むときの回避策 - 自分の仕事を憎むには人生は余りにも短い

⇧  上記サイト様を参考に、「MS-DOS短縮」を確認。

f:id:ts0818:20171104093507j:plain

f:id:ts0818:20171104093608j:plain

「Program Files」は「PROGRA~1」で書き換えできるようですので、

C:\PROGRA~1\MySQL¥MySQL Server 5.7\bin\mysqld --install mysqld57 --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"
C:\PROGRA~1\mysql-8.0.3-rc-winx64\bin\mysqld --install mysqld80 --defaults-file="C:\Program Files\mysql-8.0.3-rc-winx64\my.cnf"

として実行してみます。エラー。

f:id:ts0818:20171104162719j:plain

MySQL Server 5.7」の部分でもがっつり半角スペース入ってましたね(涙)

パス名にスペースのある実行ファイルの指定方法

シェルスクリプト-スペースが含まれる文字列を扱う CapmNetwork

⇧  上記サイト様を参考に、「`(『Shift + @』で入力するバッククォート)」、「¥」を試すもエラー。

f:id:ts0818:20171104162949j:plain

コマンドプロンプトでのエスケープ文字 -標記の通り、コマンドプロンプ- Windows 10 | 教えて!goo

⇧  上記サイト様の「"」で半角スペースを囲む場合も、上手くいかず...

Windowsのコマンドプロンプトでワンライナーを書こうとすると二重引用符がビョーキ - C Sharpens you up

⇧  上記サイト様によりますと、どうやらダブルクォーテーションの挙動が複雑らしいっす。

C:\PROGRA~1\MySQL\MySQL" "Server" "5.7\bin\mysqld --install mysqld57 --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"
C:\PROGRA~1\mysql-8.0.3-rc-winx64\bin\mysqld --install mysqld80 --defaults-file="C:\Program Files\mysql-8.0.3-rc-winx64\my.cnf"

f:id:ts0818:20171104165255j:plain

ダブルクォーテーションの挙動はよく分からんですが、最終稿!

C:\PROGRA~1\MySQL\\"MySQL Server 5.7"\bin\mysqld --install mysqld57 --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"

とすればいけました。

f:id:ts0818:20171104172926j:plain

ブログの編集でバックスラッシュが¥の特殊文字になってしまっていたので失敗してますが、バックスラッシュに修正すればいけました。

f:id:ts0818:20171104175518j:plain

⇧  左の『\』が正解。『¥』のほうのコードを実行してしまっていました。

f:id:ts0818:20171104173853j:plain

サービスとして登録されているか確認。

f:id:ts0818:20171104175942j:plain

f:id:ts0818:20171104175955j:plain

GUIでも確認できます。

f:id:ts0818:20171104111058j:plain

Windowsアイコンを右クリックし、「コンピューターの管理(G)」を選択し、

f:id:ts0818:20171104110939j:plain

左サイドバーから「サービスとアプリケーション」>「サービス」を選択。 

f:id:ts0818:20171104180106j:plain

 

それでは、 サービスとして起動!

NET START mysqld57
NET START mysqld80

f:id:ts0818:20171104180526j:plain

 動きました!

f:id:ts0818:20171104181602j:plain

mysqld57(『MySQL 5.7.18』)のほうはポート番号が3306なので省略してアクセスできます。

f:id:ts0818:20171104181954j:plain

mysqld80(『MySQL 8.0』)のほうはポート番号が3309なので、オプションでポート番号も指定する必要があります。

f:id:ts0818:20171104182107j:plain

XAMPPのMySQLもポート番号3308にしてるので、無事起動できました。

f:id:ts0818:20171104183254j:plain

phpMyAdminへもアクセスできました。 

f:id:ts0818:20171104192002j:plain

 

再帰共通テーブル式再帰共通表式)まで 辿り着けなかったけど、MySQL 8.0が使える環境が整ったので、次回以降に試していきたいと思います。

今回も2日ぐらいハマってしまった(涙)。

 

 

番外篇 - NG集

f:id:ts0818:20171104110534j:plain

 エラー!「NET HELPMSG 3534」を入力するも、

f:id:ts0818:20171104110712j:plain

気の利かないメッセージですよ!

windowsのイベントビューアーで確認できるようなので、確認。画面左下の

f:id:ts0818:20171104111058j:plain

Windowsアイコンの上で右クリックし、「コンピューターの管理(G)」を選択。

f:id:ts0818:20171104110939j:plain

左サイドバーより、「イベント ビューアー」>「Windows ログ」>「Application」を選択し、「エラー」をクリックし、「詳細」タブで確認できます。

f:id:ts0818:20171104111323j:plain

failed to set datadir to C:\Program Files\MySQL\MySQL Server 5.7\data\

データディレクトリないよって...ありますけど?というか、フォルダの場所は違うけど「C:¥ProgramData¥MySQL¥MySQL Server 5.7¥Data¥」ってフォルダはあるんですが。

f:id:ts0818:20171104111807j:plain

C:¥ProgramData¥MySQL¥MySQL Server 5.7¥my.ini」の設定のdatadirが認識されとらんですね...。

f:id:ts0818:20171104115212j:plain

というか、zipファイル(『mysql-8.0.3-rc-winx64.zip』)に未変更のままのデータディレクトリなんてなかったけど...。 

インストーラーでインストールしてたMySQL(『MySQL 5.8.17』)もデータディレクトリが、インストールディレクトリの下にできてないし...。なんか、リファレンスマニュアルに不信感が。

Windows では、データディレクトリは MySQL 配布に含まれています。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.3.1 複数のデータディレクトリのセットアップ

というエラーが起こってましたが、windowsのサービスをインストール (MySQLをサービスとして登録)する際に、--defaults-fileオプションを使っていなかったため、Xamppのほうのmy.ini(『C:¥xampp¥mysql¥bin¥my.ini』)の設定が利用されていたみたいです(涙)。