Base de Conhecimento

n8n com MySQL: como conectar e gravar dados no banco

  • n8n, mysql, credencial, docker, banco de dados, automação
  • Usuários acharam útil: 0

Veja como conectar o n8n ao MySQL: usuário próprio, credencial, nó MySQL para ler e gravar, consultas com parâmetros e o Host certo quando o n8n roda no Docker.

Por Redação Eleven Host · @robson.direitodigital · 28 de outubro de 2026 · 9 min de leitura

Arte da Eleven Host: janela de terminal com o título: n8n com MySQL: como conectar e gravar dados no banco

Capa da Redação Eleven Host para o guia: n8n com MySQL: como conectar e gravar dados no banco Arte: Eleven Host

Para usar o n8n com MySQL, crie no banco um usuário só para o n8n, cadastre a credencial MySQL com host, banco, usuário, senha e porta 3306 e use o nó MySQL para ler, inserir ou atualizar dados nos seus fluxos.

Este guia é para quem já tem o n8n funcionando, por exemplo seguindo o guia Instalar n8n na VPS: passo a passo com Docker, e quer que um fluxo converse com um banco MySQL. A ordem é a do trabalho real: primeiro o usuário no banco, depois a credencial no n8n, depois os nós. Os nomes meu_banco, n8n, 203.0.113.10 (o servidor do banco) e 198.51.100.20 (a máquina onde roda o n8n) são exemplos. Troque pelos seus.

O que o nó MySQL do n8n faz

O n8n organiza o trabalho em nós, e cada nó faz uma tarefa. O nó MySQL, segundo a documentação do n8n, tem seis operações:

  • Select: selecionar, ou seja, ler linhas de uma tabela.
  • Insert: inserir linhas novas.
  • Update: atualizar linhas que já existem.
  • Insert or Update: inserir ou atualizar.
  • Delete: apagar linhas.
  • Execute SQL: executar uma consulta SQL escrita por você.

As operações prontas cobrem leitura, gravação e remoção de linhas. O Execute SQL fica para os casos que elas não cobrem, e este guia mostra um deles na seção de erros comuns.

Passo 1: crie um usuário só para o n8n

A documentação do n8n lista como pré-requisito ter criado um usuário no banco. Em vez de usar a conta administrativa, crie uma conta própria para o n8n e dê a ela só as permissões que o fluxo usa. Entre no MySQL com uma conta administrativa e rode:

CREATE USER 'n8n'@'198.51.100.20' IDENTIFIED BY 'troque-esta-senha';

GRANT SELECT, INSERT, UPDATE ON meu_banco.* TO 'n8n'@'198.51.100.20';

O texto depois do @ limita de onde a conta pode entrar. Aqui, só a máquina 198.51.100.20, que é onde o n8n roda. Se você tirar essa parte, a conta passa a valer para '%', ou seja, sem restrição de origem. Troque troque-esta-senha por uma senha sua.

O GRANT do exemplo dá só ler, inserir e atualizar no banco meu_banco. Se o seu fluxo também apaga linhas, acrescente DELETE à lista. Se não apaga, deixe de fora: assim a conta fica só com o que o fluxo usa.

Se o banco está em outra máquina, o MySQL precisa aceitar conexões de fora. O guia Acesso remoto MySQL: como liberar com segurança mostra como fazer isso com cuidado.

Passo 2: cadastre a credencial no n8n

No n8n, a credencial guarda os dados de acesso uma vez, e vários nós podem usá-la. Pela documentação do n8n, a credencial MySQL tem estes campos:

  • Host: o nome ou o IP do servidor do banco, como 203.0.113.10.
  • Database: o nome do banco, como meu_banco.
  • User: o usuário que você criou no passo 1, o n8n.
  • Password: a senha desse usuário.
  • Port: a porta do MySQL. O padrão é 3306.

A credencial tem ainda três campos opcionais:

  • Connect Timeout: o tempo de espera pela conexão. O padrão é 10000 ms.
  • SSL: use se o seu banco usa SSL. Esse campo pede o certificado da CA, a chave do cliente e o certificado do cliente.
  • SSH Tunnel: faz a conexão passar por um túnel SSH, com senha ou com chave privada.

Preencha os cinco campos principais, salve a credencial e execute o nó MySQL uma vez para ver se o n8n alcança o banco. Se falhar, confira primeiro o host, a porta e o endereço depois do @ no CREATE USER.

Passo 3: ler dados com Select

Para ler, adicione um nó MySQL ao fluxo, escolha a credencial do passo 2 e a operação Select. Informe a tabela e o que deseja ler. O resultado da leitura segue para o próximo nó do fluxo.

Um exemplo simples: ler os pedidos novos de hora em hora e enviar para uma planilha. O fluxo começa com o Schedule Trigger, passa pelo nó MySQL com Select e termina no nó da planilha.

Passo 4: gravar dados com Insert e Insert or Update

Para gravar, use o nó MySQL com a operação Insert. Ela cria uma linha nova na tabela. Um uso possível é gravar cada resposta de formulário que chega por webhook numa tabela com colunas como nome, email e criado_em. O webhook é o ponto de entrada do fluxo e está explicado em Webhook no n8n: como criar, testar e colocar no ar.

Há também a operação Insert or Update, que serve para inserir ou atualizar a linha na mesma operação. E há a operação Update, que muda linhas que já existem e usa uma coluna de correspondência, a "Column to Match On", para saber qual linha alterar.

Antes de testar um fluxo com Update ou Delete, faça uma cópia do banco. Se a operação atingir mais linhas do que você previu, a cópia permite voltar.

O backup do MySQL com mysqldump tem guia próprio na base de conhecimento.

Quer um n8n para começar a montar seus fluxos? O n8n Essencial sai a partir de R$ 19,90/mês; confira na loja o que cada plano inclui. Ver planos de n8n

Consultas com parâmetros: $1, $2 e a injeção de SQL

Na operação Execute SQL, você escreve a consulta. Quando ela usa valores que vêm do fluxo, como o e-mail de um formulário, use parâmetros em vez de colar o valor dentro do texto da consulta. Em Options, no campo Query Parameters, escreva $1, $2 e assim por diante na consulta e liste os valores na mesma ordem. O exemplo da documentação do n8n é este:

SELECT * FROM $1:name WHERE email = $2;

E, no campo Query Parameters, os valores nesta ordem:

users, {{ $json.email }}

Aqui o $1 recebe users (o nome da tabela) e o $2 recebe o e-mail que veio do item anterior. A documentação diz que o n8n trata os dados dos parâmetros, e isso evita a injeção de SQL (SQL injection), o ataque em que um texto digitado por alguém vira parte da consulta. Por isso, prefira os parâmetros a colar o {{ }} direto dentro do SQL.

n8n no Docker e MySQL na mesma VPS

Este caso vale para quem instala o n8n com Docker e deixa o MySQL no próprio servidor, fora do contêiner. O localhost dentro do contêiner aponta para o próprio contêiner, e não para a VPS, então a credencial precisa de outro host. A documentação do n8n descreve quatro casos:

  • n8n no Docker e MySQL na VPS, fora do Docker: o MySQL precisa escutar em todas as interfaces. No Linux, inicie o contêiner do n8n com --add-host host.docker.internal:host-gateway e use host.docker.internal no campo Host.
  • Os dois em contêineres separados: ponha os dois na mesma rede bridge definida pelo usuário e use, no campo Host, o nome do contêiner do MySQL.
  • Só o MySQL no Docker: publique a porta 3306 com -p e use localhost.
  • Os dois no mesmo contêiner: use localhost.

Atenção ao primeiro caso. Fazer o MySQL escutar em todas as interfaces o deixa alcançável por mais caminhos, e por isso o firewall importa. O guia Firewall para VPS: como proteger seu servidor mostra como proteger o servidor.

Erros comuns com o nó MySQL

Update que não encontra a linha certa. A operação Update pela "Column to Match On" só funciona quando uma coluna identifica a linha sozinha. Se a linha é identificada por duas colunas juntas, a chamada chave composta, use o Execute SQL. O exemplo da documentação é:

UPDATE orders SET quantity = 3 WHERE customer_id = 538 AND product_id = 800;

Valores DECIMAL que chegam como texto. O n8n devolve colunas do tipo DECIMAL como texto, para não perder precisão no JavaScript. A documentação oferece três saídas: ligar a opção "Output Decimals as Numbers", aceitando o risco de perder precisão; converter o valor com toFloat() ou toFixed(); ou usar o nó Edit Fields (Set) para ajustar o campo.

Conexão recusada dentro do Docker. Se o n8n roda no Docker e o MySQL está na mesma VPS, revise o campo Host. Com localhost, o contêiner procura o banco dentro de si mesmo.

Dois exemplos para começar

Para sair do papel, escolha um fluxo pequeno e que você consegue conferir à mão:

  • Gravar respostas de formulário: um Webhook recebe a resposta, e um nó MySQL com Insert grava nome, email e criado_em numa tabela. Depois de enviar um formulário de teste, confira a linha no banco.
  • Ler pedidos novos de hora em hora: um Schedule Trigger dispara o fluxo, um nó MySQL com Select lê os pedidos e o resultado segue para uma planilha. Rode uma vez à mão e compare com o que há no banco.

Em ambos, comece com a conta do passo 1 e só acrescente permissões quando o fluxo pedir.

Checklist da conexão n8n com MySQL

  • Criei um usuário só para o n8n, com o endereço da máquina do n8n depois do @.
  • Dei só as permissões que o fluxo usa no GRANT.
  • Preenchi na credencial Host, Database, User, Password e Port (3306) e testei a conexão.
  • Se o banco usa SSL ou túnel SSH, preenchi os campos opcionais.
  • Usei $1 e $2 nas consultas com valores do fluxo.
  • No Docker, conferi o Host: host.docker.internal, o nome do contêiner ou localhost, conforme o caso.
  • Se o MySQL escuta em todas as interfaces, revisei o firewall.
  • Fiz backup antes de testar Update ou Delete.

Procura um plano de n8n para os seus fluxos? O n8n Essencial custa a partir de R$ 19,90/mês; confira na loja o que cada plano inclui. Conhecer o n8n Essencial

Perguntas frequentes

Qual porta o n8n usa para conectar ao MySQL?

A credencial MySQL do n8n traz a porta 3306 como padrão. Mude o campo Port só se o seu MySQL escuta em outra porta.

Posso usar o usuário administrativo do MySQL no n8n?

Pode funcionar, mas crie um usuário só para o n8n, com as permissões que o fluxo usa. Assim a conta fica só com as permissões que o fluxo usa.

Como evito injeção de SQL no n8n?

Use parâmetros na operação Execute SQL: escreva $1 e $2 na consulta e liste os valores em Query Parameters. A documentação do n8n diz que o n8n trata esses dados, o que evita a injeção de SQL.

O n8n está no Docker e o MySQL na VPS. Qual Host uso?

Com o MySQL fora do Docker, inicie o contêiner do n8n com --add-host host.docker.internal:host-gateway e use host.docker.internal no campo Host. O MySQL precisa escutar em todas as interfaces, e isso pede firewall.

Por que meus valores DECIMAL chegam como texto?

O n8n devolve o DECIMAL como texto para não perder precisão no JavaScript. Use a opção "Output Decimals as Numbers", converta com toFloat() ou toFixed(), ou ajuste no nó Edit Fields (Set).

Esta resposta lhe foi útil?

Artigos Relacionados