0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MySQLのメタデータロックを実感する

0
Posted at

概要

サクッとメタデータロックを体感する。

前提知識

MySQLのオンラインDDLを利用すれば、ほぼロックすることなしに大きなテーブルに対してALTERをかけることができる。

実施するALTERによるが、MySQLは3つの変更方式を提供している。

  • COPY
    • 遅い
    • オンラインDDLではない
  • INPLACE
    • まぁ早い
    • オンラインDDL
  • INSTANT
    • 早い
    • オンラインDDL

オンラインDDLとはなんぞや?については、まぁDDL実行中も大体DML打てるやつのことをそう言ってるっぽい。
https://dev.mysql.com/doc/refman/8.4/en/innodb-online-ddl.html

ただ、色々な記事でオンラインDDLでもメタデータロックには気をつけなはれやと言ってくるのでとりあえず実感してみたいなと思ったのが執筆のきっかけ。

体感

3つのDBへのセッションを用意する。
それぞれsession-a, session-b, session-c と呼ぶ。

まずsession-aでトランザクションを張る

SET autocommit = 0;
START TRANSACTION;

SELECT * FROM user;

次にsession-bでオンラインDDLを実行する。

ALTER TABLE user
    ADD COLUMN `name` VARCHAR(255) DEFAULT NULL,
    ALGORITHM = INSTANT;

ただ、これはメタデータに対してexclusiveなロックを要求するため、session-aのトランザクションの存在によって待たされる。


次にsession-cで単純なselectを実行する。

SELECT * FROM user;

なんとこれも即座に成功せず、待たされる。
MySQLは「EXCLUSIVE待ちがいるなら、新規SHAREDは入れない」設計となっているためだ。

終わりに

起きたら全てが止まるので怖いね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?