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?

More than 1 year has passed since last update.

[MySQL / MySQLWorkbench] パーティション分割済みの巨大テーブルをRenameしたら、レコード件数が0件になった

Last updated at Posted at 2023-09-30

概要

タイトルの通り。
ただし、後でわかったのだが、この件数減少は表面上の一時的な現象だった模様。

結論

待てばよし。

発生状況詳細

数億レコード規模のテーブルを扱っていたのだけれど、訳あってテーブル名変更することになった。

状況は以下の通り。

  • MySQLWorkbenchを使っていた
  • テーブル名変更前は、レコードが数億件レベルで存在することを確認済み
  • そのテーブルはpartition分割されていた
  • Renameを実施したところ、レコード行数 (Table rows:)が一時的に0件と表示された
    • これは、MySQLWorkbenchの TableInspector 機能による Info タブ画面上の表示件数

ちなみに、テーブル名変更のために実行したSQLは以下の通り。

RENAME TABLE <スキーマ名>.<テーブル名> TO <新テーブル名>;

/* Example */
RENAME TABLE staging_database.old_user TO user;

経過

  • 最初はめちゃ慌てた
  • 慌ててすぐに逆 Rename して、旧テーブル名に戻した (新テーブル名 --> 旧テーブル名)
  • すると、レコードの件数は元の状態へとすぐに復活した
  • しかし、落ち着いて再度 Rename を実行 (旧テーブル名 --> 新テーブル名)
  • 際 Rename 後、 30分程度 待ったところ、8000万件近くまでレコード件数が回復(?)していた。
  • さらにしばらく待つと、元のテーブルの件数にほぼ近い値に復旧 (ただし、なぜか完全には一致せず...)

補足

なお、partition側の TABLE_NAME については、 親のテーブル名変更のタイミングで、自動的に新しいテーブル名に書き換わっていた。
なので、partition側の TABLE_NAME を一つ一つ書き換えるとか、そういう面倒なことはしなくても大丈夫。

partitionの状況は以下のSQLで確認可能。

SELECT
  TABLE_SCHEMA, TABLE_NAME, PARTITION_NAM,
  PARTITION_ORDINAL_POSITION, TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
/* WHERE文は、必要なければ削除して実行してもOK */
WHERE TABLE_NAME = 'テーブル名' AND TABLE_SCHEMA = 'スキーマ名';

参考資料

partitionの情報確認をするためのSQLは、以下の記事に書かれていました。

感じたこと

こういう情報がどこにもなかったので、半日〜1日近くこの問題の対処をしてしまった。
ので、記事化した。

みんな、困った後解決したら、記事を書こう。

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?