

PHP+mysqlでwebサービス稼働中なのですが、更新クエリ（トランザクション）が多く発行されるテーブルに対し日中、ALTER
TABLEでカラム1件を追加したところ、DB負荷が高まりサイトアクセスできなくなり、mysqlを再起動せざるを得ない状態となりました。

[漢のコンピュータ道氏のサイト](http://nippondanji.blogspot.jp/2009/05/alter-
table.html)によりますと以下のように書かれてあり、これは負荷かかるだろうなと思いました。

> まず結論から言うと、なんとMySQLのALTER  
>
> TABLEはテーブルのデータを全てコピーし直すのである。なんて無駄なことを！？と思うかも知れないが、テーブル定義（スキーマ）の変更を動的に行うには、ストレージエンジンによるサポートが必要であり、動的なスキーマ変更をサポートしているストレージエンジンはまだ少ないのである。

みなさんはサービス稼働中のサイトにどのようにALTER TABLEを実行していますか？  
サービスを止めたりしていますか？または深夜に行う等

■バージョン情報  
バージョン：5.1.73  
ストレージエンジン：INNODB


CC BY-SA 3.0
2017-02-28T23:23:39.187
32999
2019-09-25T08:01:00.097
15167
question
mysql
mysqlで更新クエリの多いテーブルにカラム追加したらＤＢ負荷が高まりサイトが落ちました。


バージョンは、 8.0.12~ になってしまいますが、 instant add column という機能が追加されたようです。

これは何かというと、 DDL 実行時に InnoDB は変更せず、 MySQL 8 から導入された（たしか） Data Dictionary
のメタデータだけを更新することで、 ADD COLUMN 等、一部の DDL を一瞬で終わらせる仕組みの様子です。

[code]

    -- https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-column-operations
    ALTER TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT, ALGORITHM=INSTANT;
    
[/code]

また、日本語の解説としては、以下のページを発見しています。

<https://y-asaba.hatenablog.com/entry/2018/12/21/002811>

* * *

また、 8 までいかなくても、 5.6 ぐらいから、 INPLACE の ADD COLUMN もできるようになっている様子です。これは、 add
column をしている最中でも、参照や更新をできるようにするための仕組みの様子です。

なので、8 までいかないにせよ、 MySQL のバージョンをあげることで、解決可能な問題であるようだ、と思っています。


CC BY-SA 4.0
2019-08-26T07:53:28.117
57606
2019-08-26T07:53:28.117
754
32999
answer