MySQL闇歴史2 書き戻せないmysqldump

これは MySQL闇歴史 Advent Calendar 2022 の2枚目のカレンダー6日目のエントリーです。


昔、mysqldumpでダンプしたデータをリストアできないことがあった、と言ったら、あなたは信じるだろうか。


知名度:★★★☆☆
闇度 :★★★☆☆
個人的な思い出度:★★★★★


 MySQL 4.0 の時代、mysqldumpでダンプしたデータをリストアする際に、確実に失敗する事象があった。テーブルにとあるデータ型を使っていた場合だ。なんの型か、想像がつくだろうか。

 そう。BLOBだ。MySQL 4.0.22 まで、なんとmysqldumpは、BLOBカラムの内容をそのままバイナリで吐き出していたのだ。ダンプされたファイルをテキストエディタで覗いてみると、まるで滅茶苦茶である。これでは書き戻しができるわけがない。
 そこで、BLOBカラムの場合は HEX文字列化してダンプする提案をし、中の人に実装してもらった。書き戻しも正常に行えるようになって快適になったこの修正(--hex-blob オプション)は、2004年12月のMySQL 4.0.23 および 4.1.8 にて公開された。
 

MySQL 4.0 Release Note より


 その直後、モンティ氏によって、BLOB型だけでなくBINARY属性のついた文字列カラムにまで適用範囲を広げられてしまった。当時我々日本人は、文字化けを防ぐためだったか期待せぬマッチをされぬためだったか、VARCHAR()列には BINARY 属性をつけることが常識となっていたと記憶している。普通に文字列のままダンプしてくれて何も問題がなかったところ、そのあたりすべてが HEX表記でのダンプとなってしまい、ダンプ結果が目視しにくくなってしまった。「おもてたんとちがう」というオチがついてしまった格好だ。

MySQL闇歴史2 懇親パーティ 割れたワイングラス

これは MySQL闇歴史 Advent Calendar 2022 の2枚目のカレンダー4日目のエントリーです。


 ここは、とあるMySQLのパーティ。突然ホール内に鳴り響くグラスの割れる音。いったい何が・・・・!?


知名度   :★☆☆☆☆
闇度    :★☆☆☆☆
アルコール度:★★★★★


 あれはお台場の科学未来館で開催されたMySQLのカンファレンスだっただろうか。日本市場にさらに勢いをつけたいMySQL社は、パワフルな来日チームを組んで日本に乗り込んできた。ファウンダーのモンティ氏、CEOのマーティン・ミコス氏、「知の巨人」ブライアン・エーカー氏、コミュニティ担当のカイ・アーノ氏などなど錚錚たる顔ぶれだ。MySQL公用語である「へたな英語」が飛び交う中、英語にコンプレックスを持つ私も、下手すぎる英語を駆使して必至にコミュニケーションを取ろうとしていた。

 日中のセミナーが終わり、立食形式のパーティ中。突如、ミコス氏が歌をうたうと言う。フィンランドでは酒の席でこういう歌をうたうんだ、と聴かせてくれた声はよく通る、低く、力強いものだったと記憶している。 会場では聴いている人半分、関心を寄せずに他のことをしている人半分という、よくあるパーティ風景だったろう。

 歌い終わるとミコス氏は突如、グラスを自身の後ろに向かって投げ捨てた。グラスが割れる高く鋭い音が会場に響く。一瞬その場が凍り付いた後、ざわつく会場。日本にいる我々がグラスの割れる音を聞くのは、酔っ払いが倒れた時か、会場で喧嘩が起こった時か、あるいは、みんなの前で話したり歌ったりしている人があまりに皆が聞いてくれないので怒り狂ったときか、それくらいであろう。平常時には聴かない音なのである。「何が起きた!?」という不安の空気となったように記憶している。

 グラスを投げ捨てるという「勢いのある行動」に会場喝采となることを氏は期待していたのかもしれない。であれば、日本でのざわざわした反応にミコス氏はさぞ戸惑ったであろうと考えると、お互いのささやかな異文化交流に些かの可笑しな気持ちを抑えられない思い出となったのであった。
 このときの動画が今も残っているという話も聞く。お持ちの方はご自身のブログやその他の手段で、ぜひ情報提供いただきたい。
 
 余談ながら、その後、どこをどう歩いたのか把握していないが、結構な距離をみんなでぞろぞろ歩いてお寿司を食べに行ったのも、古き良き思い出である。


 なお、なにぶん古い話なので、記憶違いで書いている部分があった場合はご容赦願いたい。そもそも別のイベントでの話だったかもしれないし、タイトルにワイングラスと書いたが普通のビールグラスだったかもしれない。


2022/12/05追記:
 梶山さんが当時の動画を紹介してくれた。本エントリで紹介したイベントのものではないが、MySQL AB 内ではこういった盛り上がりが「定番」だったらしい。
qiita.com



 >

An image by Dall-E

MySQL闇歴史2 主力商品になりたかった?MySQL Workbench

これは MySQL闇歴史 Advent Calendar 2022 の2枚目のカレンダー3日目のエントリーです。


 多くの人が便利に利用しているであろう MySQL Workbench。このプロダクトを、単独での売上の柱のひとつとすることを模索していたと思われる時期があった。


知名度   :★★★★☆
闇度    :★☆☆☆☆
便利に感謝度:★★★★★


 MySQL Workbench (以下 Workbench) は、2005年9月に最初のアルファ版が公開された後、2008年4月にバージョン 5.0.19として正式リリースされた。なかなかの難産である。
 翌2009年のバージョン5.2を経て2013年のバージョン 6.0の頃だっただろうか。Workbenchのダウンロードページに突如、お値段が登場した。サブスクリプション形式で、年間1万円程度だったと記憶している。SE(Standard Edition)は無料、EE(Enterprise Edition)は有料。しかし比較的基本的と思われる重要機能が EE版でのみ使えるなど、なんとか買わせようという努力を、当時の私は感じていたように思う。

 現在も、MySQL Workbench 自体は CE(Community Edition)/SE/EE とエディションが分かれているが、SE/EEらの単体での提供はなくなり、これらは MySQL Enterprise の契約によって使える版となったようだ(私が Enterprise について詳しくないので、認識違いがあったらご容赦いただきたい)。現在の各エディションの機能の違いについては、本文末尾のリンク先を確認いただきたい。

 いま、無料で使えるコミュニティ版のMySQL Workbench ダウンロードページに行ってみると、このソフトに単独で値段がついていたことを感じさせる面影すらない。単体販売の夢破れたりと言う向きもあろうが、この素晴らしいソフトがCEとして無料で提供されていることに、利用者としては大きな感謝を送りたいと思う。

参考リンク:

MySQL Workbench画面イメージ from https://www.mysql.com/jp/products/workbench/dev/

MySQLのデータをApache Arrow形式で取り出す

これは、MySQL Advent Calendar 2022 の2日目のエントリです。

きっかけ

 最近、MySQL上のデータを Apache Arrow形式で取り出したいという機会を得ました。珍しいケースかもしれませんが、世の中にあまり情報も多くないようなので、ここに記録をしたためる次第。

環境・前提条件

 今回は以下の環境で動作確認をしました。

mysql2arrow のビルド

 mysql2arrow は、PG-Stromのリポジトリに含まれているものを自分でビルドして使います。

1. ビルド環境の整備

 だいたいこの辺のものを使います

$ sudo apt install gcc make build-essential libtool libssl-dev -y
2. PG-Stromソースコードの取得

 GitHubで公開されているので、cloneしてきます。

$ git clone https://github.com/heterodb/pg-strom
3. mysql2arrowのビルド

 今回は mysql2arrow が欲しいだけなので、PG-Strom全体をビルドせずに、ピンポイントで make します。MySQLがインストールされていない場合は mysql2arrowはビルドできません。

$ cd  pg-strom/arrow-tools
$ make mysql2arrow
4. arrow2csvのビルド

 今回は特に必要ないのですが、arrowファイルの中身をcsvファイルとして取り出せる arrow2csv というのもリポジトリに含まれているので、ついでにビルドしておくと便利

$ make arrow2csv

※ その他、例えば pg2arrow を make したい場合は PostgreSQLがインストールされている必要あり

mysql2arrow実行環境の整備

 mysql2arrowでは、日付時刻データの取り出し時にMySQL内部にあるタイムゾーン文字列の情報を使用します("UTC"とか"JST"など)。この情報は mysql.time_zone_name テーブルにあるのですが、デフォルトではこのテーブルにデータは含まれていないため、ここで手動で追加します(インストール方法に依るのかもしれません)。
 テーブルにデータが登録されているかを確認するには、以下のクエリが良いでしょう。

select * FROM mysql.time_zone_name;

 登録されていない場合、コマンドラインから mysql_tzinfo_to_sql コマンドを使用して登録します。

$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -pMyPa5$w0Rd mysql

 いくつかエラーが出るけど、ぱっと見、魅力のなさそうな(主観)ファイルなので、今回は無視しておく。

mysql: [Warning] Using a password on the command line interface can be insecure.
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.

mysql2arrow の実行方法

 テーブルを指定して、テーブルまるごとを Arrowファイルに吐き出させる方法と、クエリを指定して、クエリの実行結果をArrowファイルに吐かせる方法の2種類があります。

テーブルまるごとを吐かせる方法

 -t オプションでテーブル名を指定する。パスワード指定は、小文字5文字mysqlコマンドの場合は小文字のpだが、mysql2arrowでは大文字のPであることに注意。
 -d はデータベース名
 -o は出力先ファイル名

./mysql2arrow -uroot -PMyPa5$w0Rd -dtest -tmytable01 -oout.arrow
クエリを指定して吐かせる方法

 テーブル指定の場合は -t だったが、クエリを指定したい場合は代わって -c を使用する。

./mysql2arrow -uroot -PMyPa5$w0Rd -dtest -c"SELECT id, name, count(*) FROM mytable01 WHERE xxxx GROUP BY id, name;"  -oout.arrow

 どちらの方法も、あっさりと Arrowファイルに出力される。

余談: Arrowファイルの中身

 出力された Arrowファイルの中身を覗いてみます。Arrowファイルはいわゆるカラム型のストアなので、Nameカラムの中身(name001 name002....)が連続してかたまっていたり、ZipCodeカラムの中身(123-4567 234-567...)がかたまっていたりすることがわかります。面白い。

MySQLのGIS機能2022

このエントリは、RDBMS-GIS(MySQL,PostgreSQLなど) Advent Calendar 2022 の1日目です。「RDBMS-GIS Advent Calendar」では参加者を絶賛募集中です。今年も、ご自由にお気楽に参加ください。

さて。

MySQL の Spatial機能(GIS機能)、2022年の進化のまとめです。MySQLは臨時のリリースがない限りは通常、3ヶ月に一度、年4回のアップデート・バージョンが公開されます。
リリースノートから、この1年の進化を見てみましょう。

といいつつ実は、2022年は、あまり大きな進化のない1年でした。新機能追加してくれないと、私、飽きちゃうぞっ!

MySQL 8.0.28(2022年1月)

 MBRContains() 関数が遅かった(空間インデックスをちゃんと使わないことがあった)のが改善されたようです。

Queries making use of the MBRContains() function did not employ all available spatial indexes. (Bug #32975221)
References: This issue is a regression of: Bug #29770705.

MySQL 8.0.29(2022年4月~その後リリース取り下げ)

 Spatial機能に関する変更点、なし

MySQL 8.0.30(2022年7月)

 リリースノートによると、2件の関連修正が含まれています。

一点目は、ST_Transform()の使いどころの拡大。平面直角座標系への変換をサポートするようになったようです。SRID 3857の、いわゆる「Webメルカトル」がサポートされたとのこと。日本の平面直角座標系(JGD2000だと SRID 2443〜2461) はまだかなぁ。。

Previously, the ST_TRANSFORM() function added in MySQL 8.0.13 did not support Cartesian Spatial Reference Systems. Beginning with this release, support is provided by this function for the Popular Visualisation Pseudo Mercator (EPSG 1024) projection method, used for WGS 84 Pseudo-Mercator (SRID 3857).


もう一点は、全バージョンで混入したバグの修正。 MySQL 8.0.29 でBoostライブラリ(Ver. 1.77.0)にしたらエリア計算の方法が変わってしまい、既存の空間インデックスに問題が発生していたとのこと。

Upgrading to MySQL 8.0.29 led to issues with existing spatial indexes (see Creating Spatial Indexes). The root cause of the problem was a change in how geographic area computations were performed by the included Boost library, which was upgraded to version 1.77.0 in MySQL 8.0.29. We fix this by ensuring that we accommodate the new method whenever such computations are performed. (Bug #107320, Bug #34184111)

References: This issue is a regression of: Bug #33353637.

MySQL 8.0.31(2022年10月)

 Spatial機能に関する変更点、なし

全体を通して

 冒頭でもコメントしたとおり、MySQLのSpatial機能の進化に期待する身としては、非常に地味な1年となりました。Spatial機能に関する修正が入ったのが4回のリリース中2回にとどまっています。Spatial機能は半年に一度という方針なのか、たまたまこうなったのか、引き続き2023年も注視していきたいと思います。
 個人的には、最近少し PostGISも触りはじめたこともあって、MySQLの進化が停滞するならば、そのうち私、「PostGISさいこー」とか言い始めちゃうぞ~!(笑)
PostGISが関数の充実度、長年の実績の積み重ね、利用実績の多さなど、素晴らしいのは間違いないです。MySQLも追いついて欲しいです...)

An image by Dall-E

ラズパイのSDカード作成がすごくラクになっていた!

久々にラズパイを使おうと、実行用ディスク(SDカード)を作成したら、手順がすごくラクになっていて驚きました。私の場合はCUIWi-Fiでつないで使いたいことが多いので、そのための準備も、あっという間にできて感心しました。その記録。

前提

準備

  • Raspberry Pi Imager をダウンロード
  • Windowsにインストール
  • SDカードはあらかじめ用意しておく

SDカード作成

  • Raspberry Pi Imager 起動後の画面(メイン画面)

  • 「OSを選ぶ」を押下すると、OSのリストが出てくるので、インストールしたいOSを選択する。今回は、GUIを持たないものをインストールしたいので、「other」をクリックして、更に下層のリストを表示させる。

  • otherをクリックした時の画面の一部。今回は "Lite"というのを選択した(Pi 3 で 64bitを、ZERO W で 32bitを指定した)


  • メイン画面に戻り「ストレージを選ぶ」をクリックしたところ。SDカードが差し込まれていれば表示されているはず。間違って大切なディスクを消してしまわないように注意して、選択する


  • メイン画面に戻り、右下の歯車アイコンをクリックすると、設定画面が表示される。
    • Wi-Fiの設定
    • ログインユーザ名とパスワードの設定
    • SSHを有効化する設定
    • ホスト名の設定

などを行える。


  • メイン画面に戻り「書き込む」ボタン押下で、SDカードへの書き込みが始まる。概ね3分程度で完了した

ラズパイ起動

  • SDカードをラズパイに挿し、電源投入(USCmicroのケーブルを挿す)
  • しばらく待つと起動が完了するっぽい(ヘッドレスなので詳細は分からない)
  • Windows(など)から、SSHターミナルを使って、SDカードを作る際に詳細設定画面で決めたホスト名(raspberrypi.local など)とユーザ名、パスワードを使用して接続
    • SSH接続が確立し、以後普通にLinuxなどを使うのと同じような感覚で操作できる

本当に便利になった

 数年ぶりにラズパイに火をいれたわけですが、前回私が触っていた時には、ラズパイ本体にディスプレイ、キーボード、マウスを接続して操作していました(初期設定完了後にWi-Fi接続できるようになったら、リモート操作していましたが、当時の家のWi-Fi環境が不安定だったこともあってか、接続できなくなるたびにまたディスプレイ等を接続するという感じでした)。
 それが、「Windows上でSDカード作成」「ラズパイに挿して起動」「WindowsからSSH接続」という、完全にヘッドレスで動くようになり、とても快適になりました。開発をされている皆さんに感謝です!

 こうして使えるようになった Raspberry Pi 3 は、SDRチューナーをUSB接続して、ADS-B受信機として、今のところほぼ1週間稼働し続けています。ADS-Bの話はまたそのうち書きたいと思います。

OSC2022-Nagaoka参加

新潟県長岡市で開催された OSC2022 Nagaoka に参加してきました。

ospn.connpass.com


この数年、ずっとオンラインのみで開催されてきたOSCですが、規模の小ささ(参加者の予測が可能)という面もあって、オフライン開催の試行でもありました。

やはり、直接顔を見ながらお話を聞くというのは素晴らしいし、聞いてくれる人の反応を見ながらお話できるのは安心できるな、と感じました。はやく普通にこういう対面イベントが開催できるようになると良いですね。
一応MySQLの情報を最近あまりキャッチアップしていない人に向けて、最近の状況を紹介するようなお話をしてきました。



(というのを12月末に書いています。記録として残しておきたかったので)