MariaDB / Como mudar o diretório de dados no Ubuntu e no Windows
Para mudar onde o MariaDB armazena os dados, desligue o servidor corretamente, copie todo o diretório de dados e ajuste a opção datadir e as permissões de acesso. Alterar apenas a configuração não move os bancos existentes, e uma cópia comum com o servidor em execução pode ficar inconsistente; prepare primeiro um backup independente e uma janela sem gravações.
Escopo e preparação
O diretório de dados contém os bancos e os arquivos de gerenciamento dos mecanismos de armazenamento. A variável de servidor datadir informa o caminho atual. Este procedimento altera o caminho de uma instância independente, no mesmo computador e com a mesma versão do MariaDB. Atualização de versão, troca de sistema operacional, replicação, cluster Galera ou volumes de contêiner exigem um plano separado.
Conecte-se com uma conta administrativa do MariaDB e registre os resultados SQL abaixo. No Ubuntu, sudo mariadb costuma funcionar em instalações com autenticação local por socket. No Windows, use bin\mariadb.exe -u root -p na instalação. Se a autenticação for diferente, utilize a conta administrativa real da instância.
SELECT VERSION(), @@datadir, @@port;
SHOW VARIABLES WHERE Variable_name IN (
'log_error', 'log_bin_basename', 'innodb_data_home_dir',
'innodb_log_group_home_dir', 'aria_log_dir_path'
);
- Backup independente: mantenha uma cópia recuperável em outro local e verifique a restauração ao lidar com produção. Preservar a pasta antiga não substitui um backup separado. A visão geral de backups do MariaDB explica as abordagens lógica e física.
- Caminhos e capacidade: anote a origem real e um destino com espaço suficiente.
/var/lib/mysql/e a versão do Windows11.4são exemplos que precisam corresponder à sua instalação. - Arquivos externos: logs binários em caminhos absolutos, tablespaces externos, chaves de criptografia, links simbólicos e pontos de nova análise do Windows precisam de avaliação própria. Alterar
datadirnão move automaticamente todos os arquivos. - Manutenção: interrompa gravações de aplicações, tarefas agendadas e mecanismos de reinício automático. Mantenha as gravações externas bloqueadas até concluir a verificação.
Não execute mariadb-install-db no destino ao mover uma instância existente. Essa ferramenta inicializa uma nova instância; aqui, a operação consiste em copiar integralmente os dados atuais.
Mover o diretório no Ubuntu
Identificar a configuração e a montagem
Uma instalação comum por pacotes no Ubuntu 24.04 usa /etc/mysql/mariadb.conf.d/50-server.cnf, mas o método de instalação pode alterar esse caminho. Verifique argumentos e complementos do serviço com systemctl cat e as opções lidas dos arquivos com mariadbd --print-defaults. Não publique a saída sem verificar se há configurações sensíveis.
sudo systemctl cat mariadb
sudo mariadbd --print-defaults
sudo du -sh /var/lib/mysql
df -h /data
findmnt -T /data
Se /data não existir, prepare e monte primeiro o disco de destino. Confirme com df e findmnt que o sistema de arquivos é o esperado. A documentação dos arquivos de opções do MariaDB explica que opções posteriores ou argumentos de inicialização podem substituir valores anteriores. Faça backup do arquivo realmente lido pelo serviço antes de editá-lo.
Parar o servidor e copiar todos os dados
O exemplo usa o serviço mariadb, a conta do sistema mysql e o destino /data/mariadb/. Instale o rsync antes da parada, se necessário. Confirme o estado inactive e o encerramento do processo do servidor. is-active pode retornar um código diferente de zero quando o serviço está inativo. Não copie após uma falha no desligamento nem enquanto outra instância usar o mesmo diretório.
sudo systemctl stop mariadb
sudo systemctl is-active mariadb
sudo systemctl status mariadb --no-pager
Use um destino vazio, sem misturar arquivos de instâncias diferentes. Os comandos criam a pasta, definem proprietário e permissões e copiam também arquivos ocultos e de gerenciamento dos mecanismos. -a preserva, entre outros atributos, proprietário e permissões. cp -a também pode preservá-los; uma cópia simples não garante o mesmo resultado.
sudo mkdir -p /data/mariadb
sudo chown mysql:mysql /data/mariadb
sudo chmod 750 /data/mariadb
sudo rsync -aHAX --numeric-ids /var/lib/mysql/ /data/mariadb/
sudo rsync -aHAXnci --numeric-ids /var/lib/mysql/ /data/mariadb/
O primeiro rsync faz a cópia; o segundo compara somas de verificação em uma simulação, sem alterar arquivos. Confirme o sucesso dos dois e investigue diferenças no segundo. A barra final da origem significa “copiar o conteúdo”. Se o destino não conseguir preservar ACLs, listas de controle de acesso, ou atributos estendidos, resolva o erro verificando o sistema de arquivos e as opções, em vez de ignorá-lo.
Ajustar datadir e as regras de segurança
Altere a entrada existente de datadir em um grupo de opções de servidor efetivamente lido. Evite acrescentar entradas conflitantes em vários locais.
[mysqld]
datadir=/data/mariadb
O proprietário correto nem sempre basta. O AppArmor restringe o acesso de programas a arquivos no Linux. Verifique os perfis ativos e os registros do kernel em busca de mensagens DENIED relacionadas ao executável do MariaDB.
sudo aa-status
sudo journalctl -k -b --no-pager
Se o perfil aplicado permitir somente o caminho antigo, ajuste suas regras locais ou um alias que ele realmente utilize. O guia de falhas de inicialização do MariaDB apresenta o alias abaixo em /etc/apparmor.d/tunables/alias. Confirme primeiro que o perfil ativo utiliza esse arquivo, faça backup e verifique o sucesso de sudo systemctl reload apparmor após a alteração. Os perfis variam conforme a distribuição e o pacote; esse alias não é obrigatório em toda instalação.
alias /var/lib/mysql/ -> /data/mariadb/,
Examine também ReadWritePaths, ProtectSystem e outras restrições em systemctl cat mariadb. Para um disco separado, sudo systemctl edit mariadb permite adicionar esta dependência de montagem. Isso não formata o disco nem substitui a montagem permanente em /etc/fstab. Consulte RequiresMountsFor no systemd.
[Unit]
RequiresMountsFor=/data/mariadb
O exemplo evita /home e /root, que podem ser bloqueados pela proteção padrão do serviço. Se for necessário liberar mais acesso de gravação, autorize o caminho específico, em vez de desativar toda a proteção. A documentação do MariaDB sobre systemd explica essas restrições.
Iniciar e confirmar o caminho ativo
Se alterou configurações da unidade, recarregue o gerenciador de serviços e inicie o MariaDB. A consulta SQL deve indicar /data/mariadb/. Mover os dados não exige mudar também o socket usado pelos clientes; evite alterações sem relação com a tarefa.
sudo systemctl daemon-reload
sudo systemctl start mariadb
sudo systemctl status mariadb --no-pager
sudo mariadb -e "SELECT @@datadir;"
Se a inicialização falhar ou o caminho antigo aparecer, mantenha as aplicações desconectadas e siga o diagnóstico adiante.
Mover o diretório no Windows
Identificar serviço, conta e my.ini
Execute estas consultas no PowerShell como administrador para descobrir o nome real do serviço, a conta de logon e os argumentos. Substitua MariaDB e a versão 11.4 em todos os exemplos. O nome padrão do guia de instalação MSI no Windows pode diferir daquele registrado no computador.
Get-CimInstance Win32_Service |
Where-Object { $_.PathName -match 'mariadbd|mysqld' } |
Select-Object Name, State, StartName, PathName
sc.exe qc MariaDB
Identifique o my.ini indicado por --defaults-file. Se não houver essa opção, examine os caminhos de busca apresentados por --help --verbose daquele executável e os arquivos existentes. No Explorador, ative Exibir → Mostrar → Extensões de nomes de arquivos para evitar salvar como my.ini.txt. Registre @@datadir e faça backup da configuração ativa em outro local.
Parar o serviço e copiar os arquivos
O exemplo move C:\Program Files\MariaDB 11.4\data para uma nova pasta vazia C:\MariaDB. Confirme o estado Stopped antes da cópia. Se o destino existir, verifique seu conteúdo e não una dados de outra origem.
Stop-Service -Name 'MariaDB'
Get-Service -Name 'MariaDB'
New-Item -ItemType Directory -Path 'C:\MariaDB'
robocopy "C:\Program Files\MariaDB 11.4\data" "C:\MariaDB" /E /COPY:DAT /DCOPY:DAT /R:1 /W:1 /XJ /XF my.ini
$copyExit = $LASTEXITCODE
if ($copyExit -ge 8) { throw "Robocopy failed: $copyExit" }
O comando inclui subpastas, mas exclui my.ini, que continuará sendo usado no local original. /COPY:DAT copia dados, atributos e horários; as permissões do destino são definidas depois. /XJ exclui junções, exigindo tratamento separado de conteúdo externo. Conforme a referência do Microsoft Robocopy, códigos de saída a partir de 8 indicam falha. Mesmo entre 0 e 7, examine falhas, divergências e arquivos extras inesperados no resumo.
Dar acesso ao serviço e alterar datadir
Abra services.msc e verifique Propriedades → Logon do serviço. Em Propriedades → Segurança → Editar → Adicionar da nova pasta, conceda Modificar à conta que realmente o executa. O usuário SQL root é diferente da conta Windows do serviço. Não é necessário dar controle total a Everyone.
Use o comando a seguir somente após confirmar a conta virtual NT SERVICE\MariaDB. Caso o serviço tenha outro nome ou utilize um usuário local ou de domínio, substitua pela identidade correta. (OI)(CI)M concede modificação herdada por arquivos e subpastas. Veja a referência do Microsoft icacls.
icacls "C:\MariaDB" /grant "NT SERVICE\MariaDB:(OI)(CI)M"
icacls "C:\MariaDB"
Edite o grupo de servidor existente no my.ini original e salve no mesmo lugar. Barras normais evitam problemas de escape com barras invertidas. Mantenha --defaults-file apontando para o arquivo original; não mova também a configuração durante essa operação.
[mysqld]
datadir=C:/MariaDB
Iniciar o serviço e conectar
Inicie o MariaDB e abra o cliente. Digite a senha quando solicitada, sem colocá-la diretamente após -p na linha de comando.
Start-Service -Name 'MariaDB'
Get-Service -Name 'MariaDB'
& 'C:\Program Files\MariaDB 11.4\bin\mariadb.exe' -u root -p
Execute SELECT @@datadir; e confirme C:\MariaDB\ ou a forma equivalente com barras normais. O estado Running sozinho não comprova que os dados corretos foram abertos.
Verificar dados existentes, gravação e persistência
Compare bancos, contagens de linhas representativas e valores conhecidos com os registros anteriores. Depois, confirme que o nome de teste abaixo não está em uso e execute o SQL com uma conexão administrativa. Se já existir, escolha outro nome único e substitua em todas as instruções. Não crie objetos de teste dentro de um banco de negócio.
SELECT @@datadir;
CREATE DATABASE datadir_move_check_13862;
CREATE TABLE datadir_move_check_13862.probe (id INT PRIMARY KEY);
INSERT INTO datadir_move_check_13862.probe VALUES (1);
SELECT * FROM datadir_move_check_13862.probe;
A última consulta deve retornar uma linha com id = 1. Mantenha as gravações externas bloqueadas, reinicie o serviço corretamente mais uma vez, reconecte e execute:
SELECT @@datadir;
SELECT * FROM datadir_move_check_13862.probe;
O caminho novo e a linha 1 devem permanecer. Remova somente o banco de teste com a instrução seguinte, confira a conexão e as leituras e gravações da aplicação e então retome o tráfego. A criação de uma pasta não comprova a migração de todos os dados InnoDB.
DROP DATABASE datadir_move_check_13862;
Preserve a origem até concluir as verificações e cumprir sua política de retenção. Atualize backups e monitoramento para incluir o novo local.
Diagnosticar falhas ou um caminho inalterado
- O datadir antigo aparece: verifique se o arquivo errado foi editado, se uma opção posterior ou argumento substitui o valor ou se o cliente usa a porta ou socket de outra instância.
- Permission denied ou falha ao criar arquivo de teste: confira a conta do serviço, a passagem pelos diretórios superiores e a escrita no destino. No Ubuntu, examine AppArmor e systemd; no Windows, a ACL da conta real.
- Bancos ou tabelas do sistema ausentes: procure um nível de pasta extra ou uma cópia incompleta. Não inicialize o destino nem apague
ibdata1ou logs como tentativa de correção. - Falha após reiniciar o computador: verifique montagem permanente, ordem de inicialização e estabilidade das letras de unidade.
No Ubuntu, confira o horário e o caminho da falha nos registros. namei ajuda a examinar as permissões de cada diretório superior.
sudo journalctl -u mariadb -b -n 100 --no-pager
sudo journalctl -k -b --no-pager
namei -l /data/mariadb
sudo systemctl cat mariadb
No Windows, consulte o local de log_error, os arquivos .err nas pastas antiga e nova e o Visualizador de Eventos. Uma mensagem genérica como o erro de serviço 1067 não identifica a causa. O diagnóstico de inicialização do MariaDB apresenta verificações específicas.
Quando e como voltar ao caminho anterior
Se ainda não houve gravações externas no novo local, pare completamente o MariaDB e restaure a configuração salva ou o valor original de datadir. Reverta somente o alias do AppArmor ou complemento do systemd adicionado nesta mudança, preservando os demais ajustes. Se a unidade foi alterada, execute daemon-reload antes de iniciar e confirme o caminho original e os dados.
Se já houve gravações reais no novo local, a origem preservada está desatualizada. Apenas apontar de volta pode perder essas mudanças. Bloqueie novamente as gravações, faça backup dos dados recentes e planeje uma migração inversa com o servidor parado ou uma recuperação adequada. Não misture arquivos dos dois diretórios nem execute as duas cópias simultaneamente.
