データベースの運用をしていると、DDLを必要に応じて実行する必要がありますが、大きなサイズのテーブルを変更する時は、ALTER TABLEの進捗が気になるところです。終わりが見えないと、本当に進んでいるかどうか不安になるかと思いますが、MySQLやPostgreSQLでは以下の様に進捗を確認する事が出来るので大きなテーブルを処理する場合は活用してみると良いでしょう。
MySQLにおけるDDLステータスの確認
DDLのステータスが確認出来る設定になっているか確認
設定を確認して、設定が有効になってない場合は必要に応じて有効化して下さい。但し、使わない場合はOFFにしておくと良いでしょう。実際にどれだけリソースが利用されるかは確認してませんが、モニタリングにはそれなりのリソースを使う事は常に念頭に置いておくと良いでしょう。
mysql> select * from performance_schema.setup_instruments where NAME LIKE 'stage/innodb/alter%';
mysql> select * from performance_schema.setup_consumers WHERE NAME LIKE '%stages%';
mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter%';
参照:15.16.1 パフォーマンススキーマを使用した InnoDB テーブルの ALTER TABLE の進行状況のモニタリング
ALTER TABLEと進捗状況の確認
- ALTERテーブルで列のデータサイズを変更
varchar (100) からvarchar(255)に変更は、DML全てONLINEで処理可能。(0 rows affected)
varchar(255)からvarchar(100)に変更は、サイズ縮小になるのでSELECT以外はロックされるので、以下の様にevents_stages_currentにて進捗が確認する事が可能です。(29979 rows affected)
mysql> select count(*) from tourism_and_busstop;
+----------+
| count(*) |
+----------+
| 29979 |
+----------+
1 row in set (0.15 sec)
mysql> desc tourism_and_busstop;
+----------+-----------------+------+-----+---------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-----------------+------+-----+---------+-------------------+
| gid | bigint unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(100) | YES | | NULL | |
| category | varchar(50) | YES | | NULL | |
| type | varchar(50) | YES | | NULL | |
| geom | point | YES | | NULL | |
| geohash | varchar(20) | YES | | NULL | VIRTUAL GENERATED |
+----------+-----------------+------+-----+---------+-------------------+
6 rows in set (0.01 sec)
mysql> alter table tourism_and_busstop modify column name varchar(255);
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table tourism_and_busstop modify column name varchar(100);
Query OK, 29979 rows affected (3.07 sec)
Records: 29979 Duplicates: 0 Warnings: 0
- 進行状況の確認
mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current;
+-----------------------------+----------------+----------------+
| EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
+-----------------------------+----------------+----------------+
| stage/sql/copy to tmp table | 25939 | 29822 |
+-----------------------------+----------------+----------------+
1 row in set (0.00 sec)
PostgreSQLにおけるDDLステータスの確認
コマンドの実行中に進捗状況をレポートする能力があります。 現在、進捗状況のレポートをサポートしているのは、ANALYZE、CLUSTER、CREATE INDEX、VACUUM、および、BASE_BACKUP(すなわち、pg_basebackupがベースバックアップのために発行するレプリケーションコマンド)のみです。
27.4. 進捗状況のレポート
pg_stat_progress_analyze | ANALYZEが実行されているときにはいつでも、pg_stat_progress_analyzeビューには現在コマンドを実行している各バックエンドごとの行が含まれます。 |
pg_stat_progress_create_index | CREATE INDEXやREINDEXが実行中であるときにはいつでも、pg_stat_progress_create_indexビューには現在インデックスを作成している各バックエンドごとの行が含まれます。 |
pg_stat_progress_vacuum | 現在バキューム処理している(自動バキュームワーカプロセスを含む)それぞれのバックエンドごとに1行を格納します。※ VACUUM FULLとCLUSTERはいずれもテーブルを再作成する為、pg_stat_progress_clusterで確認。 |
pg_stat_progress_cluster | CLUSTERやVACUUM FULLが実行されているときにはいつでも、pg_stat_progress_clusterビューには現在いずれかのコマンドを実行している各バックエンドごとの行が含まれます。 |
pg_stat_progress_basebackup | ビューには現在BASE_BACKUPレプリケーションコマンドを実行し、バックアップをストリームしている各WAL送信プロセスごとの行が含まれます。 |
Create Indexの進捗状況
postgres=# select * from pg_stat_progress_create_index;
-[ RECORD 1 ]------+-------------------------------
pid | 239
datid | 16384
datname | POC
relid | 17435
index_relid | 0
command | CREATE INDEX
phase | building index: scanning table
lockers_total | 0
lockers_done | 0
current_locker_pid | 0
blocks_total | 22059
blocks_done | 16486
tuples_total | 0
tuples_done | 0
partitions_total | 0
partitions_done | 0
postgres=#
Vacuum Fullの進捗状況
postgres=# select * from pg_stat_progress_vacuum;
(0 rows)
postgres=# select * from pg_stat_progress_cluster;
-[ RECORD 1 ]-------+------------------
pid | 239
datid | 16384
datname | POC
relid | 17435
command | VACUUM FULL
phase | seq scanning heap
cluster_index_relid | 0
heap_tuples_scanned | 1346822
heap_tuples_written | 1346822
heap_blks_total | 44118
heap_blks_scanned | 31962
index_rebuild_count | 0