Pela segunda vez, encontrei um problema em que nosso servidor MySQL (MariaDB v10.1) de repente lançou um erro - Não foi possível remover a tabela temporária: './database_name/#sql-4593_791', erro: 120.
Seguir os guids como https://mariadb.com/resources/blog/get-rid-of-orphaned-innodb-temporary-tables-the-right-way/ não funciona, ainda recebo um erro de que a tabela não é conhecido ( ERROR 1051 (42S02): Unknown table 'database_name.#mysql50#sql-4593_1e9'
)
O que torna este problema diferente de outras questões sobre a remoção de tabelas temporárias órfãs do InnoDB é que o servidor de banco de dados parece ter deletado o arquivo .frm, tanto do disco quanto da memória (a execução lsof | grep sql-4593_1e9
mostra apenas o arquivo .ibd aberto)
Isso pode ser uma fonte do problema? Em caso afirmativo, existe alguma maneira de recriar o arquivo .frm de uma tabela praticamente inacessível de estrutura desconhecida?
A única menção que posso obter no próprio banco de dados é executando:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql%';
Que produz o seguinte:
+----------+-----------------------------+------+--------+---------+-------------+------------+---------------+
| TABLE_ID | NAME | FLAG | N_COLS | SPACE | FILE_FORMAT | ROW_FORMAT | ZIP_PAGE_SIZE |
+----------+-----------------------------+------+--------+---------+-------------+------------+---------------+
| 1576128 | database_name/#sql-4593_1e9 | 1 | 118 | 1576114 | Antelope | Compact | 0 |
| 1576129 | database_name/#sql-4593_78d | 1 | 118 | 1576115 | Antelope | Compact | 0 |
| 1576130 | database_name/#sql-4593_791 | 1 | 118 | 1576116 | Antelope | Compact | 0 |
+----------+-----------------------------+------+--------+---------+-------------+------------+---------------+
Não me sinto à vontade para remover os arquivos de banco de dados do disco manualmente, pois não tenho certeza de que isso não levaria a problemas no futuro. Mesmo que as chances de colisão do ID do tablespace sejam próximas de zero.
Você tem uma desconexão entre o que tem no disco e o que tem no dicionário de dados interno do índice. O MySQL 8.0 melhorou a forma como o dicionário de dados é tratado, mas até 10.4 mariadb não o implementou.
Você não pode simplesmente descartá-lo, porque ele não será encontrado no disco, mas o innodb ainda o verá. Para versões mais antigas do MySQL e do MariaDB, você encontrará vários guias online sobre como sincronizar o dicionário de dados e o disco . No entanto, esta é a maneira que achei mais eficaz e segura :
rename table
, desde que o novo banco de dados esteja na mesma partição)Eu usei isso várias vezes e acho que é a maneira mais fácil, rápida e segura de sincronizar as tabelas parcialmente excluídas .
Importante,
#sql-4593_1e9
é o formato para tabelas temporárias , por favor, não as descarte, a menos que você ache que são realmente sobras - pode haver transações em andamento que precisam delas internamente para consultas. Em outras palavras, eu não tocaria nisso a menos que eles apareçam em um novo servidor inicial sem nenhuma conexão.