いままで、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
※ 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 は、関数やストアド プロシージャ、トリガー、ビューなどのユーザー定義ルーチン内に定義できます。
う、う~ん...分からんですね。
・いまさら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
スクロールしていくと、MySQL57というサービス名で起動しています。
『net stop [サービス名]』でサービスを停止できるようです。
net stop MySQL57
オウ痛っ!コマンドプロンプトを管理者権限で起動しないとまずかったですね、 『コマンド プロンプト』上で右クリックし『管理者として実行(A)』。
今度は、止まりましたね。
・作成したWindowsサービスを完全に削除する方法 | minto.tech
⇧ 上記サイト様を参考に、MySQL57サービスを削除します。
sc delete MySQL57
一瞬で削除されましたね...。
MySQL 8.0 RC版をインストール
⇧ 上記サイト様によると、MySQL 8.0のRC版が出ているようです。上記サイト様の『GA、DMR、RC、Labって何?』によりますと、
- GA(General Available/General Availability)
- – 製品版
- – http://dev.mysql.com/downloads/ からダウンロード可能
- 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の高可用性フレームワークも存在するみたいですね。
ということで、MySQL 8.0 RC版をインストールしていきたいと思います。
https://www.mysql.com/ にアクセスし、『DOWNLOADS』を選択。
「MySQL Downloads」のページに遷移したらば、下の方にスクロールし
「MySQL Community Edition(GPL)」の『Community (GPL)Downloads』を選択。
「MySQL Community Downloads」のページに遷移したらば、『MySQL COmmunity Server(GPL)』を選択。
「Download MySQL Community Server」のページに遷移したらば、下の方にスクロールし、『Development Releases』のタブを選択。
「Recommend Download:」となっている、「MySQL Installer for Windows」のバナーっぽい画像をクリックだと、既にインストールしてるMySQLを上書きしてしまう感じになってしまうので、「Other Download:」のZipファイルをDownloadします。
・WindowsにzipファイルのMySQLをインストールする方法
一番下の「No thanks. just start my download.」を選択。
Downloadが始まります。
ちょっと脱線して、ちなみに、バージョンを指定してダウンロードする場合は、「Download MySQL Community Server」のページの「Archived versions >>」のリンクで選べますが、
旧いバージョンをインストールするのは非推奨とか出ますが、実際に開発するとなったら旧いバージョンを使っていくのは致し方ないとは思われます。
それでは、本題に戻りまして、
Downloadが完了したら、「ダウンロード」フォルダで、ダウンロードされたzipファイルを選択し右クリック、「すべて展開(T)」を選択します。
「C:¥Program File」を展開先として「フォルダーの選択」。
「展開(E)」。
「続行(C)」。
展開されます。
「C:¥Program File¥mysql-8.0.3-rc-winx64」に配置されました。
前にインストーラーでインストールしたMySQL(『MySQL 5.7.18』)は、「MySQL Server 5.7」以外にもいろいろ入っていたんですが、
zipファイルだと本当に、MySQL Serverオンリーっぽいですね。
MySQLをサービスとして起動するための設定
WindowsのサービスとしてMySQLを起動するには、2つ方法があるようで、
- いずれかの標準オプションファイル内ですべてのサービスのオプションを指定
- 各サーバーのオプションを別々のファイルに指定し、サービスをインストールするときに --defaults-file を使用して、使用するファイルを各サーバーに指示
のどちらかを使うということみたいです。
・MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.3.2.2 Windows サービスとして複数の MySQL インスタンスの起動
ただ、公式だの説明だと、「.cnf」ファイルを使ってますが、WindowsでMySQLをインストーラーでインストールすると、「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用の設定ファイルを作成していきたいと思います。
設定ファイルができています。
設定ファイル編集をメモ帳以外でコマンドプロンプトから行うのは、いろいろ設定がひつようみたいなので、普通にテキストエディタから編集します。
この際、テキストエディタを管理者権限で起動しておく必要があります。
すると、エラー。
・サクラエディタに「権限レベルの異なるエディタ云々」と言われた - 城州研
⇧ 上記サイト様によると、サクラエディタが常駐モードになっているらしい。
・テキスト関連ソフト/サクラエディタの常駐をオフする方法 - Windowsと暮らす
⇧ 上記サイト様によると、サクラエディタの設定で常駐モードをオフにできるらしい。
⇩ 常駐は、常にタスクトレイに居座ってる状態みたいです。
タスクマネージャーでプロセスを強制終了する方法でもいけるみたいですが、毎回タスクマネージャーを開いて強制終了する必要があるようです。
今回は、サクラエディタの設定で。とりあえず、前回開いていた権限でサクラエディタを起動し、「設定(C)...」>「共通設定(C)...」を選択。
「タスクトレイ」の「タスクトレイに常駐(R)」のチェックを外します。
「OK」をクリック。
今度は普通に、管理者権限で起動できました。「ファイル(F)」>「開く(O)...」を選択。
「C:¥Program Files¥mysql-8.0.3-rc-winx64¥my.cnf」を選択します。
編集できる状態で開けました。
・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 が使用されます。
「socket」は、Windowsの場合は特に関係ないってことですかね?
クライアントからMySQLサーバーに接続する場合、MySQLサーバーがローカルマシンでUnixなら、ソケット通信で接続できます。 サーバーが他のマシンになる場合は、TCP/IPなどで接続することになります。
ということで、こんな感じの設定。
「保存(S)」。
「はい(Y)」。
「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短縮」を確認。
「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"
として実行してみます。エラー。
「MySQL Server 5.7」の部分でもがっつり半角スペース入ってましたね(涙)
・シェルスクリプト-スペースが含まれる文字列を扱う CapmNetwork
⇧ 上記サイト様を参考に、「`(『Shift + @』で入力するバッククォート)」、「¥」を試すもエラー。
・コマンドプロンプトでのエスケープ文字 -標記の通り、コマンドプロンプ- 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"
ダブルクォーテーションの挙動はよく分からんですが、最終稿!
C:\PROGRA~1\MySQL\\"MySQL Server 5.7"\bin\mysqld --install mysqld57 --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"
とすればいけました。
ブログの編集でバックスラッシュが¥の特殊文字になってしまっていたので失敗してますが、バックスラッシュに修正すればいけました。
⇧ 左の『\』が正解。『¥』のほうのコードを実行してしまっていました。
サービスとして登録されているか確認。
GUIでも確認できます。
のWindowsアイコンを右クリックし、「コンピューターの管理(G)」を選択し、
左サイドバーから「サービスとアプリケーション」>「サービス」を選択。
それでは、 サービスとして起動!
NET START mysqld57
NET START mysqld80
動きました!
mysqld57(『MySQL 5.7.18』)のほうはポート番号が3306なので省略してアクセスできます。
mysqld80(『MySQL 8.0』)のほうはポート番号が3309なので、オプションでポート番号も指定する必要があります。
XAMPPのMySQLもポート番号3308にしてるので、無事起動できました。
phpMyAdminへもアクセスできました。
再帰共通テーブル式(再帰共通表式)まで 辿り着けなかったけど、MySQL 8.0が使える環境が整ったので、次回以降に試していきたいと思います。
今回も2日ぐらいハマってしまった(涙)。
番外篇 - NG集
エラー!「NET HELPMSG 3534」を入力するも、
気の利かないメッセージですよ!
windowsのイベントビューアーで確認できるようなので、確認。画面左下の
のWindowsアイコンの上で右クリックし、「コンピューターの管理(G)」を選択。
左サイドバーより、「イベント ビューアー」>「Windows ログ」>「Application」を選択し、「エラー」をクリックし、「詳細」タブで確認できます。
「failed to set datadir to C:\Program Files\MySQL\MySQL Server 5.7\data\」
データディレクトリないよって...ありますけど?というか、フォルダの場所は違うけど「C:¥ProgramData¥MySQL¥MySQL Server 5.7¥Data¥」ってフォルダはあるんですが。
「C:¥ProgramData¥MySQL¥MySQL Server 5.7¥my.ini」の設定のdatadirが認識されとらんですね...。
というか、zipファイル(『mysql-8.0.3-rc-winx64.zip』)に未変更のままのデータディレクトリなんてなかったけど...。
インストーラーでインストールしてたMySQL(『MySQL 5.8.17』)もデータディレクトリが、インストールディレクトリの下にできてないし...。なんか、リファレンスマニュアルに不信感が。
Windows では、データディレクトリは MySQL 配布に含まれています。
-
Windows 用の MySQL Zip アーカイブ配布には、未変更のままのデータディレクトリが格納されています。そのような配布を一時的な場所に解凍し、新規インスタンスをセットアップする場所にその
data
ディレクトリをコピーします。 -
Windows MSI パッケージインストーラは、インストールされたサーバーが使用するデータディレクトリを作成してセットアップするだけでなく、インストールディレクトリの下に
data
という名前の新しい「テンプレート」データディレクトリも作成します。MSI パッケージを使用してインストールが実行されたあと、テンプレートデータディレクトリをコピーして、追加の MySQL インスタンスをセットアップすることができます。
というエラーが起こってましたが、windowsのサービスをインストール (MySQLをサービスとして登録)する際に、--defaults-fileオプションを使っていなかったため、Xamppのほうのmy.ini(『C:¥xampp¥mysql¥bin¥my.ini』)の設定が利用されていたみたいです(涙)。