mariadb
Galera
GaleraCluster

MariaDBのAUTO_INCREMENTについて

はじめに

以下のページのざっくり訳メモです。

MariaDB Documentation - AUTO_INCREMENT

Description

  • 新規にレコードを追加するときにkeyの値を自動的に増やす仕組み
  • defaultは1
  • tableは1つだけAUTO_INCREMENTを設定したカラムを持つことができる
    • それはkeyである必要があるが、PRIMARY KEYやUNIQUE KEYである必要はない

Setting or changing the auto_increment value

  • tableにAUTO_INCREMENTを設定する方法は2つ
    • ALTER TABLE
    • insert_idというvalueにset

InnoDB/XtraDB

  • 10.2.3まではauto-increment数はメモリに保管されており、serverを再起動すると数はtable内のもっとも高い値に設定される
  • 10.2.4からはこの制約は解除され、AUTO_INCREMENTは永続的になる
  • AUTO_INCREMENT Handling in XtraDB/InnoDBも見るとよい
    • 今更ですけどAUTO_INCREMENTってあるPKの次に設定される値で、どんどん大きくなるんですね。ON/OFFではなく。

Setting explicit values

  • AUTO_INCREMENTの値は対象のkeyに存在してはいけない
  • 新しい値は現在の最大値より大きくないといけない。
  • もし現在の最大値より小さい値が挿入された場合はAUTO_INCREMENTは変化しない

例が分かりやすい。

Missing values

  • AUTO_INCREMENTは欠損することがある
  • 行が削除された場合やAUTO_INCREMENTが明示的に更新された場合、古い値は決して使われない
  • 結果的に、AUTO_INCREMENTは時系列的に(昇順に)並ぶが、整数列にはならない

Replication

  • galeraによるmalti-master replicationを安全に行うためにはAUTO_INCREMENTはauto_increment_incrementとauto_increment_offsetを使いクラスタ内でユニークな値を生み出す必要がある。

ここがキモ。OFFSETは開始位置で、INCREMENTが増分。multi-musterの場合は以下のように増えていかないといけない。

* maria1: 1 -> 4 -> 7 (INCREMENT=3, OFFSET=1)
* maria2: 2 -> 5 -> 8 (INCREMENT=3, OFFSET=2)
* maria3: 3 -> 8 -> 9 (INCREMENT=3, OFFSET=3)

CHECK constraints, DEFAULT values and virtual columns

  • MariaDB 10.2.6以降ではauto_incrementカラムは以下の環境下では許可されない
  • 10.2.4より低いバージョンでは許可されるが、うまく動かない可能性がある。詳細はMDEV-11117参照

ちょっとここはよくわかんなかったな。

おわりに

AUTO_INCREMENTの考え方がわかった。次はgaleraによるmulti-master replicationを行うときの動きについて、wsrep_auto_increment_controlを見ていく。