Como mudar o diretório de dados do MySQL?

158

É possível alterar meu diretório de dados padrão do MySQL para outro caminho? Poderei acessar os bancos de dados a partir do local antigo?

MySQL DBA
fonte
3
Existem respostas disponíveis para esta pergunta se o sistema no Win8?
Jonathan M
1
Para janelas - veja aqui: dba.stackexchange.com/questions/24403/…
Dr. Aaron Dishno
Para usuários de mac, tudo o que você precisa é este e o passo 1-4 da resposta de @ user1341296.
shellbye

Respostas:

270
  1. Pare o MySQL usando o seguinte comando:

    sudo /etc/init.d/mysql stop
  2. Copie o diretório de dados existente (padrão localizado em /var/lib/mysql) usando o seguinte comando:

    sudo cp -R -p /var/lib/mysql /newpath
  3. edite o arquivo de configuração do MySQL com o seguinte comando:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
  4. Procure a entrada datadire altere o caminho (que deveria ser /var/lib/mysql) para o novo diretório de dados.

  5. No terminal, digite o comando:

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
  6. Procure por linhas começando com /var/lib/mysql. Mudança /var/lib/mysqlnas linhas com o novo caminho.

  7. Salve e feche o arquivo.

  8. Reinicie os perfis do AppArmor com o comando:

    sudo /etc/init.d/apparmor reload
  9. Reinicie o MySQL com o comando:

    sudo /etc/init.d/mysql restart
  10. Agora entre no MySQL e você poderá acessar os mesmos bancos de dados que você tinha antes.

user1341296
fonte
33
O exemplo acima não conseguiu resolver o problema para mim no Ubuntu 12.04 (Precise). Eu descobri que é necessário editar o arquivo /etc/apparmor.d/tunables/alias para incluir uma linha "alias / var / lib / mysql / -> / newpath /", com isso no lugar, não era necessário alterações em qualquer um dos outros arquivos do AppArmor. Ele funcionou imediatamente após reiniciar o AppArmor com "/etc/init.d/apparmor restart" e o MySQL com "restart mysql".
mak
2
Apparmor não é relevante no CentOS. Existe o SELinux. Pode ler sobre como desativar ou gerencia aqui blogs.oracle.com/jsmyth/entry/selinux_and_mysql
Noam
12
na edição de mak (que é necessário) não se esqueça da vírgula no final da linhaalias /var/lib/mysql/ -> /newpath/,
Michael
4
Não posso enfatizar o suficiente a importância do comentário de Michel acima: ADICIONE Vírgula e economize alguns neurônios. Desculpe pelas tampas.
alx
2
Não funciona para mim. Eu recebo o trabalho para mysql.service falhou. Consulte 'status do systemctl mysql.service' e 'journalctl -xn' para obter detalhes ao tentar reiniciar o mysqld, e o erro é que o disco está cheio. Tem 500 GB de espaço livre ...
Frank H.
17

Rápido e fácil de fazer:

# Create new directory for MySQL data
mkdir /new/dir/for/mysql

# Set ownership of new directory to match existing one
chown --reference=/var/lib/mysql /new/dir/for/mysql

# Set permissions on new directory to match existing one
chmod --reference=/var/lib/mysql /new/dir/for/mysql

# Stop MySQL before copying over files
service mysql stop

# Copy all files in default directory, to new one, retaining perms (-p)
cp -rp /var/lib/mysql/* /new/dir/for/mysql/

Edite o /etc/my.cnfarquivo e, em seguida, [mysqld]adicione esta linha:

datadir=/new/dir/for/mysql/

Se você estiver usando o CageFS (com ou sem CloudLinux) e quiser alterar o diretório MySQL, DEVE adicionar o novo diretório a este arquivo:

/etc/cagefs/cagefs.mp

E, em seguida, execute este comando:

cagefsctl --remount-all
sMyles
fonte
1
Fico feliz em ouvir: P
sMyles
Muito obrigado e, para adicionar, se você quiser criar um script completamente como eu, você pode usar o seguinte: sed -i's | datadir = / var / lib / mysql | datadir = / data / var / lib / mysql | g '/ etc / my.cnf
berimbolo
Isso não funcionou para mim. Eu tentei isso e muitas outras alternativas diferentes. Estou chegando à mesma conclusão que user3338098 quando ele diz que esta é a única maneira que funciona: serverfault.com/questions/503887/…
Volksman
@Volksman tudo o que esse link diz é que ele teve que remover e reinstalar ... é provável que ambos tenham algum outro problema específico do servidor, pois o MySQL e o MariaDB suportam a configuração do datadir, e eu fiz isso recentemente (há 6 meses) em outro servidor sem problemas
sMyles
@sMyles sim, foi removido e instalado, mas após a montagem do / var / lib / mysql em outro local, ou seja, uma mega partição diferente da que o / var foi montada anteriormente. Se houver um problema específico em nossos sistemas, seria ótimo descobrir isso. Essa foi uma nova instalação padrão do Centos 7 OS com RAID 10 com disco rígido de 8x, mas geralmente esses detalhes da matriz de disco são transparentes para o software.
Volksman
15

você teria que copiar os dados atuais para o novo diretório e alterar my.cnfseu MySQL.

[mysqld]
datadir=/your/new/dir/
tmpdir=/your/new/temp/

Você precisa copiar o banco de dados quando o servidor não estiver em execução .

RageZ
fonte
Bem, é isso que eu não posso fazer. Quero alterar o diretório, mas quero criar novos bancos de dados no novo diretório. E deseja acessar o diretório antigo e os novos bancos de dados de diretório.
MySQL DBA
1
@MySQL DBA: se você usar algum ln -slince simbólico estático, não será?
RageZ
Bem, estou um pouco confuso com o uso deste comando. Como expliquei antes, quero criar novos bancos de dados em um novo diretório. É possível com o link simbólico.
MySQL DBA
1
você pode criar um novo diretório, use link simbólico para tornar o arquivo aparecer na nova dir e mudar suamy.cnf
RageZ
2
down votado porque não funciona como detalhado em serverfault.com/a/733998/279553 #
user3338098
14

Primeiro você deve parar o servidor mysql. por exemplo

# /etc/init.d/mysql stop

Depois disso, você deve copiar o diretório de dados antigo (por exemplo, / var / lib / mysql) incl. privilégios para o seu novo diretório via

# cp -R -p /var/lib/mysql /new/data/dir

agora você pode alterar /etc/mysql/my.cnfos dados novos e reiniciar o servidor

# /etc/init.d/mysql restart
H6
fonte
5
baixo votou porque ele não funciona conforme detalhado na serverfault.com/a/733998/279553
user3338098
7

Se como eu, você está no debian e deseja mover o diretório mysql para sua casa ou um caminho em / home / ..., a solução é:

  • Pare o mysql por "sudo service mysql stop"
  • altere a variável "datadir" para o novo caminho em "/etc/mysql/mariadb.conf.d/50-server.cnf"
  • Faça um backup de / var / lib / mysql: "cp -R -p / var / lib / mysql / path_to_my_backup"
  • exclua este diretório: "sudo rm -R / var / lib / mysql"
  • Mova os dados para o novo diretório: "cp -R -p / path_to_my_backup / path_new_dir
  • Altere o acesso por "sudo chown -R mysql: mysql / path_new_dir"
  • Altere a variável "ProtectHome" por "false" em "/etc/systemd/system/mysqld.service"
  • Reload systemd por "sudo systemctl daemon-reload"
  • Reinicie o mysql por "service mysql restart"

Um dia, para encontrar a solução para mim na documentação do mariadb. Espero que isso ajude alguns caras!

Sirac
fonte
O arquivo /etc/systemd/system/mysqld.service não está aqui. Alguma idéia de onde devo procurar?
Ron Piggott
1
Para aqueles que usam MariaDB o serviço de arquivo está localizado em /lib/systemd/system/[email protected]
Ron Piggott
5

Eu queria manter um banco de dados na minha máquina, mas também ter dados no disco rígido externo e alternar entre os dois.

Se você está em um Mac e instalou o MySQL usando o Homebrew, isso deve funcionar para você. Caso contrário, você só precisará substituir os locais apropriados para o MySQL datadirem sua máquina.

#cd to my data dir location
cd /usr/local/var/

#copy contents of local data directory to the new location
cp -r mysql/ /Volumes/myhd/mydatadir/

#temporarily move the old datadir
mv mysql mysql.local

#symlink to the new location
ln -s /Volumes/myhd/mydatadir mysql

Então, quando você quiser voltar, faça:

mv mysql mysql.remote

mv mysql.local mysql

e você está usando seu banco de dados local novamente. Espero que ajude.

wfbarksdale
fonte
1
isso não está exatamente abordando a questão como indicado - no entanto, era exatamente isso que eu estava procurando - e é uma maneira elegante de lidar com um caso / bug de ponta em que o my.cnf não lida bem com os espaços: bugs.mysql.com /bug.php?id=26033 . Vou vincular essa solução alternativa nesse relatório de bug.
gabe 23/09
baixo votou porque ele não funciona conforme detalhado na serverfault.com/a/733998/279553
user3338098
5

Primeira parada do mysqld

mysql_install_db --user=mysql \
                 --basedir=/opt/mysql/mysql \
                 --datadir=/opt/mysql/mysql/data

Então mude o datadir no seu /etc/mysql/my.cnf
mysqld Start

Notas:
# 1: provavelmente você precisa ajustar as configurações do SELinux (experimente o SELinux desativado em caso de problemas), o Apparmor (Ubuntu) também pode ser um problema.

# 2: consulte Referência de banco de dados de instalação do MySQL

Murlo
fonte
4

Primeiro pare seu mysql

sudo service mysql stop

copie dados mysql para o novo local.

sudo cp -rp /var/lib/mysql /yourdirectory/

se você usar o apparmor, edite o seguinte arquivo e faça o seguinte

sudo vim /etc/apparmor.d/usr.sbin.mysqld

Substitua onde / var / lib / by / yourdirectory / adicione o seguinte, se não houver, ao arquivo

    /yourdirectory/mysql/ r,
    /yourdirectory/mysql/** rwk,

Salve o arquivo com o comando

:wq

Edite o arquivo my.cnf

sudo vim /etc/mysql/my.cnf

Substitua onde / var / lib / by / yourdirectory / e salve com o comando

:wq

finalmente inicie o mysql

sudo service mysql start

@ veja mais sobre raid0, otimização ici

naddame
fonte
baixo votou porque ele não funciona conforme detalhado na serverfault.com/a/733998/279553
user3338098
talvez isso não funcione para outra distribuição, mas se você estiver usando o ubuntu, isso funcionará bem para mim e eu mudarei o caminho para cada novo servidor ubuntu instalado para ativar o raid0.
Naddame 6/11
2
Sei que as pessoas estão votando contra isso, mas quero dizer que isso salvou meu dia. Obrigado!
Daniel Loureiro
3

Esta solução funciona no Windows 7 usando o Workbench. Você precisará de privilégios de administrador para fazer isso. Ele cria uma junção (como um atalho) para onde você realmente deseja armazenar seus dados

Abra o Workbench e selecione INSTANCE - Inicialização / Desligamento Pare o servidor

Instale o Junction Master em https://bitsum.com/junctionmaster.php

Navegue para C: \ ProgramData \ MySQL \ MySQL Server 5.6

Clique com o botão direito do mouse em Dados e selecione "Mover e depois vincular a pasta para ..." Aceite o aviso Aponte o destino para "Seu novo diretório de dados aqui sem as aspas" Clique em Mover e vincular

Agora vá para "Seu novo diretório de dados aqui sem as aspas"

Clique com o botão direito do mouse em Dados. Vá para a guia segurança. Clique em Editar. Clique em Adicionar. Serviço de Rede e depois em Verificar Nomes. Clique em OK. Clique na caixa de seleção Permitir Controle Total e em OK.

Volte para o Workbench e inicie o servidor

Este método funcionou para mim usando o MySQL Workbench 6.2 no Windows 7 Enterprise.

Roubar
fonte
2

Tudo como @ user1341296 disse, mais ...

É melhor não mudar /etc/mysql/my.cnf Em vez disso, você deseja criar um novo arquivo /etc/mysql/conf.d/ext.cnf(qualquer nome, mas a extensão deve ser cnf)

E coloque nela sua mudança:

[mysqld]
datadir=/vagrant/mq/mysql

Nesse caminho

  • Você não precisa alterar o arquivo existente (mais fácil para scripts de automação)
  • Sem problemas com a atualização da versão do MySQL (e suas configurações!).
Pavel
fonte
2

Caso você seja um usuário do Windows e tenha chegado aqui para descobrir que todas as respostas são para usuários do Linux, não fique desapontado! Não vou deixar você perder tempo do jeito que eu fiz.

Um pouco de conversa fiada antes da solução:

O MySQL usa um diretório Data para armazenar os dados dos diferentes bancos de dados que você cria. Bem, no final, ele precisa armazená-los na forma de arquivos com alguns malabarismos adicionados no aplicativo e no formato de arquivo para garantir que o banco de dados prometa que você aprendeu nas classes de bancos de dados esteja intacto.

Agora você quer ter certeza de que há espaço suficiente para armazenar grandes bancos de dados que você pode criar no futuro, e então pensou: Ei! Quero colocá-lo em outra unidade que tenha mais espaço.

Então você faz o seguinte.

Etapa - 1 : Parando o serviço MySQL.

  Window Key + R - will open Run
  servies.msc    - will open services manager
  Locate MySQL80 (80 is for version 8.0, look for the one you've).
  Stop it.       (Right click, Stop)

Etapa 2 : Descobrindo o diretório de dados atual

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

Por padrão, deve haver uma pasta aqui chamada Data , essa é a que é usada pelo MySQL na configuração padrão (desde que eles não tenham encontrado outro local melhor), mas vamos verificar isso.

Encontre o my.iniarquivo, deve estar ali.

Abra-o em um editor (talvez o Notepad ++).

Faça um CTRL + F para descobrir datadirno arquivo.

Tudo o que é mencionado aqui é a localização atual atualmente em uso pelo MySQL para o diretório de dados. É isso que você quer mudar.

Etapa 3 : Substituindo-o por um novo diretório de dados.

Digamos que você deseja que seu novo diretório de dados seja W: __ MySQL_Data. Vamos alterar o datadirvalor no my.iniarquivo para esse valor. Mantenha o valor anterior comentado para que você não precise se lembrar dele.

 # Path to the database root
 # datadir=C:/ProgramData/MySQL/MySQL Server 8.0/Data
   datadir=W:/__MySQL_Data

Agora use xcopypara copiar o padrão datadirpara W:\. Iniciar prompt de comando (Window + R, cmd, Enter)

 >> xcopy "\C:\ProgramData\MySQL\MySQL Server 8.0" "W:\" /E /H /K /O /X

E renomeie a pasta copiada para o novo datadirvalor que você alterou. Aqui:W:/__MySQL_Data

Por que não simplesmente copiar? Bem, porque isso não é FRESCO !, isso ajuda você a não perder permissões na pasta copiada, para que, ao reiniciar MySQL80, não ocorra um erro estúpido: "O serviço MySQL80 no Computador Local foi iniciado e parou. Alguns serviços param automaticamente se eles não estão sendo usados ​​por outros serviços ou programas ". - Cortesia: Microsoft

Etapa 4 : Reiniciando o serviço

 Well, go back to the Services Manager to Start again, 
 "MySQL80" that you stopped, to restart it again.

Etapa 5 : Feito! Agora, volte ao trabalho !!

Prem KTiw
fonte
1
Obrigado por ter sido útil, mas aviso: my.ini não pode ser gravado por um usuário normal, a menos que você altere suas permissões. Ah, e ProgramData é uma pasta oculta, portanto você precisa alterar as configurações da pasta Explorer para vê-la.
JonP 05:00
1

Costumo fazer isso ao atualizar máquinas, movendo de uma caixa para outra. Além de mover / var / lib / mysql para um local melhor, muitas vezes preciso restaurar tabelas antigas do banco de dados a partir de uma instalação antiga do MySQL. Para fazer isso ...

  1. Pare o mysql. Siga as instruções acima, se necessário.
  2. Copie os diretórios do banco de dados - haverá um para cada banco de dados da instalação antiga - para o novo local do DATADIR. Mas omita os diretórios "mysql" e "performance_schema".
  3. Permissões corretas entre os diretórios de banco de dados copiados. A propriedade deve ser mysql: mysql, diretórios devem ser 700 e arquivos devem ser 660.
  4. Reinicie o mysql. Dependendo da sua instalação, os arquivos DB da versão antiga devem ser atualizados.
K Markey
fonte
desculpe pelo voto negativo, esta solução pode estar correta, não tentei.
precisa saber é o seguinte
1

Tivemos que mover o MySQL para o /homediretório porque ele foi mapeado a partir de outro disco físico. Para simplificar ao vivo, em vez de alterar o diretório no my.cnf, mapeamos o novo diretório /home/mysqlno lugar do diretório original/var/lib/mysql . Funciona para nós como um encanto (testado no CentOS 7.1).

Crie o novo diretório e defina as permissões corretas.

mkdir -p /home/mysql
chmod 755 /home/mysql
chown mysql:mysql /home/mysql

Pare o MySQL se estiver executando.

systemctl stop mysql

Mova o diretório de dados.

mv -f /var/lib/mysql/* /home/mysql

Crie uma montagem permanente e execute-a.

echo "/home/mysql /var/lib/mysql none    bind   0 0" >> /etc/fstab
mount -a

Reinicie o servidor.

systemctl start mysql
TomS
fonte
1

Se você deseja fazer isso programaticamente (sem entrada manual de texto com o gedit), veja uma versão para um arquivo Docker com base na resposta do usuário1341296 acima:

FROM spittet/ruby-mysql
MAINTAINER you@gmail.com

RUN cp -R -p /var/lib/mysql /dev/shm && \
    rm -rf /var/lib/mysql && \
    sed -i -e 's,/var/lib/mysql,/dev/shm/mysql,g' /etc/mysql/my.cnf && \
    /etc/init.d/mysql restart

Disponível no hub Docker aqui: https://hub.docker.com/r/richardjecooke/ruby-mysql-in-memory/

Richard
fonte
0

Primeiro, você deve saber onde está o seu arquivo de configuração? onde está o seu arquivo de configuração?

SE você instalou com o apt-get ou yum install。

arquivo de configuração pode aparecer em

/etc/mysql/my.cnf

arquivo de dados pode aparecer em

/ var / lib / mysql

e o que você deve fazer é

  1. pare o mysql
  2. mude os dados do mysql para o novo diretório
  3. alterar o arquivo de configuração
  4. recarregar o arquivo de configuração
  5. reinicie o mysql

e depois trabalhos concluídos.

Mas se você não o instalou com o apt ou yum, o diretório pode não ser assim, e você pode encontrar os arquivos mysql com

whereis mysql

42wolf
fonte
baixo votou porque ele não funciona conforme detalhado na serverfault.com/a/733998/279553
user3338098
0

No SuSE 13.1, isso funciona bem para mover o diretório de dados do mysql para outro lugar, por exemplo, para / home / example_user / e para fornecer um nome mais informativo:

Em / var / lib /:

# mv -T mysql /home/example_user/mysql_datadir
# ln -s /home/example_user/mysql_datadir ./mysql

Eu reiniciei o mysql:

# systemctl restart mysql.service

mas suspeite que mesmo isso não fosse necessário.

user3346151
fonte
0

Para um dos ambientes, mudei o diretório de dados do mysql para um novo local, mas durante a reinicialização do servidor mysql, estava demorando. Então, verifiquei a porta e descobri que outro processo estava escutando na porta mysql. Então eu matei o processo e reiniciei o servidor mysql e funcionou bem.

Segui as etapas abaixo para alterar o diretório de dados, que funcionou excelente. alterar diretório de dados mysql no Linux

santosh tiwary
fonte
Bem-vindo ao Stack Overflow! Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Tim Diekmann
0

As etapas acima são básicas e básicas. Eu os segui e ainda recebi o erro "o mysql falhou ao iniciar".

Para que a nova pasta armazene dados mysql, você precisa ter certeza de que a pasta possui permissões e propriedade mysql: mysql.

Além disso, ele precisa verificar as permissões e a propriedade do diretório pai do mysql, se tiver, digamos, / data / mysql /. Aqui o diretório / data / deve ser root: root. Corrigi o erro de "mysql falha ao iniciar" após alterar a propriedade do diretório pai do / mysql. O SO na minha VM é RHEL 7.6.

Usuário3325137
fonte
Tentei o selinux no RHEL7.6 alterando SELINUX = reforçando para SELINUX = permissivo, não funcionou para mim.
usar o seguinte código
0

Também é possível fazer o link simbólico do datadir. Pelo menos no ambiente macOS, dev.

(homebrew) por exemplo

# make sure you're not overwriting anything important, backup existing data
mv /usr/local/var/mysql [your preferred data directory] 
ln -s [your preferred data directory] /usr/local/var/mysql

Reinicie o mysql.

Maciek Rek
fonte
-1

Se você estiver usando o SE linux, configure-o para o modo permissivo editando / etc / selinux / config e alterando SELINUX = reforçando para SELINUX = permissivo

tanxiuguang
fonte
conforme detalhado aqui serverfault.com/questions/503887/... selinux não está em falta há algum outro problema que impede a mudança da datadirpropriedade
user3338098