한 물리적 서버에서 다른 물리적 서버로 MySQL 테이블을 어떻게 이동할 수 있습니까?
이 정확한 시나리오 : innodb 테이블을 사용하고 크기가 약 20GB 인 MySQL 서버가 있습니다.
새 서버로 옮기고 싶습니다. 가장 효율적인 방법은 무엇입니까?
한 물리적 서버에서 다른 물리적 서버로 MySQL 테이블을 어떻게 이동할 수 있습니까?
이 정확한 시나리오 : innodb 테이블을 사용하고 크기가 약 20GB 인 MySQL 서버가 있습니다.
새 서버로 옮기고 싶습니다. 가장 효율적인 방법은 무엇입니까?
답변:
내가 가장 좋아하는 방법은 sqldump 명령을 sql 명령으로 파이프하는 것입니다. 모든 데이터베이스 또는 특정 데이터베이스를 수행 할 수 있습니다. 예를 들어
mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword
당신은 모든 데이터베이스를 할 수 있습니다
mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver
유일한 문제는 데이터베이스가 너무 커서 파이프가 붕괴되는 경우입니다. 이 경우 테이블별로 또는 아래 언급 된 다른 방법 중 하나를 수행 할 수 있습니다.
netcat
.
최근에 다음과 같은 전략으로 30GB 데이터베이스를 옮겼습니다.
~/mysqldata/*
) 에 복사tar -czvf mysqldata.tar.gz ~/mysqldata
)tar -xzvf mysqldata.tar.gz
)에 따르면 5.0 인증 학습 가이드 , 장 32 절 32.3.4, 페이지 456457은 설명 바이너리 이식성을위한 조건 밖으로 다음 가지고 :
이진 이식성은 한 시스템에서 작성된 이진 백업을 가져 와서 다른 아키텍처를 가진 다른 시스템에서 사용하려는 경우에 중요합니다. 예를 들어, 바이너리 백업을 사용하면 한 MySQL 서버에서 다른 MySQL 서버로 데이터베이스를 복사 할 수 있습니다.
MyISAM의 경우 이진 이식성은 MyISAM 테이블의 파일을 한 MySQL 서버에서 다른 컴퓨터의 다른 서버로 직접 복사 할 수 있고 두 번째 서버가 테이블에 액세스 할 수 있음을 의미합니다.
InnoDB의 경우 바이너리 이식성은 한 머신의 MySQL 서버에서 다른 머신의 다른 서버로 테이블 스페이스 파일을 직접 복사 할 수 있고 두 번째 서버가 테이블 스페이스에 액세스 할 수 있음을 의미합니다. 기본적으로 서버가 관리하는 모든 InnoDB 테이블은 테이블 스페이스에 함께 저장되므로 테이블 스페이스의 이식성은 모든 개별 InnoDB 테이블이 이식 가능한지 여부의 함수입니다. 하나의 테이블도 이식 가능하지 않으면 테이블 공간도 마찬가지입니다.
MyISAM 테이블과 InnoDB 테이블 스페이스는 두 가지 조건이 충족되면 한 호스트에서 다른 호스트로 이진 이식 가능합니다.
- 두 기계 모두 2의 보수 정수 산술을 사용해야합니다
- 두 머신 모두 IEEE 부동 소수점 형식을 사용해야합니다. 그렇지 않으면 테이블에 부동 소수점 열이 없어야합니다 (FLOAT 또는 DOUBLE)
실제로이 두 조건은 거의 제한이 없습니다. 2의 보수 정수 산술 및 IEEE 부동 소수점 형식은 현대 하드웨어의 표준입니다. InnoDB 바이너리 이식성의 세 번째 조건은 테이블과 데이터베이스에 소문자 이름을 사용해야한다는 것입니다. InnoDB는 이러한 이름을 Windows에서 내부적으로 (데이터 사전에) 소문자로 저장하기 때문입니다. 소문자 이름을 사용하면 Windows와 Unix 간의 이진 이식성이 가능하므로 소문자 이름을 사용하도록 옵션 파일에 다음 줄을 넣을 수 있습니다.
[mysqld]
lower_case_table_names=1
테이블 단위 테이블 스페이스를 사용하도록 InnoDB를 구성하면 이진 이식성 조건이 확장되어 InnoDB 테이블의 .ibd 파일도 포함됩니다. (공유 테이블 스페이스의 조건은 모든 InnoDB 테이블에 대한 정보를 저장하는 데이터 사전을 포함하므로 여전히 적용됩니다.)
이진 이식성 조건이 충족되지 않으면 MyISAM 또는 InnoDB 테이블을 일부 텍스트 형식 (예 : mysqldump로)을 사용하여 덤프 한 다음 대상 서버로 다시로드하여 한 서버에서 다른 서버로 복사 할 수 있습니다.
스토리지 엔진을 기반으로 개별 테이블을 이동하는 두 가지 주요 방법이 있습니다.
주어진 예에서 다음을 가정합니다.
MyISAM 테이블
mydb.mytable이 MyISAM 스토리지 엔진을 사용하는 경우 테이블은 물리적으로 세 개의 별도 파일로 나타납니다.
.frm은 테이블 구조를 포함합니다
. .MYD는 테이블 데이터를
포함합니다. .MYI는 테이블 인덱스 페이지를 포함합니다
이 파일들은 mysql의 논리적 관점에서 테이블을 나타 내기 위해 상호 의존적으로 사용됩니다. 이 파일에는 더 이상 논리적 연관 첨부가 없으므로 한 DB 서버에서 다른 DB 서버로 테이블을 마이그레이션합니다. Windows 서버에서 Linux 서버 또는 MacOS로이 작업을 수행 할 수도 있습니다. 물론 mysql을 종료하고 3 개의 테이블 파일을 복사 할 수 있습니다. 다음을 실행할 수 있습니다.
LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;
하나의 ssh 세션에서 테이블을 읽기 전용으로 유지하고 24 시간 동안 잠금을 유지하십시오. 1 초 후에 다른 ssh 세션에서 복사를 수행하십시오. 그런 다음 24 시간 잠금으로 mysql 세션을 종료하십시오. 24 시간을 기다리지 않아도됩니다.
InnoDB 테이블
앞서 언급 한 인증 책에서 인용 한 내용을 바탕으로 특정 InnoDB 테이블을 백업하는 방법을 결정하는 많은 요소가 있습니다. 단순성, 명확성 및 간결성을 위해 --single-transaction 매개 변수를 사용하여 원하는 테이블의 mysqldump를 수행하여 테이블의 완벽한 시점 덤프를 수행하십시오. 하나의 테이블 만 원한다면 InnoDB 시맨틱을 사용하지 않아도됩니다. 선택한 덤프 서버에 해당 덤프 파일을 다시로드 할 수 있습니다.
두 개의 질문이 여기에 합쳐진 이후 (jcolebrand) : EDIT
DB 성능이 약간 저하되는 것을 원한다면 mysql이 여전히 ServerA에서 실행되는 동안에도 이전 서버 (ServerA)에서 새 서버 (ServerB)로 일련의 rsync를 수행 할 수 있습니다.
단계 01) ServerA와 동일한 버전의 mysql을 ServerB에 설치
단계 02) ServerA SET GLOBAL innodb_max_dirty_pages_pct = 0;
에서 mysql과 약 10 분 동안 실행합니다 (이것은 InnoDB 버퍼 풀에서 더티 페이지를 제거합니다. 또한 mysql 종료를 더 빠르게 수행하는 데 도움이됩니다). 데이터베이스가 모두 MyISAM이면이 단계를 건너 뛸 수 있습니다.
단계 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql
단계 04) rsync가 1 분 미만이 될 때까지 단계 03을 반복하십시오.
service mysql stop
ServerA의 05 단계)
단계 06) 하나 더 rsync 수행
07 단계) scp ServerA:/etc/my.cnf ServerB:/etc/
service mysql start
ServerB의 08 단계)
service mysql start
ServerA의 08 단계) (선택 사항)
시도 해봐 !!!
경고
이와 같이 복제 슬레이브를 만들 수 있습니다. 마스터 /etc/my.cnf에 server-id를 명시 적으로 설정하고 슬레이브 /etc/my.cnf에 server-id에 다른 번호를 설정해야합니다.
전체 데이터베이스 스키마를 이동하고 첫 번째 데이터베이스를 기꺼이 중단하려는 경우 mysqldump가 필요하지 않으므로 전송시 일관성이 유지됩니다.
mysqldump는 사용자 및 사용 권한, 또는 단지 데이터를 처리하는 경우 기억이 없습니다 ...하지만이 경우에도,이는 방식으로 덤프를하고 & 그것을 실행하는 것보다 더 빨리. 스토리지 옵션 (innodb vs. myisam)을 변경 해야하는 경우 또는 mysql의 주요 버전을 변경하려는 경우 mysql 데이터베이스를 덤프 한 다음 다른 RDBMS에 다시 삽입 해야하는 경우에만 사용합니다 (그러나 그래도 4 ~ 5 사이 에이 작업을 수행했다고 생각합니다)
--all-databases
하여 mysql 스키마 를 덤프합니다. 다음 머신에서 mysql을 시작하면 동일한 주요 MySQL 릴리스를 사용하여 데이터 폴더를 다른 머신으로 전송 한 경우 권한이 표시됩니다. (MySQL 5.5.x-MySQL 5.5.x, MySQL 5.1.x-MySQL 5.1.x, MySQL 5.0.x-MySQL 5.0.x)
mysqldump
는 사용자와 권한이 mysql
스키마 내에 저장되므로 사용자와 권한을 처리합니다 .
특정 테이블을 이동하려면 다음을 시도하십시오.
mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql
동일한 명령에서 더 많은 테이블 이름을 지정할 수 있습니다. 명령이 완료되면 databasename.tablename.sql 파일을 다른 서버로 이동 한 후 다음을 사용하여 복원하십시오.
mysql -u username -ppassword databasename < databasename.tablename.sql
back .sql 파일은 mysqldump 프로그램을 사용하여 작성 되며 복원은 mysql 로 직접 수행됩니다 .
실제 데이터베이스 파일을 옮기는 가능성이있을 수 있지만 (내 설치의 경우 / var / lib / mysql에 있습니다) 실제로 어떻게 작동 / 작동하는지 확실하지 않습니다.
가동 중지 시간이 필요합니다. 네트워크 속도에 따라 다소 시간이 걸립니다. Linux / Unix에서 MySQL을 실행한다고 가정하겠습니다. 내가 사용하는 프로세스는 다음과 같습니다.
그런 다음 평소와 같이 로컬 MySQL 설정을 진행하십시오.
* 참고 : rsync와 함께 -c 매개 변수를 사용하여 전송에 체크섬을 추가 할 수도 있지만 CPU 속도에 따라 sloooow가됩니다.
DTest의 방법이 우분투와 osx 사이의 복사에도 작동한다는 것을 확인할 수 있습니다.
덤프 또는 이와 유사한 작업을 수행하지 않고 모든 데이터베이스를 복사하려면
당신은 MySQL의 깨끗한 MySQL의이 있는지 확인 (MySQL의에서 다운로드 한 DMG 설치 http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg 것을, () 아주 중요) 실행 한 적이 없습니다.
Mac의 / usr / local / mysql / data / 내용 위에있는 우분투 시스템에서 / var / lib / mysql / 폴더 내용을 복사하십시오. 우분투 컴퓨터에서 폴더를 가져 오려면 sudo를 사용해야했습니다.
sudo cp /var/lib/mysql /home/foouser/mysql_data_folder
sudo chown -R foouser /home/foouser/mysql_data_folder
scp를 사용하여 폴더를 복사했습니다.
시작하기 전에 Mac에서 mysql 폴더의 복사본을 만들어 아무것도 엉망이되지 않도록하십시오.
폴더를 복사 한 후 Mac 컴퓨터에서 다음을 수행하십시오.
sudo chown -R _mysql /usr/local/mysql/data/
sudo chgrp -R wheel /usr/local/mysql/data/
sudo chmod -R g+rx /usr/local/mysql/data/
시스템 환경 설정-> mysql의 환경 설정 창에서 mysql 서버를 처음 시작하십시오. 모든 사용자 및 데이터베이스가 이제 올바르게 설정되었습니다.
이것은 우분투 64 비트 11.10의 mysql 5.1.61 및 osx lion (macbook pro)의 mysql 5.1.63에서 작동했습니다.
이전의 모든 답변이 제대로 작동한다고 생각하지만 전송 중에 데이터베이스 이름을 설정하는 문제를 실제로 다루지는 않습니다.
이것이 내가 bash로 방금 한 방법입니다.
rsync
보다 scp
자주 사용하고 파일을 자주 압축하지 않으면 파일을 압축하지 않는 것이 좋습니다 .
내 소스 서버에서 :
me@web:~$ d=members
me@web:~$ mysqldump $d | gzip > $d.sql.gz
me@web:~$ scp -i .ssh/yourkeynamehere $d.sql.gz $sbox:$d.sql.gz
내 대상 서버에서 :
me@sandbox:~$ d1=members
me@sandbox:~$ d2=members_sb
me@sandbox:~$ mysqladmin create $d2
me@sandbox:~$ cat $d1.sql.gz | gunzip | mysql $d2
진행 상황을 보려면 두 머신 중 하나에서 :
me@sandbox:~$ ls *.gz
me@sandbox:~$ cat $d.sql.gz | gunzip | less
이것은 모두 두 머신의 홈 디렉토리에 MySQL 구성 파일이 있고 권한을 설정 했다고 가정합니다 .
$ echo "
[client]
user=drupal6
password=metoknow
host=ord-mysql-001-sn.bananas.com
[mysql]
database=nz_drupal" > .my.cnf
$ chmod 0600 ~/.my.cnf
다른 mysql 서버 db로 옮기고 있습니까? 사용하는 경우 내보내기를 수행하십시오.
# mysqldump -u username -ppassword database_name > FILE.sql
아마도 이것이 더 좋은 방법 일 것입니다.
버전 1 : 데이터 파일 사본 (MYISAM 만 해당)
ssh server1
service mysql stop
cd $mysql-data-dir
rsync -avz dirs-or-files server2:$mysql-data-dir
service mysql start
ssh server2 서비스 재시작 mysql
- 데이터베이스 파일이 읽기 전용 인 경우 서버 중지를 건너 뛸 수 있습니다.
버전 2 : mysqldump
최신 Xeon 또는 Opteron 프로세서에 pigz를 설치하십시오. 특히 2 개 이상의 CPU가있는 경우 gzip보다 훨씬 빠릅니다.
ssh server1
mysqldump ... | pigz > backup-YYMDD.sql.gz
rsync backup-YYMDD.sql.gz server:location
ssh server2
pigz -dc location/backup-YYMDD.sql.gz | mysql ..
버전 3 : 마스터 / 슬레이브 + mysqldump / 파일 복사
In HA environment you should use the following trick:
setup slave server & do all backups from it
before backups - do "slave stop";
then do version 1 or version 2
스크립트:
touch full.start
mysqladmin -h slave-db stop-slave
echo "show slave status \G" | mysql -h slave-db > FULL/comfi-$NOW.master-position
/usr/bin/mysqldump -h slave-db --default-character-set=utf8 -A --opt --skip-lock-tables | pigz > "FULL/XXXX-$NOW.sql.gz"
mysqladmin -h slave-db start-slave
touch full.end
ln -fs "FULL/XXXX-$NOW.sql.gz" FULL.sql.gz
추신:
작은 테이블을 복사하려면 다음을 사용하십시오.
ssh server1 mysqldump 스키마 테이블 | ssh server2 mysql 스키마