地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

三陸沿岸道路ドライブですずめの戸締りの聖地巡礼をしてきた

すずめの戸締りのブルーレイを買って見返してたら割と近場に色々あることに気づき久々の長時間運転で回ってきた。朝に行こうって決めてホテル取って300キロくらいの中距離ドライブだったけどあんま疲れなくてまだギリギリ20代であることに感謝の気持ちが芽生えた。ただ学生時代だったら青森の上の方まで行けた気がするので衰えてはいそう。

聖地巡礼

行ったのは4箇所。

震災から10年の節目にオープンした場所らしい。中に入ってもすずめの戸締りの情報が多くあって面白かった。作中にも出ていたクリームサンド食べたかったけど売り切れていた。土曜の17:00とかに行ったら多分買えないっぽいので次は早めにいくとかしたい。海老ラーメンも気になったけどなんとなく好みの味じゃない気がしたのでやめた。

kesennuma-kanko.jp

震災の津波で完全に流出したため海からは離れたところに作り直した場所らしい。中にはダイジンとウダイジンが置いてあった。

www.yomiuri.co.jp

  • 山田湾展望広場

織笠駅の近くにある。扉は開閉できるし細部まで細かく作られていてすごかった。織笠川水門も近くにあって見に行ったがなんであの形になってるのかよくわからなくて面白かった。ちなみに後ろ戸の後ろにはなんと要石まであった。抜いてもいいらしいが思ったより重くて辞めた。

www.yamada-kankou.jp

すずめの実家跡地。これだけポツンと立っていて異様な雰囲気だった。ちなみにGoogleマップでも見つからなかったが運動場の周りを走っていたらたまたま見つけれた。他の聖地は市が公式HPで宣伝してくれているっぽいが実家跡地だけ見つからなかった。理由は不明。

その他

廃線後見たり龍泉洞行ったり紅葉と一緒に車の写真を撮ったりした。

終わりに

宮城-岩手の海沿いを2日で600キロくらい運転した。三陸海岸沿いは震災で道路ごとなくなっていたり観光施設もなくなってしまっていたりで運転したことってほぼなくて今回を通してあらゆるものが新鮮だった。通る街それぞれが新しい施設、家、道路でここだけ切り取ってみるとニュータウンが海沿いに連なっていると思ってしまうがそうではなく復興が進んだ結果なんだなとなった。

【MySQL】mysql can't reopen union

MySQLの仕様として一時テーブルはテーブルを再オープンできないので一つのクエリ内では複数回参照するということができない。

mysql> desc employee_table;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| ID            | int          | NO   | PRI | NULL    | auto_increment |
| employee_name | varchar(255) | NO   | MUL | NULL    |                |
| phone_number  | varchar(16)  | YES  |     | NULL    |                |
| phone_number2 | varchar(15)  | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

こんなテーブルがあるとして以下のようにUNIONするとCan't reopen table: 'temporary_employee_table'というエラーになる。

mysql> CREATE TEMPORARY TABLE temporary_employee_table AS
    -> SELECT * FROM employee_table;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM temporary_employee_table
    -> UNION
    -> SELECT * FROM temporary_employee_table;
ERROR 1137 (HY000): Can't reopen table: 'temporary_employee_table'

この動作自体はドキュメントにもTEMPORARY テーブルに関する問題というセクションに書いてある。回避策としてはトランザクション内でSELECT INSERTとかしてテーブルを作ってUNIONを実行しないようにする方法などがある。ただ最近あったのはMySQL4.0では動くが5系にした途端に落ちるというのがあった。4系だとこの制限がないのかな?と思ってドキュメントを探して調べてみたら同じような制限が当時もありそうというのが書いてあった。

www.mysql.gr.jp

テンポラリーテーブルは一度のクエリで一回しか使用できません。例えば、次のようなものは動きません。
mysql> SELECT * FROM temporary_table, temporary_table AS t2;

あれ、じゃあ4.0の時にもUNIONで落ちるのではと思ったが同じクエリを実行してもエラーにならなかった。色々調べてみたがどこからUNIONで落ちるようになったかは見つけられなかったが5.0の時のバグレポートとして以下のissueが作られていた。4.0と4.1では動いていたとも書いてあるが5.0で何か変わったとなっているがどうしてそうなったのかまではわからなかった。

bugs.mysql.com

mysqlslapを使ったロードエミュレーション

dev.mysql.com

mysqlslapは,MySQLの負荷をエミュレーションできるクライアントアプリケーション。MySQLが公式でサポートしているツールになります。並列実行数やSQLの自動生成など機能豊富で色々な負荷試験ができそうです。MySQLをインストールすると、デフォルトでインストールされます。

実行してみる

$ mysqlslap [オプション]

# 実行サンプル。ほぼmysql-cliと同じオプションで認証とかができる
$ mysqlslap \
  --no-defaults \
  --concurrency=50 \
  --iterations=10 \
  --engine=innodb \
  --auto-generate-sql \
  --auto-generate-sql-add-autoincrement \
  --auto-generate-sql-load-type=mixed \
  --auto-generate-sql-write-number=1000 \
  --number-of-queries=100000 \
  --host=localhost \
  --port=3306 \
  --user=root

このほかにも * --auto-generate-sql-write-numberで各スレッドで実行する行挿入の回数を指定できる。 * --auto-generate-sql-load-type=にタイプ(mixed、read、write など)を指定すると負荷テストを指定したもので自動生成します

結果はこんな感じで見れます。

Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 0.015 seconds → 平均実行時間
    Minimum number of seconds to run all queries: 0.015 seconds → 最小実行時間
    Maximum number of seconds to run all queries: 0.015 seconds → 最大実行時間
    Number of clients running queries: 1                                                → クライアントの数
    Average number of queries per client: 0                                         → 1クライアントが発行したSQLの数

performance_schema.data_locksとperformance_schema.data_lock_waits

今更すぎるがMySQL 8.0から入ったperformance_schema.data_locks・performance_schema.data_lock_waitsあたりを学んでメモしていく。

performance_schema.data_locks

dev.mysql.com

performance_schema.data_locks は、MySQLデータベースのパフォーマンス監視のために提供されているテーブルの一つです。このテーブルは、MySQLデータベース内のデータロックに関する情報を収集し、監視するために使用することができます。加えてこれらのデータロックの詳細情報を提供し、データベースのパフォーマンスのトラブルシューティングや最適化に役立てたりもできます。

具体的な定義は以下のようになっています。

+-----------------------+-----------------+------+-----+---------+-------+
| Field                 | Type            | Null | Key | Default | Extra |
+-----------------------+-----------------+------+-----+---------+-------+
| ENGINE                | varchar(32)     | NO   | PRI | NULL    |       |
| ENGINE_LOCK_ID        | varchar(128)    | NO   | PRI | NULL    |       |
| ENGINE_TRANSACTION_ID | bigint unsigned | YES  | MUL | NULL    |       |
| THREAD_ID             | bigint unsigned | YES  | MUL | NULL    |       |
| EVENT_ID              | bigint unsigned | YES  |     | NULL    |       |
| OBJECT_SCHEMA         | varchar(64)     | YES  | MUL | NULL    |       |
| OBJECT_NAME           | varchar(64)     | YES  |     | NULL    |       |
| PARTITION_NAME        | varchar(64)     | YES  |     | NULL    |       |
| SUBPARTITION_NAME     | varchar(64)     | YES  |     | NULL    |       |
| INDEX_NAME            | varchar(64)     | YES  |     | NULL    |       |
| OBJECT_INSTANCE_BEGIN | bigint unsigned | NO   |     | NULL    |       |
| LOCK_TYPE             | varchar(32)     | NO   |     | NULL    |       |
| LOCK_MODE             | varchar(32)     | NO   |     | NULL    |       |
| LOCK_STATUS           | varchar(32)     | NO   |     | NULL    |       |
| LOCK_DATA             | varchar(8192)   | YES  |     | NULL    |       |
+-----------------------+-----------------+------+-----+---------+-------+

performance_schema.data_lock_waits

上述したテーブル同様の機能に加えてデータベース内でデータロックを待機しているトランザクションやクエリに関する情報を提供をしています。データベース内でデータロックが既に他のトランザクションによって取得されていて、別のトランザクションがそのロックを待機している状況を示すのでどのクエリとどのクリで競合が起きてるのかまでを確認したりすることができます。

+----------------------------------+-----------------+------+-----+---------+-------+
| Field                            | Type            | Null | Key | Default | Extra |
+----------------------------------+-----------------+------+-----+---------+-------+
| ENGINE                           | varchar(32)     | NO   |     | NULL    |       |
| REQUESTING_ENGINE_LOCK_ID        | varchar(128)    | NO   | MUL | NULL    |       |
| REQUESTING_ENGINE_TRANSACTION_ID | bigint unsigned | YES  | MUL | NULL    |       |
| REQUESTING_THREAD_ID             | bigint unsigned | YES  | MUL | NULL    |       |
| REQUESTING_EVENT_ID              | bigint unsigned | YES  |     | NULL    |       |
| REQUESTING_OBJECT_INSTANCE_BEGIN | bigint unsigned | NO   |     | NULL    |       |
| BLOCKING_ENGINE_LOCK_ID          | varchar(128)    | NO   | MUL | NULL    |       |
| BLOCKING_ENGINE_TRANSACTION_ID   | bigint unsigned | YES  | MUL | NULL    |       |
| BLOCKING_THREAD_ID               | bigint unsigned | YES  | MUL | NULL    |       |
| BLOCKING_EVENT_ID                | bigint unsigned | YES  |     | NULL    |       |
| BLOCKING_OBJECT_INSTANCE_BEGIN   | bigint unsigned | NO   |     | NULL    |       |
+----------------------------------+-----------------+------+-----+---------+-------+

参考