Transportable Tablespace no MySQL – O Guia Brabo

Fala rapaziada, só na boa, na moral, no esquema? espero que sim.

Hoje, mais um artigo sobre o danado do bando de dados do golfinho.

Vou falar sobre a praticidade do TTS, sim TTS no MySQL (Assim como no Oracle, também existe no MySQL).

Depois de bater cabeça com a bagaceira acima, bora la.

1. Pré-Requisitos

  1. Verificar e ativar a configuração necessária para o Transportable Tablespace funcionar corretamente.
  2. Ter um MySQL 🤓
  3. Ter lido meu artigo anterior sobre TABLESPACES NO MYSQL

Esse parça verifica se o InnoDB está configurado para criar um arquivo .ibd separado para cada tabela, o que é essencial para o TTS.

SHOW VARIABLES LIKE 'innodb_file_per_table';

+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+

Se precisar ativar:

Ativa o modo file-per-table, permitindo que cada tabela InnoDB tenha seu próprio arquivo de tablespace.

SET GLOBAL innodb_file_per_table=ON;

Query OK, 0 rows affected (0.01 sec)

2. Exemplo do esquema

Na caixa de origem:

Crie um novo banco de BRABOS (kkkk, foi boa vai) para nossos testes:

CREATE DATABASE db_brabo;

Query OK, 1 row affected (0.01 sec)

Selecione o nosso DBzinho recém-criado:

USE db_brabo;

Database changed

Então criamos uma tabela para poder simular que temos dados em nosso ambiente super, mega, master, blaster produtivo:

CREATE TABLE clientes_brabo (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    data_cadastro DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

Query OK, 0 rows affected (0.01 sec)

Vamos adicionar alguns dados de leve:

INSERT INTO clientes_brabo (nome, email) VALUES 
('Zé Brabo', 'ze@brabo.com'), -- Essa vai pro Marião
('DBA Master', 'dba@brabo.com');

Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

3. Processo de Exportação

Passo 1: Preparação para Exportação

Esse carinha é poderoso e tem um papel crucial quando você quer mover ou migrar tabelas no MySQL usando o TTS:

FLUSH TABLES clientes_brabo FOR EXPORT;

Query OK, 0 rows affected (0.00 sec)

O que ele faz?

  1. Trava a tabela para escrita
  2. Finaliza todas as transações pendentes
  3. Cria um arquivo .cfg com os metadados da tabela

Passo 2: Localização dos Arquivos

ls -l /var/lib/mysql/db_brabo/

-rw-r----- 1 mysql mysql  12345 Jun 10 15:30 clientes_brabo.ibd
-rw-r----- 1 mysql mysql   1024 Jun 10 15:30 clientes_brabo.cfg

De quais arquivos estamos falando?

  • .ibd (arquivo de dados)
  • .cfg (metadados criados pelo FLUSH TABLES)

Passo 3: Cópia de segurança dos arquivos (se vc é DBA vai entender)

Copia os arquivos para um local seguro antes de continuar (Não seja juvenil, inferno):

cp /var/lib/mysql/db_brabo/clientes_brabo.{ibd,cfg} /backup/

Passo 4: Liberação da Tabela

UNLOCK TABLES;

Query OK, 0 rows affected (0.00 sec)

Libera a tabela no servidor de origem após a cópia dos arquivos.

4. Processo de Importação

Passo 1: Preparação do Ambiente de Destino

CREATE DATABASE db_brabo_destino;
USE db_brabo_destino;

Cria e seleciona o banco de dados de destino.

CREATE TABLE clientes_brabo (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    data_cadastro DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

Query OK, 0 rows affected (0.00 sec)

Recria a mesma estrutura da tabela original, sem dados.

Passo 2: Limpeza do Tablespace Existente

Remove a tbs vazio recém-criado para preparar a importação.

ALTER TABLE clientes_brabo DISCARD TABLESPACE;

Query OK, 0 rows affected (0.00 sec)

Passo 3: Transferência dos Arquivos

Copia os arquivos para o diretório do MySQL e ajusta as permissões.

cp /backup/clientes_brabo.{ibd,cfg} /var/lib/mysql/db_brabo_destino/
chown mysql:mysql /var/lib/mysql/db_brabo_destino/clientes_brabo.*

Passo 4: Importação Final

Este comando crucial, se liga:

ALTER TABLE clientes_brabo IMPORT TABLESPACE;

Query OK, 0 rows affected (0.00 sec)

Sabe o motivo? sei que não 🤣, toma:

  1. Lê o arquivo .cfg para validar a estrutura
  2. Importa os dados do arquivo .ibd
  3. Reconstroi os índices

Passo 5: Verificação

Bora então checar os dados:

SELECT * FROM clientes_brabo;

+----+------------+---------------+---------------------+
| id | nome       | email         | data_cadastro       |
+----+------------+---------------+---------------------+
|  1 | Zé Brabo   | ze@brabo.com  | 2023-06-10 15:30:00 |
|  2 | DBA Master | dba@brabo.com | 2023-06-10 15:30:00 |
+----+------------+---------------+---------------------+

5. Validação final do esquema

Bora validar a integridade da tabela:

CHECK TABLE clientes_brabo;

+-------------------+-------+----------+----------+
| Table             | Op    | Msg_type | Msg_text |
+-------------------+-------+----------+----------+
| db_brabo.clientes | check | status   | OK       |
+-------------------+-------+----------+----------+

Como boas práticas:

  1. Sempre verifique a compatibilidade de versões entre as caixas/servers/maquinas etc.
  2. Para tabelas grandes, considere compactar os arquivos durante a transferência
  3. Mantenha backups dos arquivos .ibd e .cfg até confirmar que tudo ocorreu suave na nave.

Minhas considerações:

Este processo é extremamente útil para:

  • Migrações rápidas entre ambientes
  • Recuperação de tabelas específicas
  • Criação de ambientes de teste com dados reais

Sacou qualé da parada? agora pega teu lab e senta o dedo NELE.

Ficou ruim? Pior que o backup sem binlog? (PQP) 😂

(Brincadeira, tmj! Qualquer coisa, só chamar os BRABO!)