Eu criei esta tabela USERS com `10 milhões de registros
mysql> desc users;
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | | NULL | |
| gender | varchar(10) | NO | | NULL | |
+--------+--------------+------+-----+---------+-------+
Agora tenho 2 sessões de terminal, session_1 e session_2. Na session_1, executei este comando
mysql> alter table users add primary key(id);
Enquanto este comando alter na sessão_1 ainda estava em andamento, na sessão 2, eu mato o cliente mysql usando
kill -9 <mysql_session_id>
Quando reinicio o cliente mysql, emito desc USERS
mais uma vez, não vejo nenhuma chave primária na coluna id, mas depois de um minuto ou mais, vejo que a chave primária está lá na
id
coluna.
mysql> desc users;
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | | NULL | |
| gender | varchar(10) | NO | | NULL | |
+--------+--------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
Eu também tentei comset autocommit=0
Antes da versão 8.0, as instruções DDL (como ALTER) eram executadas sem ACID transacional. (Isto é,
autocommit
eBEGIN..COMMIT
não foram homenageados.)Se o cliente fosse embora ou o sistema travasse antes do RENAME, o processo era encerrado. (Muitas vezes o "tmp" era deixado no disco.)
O RENAME é rápido e essencialmente atômico, então, assim que passar por isso, a ação estará concluída.
(Existem alguns bloqueios que não listei.)
O MySQL 8.0 faz o mesmo, mas com
BEGIN
eCOMMIT
em torno dessas instruções, além de ter um novo código para poder fazer issoROLLBACK
.Voltando à sua pergunta... Efetivamente, o código antigo teve quase o efeito do novo código, pois a morte do cliente provavelmente aconteceu antes do
RENAME
, portanto, parecia que foi revertido.Observe também que a
INSERT
instrução leva mais tempo - porque ela deve copiar todos os dados, possivelmente em uma ordem diferente. (Os dados são armazenados em uma árvore B+ baseada na chave primária.) Ele também reconstruirá todos os secundários.INDEXes
Qual versão você está executando? Talvez você esteja executando a versão 8.0 e seu ALTER tenha realmente terminado, mas levou algum tempo para que os bloqueios fossem colocados no lugar. Isso pode explicar o atraso na exibição do DESC. (Não acho que nenhum desenvolvedor Oracle esteja acompanhando este fórum, então você pode não obter uma resposta definitiva aqui. Você pode postar um bug em bugs.mysql.com na esperança de obter uma resposta.)