MySQL 데이터 디렉토리를 변경하는 방법?


158

기본 MySQL 데이터 디렉토리를 다른 경로로 변경할 수 있습니까? 이전 위치에서 데이터베이스에 액세스 할 수 있습니까?


3
Win8의 시스템에서이 질문에 대한 답변이 있습니까?
Jonathan M


맥 사용자의 경우, 당신이 필요로하는 모든는 와 @ user1341296의 대답에서 1-4 단계를.
shellbye

답변:


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)의 문제를 해결하지 못했습니다. "alias / var / lib / mysql /-> / newpath /"줄을 포함하도록 /etc/apparmor.d/tunables/alias 파일을 편집해야한다는 것을 알았습니다. 다른 AppArmor 파일의 변경. "/etc/init.d/apparmor restart"로 AppArmor를 다시 시작한 후 "mystart"로 MySQL을 다시 시작한 직후에 작동했습니다.
mak

2
의류는 CentOS와 관련이 없습니다. 대신 SELinux가 있습니다. 사용하지 않도록 설정하는 방법에 읽거나 여기에 관리 할 수 blogs.oracle.com/jsmyth/entry/selinux_and_mysql
노암

12
mak의 판에 (필수) 줄 끝의 쉼표를 잊지 마십시오alias /var/lib/mysql/ -> /newpath/,
Michael

4
위의 Michel의 의견이 얼마나 중요한지 강조 할 수 없습니다. 쉼표 추가 및 일부 뉴런 저장. 모자에 대해 죄송합니다.
alx

2
나를 위해 작동하지 않습니다. mysql.service에 대한 작업이 실패합니다. mysqld를 재시작 할 때 자세한 내용은 'systemctl status mysql.service'및 'journalctl -xn'을 참조하십시오. 오류는 디스크가 가득 찼다는 오류입니다. 여유 공간이 500GB입니다.
Frank 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

고마워요, 내가 한 것처럼 이것을 완전히 스크립트하려면 추가 할 수 있습니다 : 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의 새로운 표준 설치입니다. 그러나 일반적으로 이러한 디스크 어레이 세부 사항은 소프트웨어에 투명합니다.
Volksman

15

현재 데이터를 새 디렉토리에 복사하고 my.cnfMySQL 을 변경해야 합니다.

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

서버가 실행되고 있지 않을 때는 데이터베이스를 복사해야합니다 .


그게 내가 할 수없는 일입니다. 디렉토리를 변경하고 싶지만 새 디렉토리에 새 데이터베이스를 만들고 싶습니다. 그리고 이전 디렉토리와 새 디렉토리 데이터베이스 모두에 액세스하려고합니다.
MySQL DBA

1
@MySQL DBA : ln -s정적 기호 스라소니를 사용하면 그렇지 않습니다.
RageZ

글쎄, 나는이 명령의 사용과 약간 혼동된다. 이전에 설명했듯이 새 디렉토리에 새 데이터베이스를 작성하려고합니다. symlink로 가능합니까?
MySQL DBA

1
새 디렉토리를 만들고 심볼릭 링크를 사용하여 파일을 새 디렉토리에 표시하고 다음을 변경할 수 있습니다.my.cnf
RageZ


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

나처럼 데비안에 있고 mysql 디렉토리를 집이나 / home / ...의 경로로 옮기고 싶다면 해결책은 다음과 같습니다.

  • "sudo service mysql stop"으로 mysql 중지
  • "/etc/mysql/mariadb.conf.d/50-server.cnf"의 "datadir"변수를 새 경로로 변경하십시오.
  • / 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"에서 "false"로 변수 "ProtectHome"을 변경하십시오.
  • "sudo systemctl daemon-reload"에 의해 시스템 재로드
  • "service mysql restart"로 mysql을 재시작하십시오.

어느 날 mariadb 설명서에서 해결책을 찾으십시오. 이것이 어떤 사람들을 돕기를 바랍니다!


/etc/systemd/system/mysqld.service 파일 이 없습니다. 내가 어디를 봐야할지 알 겠어?
Ron Piggott

1
MariaDB를 사용하는 사람들을 위해 서비스 파일은 /lib/systemd/system/mariadb@.service에 있습니다
Ron Piggott

5

컴퓨터에 데이터베이스를 유지하고 싶지만 외장 하드 드라이브에 데이터가 있고 두 장치를 사용하여 전환했습니다.

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

에 설명 된대로 작동하지 않기 때문에 아래로 투표 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
Start mysqld 에서 datadir을 변경 하십시오.

참고 :
# 1 : SELinux 설정을 조정해야 할 수도 있습니다 (문제가 발생할 경우 SELinux를 비활성화 한 상태로 시도). Apparmor (우분투)도 문제가 될 수 있습니다.

# 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

/ your / your /로 / var / lib /를 대체 한 후 파일에없는 경우 다음을 추가하십시오.

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

명령을 사용하여 파일을 저장하십시오.

:wq

my.cnf 파일을 편집하십시오

sudo vim /etc/mysql/my.cnf

/ your / your 디렉토리 /로 / var / lib /를 바꾸고 다음 명령으로 저장하십시오

:wq

마지막으로 mysql을 시작하십시오

sudo service mysql start

@ raid0, 최적화 ici 에 대해 더 알아보기


에 설명 된대로 작동하지 않기 때문에 아래로 투표 serverfault.com/a/733998/279553
user3338098

아마도 이것은 다른 배포판에서는 작동하지 않지만 우분투를 사용하는 경우 이것은 잘 작동하며 새로 설치된 모든 우분투 서버의 경로를 변경하여 raid0을 활성화합니다.
naddame

2
나는 사람들이 이것을 내리는 것을 알고 있지만 이것이 내 하루를 구했다고 말하고 싶다. 감사!
Daniel Loureiro

3

이 솔루션은 Workbench를 사용하여 Windows 7에서 작동합니다. 이를 위해서는 관리자 권한이 필요합니다. 데이터를 실제로 저장하려는 위치에 대한 바로 가기와 같은 접점을 만듭니다.

워크 벤치를 열고 인스턴스-시작 / 종료 서버를 선택하십시오.

https://bitsum.com/junctionmaster.php 에서 정션 마스터 설치

C : \ ProgramData \ MySQL \ MySQL Server 5.6으로 이동하십시오.

데이터를 마우스 오른쪽 단추로 클릭하고 "이동 후 링크 폴더를 ..."로 선택하십시오. 경고 지점 대상을 "따옴표없이 새 데이터 디렉토리"로 이동하십시오. 이동 및 링크를 클릭하십시오.

이제 "따옴표없이 새 데이터 디렉토리"로 이동하십시오.

데이터를 마우스 오른쪽 버튼으로 클릭 보안 탭으로 이동 편집 클릭 유형 추가 네트워크 서비스를 클릭 한 다음 이름 확인 확인을 클릭하고 모든 권한 허용 확인란을 클릭 한 다음 확인

워크 벤치로 돌아가서 서버 시작

이 방법은 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 디렉토리를 사용하여 생성 한 다른 데이터베이스의 데이터를 저장합니다. 결국, 데이터베이스 클래스에서 배운 데이터베이스 약속이 그대로 유지되도록 응용 프로그램 및 파일 형식으로 약간의 저글링을 추가하여 파일 형식으로 파일을 저장해야합니다.

이제 미래에 만들 수있는 큰 데이터베이스를 저장할 공간이 충분한 지 확인하고 싶었습니다. 더 많은 공간을 가진 다른 드라이브에 넣고 싶습니다.

따라서 다음을 수행하십시오.

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파일을 찾으십시오 .

편집기에서 엽니 다 (메모장 ++).

datadir파일에서 찾으려면 CTRL + F를 수행하십시오.

여기에 언급 된 것은 데이터 디렉토리를 위해 MySQL에서 현재 사용중인 실제 위치입니다. 이것이 당신이 바꾸고 싶은 것입니다.

3 단계 : 새 데이터 디렉토리로 바꾸십시오.

새 데이터 디렉토리가 W : __ MySQL_Data가되고 싶다고 가정 해 봅시다. 파일 의 datadirmy.ini을이 값으로 변경합시다 . 기억할 필요가 없도록 이전 값을 주석 처리하십시오.

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

이제 xcopy기본값 datadir을 로 복사하십시오 W:\. 명령 프롬프트 실행 (Window + R, cmd, Enter)

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

복사 한 폴더의 이름을 변경 한 새 datadir값으로 바꿉니다 . 여기:W:/__MySQL_Data

왜 간단하게 복사하지 않습니까? COOL!이 아니기 때문에 복사 한 폴더에 대한 권한을 잃지 않도록 도와 주므로 다시 시작할 때 MySQL80"로컬 컴퓨터의 MySQL80 서비스가 시작되었다가 중지되었습니다. 일부 서비스는 자동으로 중지됩니다. 다른 서비스 나 프로그램에서 사용하고 있지 않습니다. " -의례 : Microsoft

4 단계 : 서비스 다시 시작

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

5 단계 : 완료! 이제 일하러 돌아와!


1
도움이되었지만 경고 해 주셔서 감사합니다. my.ini는 권한을 변경하지 않으면 일반 사용자가 쓸 수 없습니다. Oh와 ProgramData는 숨겨진 폴더이므로 탐색기 폴더 설정을 변경하여 확인해야합니다.
JonP

1

컴퓨터를 업그레이드 할 때 상자에서 상자로 이동할 때 종종이 작업을 수행해야합니다. / var / lib / mysql을 더 나은 위치로 옮기는 것 외에도 오래된 MySQL 설치에서 오래된 DB 테이블을 복원해야하는 경우가 종종 있습니다. 이렇게하려면 ...

  1. mysql을 중지하십시오. 위의 지침을 따르십시오.
  2. 데이터베이스 디렉토리 (이전 설치 데이터베이스마다 하나씩)를 새 DATADIR 위치로 복사하십시오. 그러나 "mysql"및 "performance_schema"디렉토리는 생략하십시오.
  3. 복사 된 데이터베이스 디렉토리간에 올바른 권한. 소유권은 mysql : mysql이어야하고 디렉토리는 700이어야하고 파일은 660이어야합니다.
  4. mysql을 다시 시작하십시오. 설치에 따라 이전 버전 DB 파일을 업데이트해야합니다.

다운 투표에 대해 죄송합니다.이 솔루션은 정확할 수 있습니다. 시도하지 않았습니다.
user3338098

1

MySQL /home은 다른 물리적 디스크에서 매핑 되었기 때문에 디렉토리 로 이동 해야했습니다. 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 데이터를 새로운 dirctory로 변경
  3. 구성 파일을 변경하십시오
  4. 구성 파일을 다시로드
  5. MySQL을 다시 시작

그런 다음 작업이 완료되었습니다.

그러나 apt 또는 yum으로 설치하지 않으면 direcotry가 이것을 좋아하지 않을 수 있으며 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 서버를 다시 시작했는데 제대로 작동했습니다.

나는 훌륭하게 작동하는 데이터 디렉토리를 변경하기 위해 아래 단계를 따랐다. 리눅스에서 mysql 데이터 디렉토리 변경


스택 오버플로에 오신 것을 환영합니다! 이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다.
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, dev 환경에서는.

(가제) 예

# 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 = enforce를 SELINUX = permissive로 변경하여 허용 모드로 설정하십시오.


여기에 설명 된대로 serverfault.com/questions/503887/... SELinux에 잘못이되지 않습니다의 변경 방지 다른 문제가있는 datadir재산
user3338098
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.