MySQLでマテリアライズド・ビューFlexviewsを試してみる

目次

はじめに

マテリアライズド・ビューと言えば、Oracle Databaseに存在するスキーマ・オブジェクトですが、残念ながらMySQLには同等の機能は存在しません。

MySQLの入門書で、マテリアライズド・ビューの代替手段として「Flexviews」というサードパーティツールが紹介されていたのを見かけました。

 高速リフレッシュを頑張るとなると、本家の高速リフレッシュは「ベーステーブルに対する更新の差分を別領域に保管しておき、その部分だけを再計算して適用」ですので、それに近づけるならバイナリログをパースして適用することになるでしょう(事実、遠い遠い昔からそのコンセプトで開発されたFlexviews注3.35というサードパーティーツールがあります。日本で使われているのは見たことがありませんが)。
注3.35 https://github.com/greenlion/swanhart-tools/tree/master/flexviews

引用:yoku0825、北川健太郎、tom__bo、坂井恵『MySQL運用・管理[実践]入門 〜安全かつ高速にデータを扱う内部構造・動作原理を学ぶ』技術評論社、2024年5月22日、p.67

今回はFlexviewsをインストールから実際に動作させるまでのデモンストレーションを行いたいと思います。
ただし、FlexviewsはMySQL 5.1の頃に開発されたツールであり、4年前から更新が止まっている状態となっています。GitリポジトリのREADMEにも、プロジェクト廃止の旨が書かれています。製作者は、AWS上で使えるMySQLディストリビューションを作成し、提供する方向にシフトしたそうです。
動作の保証はないため、使用は自己責任でお願いします。

最新のLTSリリースであるMySQL 8.4 LTSで動作させるためには、何点かスクリプトを修正する必要がありましたので、その経緯も含めて説明していきます。(例:MASTER/SLAVE語句廃止など)

検証環境

インストール

インストール手順は、以下のブログを参考に進めていきます。
Using Flexviews – part two, change data capture

Flexviewsの動作要件は以下です。

  • MySQL 5.1以降
  • 行ベースのログ記録 (binlog_format=1)
  • my.cnf 内の一意の server_id
  • log_slave_updates=1(MySQLスレーブの場合)
  • transaction_isolation=READ-COMMITTED

設定ファイルの変更

要件に適合するようにmy.cnfを設定します。

Gitリポジトリからクローン

FlexviewsをGitリポジトリから取得します。

Flexviews設定ファイルの変更

mysqlbinlogバイナリの場所を確認しておきます。

設定ファイルを編集します。

セットアップスクリプト実行

セットアップスクリプトを実行します。

エラー対策1-1

phpパッケージが不足していたので、インストールします。

エラー対策1-2

SHOW MASTER STATUSでエラーになりました。

MASTER語句はMySQL 8.4 LTS以降で削除されました。

Features Removed in MySQL 8.4

SHOW MASTER STATUS: Use SHOW BINARY LOG STATUS.

引用:MySQL :: MySQL 8.4 Reference Manual :: 1.4 What Is New in MySQL 8.4 since MySQL 8.0

代わりに、SHOW BINARY LOG STATUSを使用します。
該当ファイルの文字列を置換します。


セットアップスクリプトを実行し、正常終了しました。

バックグラウンド処理の実行

変更ログ作成処理のバックグラウンドプロセスを実行します。

インストールスクリプトの実行

次に、INSTALLファイルの記述を参考にインストールスクリプトを実行します。

エラー対策2-1

local_infileを有効化する必要があります。
クライアントとサーバー両方で有効化します。

サーバーの設定を変更します。

クライアントは--local-infile=1を指定して接続するようにします。

エラー対策2-2

ユーザ作成でエラーとなりました。

GRANTでユーザ作成と同時に権限付与する方法はMySQL 8.0以降で削除された機能です。

MySQL 8.0 で削除された機能

GRANT を使用したユーザーの作成。 かわりに、CREATE USER を使用してください。

引用:MySQL :: MySQL 8.0 リファレンスマニュアル :: 1.3 MySQL 8.0 の新機能

CREATE USERと、GRANTを2文に分けて実行します。
インストールスクリプトを修正します。

エラー対策2-3

storage_engineというシステム変数がないためエラーとなりました。

storage_engineシステム変数はMySQL 5.7以降で削除されました。
代わりにdefault_storage_engineシステム変数を使用します。

Features Removed in MySQL 5.7

The storage_engine system variable. Use default_storage_engine instead.

引用:MySQL :: MySQL 5.7 Reference Manual :: 1.3 What Is New in MySQL 5.7

スクリプトを修正します。

エラー対策2-4

ブロックコメント/* */の最後にセミコロンが無かったため、エラーとなりました。

他のsqlファイルの書式に倣って、DELIMITER ;;の位置を20行目から1行目に移動します。

エラー対策2-5

Warningが出ています。

mysqlbinlogから読み取ったバイナリログに空行が含まれていたため、エラーになっていました。
空行が来ても良いように、null避けを追加します。


インストールが正常終了しました。

マテリアライズド・ビュー作成とリフレッシュ

flexviews_demo/INSTRUNCTIONSファイルの記述に従い、デモを行っていきます。
マテリアライズド・ビューを作成し、マスター表のデータを更新し、リフレッシュでデータが最新化されることを確認したいと思います。

Step 1: マスター表の作成

マスター表を作成し、デモ用のデータを投入します。

Step 2: マテリアライズド・ビューログの作成

マテリアライズド・ビューログを作成します。

作成したテーブルの名前はディクショナリテーブルから確認できます。

試しに一つSELECTしてみますが、中身は空です。

マテリアライズド・ビューがDMLで変更されるたびに、ここに変更ログが記録されていきます。

Step 3: マテリアライズド・ビューの作成

マテリアライズド・ビューを作成します。

エラー対策3-1

作成エラーになりました。

refresh_step_info.last_step_at列がNOT NULL制約に違反しているので、テーブル定義を変更します。

重複作成でエラーになるため、一旦削除して仕切り直します。
(作成途中のゴミが残って削除し切れないので、ディクショナリテーブルをTRUNCATEしてしまいます。)


views.sqlをインポートし、正常終了しました。

Step 4: データを参照

マテリアライズド・ビューからサンプルデータをSELECTします。

マテリアライズド・ビューの定義を取得するにはget_sqlファンクションを使用します。

Step 5: マスター表のデータを更新

マスター表のデータを1行更新します。

変更ログがマテリアライズド・ビューログに記録されます。

  • dml_typeはINSERTで1、DELETEで-1、UPDATEは-1の後に1で記録されます。
  • UPDATEの結果通りにQuantityが+100加算されていることがわかります。

マテリアライズド・ビューはまだリフレッシュしていないので、値に変化はありません。

Step 6: マテリアライズド・ビューのリフレッシュ

マテリアライズド・ビューをリフレッシュします。

Step 7: リフレッシュ結果の確認

マテリアライズド・ビューのデータが最新化されていることを確認します。

おわりに

本記事で修正したスクリプトを盛り込んでアップロードし直したGitHubのForkを公開しています。お気軽に動作検証をお試しください。

MySQLでマテリアライズド・ビューを実現するツールとしてFlexviewsを紹介しました。本記事では紹介しきれませんでしたが、差分リフレッシュ・完全リフレッシュどちらも扱えたり、ほとんどの集合関数にも対応しているようです。ただ開発停止なので今後MySQLに大きなアップデートが来た場合に動作しなくなることも考えられます。導入は慎重にご検討くださいませ。

スマートスタイルTECHブログについて

スマートスタイルTECHブログでは、日頃MySQLのサポート業務に従事している有資格者で構成された技術サポートチームがMySQLに関する技術情報を発信しています。データベースのお困りごとはお気軽にご相談下さい。

よかったらシェアしてね!
  • URLをコピーしました!
目次