답변:
앱 아머를 잊었습니다.
관심있는 사람은 폴더를 이동하기 위해 다음을 수행했습니다.
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
/etc/apparmor.d/usr.sbin.mysqld
MySQL의 업데이트를 수신 할 때마다, 당신은 추가 할 수 있습니다 /array2/mysql/** rwk,
에 /etc/apparmor.d/local/usr.sbin.mysqld
대신. MySQL은 여전히 이전 데이터 디렉토리에 액세스 할 수 있지만 아마도 문제가되지 않습니다.
sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf
. 왜 데이터베이스 폴더 만?
innodb_use_native_aio=0
에 [mysqld]
귀하의 섹션 my.cnf
파일, 리눅스에 ZFS는 AIO를 지원하지 않기 때문에. dev.mysql.com/doc/refman/5.5/en/…
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
.
알아 두세요
InnoDB 테이블이있는 경우 ibdata*
및 ib_logfile*
파일을 복사해야 합니다. 그렇지 않으면 테이블을 사용할 수 없습니다. 당신은 얻을 것이다 :
'데이터베이스 이름 .tableName'테이블이 없습니다 '
오류.
이 복사 명령을 실행하여 ibdata*
및 ib_logfile*
파일 을 복사 하십시오.
sudo cp -p /var/lib/mysql/ib* /array2/mysql/
방금 다른 방법으로 시도했는데 일부는 유용 할 수 있습니다.
사용 권한이 그대로있는 사본 :
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이 저에게 효과가 없었기 때문에 누군가에게 도움이되기를 바랍니다. 이것이 가장 간단한 방법이었습니다.
datadir을 이동하면 새 datadir 권한을 부여 할 필요가있을뿐 아니라 모든 상위 디렉토리에 권한이 있어야합니다.
나는 datadir을 하드 드라이브로 옮겼으며 우분투에 다음과 같이 마운트되었습니다.
/media/*user*/Data/
내 datadir은 Databases 였습니다 .
각 미디어, 사용자 및 데이터 디렉토리 에 대한 권한을 771로 설정해야했습니다 .
sudo chmod 771 *DIR*
이것이 작동하지 않으면 mysql을 작동시킬 수있는 또 다른 방법은 /etc/mysql/my.cnf의 사용자를 root로 변경하는 것입니다. 보안 관점에서이를 수행하는 데는 몇 가지 문제가있을 것입니다.
나는 bind 옵션과 함께 mount를 사용하는 것을 선호하므로 Apparmor 및 Mysql 구성에서 더 이상 변경되지 않도록합니다.
예를 들면 다음과 같습니다.
에 모든 것을 옮기고 싶다고 가정 해보십시오 /var/www
. 이 디렉토리가 내 개발 환경이며 다른 파티션에 마운트되어 있다고 가정 해 봅시다.
먼저 mysql을 중지해야합니다 .
sudo systemctl stop mysql.service
파일을 이동한다 (권한 보존)
sudo rsync -av /var/lib/mysql /var/www
/var/www/mysql/
모든 컨텐츠 가 포함 된 디렉토리가 생성 됩니다.
이전 디렉토리의 모든 것을 제거합니다 :
sudo rm -r /var/lib/mysql/*
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
아무것도 바뀌지 않은 것처럼됩니다.
이제 마운트를 수행합니다 :
sudo mount -a
mysql을 다시 시작하십시오.
당신은 당신이 받아 들인 대답에서 그대로 명령을 따르면 실패한다는 것을 알고 있습니까?
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 센트 만 가치가 있습니다.