Come cambiare la directory dei dati MySQL?


158

È possibile cambiare la mia directory di dati MySQL predefinita in un altro percorso? Sarò in grado di accedere ai database dalla vecchia posizione?


3
Ci sono risposte disponibili per questa domanda se il sistema in Win8?
Jonathan M,


Per l'utente mac, tutto ciò di cui hai bisogno è questo e il passaggio 1-4 dalla risposta di @ user1341296.
shellbye

Risposte:


270
  1. Interrompere MySQL utilizzando il seguente comando:

    sudo /etc/init.d/mysql stop
  2. Copia la directory dei dati esistente (impostazione predefinita in /var/lib/mysql) utilizzando il seguente comando:

    sudo cp -R -p /var/lib/mysql /newpath
  3. modifica il file di configurazione di MySQL con il seguente comando:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
  4. Cerca la voce datadire modifica il percorso (che dovrebbe essere /var/lib/mysql) nella nuova directory di dati.

  5. Nel terminale, immettere il comando:

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
  6. Cerca le righe che iniziano con /var/lib/mysql. Modifica /var/lib/mysqldelle linee con il nuovo percorso.

  7. Salva e chiudi il file.

  8. Riavvia i profili AppArmor con il comando:

    sudo /etc/init.d/apparmor reload
  9. Riavvia MySQL con il comando:

    sudo /etc/init.d/mysql restart
  10. Ora accedi a MySQL e puoi accedere agli stessi database che avevi prima.


33
Quanto sopra non è riuscito a risolvere il problema per me su Ubuntu 12.04 (Preciso). Ho scoperto che è necessario modificare il file /etc/apparmor.d/tunables/alias per includere una riga "alias / var / lib / mysql / -> / newpath /," Con questo in atto, non avevo bisogno di alcun modifiche in uno qualsiasi degli altri file AppArmor. Ha funzionato immediatamente dopo aver riavviato AppArmor con "/etc/init.d/apparmor restart" e MySQL con "restart mysql".
Mak

2
Apparmor non è rilevante su CentOS. C'è invece SELinux. Puoi leggere su come disabilitare o gestire qui blogs.oracle.com/jsmyth/entry/selinux_and_mysql
Noam

12
sull'edizione di mak (che è necessario) non dimenticare la virgola alla fine della rigaalias /var/lib/mysql/ -> /newpath/,
Michael,

4
Non posso sottolineare abbastanza quanto sia importante il commento di Michel sopra: AGGIUNGI COMMA TRAILING e salva alcuni neuroni. Mi dispiace per i tappi.
alx

2
Non funziona per me. Ho ricevuto Job per mysql.service fallito. Vedere "systemctl status mysql.service" e "journalctl -xn" per i dettagli quando si tenta di riavviare mysqld e l'errore è che il disco è pieno. Ha 500 GB di spazio libero ...
Frank H.

17

Veloce e facile da fare:

# 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/

Modifica il /etc/my.cnffile e in [mysqld]aggiungi questa riga:

datadir=/new/dir/for/mysql/

Se stai usando CageFS (con o senza CloudLinux) e vuoi cambiare la directory di MySQL, DEVI aggiungere la nuova directory a questo file:

/etc/cagefs/cagefs.mp

E quindi eseguire questo comando:

cagefsctl --remount-all

1
Sono contento di sentire: P
sMyles

Grazie mille, e se vuoi aggiungere questo script come ho fatto io puoi usarlo: sed -i 's | datadir = / var / lib / mysql | datadir = / data / var / lib / mysql | g' / etc / my.cnf
berimbolo

Questo non ha funzionato per me. Ho provato questo e molte altre alternative. Sto arrivando alla stessa conclusione dell'utente3338098 quando dice che questo è l'unico modo che funziona: serverfault.com/questions/503887/…
Volksman

@Volksman tutto ciò che dice il link è che doveva rimuovere e reinstallare ... è probabile che entrambi abbiate qualche altro problema specifico del server, poiché sia ​​MySQL che MariaDB supportano entrambi la configurazione del datadir, e recentemente l'ho fatto (6 mesi fa) su un altro server senza problemi
sMyles,

@smyles sì, è stato rimosso e installato ma dopo il montaggio / var / lib / mysql altrove, ovvero una mega partizione diversa da quella / var era precedentemente montata. Se c'è un problema specifico con i nostri sistemi, sarebbe bello capire che lo è. Questo era su una nuova installazione standard di magazzino del sistema operativo Centos 7 con RAID 10 con HDD 8x, ma in genere tali dettagli dell'array di dischi sono trasparenti al software.
Volksman,

15

dovresti copiare i dati correnti nella nuova directory e cambiare il my.cnftuo MySQL.

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

Devi copiare il database quando il server non è in esecuzione .


Bene, questo è quello che non posso fare. Voglio cambiare la directory ma voglio creare nuovi database nella nuova directory. E vuoi accedere sia alla vecchia directory che ai nuovi database delle directory.
MySQL DBA,

1
@MySQL DBA: se usi una ln -slince simbolica statica non ce la farai?
RageZ,

Bene, sono un po 'confuso con l'uso di questo comando. Come ho spiegato prima, voglio creare nuovi database in una nuova directory. È possibile con symlink.
MySQL DBA,

1
puoi creare una nuova directory, usare il link simbolico per far apparire il file nella nuova dir e cambiare il tuomy.cnf
RageZ

2
down votato perché non funziona come descritto dettagliatamente su serverfault.com/a/733998/279553
user3338098

14

Per prima cosa dovresti arrestare il server mysql. per esempio

# /etc/init.d/mysql stop

Successivamente è necessario copiare la vecchia directory dei dati (ad es. / Var / lib / mysql) incl. privilegi per la tua nuova directory tramite

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

ora è possibile modificare /etc/mysql/my.cnfi dati nuovi e riavviare il server

# /etc/init.d/mysql restart

5
down votato perché non funziona come dettagliato su serverfault.com/a/733998/279553
user3338098

7

Se come me sei su debian e vuoi spostare la directory mysql a casa tua o un percorso su / home / ..., la soluzione è:

  • Stop mysql di "sudo service mysql stop"
  • cambia la variabile "datadir" nel nuovo percorso in "/etc/mysql/mariadb.conf.d/50-server.cnf"
  • Eseguire un backup di / var / lib / mysql: "cp -R -p / var / lib / mysql / path_to_my_backup"
  • eliminare questa directory: "sudo rm -R / var / lib / mysql"
  • Sposta i dati nella nuova directory: "cp -R -p / path_to_my_backup / path_new_dir
  • Modifica accesso tramite "sudo chown -R mysql: mysql / path_new_dir"
  • Modifica la variabile "ProtectHome" con "false" su "/etc/systemd/system/mysqld.service"
  • Ricarica systemd con "sudo systemctl daemon-reload"
  • Riavvia mysql con "service mysql restart"

Un giorno per trovare la soluzione per me sulla documentazione di mariadb. Spero che questo aiuti alcuni ragazzi!


Il file /etc/systemd/system/mysqld.service non è qui. Qualche idea su dove devo guardare?
Ron Piggott,

1
Per coloro che utilizzano MariaDB il file di servizio si trova in /lib/systemd/system/mariadb@.service
Ron Piggott

5

Volevo mantenere un database sul mio computer, ma avere anche dei dati sul mio disco rigido esterno e passare dall'uso dei due.

Se sei su un Mac e hai installato MySQL usando Homebrew, questo dovrebbe funzionare per te. Altrimenti, dovrai solo sostituire le posizioni appropriate per MySQL datadirsul tuo computer.

#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

Quindi, quando vuoi tornare indietro, fai semplicemente:

mv mysql mysql.remote

mv mysql.local mysql

e stai usando di nuovo il tuo database locale. Spero che aiuti.


1
questo non affronta esattamente la domanda come indicato - tuttavia era esattamente quello che stavo cercando - ed è un modo pulito di gestire un caso / bug perimetrale che my.cnf non gestisce bene gli spazi: bugs.mysql.com /bug.php?id=26033 . Collegherò questa soluzione alternativa alla segnalazione di bug.
gabe,

down votato perché non funziona come dettagliato su serverfault.com/a/733998/279553
user3338098

5

Prima di tutto mysqld

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

Quindi modificare il datadir in /etc/mysql/my.cnf
Start mysqld

Note:
# 1: probabilmente devi adattare le tue impostazioni SELinux (prova con SELinux disabilitato in caso di problemi), anche Apparmor (Ubuntu) potrebbe essere un problema.

# 2: vedi riferimento DB installazione MySQL


4

Per prima cosa ferma il tuo mysql

sudo service mysql stop

copia i dati mysql nella nuova posizione.

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

se usi apparmor, modifica il seguente file e procedi come segue

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

Sostituisci dove / var / lib / con / yourdirectory / quindi aggiungi il seguente se non esiste nel file

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

Salvare il file con il comando

:wq

Modifica il file my.cnf

sudo vim /etc/mysql/my.cnf

Sostituisci dove / var / lib / con / yourdirectory / quindi salva con il comando

:wq

finalmente avviare mysql

sudo service mysql start

@vedi ulteriori informazioni su raid0, ottimizzazione ici


down votato perché non funziona come descritto in serverfault.com/a/733998/279553
user3338098

forse questo non funziona per altre distribuzioni, ma se stai usando Ubuntu, questo funziona bene per me e cambio percorso per ogni nuovo server Ubuntu installato per abilitare raid0.
naddame,

2
So che la gente sta votando a favore di questo, ma voglio dirti che questo mi ha salvato la giornata. Grazie!
Daniel Loureiro,

3

Questa soluzione funziona in Windows 7 utilizzando Workbench. Per farlo, avrai bisogno dei privilegi di amministratore. Crea una giunzione (come una scorciatoia) dove vuoi veramente archiviare i tuoi dati

Apri Workbench e seleziona INSTANCE - Startup / Shutdown Arresta il server

Installa Junction Master da https://bitsum.com/junctionmaster.php

Passare a C: \ ProgramData \ MySQL \ MySQL Server 5.6

Fare clic con il tasto destro su Dati e selezionare "SPOSTA e quindi LINK cartella per ..." Accettare la destinazione del punto di avviso su "La nuova directory di dati qui senza virgolette" Fare clic su SPOSTA E COLLEGAMENTO

Ora vai a "La tua nuova directory di dati qui senza le virgolette"

Fai clic destro su Dati Vai alla scheda sicurezza Fai clic su Modifica Fai clic su Aggiungi tipo SERVIZIO DI RETE quindi Verifica nomi Fai clic su OK Fai clic sulla casella di controllo Consenti controllo completo e poi su OK

Torna a Workbench e avvia il server

Questo metodo ha funzionato per me usando MySQL Workbench 6.2 su Windows 7 Enterprise.


2

Tutto come diceva @utente1341296, oltre a ...

È meglio non cambiare /etc/mysql/my.cnf Invece si desidera creare un nuovo file /etc/mysql/conf.d/ext.cnf(qualsiasi nome, ma l'estensione dovrebbe essere cnf)

E inserisci il tuo cambiamento:

[mysqld]
datadir=/vagrant/mq/mysql

In questo modo

  • Non è necessario modificare il file esistente (più semplice per gli script di automazione)
  • Nessun problema con l'aggiornamento della versione MySQL (ed è configs!).

2

Nel caso in cui sei un utente Windows e sei arrivato qui per scoprire che tutte le risposte sono per utenti Linux, non rimanere deluso! Non ti lascerò perdere tempo come ho fatto io.

Un po 'di cazzate prima della soluzione:

MySQL utilizza una directory di dati per archiviare i dati di diversi database creati. Bene, alla fine, deve archiviarli sotto forma di file con alcuni giocolieri aggiunti nell'applicazione e nel formato file per garantire che le promesse del database apprese nelle classi Database siano intatte.

Ora vuoi assicurarti che ci sia abbastanza spazio per archiviare grandi database che potresti creare in futuro, e così hai pensato, Ehi! Voglio inserirlo in un'altra unità che ha più spazio.

Quindi fai quanto segue.

Passaggio 1 : arresto del servizio 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)

Passaggio - 2 : scoprire la directory dei dati corrente

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

Per impostazione predefinita, dovrebbe esserci una cartella qui denominata Data, questa è quella utilizzata da MySQL nelle impostazioni predefinite (a condizione che non abbiano trovato un'altra posizione migliore), ma diamo un'occhiata.

Trova il my.inifile, dovrebbe essere proprio lì.

Aprilo in un editor (forse Notepad ++).

Fai un CTRL + F per scoprirlo datadirnel file.

Qualunque cosa sia menzionata qui è l'ubicazione attuale attualmente utilizzata da MySQL per la directory dei dati. Questo è ciò che vuoi cambiare.

Passaggio 3 : sostituirlo con una nuova directory di dati.

Supponiamo che tu desideri che la tua nuova directory di dati sia W: __ MySQL_Data. Cambiamo il datadirvalore nel my.inifile con questo valore. Mantieni il valore precedente commentato in modo da non doverlo ricordare.

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

Ora usa xcopyper copiare il valore predefinito datadirin W:\. Avvia il prompt dei comandi (Window + R, cmd, Enter)

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

E rinominare la cartella copiata con il nuovo datadirvalore che è stato modificato. Qui:W:/__MySQL_Data

Perché non semplicemente copiare? Bene perché non è COOL !, questo ti aiuta a non perdere i permessi sulla cartella copiata, in modo che quando si riavvia MySQL80, non darà uno stupido errore: "Il servizio MySQL80 sul computer locale si è avviato e poi interrotto. Alcuni servizi si arrestano automaticamente se non sono utilizzati da altri servizi o programmi. " - Cortesia: Microsoft

Passaggio 4 : riavvio del servizio

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

Step - 5 : Fatto! Ora torna al lavoro !!


1
Grazie che è stato utile ma attenzione: my.ini non è scrivibile da un normale utente a meno che non si modifichino le sue autorizzazioni. Oh e ProgramData è una cartella nascosta, quindi è necessario modificare le impostazioni della cartella Explorer per vederlo.
JonP

1

Ho spesso bisogno di farlo quando aggiorno le macchine, passando da una scatola all'altra. Oltre a spostare / var / lib / mysql in una posizione migliore, ho spesso bisogno di ripristinare vecchie tabelle DB da una vecchia installazione di MySQL. Per fare questo ...

  1. Smetti di mysql. Seguire le istruzioni sopra, è necessario.
  2. Copia le directory del database - ce ne sarà una per ciascuno dei database della tua vecchia installazione - nella nuova posizione DATADIR. Ma ometti le directory "mysql" e "performance_schema".
  3. Autorizzazioni corrette tra le directory del database copiate. La proprietà dovrebbe essere mysql: mysql, le directory dovrebbero essere 700 e i file dovrebbero essere 660.
  4. Riavvia mysql. A seconda dell'installazione, è necessario aggiornare i file DB della vecchia versione.

scusate il voto negativo, questa soluzione potrebbe essere corretta, non l'ho ancora provata.
user3338098

1

Abbiamo dovuto spostare MySQL nella /homedirectory perché era mappato da un altro disco fisico. Al fine di rendere live più semplice, invece di cambiare directory in my.cnf, abbiamo mappato la nuova directory /home/mysqlal posto della directory originale/var/lib/mysql . Funziona per noi come un incantesimo (testato su CentOS 7.1).

Crea la nuova directory e imposta le autorizzazioni corrette.

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

Arresta MySQL se in esecuzione.

systemctl stop mysql

Sposta la directory dei dati.

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

Crea un mount permanente ed eseguilo.

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

Riavvia il server.

systemctl start mysql

1

Se vuoi farlo a livello di codice (nessuna immissione manuale del testo con gedit) ecco una versione per un file Docker basato sulla risposta di user1341296 sopra:

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

Disponibile sull'hub Docker qui: https://hub.docker.com/r/richardjecooke/ruby-mysql-in-memory/


0

Innanzitutto, dovresti sapere dov'è il tuo file di configurazione? dov'è il tuo file di configurazione?

SE hai installato con apt-get o yum install。

il file di configurazione potrebbe apparire in

/etc/mysql/my.cnf

file di dati potrebbe apparire in

/ Var / lib / mysql

e quello che dovresti fare è

  1. basta mysql
  2. cambia i dati mysql in nuova directory
  3. cambia il file di configurazione
  4. ricaricare il file di configurazione
  5. riavvia mysql

e poi i lavori fatti.

Ma se non lo hai installato con apt o yum, la directory potrebbe non piacerti e puoi trovare i file mysql con

dov'è mysql


down votato perché non funziona come descritto in serverfault.com/a/733998/279553
user3338098

0

In SuSE 13.1, funziona perfettamente per spostare la directory dei dati mysql altrove, ad esempio in / home / esempio_utente /, e per dargli un nome più informativo:

In / var / lib /:

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

Ho riavviato mysql:

# systemctl restart mysql.service

ma sospetto che anche quello non fosse necessario.


0

Per uno degli ambienti ho cambiato la directory dei dati mysql in una nuova posizione, ma durante il riavvio del server mysql, ci voleva tempo. Quindi ho controllato la porta e ho scoperto che altri processi erano in ascolto sulla porta mysql. Quindi ho interrotto il processo e riavviato il server mysql e ha funzionato bene.

Ho seguito i passaggi seguenti per cambiare la directory dei dati che ha funzionato in modo eccellente. cambia la directory dei dati mysql in Linux


Benvenuto in Stack Overflow! Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
Tim Diekmann,

0

I passaggi precedenti sono di base e di base. Li ho seguiti e ho ancora ricevuto l'errore "Impossibile avviare mysql".

Affinché la nuova cartella memorizzi i dati mysql, è necessario assicurarsi che la cartella disponga delle autorizzazioni e della proprietà mysql: mysql.

Inoltre, deve controllare le autorizzazioni e la proprietà della directory principale di mysql se, ad esempio, avere / data / mysql /. Qui / data / directory dovrebbe essere root: root. Ho risolto l'errore di "mysql impossibile avviare" dopo aver cambiato la proprietà della directory padre di / mysql. Il sistema operativo nella mia macchina virtuale è RHEL 7.6.


Ho provato selinux in RHEL7.6 cambiando SELINUX = imponendo SELINUX = permissivo, non ha funzionato per me.
user3325137 William

0

È anche possibile collegare in modo simbolico il datadir. Almeno in macOS, ambiente di sviluppo.

(homebrew) ad es

# 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

Riavvia mysql.


-1

Se stai usando SE Linux, impostalo in modalità permissiva modificando / etc / selinux / config e cambiando SELINUX = applicando SELINUX = permissivo


come dettagliato qui serverfault.com/questions/503887/… selinux non è in errore c'è qualche altro problema che impedisce la modifica della datadirproprietà
user3338098
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.