2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

エヌシーアイ総合システムAdvent Calendar 2021

Day 9

MySQLのAurora化でMyISAMがなくなって苦戦した話

Last updated at Posted at 2021-12-08

あるシステムで、MySQLをオンプレからAuroraに移行してテストしたところ、異常発生した際に操作ログ保存用のテーブルにレコードが保存されなくなったことが判明。

原因を調べたところ、MyISAMテーブルがInnoDBテーブルに変わっていたことが判明。
AuroraはMyISAMテーブルをサポートしていないので、移行時にInnoDBに変わってしまっていた模様。

これによって、トランザクション制御が効いてロールバックされるようになっていた。
(MyISAMテーブルはトランザクションの概念がないため、常に自動コミット同様となる)

つまり、ログ保存用のテーブルに書き込んだあとに異常発生時はロールバックしていたため、ログもロールバックされていた・・・(ログの意味無し!)。

が、単純にトランザクションのタイミングをずらそうとすると、ログテーブルへの書き込み前後両方でトランザクションテーブル(これは逆にまとめてロールバック必要)に書き込みしている箇所も多々あり、ずらすこともできない。

1.トランザクション開始
2.テーブルA更新
3.操作ログテーブル登録(もとはMyISAMテーブルなので、異常でもロールバックされなかった)
4.テーブルB更新
5.正常ならコミット、 異常ならロールバック(3も含めてロールバック、、、)

2~4の処理順変えるのも困難なコードだったので、これは詰み?

かと思ったが、よくよく考えれば、ログテーブル登録だけコネクションを別にすれば解決だった。

1.トランザクション開始
2.テーブルA更新
3.別コネクションで操作ログテーブル登録(この時点でコミットされるので、5でロールバックされても無関係)
4.テーブルB更新
5.正常ならコミット、 異常ならロールバック(2と4だけがちゃんとロールバックされる)

ただ、もうちょっとマシな方法ないのか、これ。。

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?