MySQL 데이터 디렉토리를 어떻게 이동합니까?


57

MySQL 데이터베이스의 데이터 디렉토리를 마운트 지점으로 사용하는 두 번째 디스크 배열로 이동하려고합니다 /array2/.

내가 겪고있는 문제는 모든 것을 시도했지만 my.cnf에서 datadir의 위치를 ​​수정 한 후 mysql이 다시 시작되지 않는다는 것입니다.

내가 얻는 것은 :

start: Job failed to start

답변:


62

앱 아머를 잊었습니다.

관심있는 사람은 폴더를 이동하기 위해 다음을 수행했습니다.

mysql 서버를 중지하십시오 :

stop mysql

새 디렉토리를 작성하십시오.

mkdir /array2/mysql

데이터베이스 폴더 만 복사하십시오.

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

my.cnf파일을 백업 하십시오.

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

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

nano /etc/mysql/my.cnf

이전 datadir 및 소켓에 대한 모든 언급을 새 위치로 변경하십시오.

광산이되었다 :

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

디렉토리 권한을 업데이트하십시오.

chown -R mysql:mysql /array2/mysql

이전 디렉토리의 이름을 바꾸십시오.

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

다음과 같은 경우에 심볼릭 링크를 만듭니다.

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

AppArmor에 새 datadir에 대해 알리십시오.

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

의류 프로필을 새로 고침

sudo /etc/init.d/apparmor reload

그런 다음 mysql을 시작하십시오.

start mysql

이것은 좋은 대답이지만 클라이언트가 mysql에 연결할 수 있도록 한 단계가 더 필요할 수 있습니다. 한 줄 아래에 새 그룹을 추가하십시오. [clients] socket = / array2 / mysql / mysql.sock 여기서 socket = 부분은 mysql.sock 파일의 새 위치를 가리 킵니다.
Night Owl

1
병합 방해하지 않으려면 /etc/apparmor.d/usr.sbin.mysqldMySQL의 업데이트를 수신 할 때마다, 당신은 추가 할 수 있습니다 /array2/mysql/** rwk,/etc/apparmor.d/local/usr.sbin.mysqld대신. MySQL은 여전히 ​​이전 데이터 디렉토리에 액세스 할 수 있지만 아마도 문제가되지 않습니다.
drevicko

sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf. 왜 데이터베이스 폴더 만?
int_ua

(나처럼) ZFS 자신의 DATADIR를 이동 누군가를 위해, 당신은 또한 추가 확인 innodb_use_native_aio=0[mysqld]귀하의 섹션 my.cnf파일, 리눅스에 ZFS는 AIO를 지원하지 않기 때문에. dev.mysql.com/doc/refman/5.5/en/…
Andrew Ensley

23

AppArmor가을 (를) 조사하여 범인임을 발견했으며이 프로세스를 수행 syslog하여 mysql데이터 위치 를 성공적으로 변경할 수있었습니다 .

아래에서 편집 된 파일에서 시작하는 줄 +이 추가되고 시작하는 줄 -은 제거되었습니다. +이 파일에 줄을 추가 할 때 실제로 부호를 입력 / 붙여 넣어서 는 안됩니다 .

mysql디렉토리를 새 위치로 복제했습니다 .

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

그런 다음 datadir줄을 편집 했습니다 /etc/mysql/my.cnf.

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

그런 다음 편집했습니다 /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,

그런 다음 다시 시작했습니다 mysql.


13

알아 두세요

InnoDB 테이블이있는 경우 ibdata*ib_logfile*파일을 복사해야 합니다. 그렇지 않으면 테이블을 사용할 수 없습니다. 당신은 얻을 것이다 :

'데이터베이스 이름 .tableName'테이블이 없습니다 '

오류.

이 복사 명령을 실행하여 ibdata*ib_logfile*파일 을 복사 하십시오.

sudo cp -p /var/lib/mysql/ib* /array2/mysql/

이것은 의견이어야합니다, 그것은 완전한 답변이 아닙니다
Postadelmaga

4

방금 다른 방법으로 시도했는데 일부는 유용 할 수 있습니다.

사용 권한이 그대로있는 사본 :

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

백업 (문제가 생길 경우) :

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

기존 위치 대신 새 빈 디렉토리를 만듭니다.

mkdir /var/lib/mysql

새 위치를 이전 위치에 바인드 마운트하십시오.

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

symlinking이 저에게 효과가 없었기 때문에 누군가에게 도움이되기를 바랍니다. 이것이 가장 간단한 방법이었습니다.


3

datadir을 이동하면 새 datadir 권한을 부여 할 필요가있을뿐 아니라 모든 상위 디렉토리에 권한이 있어야합니다.

나는 datadir을 하드 드라이브로 옮겼으며 우분투에 다음과 같이 마운트되었습니다.

/media/*user*/Data/

내 datadir은 Databases 였습니다 .

각 미디어, 사용자 및 데이터 디렉토리 에 대한 권한을 771로 설정해야했습니다 .

sudo chmod 771 *DIR*

이것이 작동하지 않으면 mysql을 작동시킬 수있는 또 다른 방법은 /etc/mysql/my.cnf의 사용자를 root로 변경하는 것입니다. 보안 관점에서이를 수행하는 데는 몇 가지 문제가있을 것입니다.


2

나는 bind 옵션과 함께 mount를 사용하는 것을 선호하므로 Apparmor 및 Mysql 구성에서 더 이상 변경되지 않도록합니다.


예를 들면 다음과 같습니다.

에 모든 것을 옮기고 싶다고 가정 해보십시오 /var/www. 이 디렉토리가 내 개발 환경이며 다른 파티션에 마운트되어 있다고 가정 해 봅시다.

  1. 먼저 mysql을 중지해야합니다 .

    sudo systemctl stop mysql.service
    
  2. 파일을 이동한다 (권한 보존)

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

    /var/www/mysql/모든 컨텐츠 가 포함 된 디렉토리가 생성 됩니다.

  3. 이전 디렉토리의 모든 것을 제거합니다 :

    sudo rm -r /var/lib/mysql/*
    
  4. bind이전 디렉토리에는 옵션으로 새 디렉토리를 마운트합니다 . 이 줄을
    편집 /etc/fstab하고 추가하십시오.

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

    이것은 /var/www/mysql빈 디렉토리에 마운트합니다 . 여기 /var/lib/mysql
    bind옵션은 마술을 수행합니다 .mysql과 apparmor /var/lib/mysql의 내용으로 채워져 /var/www/mysql아무것도 바뀌지 않은 것처럼됩니다.

  5. 이제 마운트를 수행합니다 :

    sudo mount -a
    

    mysql을 다시 시작하십시오.


0

당신은 당신이 받아 들인 대답에서 그대로 명령을 따르면 실패한다는 것을 알고 있습니까?

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

/ var / lib / mysql을 / array2 / mysql / mysql에 복사합니다.

구성 파일을 설정하면 / array2 / mysql / mysql을 디렉토리로 배치하는 것이 좋습니다. 그렇지 않으면 mysqld가 시작되지 않습니다.

더 나은 복사 명령은 다음과 같습니다.

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

내 2 센트 만 가치가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.