MySQLデータディレクトリを変更する方法


158

デフォルトのMySQLデータディレクトリを別のパスに変更することはできますか?以前の場所からデータベースにアクセスできますか?


3
Win8のシステムの場合、この質問に対する回答はありますか?
Jonathan M


Macユーザーの場合、これと@ user1341296の回答の1〜4ステップが必要です。
shellbye 2016

回答:


270
  1. 次のコマンドを使用してMySQLを停止します。

    sudo /etc/init.d/mysql stop
  2. /var/lib/mysql次のコマンドを使用して、既存のデータディレクトリ(デフォルトではにあります)をコピーします。

    sudo cp -R -p /var/lib/mysql /newpath
  3. 次のコマンドでMySQL構成ファイルを編集します。

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
  4. のエントリを探しdatadir、パス(である必要があります/var/lib/mysql)を新しいデータディレクトリに変更します。

  5. ターミナルで、次のコマンドを入力します。

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
  6. で始まる行を探し/var/lib/mysqlます。/var/lib/mysql新しいパスで行を変更します。

  7. ファイルを保存して閉じます。

  8. 次のコマンドでAppArmorプロファイルを再起動します。

    sudo /etc/init.d/apparmor reload
  9. 次のコマンドでMySQLを再起動します。

    sudo /etc/init.d/mysql restart
  10. MySQLにログインすると、以前と同じデータベースにアクセスできます。


33
上記では、Ubuntu 12.04(Precise)での問題を解決できませんでした。ファイル/etc/apparmor.d/tunables/aliasを編集して、「alias / var / lib / mysql /-> / newpath /」という行を含める必要があることがわかりました。これを行うと、他のAppArmorファイルの変更。「/etc/init.d/apparmor restart」でAppArmorを、「restart mysql」でMySQLを再起動した直後に機能しました。
mak

2
ApparmorはCentOSには関係ありません。代わりにSELinuxがあります。blogs.oracle.com/jsmyth/entry/selinux_and_mysql
Noam

12
makのエディション(必須)では、行末のカンマを忘れないでくださいalias /var/lib/mysql/ -> /newpath/,
Michael

4
上記のミッシェルのコメントがどれほど重要であるかを十分に強調することはできません:トレーリングコンマを追加して、いくつかのニューロンを保存します。キャップについては申し訳ありません。
alx 2014

2
うまくいきません。mysql.serviceのジョブが失敗しました。mysqldを再起動しようとしたときの詳細については、「systemctl status mysql.service」および「journalctl -xn」を参照してください。エラーは、ディスクがいっぱいであることです。500GBの空き容量があります...
フランクH.

17

素早く簡単:

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

/etc/my.cnfファイルを編集し、以下の[mysqld]行を追加します。

datadir=/new/dir/for/mysql/

CageFS(CloudLinuxの有無にかかわらず)を使用していて、MySQLディレクトリを変更する場合は、このファイルに新しいディレクトリを追加する必要があります。

/etc/cagefs/cagefs.mp

次に、次のコマンドを実行します。

cagefsctl --remount-all

1
:P
sMyles、2018年

ありがとうございます。これを完全にスクリプト化したい場合は、次のように使用できます:sed -i 's | datadir = / var / lib / mysql | datadir = / data / var / lib / mysql | g' / etc / my.cnf
berimbolo

これは私にはうまくいきませんでした。私はこれと他の多くの代替案を試しました。彼はこの作品の唯一の方法であると言うとき、私はuser3338098と同じ結論に来ている:serverfault.com/questions/503887/...
Volksman

@Volksmanすべてのリンクは彼が削除して再インストールしなければならなかったということです... MySQLとMariaDBの両方がdatadir構成をサポートしているため、両方に他のサーバー固有の問題がある可能性があります。問題のないサーバー
sMyles

@sMylesはい、それは削除してインストールしましたが、/ var / lib / mysqlを別の場所にマウントした後、つまり/ varが以前にマウントされたものとは異なるメガパーティション。私たちのシステムに特定の問題がある場合、これが問題であることを理解することは素晴らしいことです。これは、8x HDDを備えたRAID 10を備えたCentos 7 OSの新しい標準インストールでしたが、通常、このようなディスクアレイの詳細はソフトウェアに対して透過的です。
フォルクスマン

15

現在のデータを新しいディレクトリにコピーしてmy.cnf、MySQL を変更する必要があります。

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

サーバーが稼働していないときは、データベースをコピーする必要があります


まあそれは私ができないことです。ディレクトリを変更したいが、新しいデータベースを新しいディレクトリに作成したい。そして、古いディレクトリと新しいディレクトリの両方のデータベースにアクセスしたい。
MySQL DBA

1
@MySQL DBA:ln -s静的シンボリックlynx を使用している場合、それはうまくいきませんか
RageZ 2009年

さて、私はこのコマンドの使用に少し混乱しています。前に説明したように、新しいデータベースを新しいディレクトリに作成したいと思います。シンボリックリンクで可能ですか?
MySQL DBA

1
新しいディレクトリを作成し、シンボリックリンクを使用してファイルを新しいディレクトリに表示し、変更することができますmy.cnf
RageZ

2
で説明するよう、それは動作しませんので、ダウンは投票serverfault.com/a/733998/279553
user3338098

14

最初に、mysqlサーバーを停止する必要があります。例えば

# /etc/init.d/mysql stop

その後、古いデータディレクトリ(/ var / lib / mysqlなど)をコピーする必要があります。新しいディレクトリへの特権

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

これで/etc/mysql/my.cnf、新しいデータを変更してサーバーを再起動できます

# /etc/init.d/mysql restart

5
で説明するよう、それは動作しませんので、ダウンは投票serverfault.com/a/733998/279553
user3338098

7

私のようにdebianを使用していて、mysqlディレクトリをホームまたは/ home / ...のパスに移動する場合、解決策は次のとおりです。

  • 「sudo service mysql stop」でmysqlを停止します
  • 「datadir」変数を「/etc/mysql/mariadb.conf.d/50-server.cnf」の新しいパスに変更します
  • / var / lib / mysqlのバックアップを実行します: "cp -R -p / var / lib / mysql / path_to_my_backup"
  • このディレクトリを削除します: "sudo rm -R / var / lib / mysql"
  • データを新しいディレクトリに移動します: "cp -R -p / path_to_my_backup / path_new_dir
  • 「sudo chown -R mysql:mysql / path_new_dir」によるアクセス権の変更
  • 「/etc/systemd/system/mysqld.service」で変数「ProtectHome」を「false」に変更します
  • 「sudo systemctl daemon-reload」によってsystemdをリロードします
  • 「service mysql restart」でmysqlを再起動します

mariadbのドキュメントで解決策を見つける1日。これが一部の人に役立つことを願っています!


/etc/systemd/system/mysqld.serviceファイルはここにはありません。私がどこを見ればいいのですか?
Ron Piggott

1
MariaDBを使用しているユーザーの場合、サービスファイルは/lib/systemd/system/mariadb@.serviceにあります
Ron Piggott

5

私は自分のマシンにデータベースを保持したいが、外付けハードドライブにもデータがあり、2つの使用を切り替えたいと考えていました。

Macを使用していて、Homebrewを使用してMySQLをインストールしている場合は、これでうまくいくはずです。それ以外の場合は、datadirマシンのMySQL を適切な場所に置き換えるだけです。

#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

次に、元に戻す場合は、次のようにします。

mv mysql mysql.remote

mv mysql.local mysql

そして、ローカルデータベースを再び使用しています。お役に立てば幸いです。


1
これは、述べられた質問に正確に対処しているわけではありません-しかし、これはまさに私が探していたものでした-そして、my.cnfがスペースを適切に処理しないという、エッジケース/バグを処理する適切な方法です:bugs.mysql.com /bug.php?id=26033。この回避策はそのバグレポートにリンクします。
gabe 2013

で説明するよう、それは動作しませんので、ダウンは投票serverfault.com/a/733998/279553
user3338098

5

最初にmysqldを停止します

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

次に、/etc/mysql/my.cnf
スタートmysqldのdatadirを変更します。

注:
#1:おそらくSELinux設定を調整する必要があります(問題が発生した場合はSELinuxを無効にして試してください)。Apparmor(Ubuntu)にも問題がある可能性があります。

#2:MySQLインストールDBリファレンスを参照


4

最初にmysqlを停止します

sudo service mysql stop

mysqlデータを新しい場所にコピーします。

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

apparmorを使用している場合は、次のファイルを編集して次の操作を行います

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

where / var / lib /を/ yourdirectory /に置き換え、ファイルに存在しない場合は以下を追加します

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

コマンドでファイルを保存します

:wq

ファイルmy.cnfを編集します

sudo vim /etc/mysql/my.cnf

where / var / lib /を/ yourdirectory /に置き換えて、次のコマンドで保存します

:wq

最後にmysqlを起動します

sudo service mysql start

@ raid0の詳細、最適化ici


で説明するよう、それは動作しませんので、ダウンは投票serverfault.com/a/733998/279553
user3338098

おそらくこれは他のディストリビューションでは機能しませんが、ubuntuを使用している場合、これは私にとってはうまく機能し、新しくインストールされたすべてのUbuntuサーバーのパスを変更してraid0を有効にします。
naddame 2015年

2
私は人々がこれに反対票を投じていることを知っていますが、これは私の日を救ったとあなたに言いたいです。ありがとう!
Daniel Loureiro、2015年

3

このソリューションはWindows 7でWorkbenchを使用して機能します。これを行うには、管理者権限が必要です。それはあなたが本当にあなたのデータを保存したい場所への(ショートカットのような)ジャンクションを作成します

Workbenchを開き、INSTANCE-Startup / Shutdownを選択しますサーバーを停止します

https://bitsum.com/junctionmaster.phpからJunction Masterをインストールします

C:\ ProgramData \ MySQL \ MySQL Server 5.6に移動します

[データ]を右クリックして[移動してからフォルダにリンク]を選択します。警告の宛先を「引用符なしの新しいデータディレクトリ」に指定します。[移動してリンク]をクリックします。

ここで「引用符なしの新しいデータディレクトリ」に移動します。

[データ]を右クリックし、[セキュリティ]タブをクリックします。[編集]をクリックします。[タイプ]の[ネットワークサービスの追加]をクリックし、[名前の確認]をクリックします。[OK]をクリックします。

Workbenchに戻り、サーバーを起動します。

この方法は、Windows 7 EnterpriseでMySQL Workbench 6.2を使用して動作しました。


2

@ user1341296が言ったすべて、プラス...

変更しない方が良い/etc/mysql/my.cnf 新しいファイルを作成したい/etc/mysql/conf.d/ext.cnf(任意の名前、ただし拡張子はcnf

そしてそれにあなたの変更を入れてください:

[mysqld]
datadir=/vagrant/mq/mysql

この方法では

  • 既存のファイルを変更する必要はありません(自動化スクリプトの方が簡単です)
  • MySQLのバージョン(および設定です)の更新に問題はありません。

2

あなたがWindowsユーザーであり、ここに上陸してすべての回答がLinuxユーザーに対するものであることが判明した場合、失望しないでください!私のように時間を無駄にさせません。

解決策の前に少しでたらめな話:

MySQLはDataディレクトリを使用して、作成したさまざまなデータベースのデータを保存します。結局のところ、データベースクラスで学んだデータベースの約束が損なわれていないことを保証するために、アプリケーションとファイル形式にいくつかの追加のジャグラリを加えたファイルの形式でそれらを保存する必要があります。

ここで、将来作成する可能性のある大規模なデータベースを格納するのに十分なスペースがあることを確認したいので、Hey!空き容量の多い別のドライブに配置したい。

したがって、次のことを行います。

ステップ-1: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)

ステップ-2:現在のデータディレクトリを見つける

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

デフォルトでは、ここにという名前のフォルダが存在するはずです。Dataこれは、MySQLがデフォルト設定で使用するフォルダです(別の適切な場所が見つからない場合)が、それを確認してみましょう。

my.iniファイルを見つける、そこにあるはずです。

それをエディターで開きます(Notepad ++の可能性があります)。

CTRL + Fをdatadir実行して、ファイルを見つけます。

ここで言及されているのは、MySQLが現在データディレクトリとして使用している実際の場所です。これは変更したいものです。

ステップ-3:新しいデータディレクトリに置き換えます。

新しいデータディレクトリをW:__ MySQL_Dataにしたいとします。レッツ・チェンジ datadirの値my.iniはこの値にファイル。覚えておく必要がないように、前の値をコメントにしておいてください。

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

を使用xcopyして、デフォルトdatadirをにコピーしますW:\。コマンドプロンプトを起動(ウィンドウ+ R、cmd、Enter)

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

コピーしたフォルダーの名前を、変更した新しいdatadir値に変更します。ここに:W:/__MySQL_Data

なぜ単にコピーしないのですか?それはCOOLではないので、コピーしたフォルダの権限を失わないようにするのに役立ちます。これにより、を再起動したときにMySQL80、「ローカルコンピュータのMySQL80サービスが開始して停止しました。一部のサービスは、他のサービスやプログラムでは使用されていません。」-礼儀:マイクロソフト

ステップ-4:サービスの再起動

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

ステップ-5:完了!仕事に戻りましょう!!


1
おかげで役に立ちましたが警告:my.iniは、権限を変更しない限り、通常のユーザーは書き込みできません。ああ、ProgramDataは隠しフォルダーなので、エクスプローラーフォルダーの設定を変更して表示する必要があります。
JonP 2018年

1

マシンをアップグレードして、ボックス間を移動するとき、私はしばしばこれを行う必要があります。/ var / lib / mysqlをより適切な場所に移動することに加えて、古いMySQLインストールから古いDBテーブルを復元する必要があることがよくあります。これを行うためには...

  1. mysqlを停止します。上記の指示に従ってください、それは必要です。
  2. データベースディレクトリ(古いインストールのデータベースごとに1つずつ)を新しいDATADIRの場所にコピーします。ただし、「mysql」および「performance_schema」ディレクトリは省略してください。
  3. コピーされたデータベースディレクトリ間の権限を修正します。所有権はmysql:mysql、ディレクトリは700、ファイルは660にする必要があります。
  4. mysqlを再起動します。インストールによっては、古いバージョンのDBファイルを更新する必要があります。

反対票を投じて申し訳ありませんが、この解決策は正しいかもしれません、それを試していません。
user3338098 2015年

1

MySQL /homeが別の物理ディスクからマップされたため、MySQLをディレクトリに移動する必要がありました。ライブをより簡単にするために、my.cnfでディレクトリを変更/home/mysqlする代わりに、元のディレクトリの代わりに新しいディレクトリをマッピングしました/var/lib/mysql。それは私たちにとって魅力のように機能します(CentOS 7.1でテスト済み)。

新しいディレクトリを作成し、正しい権限を設定します。

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

実行中の場合はMySQLを停止します。

systemctl stop mysql

データディレクトリを移動します。

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

永続的なマウントを作成して実行します。

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

サーバーを再起動します。

systemctl start mysql

1

これをプログラムで実行したい場合(geditを使用した手動のテキスト入力なし)は、上記のuser1341296の回答に基づくDockerfileのバージョンです。

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

こちらのDockerハブで入手できます:https : //hub.docker.com/r/richardjecooke/ruby-mysql-in-memory/


0

最初に、あなたはあなたの設定ファイルがどこにあるか知っているべきですか?あなたの設定ファイルはどこですか?

apt-getまたはyum installでインストールした場合。

設定ファイルは

/etc/mysql/my.cnf

データファイルが現れるかもしれません

/ var / lib / mysql

そして、あなたがすべきことは

  1. mysqlを停止する
  2. mysqlデータを新しいディレクトリに変更します
  3. 設定ファイルを変更する
  4. 設定ファイルをリロードします
  5. mysqlを再起動します

そして、仕事が完了しました。

しかし、それをaptまたはyumでインストールしなかった場合、ディレクトリはこれが気に入らない可能性があり、mysqlファイルは

mysqlはどこですか


で説明するよう、それは動作しませんので、ダウンは投票serverfault.com/a/733998/279553
user3338098

0

SuSE 13.1では、これはmysqlデータディレクトリを/ home / example_user /などの別の場所に移動し、よりわかりやすい名前を付けるために正常に機能します。

/ var / lib /内:

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

私はmysqlを再起動しました:

# systemctl restart mysql.service

しかし、それさえ必要なかったのではないかと疑っています。


0

ある環境では、mysqlデータディレクトリを新しい場所に変更しましたが、mysqlサーバーの再起動中に時間がかかっていました。そのため、ポートを確認したところ、他のプロセスがmysqlポートでリッスンしていることがわかりました。そのため、プロセスを終了してmysqlサーバーを再起動しましたが、うまくいきました。

以下の手順に従って、データディレクトリを変更しました。 Linuxのmysqlデータディレクトリを変更する


Stack Overflowへようこそ!これにより理論的には質問に答えることができますが、ここに答えの本質的な部分を含め、参照用のリンクを提供することが望ましいでしょう
Tim Diekmann

0

上記のステップは基礎と基本です。私はそれらを追跡しましたが、それでも「mysqlは起動に失敗しました」というエラーを受け取りました。

新しいフォルダにmysqlデータを格納するには、フォルダに権限と所有権mysql:mysqlがあることを確認する必要があります。

これに加えて、たとえば/ data / mysql /がある場合、mysqlの親ディレクトリの権限と所有権を確認する必要があります。ここで、/ data /ディレクトリはroot:rootである必要があります。/ mysqlの親ディレクトリの所有権を変更した後、「mysqlが起動に失敗しました」のエラーを修正しました。私のVMのOSはRHEL 7.6です。


SELINUX = enforcingをSELINUX = permissiveに変更してRHEL7.6でselinuxを試しましたが、うまくいきませんでした。
user3325137William

0

datadirをシンボリックリンクすることも可能です。少なくともmacOS、開発環境では。

(自作)例

# 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

mysqlを再起動します。


-1

SE linuxを使用している場合は、/ etc / selinux / configを編集し、SELINUX = enforcingをSELINUX = permissiveに変更して、permissiveモードに設定します。


ここで説明するようserverfault.com/questions/503887/... SELinuxが故障していないの変更防止他のいくつかの問題があるdatadirプロパティ
user3338098
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.