Pular para o conteúdo

Conectar um data warehouse MySQL / MariaDB

Este guia mostra como conectar um banco MySQL ou MariaDB ao Saiku Cloud, de ponta a ponta. Cinco minutos se o seu data warehouse já é público; dez se precisar configurar um usuário somente leitura.

Impacto no tier: todos os tiers do Saiku Cloud (Starter, Team, Business) suportam BYOC do MySQL.

Driver: o Saiku Cloud traz o MariaDB Connector/J, que fala os protocolos de transporte do MySQL e do MariaDB. Você pode colar jdbc:mysql://... ou jdbc:mariadb://... e nós cuidamos do resto.

O que você vai precisar

  • Uma instância MySQL 5.7+ ou MariaDB 10.3+ alcançável por um endereço IPv4 público. Clientes do Saiku Cloud hospedado nos tiers Starter/Team/Business precisam disso — clientes Enterprise rodando em VPC peering privado ganham acessibilidade por rede privada.
  • Acesso admin ao seu data warehouse para criar um usuário somente leitura (ou as credenciais de um usuário somente leitura existente).
  • Cinco minutos.

Passo 1 — Allowlist do nosso IP de egress

Todas as consultas do Saiku Cloud para o seu data warehouse saem de um único IP estático:

87.99.153.244

Adicione isso ao firewall / security group / allowlist de rede do seu data warehouse antes de testar a conexão. Lugares comuns de allowlist:

  • AWS RDS / Aurora MySQL: regra de entrada do security group da VPC → porta 3306 → origem 87.99.153.244/32.
  • Google Cloud SQL: Connectivity → Authorized networks → adicione 87.99.153.244/32.
  • Azure Database for MySQL: Networking → Firewall rules → adicione uma regra permitindo 87.99.153.244 para 87.99.153.244.
  • PlanetScale: IPs permitidos nas configurações do banco → adicione 87.99.153.244. O PlanetScale também exige ?sslMode=VERIFY_IDENTITY na URL JDBC — veja o passo 3.
  • Self-hosted: bind-address = 0.0.0.0 (ou sua NIC pública) em my.cnf, a regra de firewall público na frente e um grant pattern em nível de host que permita o papel de 87.99.153.244.

O IP é estável — sobrevive a reboots e reconstruções de imagem. Nos comprometemos a dar ao menos 30 dias de aviso antes de qualquer rotação. Política completa: nosso compromisso de estabilidade do IP de egress.

Passo 2 — Crie um usuário somente leitura no MySQL

O Saiku Cloud só lê do seu data warehouse — nunca escreve, nunca altera schemas, nunca cria objetos. O formato de menor privilégio é um usuário somente leitura dedicado:

-- As a MySQL user with the GRANT OPTION privilege:
CREATE USER 'saiku_read'@'%' IDENTIFIED BY 'pick-something-strong-here';
-- Grant SELECT on the database(s) you want Saiku to see. Adjust
-- 'analytics' to the database name in your JDBC URL.
GRANT SELECT ON analytics.* TO 'saiku_read'@'%';
-- Reload the privilege tables.
FLUSH PRIVILEGES;

Algumas notas:

  • O wildcard '%' permite que o usuário conecte de qualquer IP. Se o seu MySQL é restrito a IPs de origem específicos no nível do usuário (além do firewall), use 'saiku_read'@'87.99.153.244'.
  • Se seus dados estão espalhados por múltiplos bancos, repita o bloco GRANT SELECT para cada um.
  • Aurora MySQL trata grants de forma um pouco diferente — veja os docs do Aurora para a receita equivalente.
  • PlanetScale usa seu próprio sistema de papéis — crie um papel “read-only” no console do PlanetScale e capture o usuário + senha gerados em vez de rodar CREATE USER.

Passo 3 — Monte a URL JDBC

O formato:

jdbc:mysql://<host>:<port>/<database>?sslMode=REQUIRED&serverTimezone=UTC

Dois parâmetros que vale a pena entender (o placeholder do wizard inclui ambos):

serverTimezone=UTC

sslMode=REQUIRED

Força TLS para a conexão JDBC. A maioria dos serviços MySQL gerenciados já força TLS do lado do servidor; REQUIRED faz o cliente rejeitar fallback em plaintext.

Variantes:

  • sslMode=REQUIRED — o cert do servidor é confiável mas não verificado por hostname. Bom default.
  • sslMode=VERIFY_CA — verifica que o cert do servidor cadeia até uma CA em que confiamos. Funciona para serviços gerenciados que usam CAs públicas.
  • sslMode=VERIFY_IDENTITY — também verifica que o hostname do cert do servidor bate com o host da URL JDBC. Obrigatório para PlanetScale.
  • sslMode=DISABLED — plaintext. Não use.

Exemplos concretos

  • AWS RDS MySQL: jdbc:mysql://mydb.abc123.us-east-1.rds.amazonaws.com:3306/sales?sslMode=REQUIRED&serverTimezone=UTC
  • Aurora MySQL: Mesmo formato; use o endpoint writer do cluster.
  • Google Cloud SQL: jdbc:mysql://1.2.3.4:3306/sales?sslMode=REQUIRED&serverTimezone=UTC (use o IP público do console do Cloud SQL)
  • Azure Database for MySQL: jdbc:mysql://mydb.mysql.database.azure.com:3306/sales?sslMode=REQUIRED&serverTimezone=UTC
  • PlanetScale: jdbc:mysql://aws.connect.psdb.cloud:3306/analytics?sslMode=VERIFY_IDENTITY&serverTimezone=UTC
  • MariaDB: Use jdbc:mariadb://... se o seu serviço usa parâmetros de URL específicos do MariaDB; senão jdbc:mysql:// funciona contra MariaDB também.
  • MySQL/MariaDB self-hosted: jdbc:mysql://db.yourcompany.com:3306/sales?sslMode=REQUIRED&serverTimezone=UTC

Passo 4 — Conecte pelo wizard do Saiku Cloud

  1. Faça login em https://cloud.saiku.bi/.

  2. Vá em Conexões na barra lateral esquerda.

  3. Em 1. Escolha o tipo de data warehouse, clique no tile MySQL / MariaDB.

  4. Preencha:

    • URL JDBC — a URL do passo 3.
    • Usuáriosaiku_read (ou o que tiver nomeado o usuário no passo 2).
    • Senha — a senha do passo 2.
  5. Clique em Testar conexão.

Se tudo estiver corretamente ligado, você verá um banner verde de resultado: ✓ Connection successful mais a versão detectada do MySQL/MariaDB. Siga para o passo 5.

Se você vir um banner vermelho de resultado, veja Solução de problemas abaixo.

Passo 5 — Salve a conexão

Após um teste bem-sucedido, o wizard renderiza uma seção 3. Salvar conexão. Preencha:

  • Senha (digite de novo para salvar) — a mesma senha que você testou. Não armazenamos a senha do formulário de teste para evitar trafegar uma credencial pelo estado da página.
  • Rótulo — um nome legível como Production warehouse ou Marketing analytics. Mostrado na lista de conexões + designer de cubo.

Clique em Salvar conexão. Vamos te redirecionar para o schema designer.

Solução de problemas

✗ Connection failed (HOST_UNREACHABLE) ou (TIMEOUT)

Não conseguimos alcançar o host na porta que você especificou. Causas mais comuns:

  1. Firewall / allowlist — o passo 1 não foi feito ou não foi feito para o IP certo. Confirme que 87.99.153.244/32 está na allowlist do seu data warehouse + aplicado.
  2. DNS — o hostname na URL JDBC não resolve, ou resolve para um IP privado. Verifique do seu laptop: nslookup <host>. Nos recusamos a conectar a endereços RFC1918 / loopback / link-local por razões de proteção anti-SSRF — HOST_DENIED (não HOST_UNREACHABLE) é o resultado nesse caso.
  3. Porta errada — o MySQL default é 3306. Alguns serviços gerenciados usam uma porta custom (o endpoint primário do PlanetScale é 3306, mas algumas regiões fronteam um load-balancer na 443 — confira a página de connection-strings no console deles).

✗ Connection failed (AUTH_FAILED)

Erro MySQL 1045 — usuário ou senha errados. O wizard intencionalmente não distingue “usuário errado” de “senha errada” — isso é defesa contra ataques de credential-stuffing.

  • Confira o usuário. Nomes de usuário do MySQL SÃO sensíveis a maiúsculas em configurações padrão.
  • Confirme que o usuário tem permissão a partir de '%' ou especificamente de '87.99.153.244'. O formato mais comum dessa falha: CREATE USER 'saiku_read'@'localhost' só permite conexões locais; o Saiku Cloud conecta de 87.99.153.244, que não bate com localhost.
  • Tente conectar do seu laptop com mysql -h <host> -u saiku_read -p <database> para confirmar que as credenciais funcionam fora do Saiku.

✗ Connection failed (DATABASE_NOT_FOUND)

Erro MySQL 1049 — o host aceita suas credenciais, mas o nome do banco na URL JDBC não existe. Verifique:

-- From mysql CLI, as any user with login:
SHOW DATABASES;

Timestamps se deslocam por um número estranho de horas após o import

Você esqueceu serverTimezone=UTC. Adicione à URL JDBC (passo 3), teste, salve. Cubos existentes construídos contra o timezone antigo (errado) precisarão de re-renderização.

O cubo renderiza mas com 'NULL' (literal string) em vez de NULLs reais

Seu MySQL está em modo SQL ANSI + o XML de schema tem nullValue="" configurado. Ou:

Qualquer outra coisa

Tire um screenshot do wizard com o banner vermelho de resultado visível (especificamente a linha Kind: ...) e mande para support@saiku.bi.

Enterprise: rede privada

Para clientes Enterprise rodando uma configuração de rede privada, a regra do IP de egress é substituída por VPC peering ou PrivateLink para a sua instância MySQL. O fluxo do wizard de conexão é, fora isso, idêntico. Entre em contato com seu account team para provisionar o peering.

Teste com FoodMart

Quer testar o Saiku Cloud com esse dialeto antes de conectar seus próprios dados? Baixe o dataset de exemplo FoodMart empacotado para MySQL:

Dataset de exemplo FoodMart para MySQL