2012-02-28 5 views
6

안녕하세요,mysql 데이터베이스를 가장 쉽고 빠르게 움직이는 방법은 무엇입니까? 내가 다른 서버에 MySQL 데이터베이스를 이동해야

내가 두 서버에서 루트 액세스 할 수 있습니다 거의 5기가바이트

입니까?

$ mysqldump -u user -p db-name > db-name.out 

복사 DB-name.out 파일을 원격 MySQL 서버에 SFTP/SSH를 사용하여 :

$ scp db-name.out [email protected]:/backup 

하는 데이터베이스를 복원 다음과 같이

+0

이 같은 질문은 http://dba.stackexchange.com/에 속해 있다고 생각합니다. 마이그레이션을 진행할 예정이지만 담당자는 없습니다. http://www.Superuser.com하지만 전 데이터베이스의 특정 이후 의심 스럽다. – Jordan

답변

22

는 보통 백업을 데이터베이스 복사본을 만들 수 mysqldump를 실행하고 원격 서버에서 (ssh를 통해 로그인) :

$ mysql -u user -p db-name < db-name.out 

또는

$ mysql -u user -p 'password' db-name < db-name.out 

하나의 컴퓨터/서버에서 다른 컴퓨터/서버로 MySQL 데이터베이스를 복사하려면 어떻게합니까?

간단한 대답은 ssh 또는 mysql 클라이언트를 사용하여 한 컴퓨터/서버에서 다른 컴퓨터/서버로 데이터베이스를 복사 할 수 있다는 것입니다.

는 는 당신은 mysqldump를하고 MySQL의 명령을 사용하여 한 번에 위의 모든 3 개 명령을 실행할 수 있습니다

(당신이 VPN을 사용하거나 네트워크를 신뢰하는 경우 안전하지 않은 방법 만 사용) :

$ mysqldump db-name | mysql -h remote.box.com db-name 

를 사용하여 ssh를 당신이 돈이 '

$ mysqldump db-name | ssh [email protected] mysql db-name 

또는

$ mysqldump -u username -p'password' db-name | ssh [email protected] mysql -u username -p'password db-name 

당신은 C : t 원격 MySQL 서버 (보안 방법)에 직접 액세스 할 수

$ mysqldump db-name foo | ssh [email protected]x.com mysql bar 

또는

$ mysqldump -u user -p'password' db-name foo | ssh [email protected] mysql -u user -p'password' db-name foo 

거의 모든 명령

아래에 파이프를 사용하여 실행할 수 있습니다는 원격 데이터베이스 (원격 MySQL 서버의 remote.box.com)에 foo에라는 테이블 바라는 동일한 구문을 사용하여 복사 유닉스/리눅스. Reference

감사에서

더,

+3

덤프에 확장 삽입 옵션을 사용했는지 확인하십시오 (기본적으로 켜져 있지만 양수가 아님). 복원 속도가 크게 떨어집니다. –

+2

* 여기에서 가져옴 : http://www.cyberciti.biz/tips/howto-copy-mysql-database-remote-server.html –

13

당신이 루트가있는 경우, 당신이 빨리 mysqldump을 피하기 찾을 수 있습니다. 대상 서버에 DB를 만들고 데이터베이스 파일을 직접 복사 할 수 있습니다. 여기

[[email protected]]# /etc/init.d/mysqld stop 
[[email protected]]# cd /var/lib/mysql/[databasename] 
[[email protected]]# scp * [email protected]:/var/lib/mysql/[databasename] 
[[email protected]]# /etc/init.d/mysqld start 

중요 사항은 다음과 같습니다 : 파일 소유권 확인, DB 파일을 복사하기 전에 두 서버에서 mysqld를 중지하고 권한이에 mysqld를 시작하기 전에 대상에 대한 올바른 user 가정하면 대상 서버의 MySQL의 디렉토리에 액세스 할 수 있습니다 대상 서버.시간이 여기에 당신의 우선 순위가되고, 압축의 사용은 비 압축 데이터를 전송 낭비 시간보다 클 것이다 시간 (gzip 같은과) 압축/압축 해제를 기다리고 분실 여부에 따라 달라집니다와

[[email protected]]# chown mysql:mysql /var/lib/mysql/[databasename]/* 
[[email protected]]# chmod 660 /var/lib/mysql/[databasename]/* 
[[email protected]]# /etc/init.d/mysqld start 

; 즉, 연결 속도입니다. 백업 자동화 된 방법을

+0

이것은 훨씬 쉬운 방법입니다. 이것이 왜 더 높지 않은지 확실하지 않습니다. MySQL 서버는 원본의 카피 본입니다. 나는 약 5 분 만에 독특한 서버에 전체 웹 서버를 복제했다. – David

+0

위의 단계를 수행했지만 "ERROR 1146 (42S02) : 테이블 'sample.user'가 존재하지 않습니다.", 사용자 테이블을 인쇄하려고합니다. 어떤 생각 ?? – Bathakarai

+0

아이디어 : 잘못된 경로의 사용자 테이블 파일, 잘못된 파일 권한 또는 다르게 구성된 서버. – Umbrella

2

MySQL 데이터베이스 : 백업 어떤 형태의 일에

전제 조건은 실행하는 시스템의 성능을 방해하지 않고 작업을 완료하거나 사용자를 방해하는 일의 이상적인 시간을 찾는 것입니다. 이 메모에서 데이터베이스의 크기는 드라이브의 I/O 속도와 함께 고려해야합니다. 데이터베이스가 커질수록 기하 급수적으로 중요해질 것입니다 (드라이브의 수는 데이터베이스가 저장되어 있지 않은 대체 드라이브는 읽기와 쓰기 모두를 수행하지 않는 헤드로 인해 속도가 빨라집니다.)이 읽기 가능한 상태로 유지하려면 데이터베이스가 관리 가능한 크기 (100MB)이고 작업 환경은 오전 9 시부 터 오후 5 시까 지 일하며 실제 근무 시간이없는 스트레스 또는 기타 시스템이 없습니다.

첫 번째 단계는 루트 권한으로 로컬 컴퓨터에 로그인하는 것입니다. 루트 셸에서 MySQL 사용자는 읽기 전용 권한으로 만들어야합니다. 이렇게하려면 다음 명령을 사용하여 MySQL의 쉘을 입력

mysql -uroot -ppassword 

다음, 사용자가 백업 할 필요가있는 데이터베이스에 대한 읽기 전용 권한으로 생성해야합니다. 이 경우 나중에 스크립트 나 프로세스를 사용할 경우 특정 데이터베이스를 사용자에게 할당 할 필요가 없습니다. MySQL의 쉘에서 다음 명령을, 전체 읽기 권한이있는 사용자를 작성하려면 다음을 입력하십시오 만든 MySQL 사용자와

grant SELECT on *.* TO [email protected] IDENTIFIED BY ' backuppassword'; 
FLUSH PRIVILEGES; 

를, 그것은 MySQL의 쉘을 종료하고 종료를 사용하여 루트 쉘로 다시 떨어 안전합니다. 여기에서 백업 명령을 실행하려는 스크립트를 만들어야합니다. BASH를 사용하여 쉽게 수행 할 수 있습니다. 이 스크립트는 밤에 스크립트를 실행하기 위해 cron 작업을 사용하므로 어디에서나 저장할 수 있습니다.이 예제에서는 "backupscripts"라는 새 디렉토리에 스크립트를 배치합니다. 이 디렉토리를 만들려면 루트 쉘에서 다음 명령을 사용하십시오.

mkdir /backupscripts 

또한 백업을 로컬로 저장하기 위해 디렉토리를 만들어야합니다. 이 디렉토리의 이름을 "backuplogs"로 지정합니다. 디렉토리를 작성 루트 쉘에서이 명령을 실행하면 :

useradd -c "backup user" -p backuppassword backupuser 
:

mkdir /backuplogs 

다음 단계는 루트 자격 증명을 사용하여 원격 시스템에 로그인하여 명령으로 "백업 사용자"를 생성하는 것

백업에 대한 디렉토리를 만듭니다

mkdir /backuplogs/ 

을 로그 아웃하기 전에 명령을 사용하여 나중에 참조 할 수 있도록 원격 호스트의 IP 주소를 잡아 :

ifconfig -a 

eth0는 유선 네트워크 연결을위한 표준 인터페이스입니다. 이 IP_ADDR에 유의하십시오.

마지막으로 원격 서버에서 로그 아웃하고 원래 호스트로 돌아갑니다.

다음은 원격이 아닌 호스트 로컬 시스템에서 스크립트 파일을 생성합니다. 우리는 VIM을 사용할 것입니다. (nano 나 emacs 팬이라면 저를 붙들어서는 안됩니다.하지만 VIM을 사용하여 여기에서 파일을 편집하는 방법을 나열하지 않을 것입니다.) 먼저 파일을 만들고 mysqldump를 사용하십시오 , 데이터베이스를 백업하십시오. 또한 scp를 사용합니다. 데이터베이스를 만든 후 저장 용으로 파일을 압축합니다. 지시 사항을 충족 시키려면 파일을 STDOUT으로 읽으십시오. 마지막으로 7 일이 지난 파일을 확인하십시오. 그들을 제거하십시오. 이렇게하려면 스크립트가 다음과 같이 표시됩니다 우리는 암호 우리의 스크립트가 실행될 때마다 입력하라는 메시지하지 않을 수 있도록

vim /backupscripts/mysqldbbackup.sh 

#!/bin/sh 

# create a temporary file for the schema to be stored 
BACKUPDIR = /backuplogs/ 
TMPFILE = tmpout.sql 
CURRTIME = $(date +%Y%m%d).tgz 

#backup your database 
mysqldump -ubackupdbuser -pbackuppassword databasename > $BACKUPDIR$TMPFILE 

#compress this file and store it locally with the current date 
tar -zvcf /backuplogs/backupdb-$CURRTIME $BACKUPDIR$TMPFILE 

#per instructions - cat the contents of the SQL file to STDOUT 
cat $BACKUPDIR$TMPFILE 

#cleanup script 
# remove files older than 7 days old 
find $BACKUPDIR -atime +7 -name 'backup-db-*.tgz' -exec rm {} \; 

#remove the old backupdirectory from the remote server 
ssh [email protected] find /backuplogs/ -name 'backup-db-*.tgz' -exec rm {} \; 

#copy the current backup directory to the remote server using scp 
scp -r /backuplogs/ [email protected]:/backuplogs/ 

################# 
# End script 
################# 

를 장소에이 스크립트, 우리는 설정 SSH 키를해야합니다. 우리는 SSH-keygen과 명령을 통해 이것을 할 것입니다 :

ssh-keygen -t rsa 

프롬프트에 암호를 입력하십시오 - 이것은 개인 키를 생성합니다. 이것을 공유하지 마십시오.

공유해야하는 파일은 공개 키이며 current_home/.ssh/id_rsa.pub 파일에 저장되어 있습니다. 다음 단계는이 공개 키를 원격 호스트로 전송하는 것입니다. 키를 가져 오려면 다음 명령을 사용하십시오.

cat current_home/.ssh/id_rsa.pub 

파일에 문자열을 복사하십시오. 명령을 사용하여 원격 서버에 다음 SSH :

ssh [email protected] 

비밀번호를 입력 한 다음 파일 /.ssh/authorized_keys을 편집 할 수 있습니다. id_rsa.pub 파일에서 가져온 문자열을 authorized_keys 파일에 붙여 넣습니다. 편집기를 사용하여 변경 사항을 파일에 기록하고 편집기를 종료하십시오. 원격 서버에서 로그 아웃하고 이전 ssh 명령을 사용하여 원격 서버에 다시 로그인하여 RSA 키가 작동했는지 테스트합니다. 암호를 묻지 않으면 제대로 작동합니다. 원격 서버에서 다시 로그 아웃합니다.

우리가해야 할 마지막 일은 사용자가 로그 오프 한 후 매일 실행하기 위해 cron 작업을 생성하는 것입니다. crontab을 사용하여 모든 권한 문제를 피하기 위해 현재 사용자 파일 (루트)을 편집합니다. * 참고 - 데이터 삭제, 보안 취약점 등 스크립트에 오류가있는 경우 심각한 영향을 미칠 수 있습니다. 모든 작업을 다시 확인하고 자신의 시스템을 신뢰할 수 있는지 확인하십시오. 사용 권한은 현재 서버 *에서 설정해야합니다. 현재의 crontab을 편집하려면 우리는 명령을 실행합니다 :

crontab -e 

은 crontab 편집기에서 (이 기본 텍스트 편집기에서 열 수 있습니다)하지만, 우리는 12에서 매일 밤을 실행하기 위해 스크립트를 설정하는거야 : 30am.

30 0 * * * bash는 /backupscripts/mysqldbbackup.sh

이 파일을 저장하고 편집기를 종료 : 에디터에 새 줄을 입력합니다. cronjob을 제대로 실행하려면 crond 서비스를 다시 시작해야합니다. 이렇게하려면 다음 명령을 실행하십시오.

/etc/init.d/crond restart 
관련 문제