Como movo o diretório de dados do MySQL?

57

Estou tentando mover o diretório de dados do meu banco de dados MySQL para uma segunda matriz de disco que tenho como ponto de montagem /array2/.

O problema que estou tendo é que tentei de tudo e depois de modificar a localização do datadir no my.cnf, o mysql não será iniciado novamente.

Tudo o que recebo é:

start: Job failed to start
Jonny Flowers
fonte

Respostas:

62

Esqueceu a armadura do aplicativo.

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 backup do my.cnfarquivo:

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

Edite o my.cnfarquivo:

nano /etc/mysql/my.cnf

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

A minha se tornou:

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 link simbólico, apenas no caso de:

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

Informe o AppArmor 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

Então inicie o mysql:

start mysql
Jonny Flowers
fonte
Esta é uma boa resposta, mas você pode precisar de mais uma etapa para permitir que os clientes se conectem ao mysql. Adicione um novo grupo com uma linha abaixo dela ... [clients] socket = / array2 / mysql / mysql.sock em que a parte socket = aponta para o novo local do seu arquivo mysql.sock.
Coruja da noite
11
Se você não quer se incomodar em mesclar /etc/apparmor.d/usr.sbin.mysqldcada vez que o mysql recebe uma atualização, você pode adicioná /array2/mysql/** rwk,-lo /etc/apparmor.d/local/usr.sbin.mysqld. O Mysql ainda terá acesso ao diretório de dados antigo, mas isso provavelmente não é um problema.
22413 drevicko
sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf. Por que apenas as pastas do banco de dados?
int_ua
Para qualquer pessoa que mova o datadir para o ZFS (como eu fiz), adicione também: innodb_use_native_aio=0na [mysqld]seção do seu my.cnfarquivo, pois o ZFS no linux não suporta o AIO. dev.mysql.com/doc/refman/5.5/en/…
Andrew Ensley
23

Eu descobri que o AppArmor era o culpado examinando o sysloge consegui alterar com êxito o mysqllocal dos dados seguindo este processo.

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

Eu clonei o mysqldiretório no novo local:

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

Depois editei a datadirlinha 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 eu reiniciei mysql.

Brian Moore
fonte
13

Estar ciente.

Se você possui tabelas InnoDB, DEVE copiar os arquivos ibdata*e, caso ib_logfile*contrário não poderá usá-las. 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/
Dave
fonte
este deve ser um comentário, não é uma resposta completa
Postadelmaga
4

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

copie com as permissões intactas:

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

fazer backup (caso algo dê errado):

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

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

mkdir /var/lib/mysql

bind monte o novo local no antigo:

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

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

snapfractalpop
fonte
3

Se você mover o datadir, não precisará apenas conceder as novas permissões ao datadir, mas também 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 eram bancos de dados .

Eu tive que definir permissões para 771 para cada um dos diretórios de mídia, usuário e 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úvida de alguns problemas ao fazer isso do ponto de vista da segurança.

Kohjah Breese
fonte
2

Eu prefiro usar mount com opção de ligação, para evitar outras alterações na configuração do Apparmor e Mysql.


Por exemplo:

Suponha que eu queira mudar tudo /var/www. Digamos que esse diretório seja meu ambiente de desenvolvimento e esteja 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 irá 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 bindopção no antigo.
    edite /etc/fstabe adicione esta linha:

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

    Isso irá montar o /var/www/mysqldiretório vazio. /var/lib/mysql
    A bindopção aqui faz a mágica, ela será preenchida /var/lib/mysqlcom o conteúdo de /var/www/mysqlmodo que, para o mysql e o apparmor, será como se nada tivesse mudado.

  5. Agora fazemos a montagem:

    sudo mount -a
    

    e reinicie o mysql.

Postadelmaga
fonte
0

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

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

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

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

Os melhores comandos de cópia seriam:

cp -R / var / lib / mysql / array2 / cp -R / var / lib / mysql / usuários / array2 / mysql

Apenas meus 2 centavos no valor.

Ellison Chan
fonte