MySQL: Online DDL

O MySQL (mais especificamente o Engine InnoDB) permite que uma série de comandos DDL sejam feitos sem impacto à operação do banco, como está nesta tabela da documentação da versão 5.7.

Por exemplo, é possível mover uma tabela para outra TABLESPACE (e portanto, para outro disco) de forma ONLINE.

Os dados alterados durante a operação são armazenados em um log temporário especial para esta função, que deve estar dimensionado de acordo através do parâmetro innodb_online_alter_log_max_size.

No exemplo abaixo, a operação de movimentação para outra TABLESPACE é executada por um tempo, até que o espaço do log temporário é exaurido. Neste caso nenhum dado alterado foi perdido, apenas a operação terá que ser executada novamente após readequar o parâmetro de acordo.

mysql> ALTER TABLE zabbix.history_text TABLESPACE ts1;
ERROR 1799 (HY000): Creating index 'history_text_1' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
mysql> SELECT @@innodb_online_alter_log_max_size;
+------------------------------------+
| @@innodb_online_alter_log_max_size |
+------------------------------------+
|                          134217728 |
+------------------------------------+
1 row in set (0,03 sec)

mysql> SET GLOBAL innodb_online_alter_log_max_size = 1073741824;
Query OK, 0 rows affected (0,01 sec)

mysql> SELECT @@innodb_online_alter_log_max_size;
+------------------------------------+
| @@innodb_online_alter_log_max_size |
+------------------------------------+
|                         1073741824 |
+------------------------------------+
1 row in set (0,00 sec)

mysql> ALTER TABLE zabbix.history_text TABLESPACE ts1;
Query OK, 0 rows affected (31 min 30,79 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.