Como faço para mover o diretório de dados do MySQL?

52

Estou tentando mover o diretório de dados do meu banco de dados MySQL para um segundo array de disco que tenho como ponto de montagem /array2/ .

O problema que estou tendo é que eu tentei de tudo e depois que eu modifiquei a localização do datadir em my.cnf, o mysql não irá iniciar novamente.

Tudo que eu obtenho é:

start: Job failed to start
    
por Jonny Flowers 15.05.2012 / 18:32

7 respostas

61

Esqueceu-se da armadura de aplicativos.

Para quem estiver interessado, fiz o seguinte para mover a pasta.

Pare o servidor mysql:

stop mysql

Crie o novo diretório:

mkdir /array2/mysql

Copie APENAS as pastas do banco de dados:

cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql

Faça o backup do arquivo my.cnf :

cp /etc/mysql/my.cnf /root/my.cnf.backup

Edite o arquivo my.cnf :

nano /etc/mysql/my.cnf

Altere todas as menções do datadir e do soquete antigos para o novo local

A minha tornou-se:

datadir=/array2/mysql
socket=/array2/mysql/mysql.sock

Atualize as permissões do diretório:

chown -R mysql:mysql /array2/mysql

Renomeie o diretório antigo:

mv /var/lib/mysql /var/lib/mysql-old

Crie um symlink, apenas no caso:

ln -s /array2/mysql /var/lib/mysql 

Deixe o AppArmor saber sobre o novo datadir:

echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias

Recarregue os perfis do apparmor

sudo /etc/init.d/apparmor reload

Em seguida, inicie o mysql:

start mysql
    
por Jonny Flowers 21.09.2015 / 11:20
20

Descobri que o AppArmor foi o culpado ao examinar o syslog e foi capaz de alterar com sucesso a localização dos dados de mysql seguindo este processo.

Por favor, note que, nos arquivos editados abaixo, as linhas que começam com + foram adicionadas, e as linhas que começam com - foram removidas. Na verdade, você não deve digitar / colar os sinais + ao adicionar linhas a esses arquivos.

Eu clonei o diretório mysql para o novo local:

sudo rsync -av /var/lib/mysql /new_dir

Depois, editei a linha datadir em /etc/mysql/my.cnf :

sudo vi /etc/mysql/my.cnf
-datadir     = /var/lib/mysql
+datadir     = /new_dir/mysql

Então eu editei /etc/apparmor.d/usr.sbin.mysqld :

sudo vi /etc/apparmor.d/usr.sbin.mysqld
-  /var/lib/mysql/ r,
-  /var/lib/mysql/** rwk,
+  /new_dir/mysql/ r,
+  /new_dir/mysql/** rwk,

Então reiniciei mysql .

    
por Brian Moore 17.08.2012 / 18:29
13

Esteja ciente.

Se você tiver tabelas InnoDB, você DEVE copiar os arquivos ibdata* e ib_logfile* ou você não poderá usar as tabelas. Você vai ter:

  

'Table' databaseName.tableName 'não existe'

erros.

Execute este comando de cópia para copiar os arquivos ibdata* e ib_logfile* .

sudo cp -p /var/lib/mysql/ib* /array2/mysql/
    
por dave 02.05.2013 / 11:59
4

Eu apenas tentei de outra forma, que alguns podem achar útil:

copie com permissões intactas:

rsync -avzh /var/lib/mysql /path/to/new/place

backup (no caso de algo dar errado):

mv /var/lib/mysql /var/lib/_mysql

crie um novo diretório vazio no lugar do antigo:

mkdir /var/lib/mysql

bind mount o novo local para o antigo:

mount -B /path/to/new/place /var/lib/mysql

Espero que ajude alguém, porque o symlinking não funcionou para mim, e essa foi a maneira mais simples

    
por snapfractalpop 21.08.2015 / 00:19
3

Se você mover o seu datadir, você não apenas precisará fornecer as novas permissões de datadir, mas também precisará garantir que todos os diretórios pai tenham permissão.

Mudei meu datadir para um disco rígido, montado no Ubuntu como:

/media/*user*/Data/

e meu datadir era Bancos de dados .

Eu tive que definir permissões para 771 para cada mídia, usuário e diretórios de dados:

sudo chmod 771 *DIR*

Se isso não funcionar, outra maneira de fazer o mysql funcionar é mudar o usuário em /etc/mysql/my.cnf para root; embora não haja dúvidas de alguns problemas em fazer isso de uma perspectiva de segurança.

    
por Kohjah Breese 09.10.2014 / 14:36
1

Eu prefiro usar o mount com opção de bind, então eu evito qualquer alteração adicional na configuração do Apparmor e Mysql.

Por exemplo:

Suponha que eu queira mover tudo em /var/www . Vamos dizer que este diretório é meu ambiente dev e é montado em uma partição diferente

  1. Primeiro precisamos parar o mysql :

    sudo systemctl stop mysql.service
    
  2. Nós movemos arquivos (preservando a permissão)

    sudo rsync -av /var/lib/mysql /var/www
    

    Isso gerará um diretório /var/www/mysql/ com todo o conteúdo.

  3. Nós removemos tudo no diretório antigo:

    sudo rm -r /var/lib/mysql/*
    
  4. Montamos o novo diretório com a opção bind no antigo.
    edite /etc/fstab e adicione esta linha:

    /var/www/mysql /var/lib/mysql  none  bind 0 0
    

    Isso montará o /var/www/mysql em nosso diretório vazio /var/lib/mysql
    A opção bind aqui faz a mágica, ela irá preencher /var/lib/mysql com o conteúdo de /var/www/mysql então para o mysql e apparmor será como se nada tivesse mudado.

  5. Agora fazemos o monte:

    sudo mount -a
    

    e reinicie o mysql.

por Postadelmaga 02.12.2016 / 05:36
0

Você percebe que, se seguir os comandos verbatim da resposta aceita, ele falhará?

cp -R / var / lib / mysql / array2 / mysql

Copiará / var / lib / mysql para / array2 / mysql / mysql.

Quando você configura seu arquivo de configuração, é melhor você colocar / array2 / mysql / mysql como o diretório ou então o seu mysqld falhará ao iniciar.

Os melhores comandos de cópia seriam:

cp -R / var / lib / mysql / array2 / cp -R / var / lib / mysql / users / array2 / mysql

Apenas meus 2 centavos no valor.

    
por Ellison Chan 29.10.2017 / 18:16

Tags