カテゴリー「mariadb」

しばらくぶりの投稿となってしまいました。。

ebonyrack の 0.8.0 をリリースしました。

https://github.com/shigenobu/ebonyrack/releases

0.7.1 – 0.8.0 での主な変更点は以下となります。

なお、0.7.2 でローカルデータベースの変更が入っているので、

旧バージョンでJSONにWriteしてから、新バージョンでJSONをReadしてください。


外部キーの参照される側のカラム(親テーブルのカラムといったほうがいいか)は、

主キーもしくはユニークキーであるようにしました。

もともと外部キーというのはそういうものですが、MySQL系はこの制約が緩く、

要はなんでもOKだったのです。

しかし、MySQL8.4から上記のように参照される側のカラムについて厳格になったので、

それに合わせた修正を行いました。

(※今まで緩すぎたのです。本来はこう有るべきなのです。)

アウトライン(左側の小さい画面)の描画回数が大きく、

CPU使用率が高かったので、500ミリ秒間は再描画しないようにしました。

また、オブジェクトを移動する際、マウスを押してから離す時間が長いと、

(0,0) に移動してしまう不具合があったので、修正しています。

DDLとクラスファイル出力時に、

出力条件(対象テーブルの設定とか、ファイルをどこに出力するか)を一定数保持して、

その条件を再度利用できるようしました。

何度もエクスポートしていると、条件を毎回入力しないといけないので、

この煩わしさのために対応しました。

実際に、プログラムファイルを出力することが多く、

対象テーブルの絞り込みやスキーマなどの出力条件を再利用できる形になって楽になりました。


やるやるいっている、検索の修正、VIEWの対応、外部キーパースなどは全く手を付けていないです。

ebonyrackは実案件でも使っているのですが、VIEWとか、外部キーパースは使わないですよね。。

というわけで、実際に使っているうちに遭遇した不具合とか、不都合の修正を行っていました。

そろそろ、JAVA21にしようかなというフェーズに来ています。

1.0.0 には21にしたいかなと。。

以上

投稿日時:2025年06月10日 22:20   カテゴリー:java, mariadb   [コメントがあればどうぞ]

0.7.0をリリースしました。

https://github.com/shigenobu/ebonyrack/releases

今月はがんばった。。

0.6.8、0.6.9、0.7.0での対応内容は以下となります。


一定サイクルでやらないとね。

HTMLのsvgにtextを埋め込み、検索可能としました。

FONTを合わせないと、検索のときにずれてしまうので、

FONTもGoogleFontから取得するよう、HTMLも修正しています。

CTR+Fで検索BOXが出現するようになりました。

workspace上で見えているテキストに対して検索し、

見つかった場合は、ワードをハイライトするとともに、

ワードを含んでいないオブジェクトを目立たないようにしました。

とはいえ、改善の余地がある感じではあります。

これまではサイドのオブジェクト名をクリックすると、

ワークスペースの該当オブジェクトに移動し、フォーカスさせていました。

これを、クリックまたは十字キー選択では、該当オブジェクトに移動するにとどめ、

ダブルクリックまたはENTERキーで、フォーカスさせるようにしました。

これは検索時にサイドのオブジェクト名を目立たせないようにしたため、

クリックでフォーカスを当てると操作性が悪くなるためです。

また、ワークスペース上でフォーカスを持っているオブジェクトに対して、

サイドが連動して選択状態になるようにしています。


今回の検索機能で、指定のオブジェクトのみを目立たせることは不要になったので、

予定を修正して、以下のプランで今後を進めようかと思います。

  • ANTLRによる外部キーパース
  • VIEWの対応
  • 検索の改善(小さな表示スペースで、前・次で飛べるようなイメージ)
  • テストデータ作成

テストデータ用のINSERT文作成というのが正確ですが、開発中にあると便利だなと思いました。

他のツールでもあったりするようなので、優先度上げてやってみようかなと思ってたりします。

以上

投稿日時:2024年10月30日 22:19   カテゴリー:mariadb   [コメントがあればどうぞ]

mysqlで連番を生成しようとすると以外と難しいです。

再起CTEなんかでやらないといけないかなと。

mariadbではsequence storage engineの機能を使うと、とてもかんたんです。

https://mariadb.com/kb/en/sequence-storage-engine

に書いてあるとおりです。

↓の感じですね。

> select * from seq_1_to_10;
+-----+
| seq |
+-----+
|   1 |
|   2 |
|   3 |
|   4 |
|   5 |
|   6 |
|   7 |
|   8 |
|   9 |
|  10 |
+-----+

なんで連番を生成したいかというと、歯抜けが許されない場合があるからですね。

たとえば、↓のような状況だったとします。

> CREATE TABLE `active` (
  `ymd` date NOT NULL,
  `cnt` int(11) NOT NULL,
  PRIMARY KEY (`ymd`)
);

> select * from active;
+------------+-----+
| ymd        | cnt |
+------------+-----+
| 2024-10-01 |  10 |
| 2024-10-02 |   7 |
| 2024-10-04 |  11 |
+------------+-----+

見てのとおり、「2024-10-03」のデータがありません。

ここで連番テーブルとLEFT JOINすることで、

「2024-10-03」を「0」として計上できます。

↓の感じですね。

> with
t as 
(
  select date('2024-10-01') + interval seq day as ymd from seq_0_to_3
)
select
  t.ymd as ymd,
  coalesce(active.cnt, 0) as cnt
from
  t
  left outer join
  active
  on t.ymd = active.ymd
order by
  t.ymd
;
+------------+------+
| ymd        | cnt  |
+------------+------+
| 2024-10-01 |   10 |
| 2024-10-02 |    7 |
| 2024-10-03 |    0 |
| 2024-10-04 |   11 |
+------------+------+

まあ、今更ですが、意外と連番生成は求められるので、

mariadbであるなら、sequence storage engineをつかうと楽ですよ、ってことですかね。

以上

投稿日時:2024年10月19日 00:02   カテゴリー:mariadb   [コメントがあればどうぞ]

0.6.7をリリースしました。

https://github.com/shigenobu/ebonyrack/releases

0.6.5、0.6.6、0.6.7での対応内容は以下となります。


これは、「use 〇〇;」をDDLファイルの先頭に入れるためです。

オブジェクト(テーブル、シーケンス、ノート)は、今までも右クリックでコピー&ペイストができたのですが、

CTR+CとCTR+Vの操作に対応しました。

CTR+Vでは、最も新しいコピー元を貼り付けます。

テーブル内のカラム一覧に、挿入貼り付けを対応しました。

これは大量のカラムを登録したいときに、エクセルなどで予め準備しておくことで、

一気に挿入可能となるものです。

「Column name」のセルの背景が薄い赤になっているので、

ここに対してCTR+Vで挿入貼り付けとなります。

また、DELキーで複数行の削除が可能となります。

「Edit」のメニューに追加しています。

テーブルやシーケンスの情報を一括更新可能です。

テーブルでは、カラムグループとパーティションも編集可能です。

薄紫のセルに対して、CTR+Vをすることで、上書き貼り付けが可能です。

エクセルで変換情報を用意しておき、貼り付けるとよいかなと思います。

また、パーティションを一気に付与するなどができるようになっています。

(パーティションってあとでやる場合も多いので)

今まではオブジェクト1つずつしか移動できませんでしたが、

SHIFT+左クリックで対象を複数選択し、移動することができるようになりました。

オブジェクトの重なり合いが少し微妙な部分はありますが、操作性の向上は図れています。


JTableのセル操作の向上が難しく、エクセルとの併用のほうが良いかと思い、

貼り付けなどを対応している感じになってます。

今後ですが、

  • 特定の名称パターンのオブジェクトのみを表示する(例えば「shop」が含まれているテーブルだけ表示するなど)
  • VIEWの対応

あたりを優先的に考えてます。

その他としては、

  • 外部キーのDDLを読めるようにする(ANTLRのパースで、自前で生成したものくらいは読めるようしたいかな)
  • FUNCTION/TRIGGER/PROCEDUREの追加
  • 検索機能
  • データ作成機能

あたりを考えています。

以上

投稿日時:2024年10月18日 23:40   カテゴリー:java, mariadb   [コメントがあればどうぞ]

MariaDBの同一ホスト間のデータ同期システムとして作っていたmagentadeskなのですが、

0.7.0のリリースで、MySQL 8.0.31 と 8.0.32 の対応を入れました。

https://github.com/shigenobu/magentadesk

なんで今までやらなかったかというと、

  • テーブルの解析でのinformation_schemaの格納のされ方が微妙にMariaDBとMySQLで異なる
  • MySQLではEXCEPTが8.0.31までなかった
  • MariaDBのdynamic columnに相当する機能がMySQLでは賄えるか不安だった
  • シーケンスがないのをどうするか

といったところでしたが、MySQL 8.0.31でEXCEPTが入ったので、

本腰入れて対応してみました。

やってみて色々大変でした。

なかでもUNIONの動作がおかしくて、無理やりやる感じでした。

MariaDBとMySQLでのUNIONの動作を見てみます。


まず以下のデータを用意します。

> select * from base;
+------+
| c    |
+------+
|    1 |
|    2 |
+------+

> select * from compare;
+------+
| c    |
+------+
|    1 |
|    3 |
+------+

次にこんなSQLを投げます。

with 
t1 as 
(
  select * from base
  except
  select * from compare
),
t2 as 
(
  select * from compare
  except
  select * from base
),
tt1 as 
(
  select 
  json_object('c', t1.c) as b,
  json_object('c', t2.c) as c
  from
  t1
  left outer join
  t2
  on t1.c = t2.c
),
tt2 as 
(
  select 
  json_object('c', t1.c) as b,
  json_object('c', t2.c) as c
  from
  t1
  right outer join
  t2
  on t1.c = t2.c
),
t as 
(
  select * from tt1
  union
  select * from tt2
)
select * from t;

ちょっとややこしいのですが、

MariaDBとMySQLの結果を見てみます。

(MariaDB)

+-------------+-------------+
| b           | c           |
+-------------+-------------+
| {"c": 2}    | {"c": null} |
| {"c": null} | {"c": 3}    |
+-------------+-------------+

(MySQL)

+-------------+-------------+
| b           | c           |
+-------------+-------------+
| {"c": 2}    | {"c": null} |
| {"c": 1}    | {"c": 1}    |
| {"c": null} | {"c": 3}    |
+-------------+-------------+

いやー、MySQLの結果がおかしいですよね。これ仕様なのか?

EXCEPTで除いている筈なのに。。

MySQLのUNIONは結構昔から不具合あるようで、

なんかこうなってくると複雑な集計クエリーを投げるのがちょっと怖い感じもしますね。

現状では、気をつけましょうとしかいいようがないですが。。

以上

投稿日時:2024年09月26日 00:43   カテゴリー:java, mariadb, mysql   [コメントがあればどうぞ]

Rolling release(つまりSTS)なのですが、2024年8月にMariaDB11.5がGAになりました。

(参考)

https://mariadb.com/kb/en/changes-improvements-in-mariadb-11-5

気になっていたtimestamp拡張が入り、

2106-02-07 06:28:15 UTC

までtimestampを扱えるようになりました。

実際に、10.11と11.5で比較してみました。

なお、timezoneは日本にしています。


MariaDB 10.11

-- int max
> set timestamp = 2147483647; select now();
Query OK, 0 rows affected (0.000 sec)

+---------------------+
| now()               |
+---------------------+
| 2038-01-19 12:14:07 |
+---------------------+
-- int max + 1
> set timestamp = 2147483648; select now();
ERROR 1231 (42000): Variable 'timestamp' can't be set to the value of '2147483648'
+---------------------+
| now()               |
+---------------------+
| 2038-01-19 12:14:07 |
+---------------------+
-- unsigned int max
> set timestamp = 4294967295; select now();
ERROR 1231 (42000): Variable 'timestamp' can't be set to the value of '4294967295'
+---------------------+
| now()               |
+---------------------+
| 2038-01-19 12:14:07 |
+---------------------+
-- unsigned int max + 1
> set timestamp = 4294967296; select now();
ERROR 1231 (42000): Variable 'timestamp' can't be set to the value of '4294967296'
+---------------------+
| now()               |
+---------------------+
| 2038-01-19 12:14:07 |
+---------------------+

見てもらえればわかりますが、

2038-01-19 12:14:07

が限界となっています。


MariaDB 11.5

-- int max
> set timestamp = 2147483647; select now();
Query OK, 0 rows affected (0.001 sec)

+---------------------+
| now()               |
+---------------------+
| 2038-01-19 12:14:07 |
+---------------------+
-- int max + 1
> set timestamp = 2147483648; select now();
Query OK, 0 rows affected (0.001 sec)

+---------------------+
| now()               |
+---------------------+
| 2038-01-19 12:14:08 |
+---------------------+

この時点で、超えましたね。

-- unsigned int max
> set timestamp = 4294967295; select now();
Query OK, 0 rows affected (0.001 sec)

+---------------------+
| now()               |
+---------------------+
| 2106-02-07 15:28:15 |
+---------------------+
-- unsigned int max + 1
> set timestamp = 4294967296; select now();
Query OK, 0 rows affected, 1 warning (0.001 sec)

+---------------------+
| now()               |
+---------------------+
| 2106-02-07 15:28:15 |
+---------------------+

> show warnings;
+---------+------+---------------------------------------------------+
| Level   | Code | Message                                           |
+---------+------+---------------------------------------------------+
| Warning | 1292 | Truncated incorrect timestamp value: '4294967296' |
+---------+------+---------------------------------------------------+

unsigned int の最大値を超えるとwaningはでましたが、

2106-02-07 15:28:15

まで最大値が伸びているようです。


そもそも、timestampをunsignedにしたというのは、ドライバー影響を抑えるという名目だったかなと。

で、実際に以下のようにデータを入れてみます。

CREATE TABLE `t1` (
  `c1` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
insert into t1 values ('2106-02-07 15:28:15');
> select * from t1;
+---------------------+
| c1                  |
+---------------------+
| 2106-02-07 15:28:15 |
+---------------------+

これをPHPとC#(mysqlconnector)で取得してみたところ、

2106-02-07 15:28:15

が取得できることは確認できました。

MySQL側も同様の対応をしてくれると嬉しいです。

以上

投稿日時:2024年09月26日 00:18   カテゴリー:mariadb   [コメントがあればどうぞ]

大したリリースではないのですが、記載します。

https://github.com/shigenobu/ebonyrack/releases

0.6.1と比べて、

・マルチディスプレイの修正

・tableのカラムのテキスト部分をダブルクリックで選択可能(コピーしやすいように)

・読み込み専用モードで開く環境変数追加

という薄い内容です。

tableのカラムのテキストを選択可能とするのは意外と難しく、

もともろJLabelでやっていたのですが、JLabelではテキスト選択ができないため、

JTextFieldにして、ダブルクリックイベントで、コメントの部分の選択範囲を修正するなどの対応を行っています。

やりたいことが難しくて、なかなか進まない現状。。

外部キーのANTLRのパースとかも入れたほうがいい気がしてきています。。

以上

投稿日時:2024年07月09日 23:37   カテゴリー:java, mariadb   [コメントがあればどうぞ]

忙しくて放置気味でしたが、

MariaDB11.4がLTSとして2024年5月にリリースされました。

https://mariadb.com/kb/en/changes-improvements-in-mariadb-11-4

2029年5月までのサポートとなります。

見落としていたのですが、またリリースサイクルが変わったようで、

次のLTSも1年後とかなのかなと思います。

注目していたtimestamp型の拡張は、11.5に見送られたようですね。

また、自分の作成している

https://github.com/shigenobu/magentadesk

もv0.6.2で11.4対応しました。

以上

投稿日時:2024年06月24日 22:33   カテゴリー:mariadb   [コメントがあればどうぞ]

ちょこちょこ作業してます。

https://github.com/shigenobu/ebonyrack/releases

たまには画面もつけてみよう。(GITHUBに載せたままですが)

v0.5.2からv0.6.1までの主な変更は以下のとおりです。

  • テーブル・シーケンスの右クリックに「Edit」追加(ダブルクリック以外でも開けるように)
  • DDLインポート修正(DOCコメントの不具合、カラムオプションに生成列とチェック制約を登録できるように)
  • 起動時に最新バージョンのチェックを行う(古いバージョンの場合最新バージョンのリンクが表示されます)
  • HTMLにおいて、ダイアログの外側をクリックしたときに、ダイアログを閉じる処理を追加

やりたいことはたくさんあるのですが、なかなか実装が難しいので、

とりあえず未来のTODOを記録しておきます。

  • VIEWの対応
  • TRIGGERの対応
  • FUNCTIONの対応
  • PROCEDUREの対応
  • まとめて行う処理諸々(テーブルやパーティションに対してのグループの一括付与・除去とか、テーブルからカラムをまとめて付与・除去とか)
  • カラムを選択可能にしたい(JEditorPaneとか)
  • オブジェクトの複数一括移動
  • オブジェクトのグループ化みたいなもの

うーん、どれも難しい。。

以上

投稿日時:2024年04月25日 00:22   カテゴリー:java, mariadb, mysql   [コメントがあればどうぞ]

1ヶ月ほど立ちましたが、MariaDB 11.3がGAされました。

https://mariadb.com/kb/en/mariadb-11-3-2-release-notes/

※debianパッケージで不具合があるようですが。。

11系のGAはまだですが、11系のリリースを少しピックアップしてみます。


(11.0)

・オプティマイザのコストが進化

(11.1)

・DATE関数、YEAR関数の左辺配置でもINDEXが利用されるよう修正

(11.2)

・オンラインDDLの修正

(11.3)

・リダイレクトの導入

・DATE_FORMAT関数にタイムゾーンの書式追加


ぱらっと見た限り、日付系の対応がちょこちょこはいっており、

タイムゾーン(datetime with timezone みたいな)に対応していくような動きですね。

次の11.4では、timestampの変更(intからunsignedへの変更、ドライバー影響を抑えるため)が予定されており、

2039年問題が伸びるので、それまでに新しい型の導入を進めていく感じになるのでしょうか。

このあたりは、MySQL側の動きにも注目ですね。

で、個人的にちょっと気になったのは、11.2でのオンラインDDLの修正でしょうか。

(参考)

https://mariadb.com/resources/blog/alter-table-is-now-universally-online/

MySQLではオンラインDDLというと、「LOCK=NONE」なもの、

つまりALTER中も並行してDMLを受け入れるというものです。

「LOCK=NONE」なDDLというと、基本的には「ALGORITHM=NOCOPY」のもの、

「INSTANT」や「INPLACE」のみでした。

11.2の対応では、「ALGORITHM=COPY」も「LOCK=NONE」で動作するようになりました。

すべての動作ではないようですが、参考ページによるとおおよそ以下のDDLが「LOCK=NONE」となったようです。

  • カラムのデータ型変更
  • カラムをNOT NULLに変更
  • 制約のないカラムに対してDEFAULTの追加
  • STOREDの生成列の追加
  • チェック制約の追加
  • 主キーの削除
  • パーティションテーブルへの変更または削除
  • システムバージョニングの追加
  • オートインクリメントの追加

細かい制約もあるようなので、参考ページをちゃんと読んでもらえばと思います。

MySQLでは、

https://dev.mysql.com/doc/refman/8.0/ja/innodb-online-ddl-operations.html#online-ddl-foreign-key-operations

ということで、見比べてみると、拡張されたことがわかるかと思います。

とはいえ、DDLの適用コストは、INSTANTのような軽さはないので、油断はせずいてもらればと思います。

ちなみに、INSTANTの適用範囲は、以前書いたものから変わっていないようです。

※metaデータロックはかかりますのでご注意を。

また、magentadeskのv0.6.1が、MariaDB 11.3対応しています。

https://github.com/shigenobu/magentadesk

以上

投稿日時:2024年03月21日 23:20   カテゴリー:mariadb, mysql   [コメントがあればどうぞ]