14.5.5 테이블 공간의 다른 서버로 복사 (이동 가능한 테이블 스페이스)
이 섹션에서는 Transportable Tablespace 기능을 사용하여 file-per-table 테이블 공간 ( .idb
파일)을 데이터베이스 서버에서 다른 데이터베이스 서버로 복사하는 방법을 설명합니다.
다른 InnoDB
테이블 복사 방법에 대한 자세한 내용은 섹션 14.6.2 "다른 컴퓨터에 InnoDB 테이블의 이동 또는 복사" 를 참조하십시오.
InnoDB
file-per-table 테이블 스페이스를 다른 데이터베이스 서버로 복사하는 것이 좋습니다하는데는 많은 이유가 있습니다.
프로덕션 서버에 불필요한 부하를 걸지 않고 보고서를 실행하기 위하여.
새로운 슬레이브 서버 에있는 테이블과 동일한 데이터를 설정하기 위하여.
문제 나 오류가 발생한 후에 테이블의 백업 버전을 복원하기 위하여.
mysqldump 명령의 결과를 가져 오는 것보다 데이터를 이동시키는 것이 빠르기 때문에. 데이터의 재 삽입과 인덱스를 다시 작성하는 것보다 데이터를 즉시 사용할 수 있기 때문입니다.
시스템 요구 사항에 따라 적합한 스토리지 매체를 가진 서버에 file-per-table 테이블 공간을 이동하기 위하여. 예를 들어, 액세스 빈도가 높은 테이블을 SSD 장치에 두거나 큰 테이블을 대용량 HDD 장치에 두거나하는 경우입니다.
테이블 공간의 복사 제한 및 사용에 대한주의 (전송 가능한 테이블 스페이스)
테이블 공간의 복사 절차는
innodb_file_per_table
이ON
(MySQL 5.6.6 이후에서는 기본값)로 설정되어있는 경우에만 가능합니다. 공유 시스템 테이블 스페이스에있는 테이블은 중단 할 수 없습니다.테이블이 중단되면 영향을받은 테이블은 읽기 전용 트랜잭션 만 허용됩니다.
테이블 공간을 가져 오는 경우 페이지 크기는 가져올 인스턴스의 페이지 크기와 일치해야합니다.
DISCARD TABLESPACE
가 파티션 된 테이블에서 지원되지 않는 것은 이동 가능한 테이블 스페이스도 지원되지 않는 것을 의미합니다. 파티션 된 테이블에서ALTER TABLE ... DISCARD TABLESPACE
를 실행하면 다음과 같은 오류가 반환됩니다. ERROR 1031 (HY000) : Table storage engine for 'part'does not have this option.DISCARD TABLESPACE
는foreign_key_checks
가1
로 설정되어있는 부모 / 자식 (기본 키 / 외래 키) 관계를 갖는 테이블 스페이스를 지원하지 않습니다. 부모 테이블의 테이블 스페이스를 파괴하기 전에foreign_key_checks=0
을 설정합니다.ALTER TABLE ... IMPORT TABLESPACE
는 가져온 데이터에 외부 키 제약 조건을 부과하지 않습니다. 테이블 사이에 외래 키 제약 조건이있는 경우, 모든 테이블을 같은 (논리적) 시점에서 내보내기하십시오.ALTER TABLE ... IMPORT TABLESPACE
는 테이블 스페이스를 가져 오기위한.cfg
메타 데이터 파일이 필요하지 않습니다. 그러나.cfg
파일없이 가져온 경우 메타 데이터의 체크는 실행되지 않고 다음 유사한 경고가 발행됩니다.Message: InnoDB: IO Read error: (2, No such file or directory) Error opening '.\ test\t.cfg', will attempt to import without schema verification 1 row in set (0.00 sec)
.cfg
파일없이 가져 오기 기능은 스키마 불일치가 예상되지 않는 경우에 사용이 높아질 가능성이 있습니다. 또한.cfg
파일없이 가져 오기 기능은 메타 데이터가.ibd
파일에서 수집 할 수없는 충돌 복구 시나리오에 도움이 될 수 있습니다.MySQL 5.6 이상에서는 두 서버가 GA (일반 제공) 상태이며, 양자의 버전이 동일 시리즈 인 경우 테이블 공간 파일의 다른 서버에서 가져 오기가 작동합니다. 그렇지 않으면 대상 서버에 파일이 생성되어 있어야합니다.
복제 시나리오에서는 마스터와 슬레이브에서
innodb_file_per_table
가ON
으로 설정되어 있어야합니다.Windows에서는
InnoDB
는 데이터베이스, 테이블 스페이스 및 테이블 이름을 내부적으로 소문자로 저장합니다. Linux 및 UNIX 등 대소 문자를 구별 운영 체제에서 가져 오기 문제를 해결하려면 모든 데이터베이스, 테이블 스페이스 및 테이블을 소문자 이름을 사용하여 만듭니다. 이를 수행하는 편리한 방법은 데이터베이스, 테이블 스페이스 또는 테이블을 작성하기 전에my.cnf
또는my.ini
파일의[mysqld]
섹션에 다음 줄을 추가하는 것입니다.[mysqld] lower_case_table_names=1
절차 예 : 한 서버에서 다른 서버로 테이블 공간 복사 (이동 가능한 테이블 스페이스)
이 단계에서는 MySQL의 실행중인 서버 인스턴스에서 실행중인 다른 인스턴스에 테이블을 복사하는 방법을 설명합니다. 동일한 절차는 조정을 더하면 같은 인스턴스에서 테이블의 완전한 복원을 수행하는 데 사용할 수 있습니다.
소스 서버에서 테이블이 아직 존재하지 않는 경우 테이블을 만듭니다.
mysql> use test; mysql> CREATE TABLE t(c1 INT) engine=InnoDB;
목표 서버에서 테이블이 존재하지 않는 경우 테이블을 만듭니다.
mysql> use test; mysql> CREATE TABLE t(c1 INT) engine=InnoDB;
목적 서버에서 기존의 테이블 스페이스를 파기합니다. (테이블 스페이스를 가져 오기 전에,
InnoDB
는 수신 측의 테이블에 연결된 테이블 스페이스를 삭제합니다.)mysql> ALTER TABLE t DISCARD TABLESPACE;
소스 서버는
FLUSH TABLES ... FOR EXPORT
를 실행하여 테이블을 중단하고.cfg
메타 데이터 파일을 만듭니다.mysql> use test; mysql> FLUSH TABLES t FOR EXPORT;
메타 데이터 (
.cfg
) 파일은InnoDB
데이터 디렉토리에 작성됩니다.참고FLUSH TABLES ... FOR EXPORT
는 MySQL 5.6.6 이상에서 사용할 수 있습니다. 이 문은 서버 가동 중에 바이너리 테이블의 복사본 수 있도록 명명 된 테이블에 대한 변경을 디스크로 플러시합니다.FLUSH TABLES ... FOR EXPORT
가 실행되면,InnoDB
는 테이블과 같은 데이터베이스 디렉토리에.cfg
파일을 만듭니다..cfg
파일에는 테이블 스페이스 파일을 가져올 때 스키마 유효성 검사에 사용되는 메타 데이터가 포함됩니다..ibd
파일 및.cfg
메타 데이터 파일을 원본 서버에서 대상 서버로 복사합니다. 예 :shell> scp
/path/to/datadir
/test/t.{ibd,cfg} destination-server:/path/to/datadir
/test참고.ibd
파일 및.cfg
파일은 다음 단계에서 같이 공유 잠금을 해제하기 전에 복사해야합니다.소스 서버에서
UNLOCK TABLES
를 사용하여FLUSH TABLES ... FOR EXPORT
의해 취득 된 잠금을 해제합니다.mysql> use test; mysql> UNLOCK TABLES;
목표 서버에서 테이블 스페이스를 가져옵니다.
mysql> use test; mysql> ALTER TABLE t IMPORT TABLESPACE;
참고ALTER TABLE ... IMPORT TABLESPACE
기능은 가져온 데이터에 외부 키 제약 조건을 부과하지 않습니다. 테이블 사이에 외래 키 제약 조건이있는 경우, 모든 테이블을 같은 (논리적) 시점에서 내보내기하십시오. 이 경우, 테이블 갱신을 중지하고 모든 트랜잭션을 커밋 테이블에 공유 잠금을 획득 한 후 내보내기 작업을 수행합니다.
테이블 공간 복사 내부 정보 (전송 가능한 테이블 스페이스)
다음 정보는 이동 가능한 테이블 스페이스의 복사 절차에 관한 내부 정보와 오류 로그에 대해 설명합니다.
ALTER TABLE ... DISCARD TABLESPACE
가 원하는 인스턴스에서 실행 된 경우.
테이블은 X 모드로 잠겨 있습니다.
테이블 스페이스가 테이블에서 분리되어 있습니다.
FLUSH TABLES ... FOR EXPORT
가 소스 인스턴스에서 실행 된 경우.
내보내기 위해 플래시 된 테이블이 공유 모드로 잠겨 있습니다.
퍼지 코디네이터 스레드가 중지되어 있습니다.
더티 페이지가 디스크에 동기화하고 있습니다.
테이블의 메타 데이터가 바이너리
.cfg
파일에 기록되었습니다.
이 작업에서 예상되는 오류 로그 메시지입니다.
2013-07-18 14:47:31 34471 [Note] InnoDB: Sync to disk of '"test"."t"' started. 2013-07-18 14:47:31 34471 [Note] InnoDB: Stopping purge 2013-07-18 14:47:31 34471 [Note] InnoDB: Writing table metadata to './test/t.cfg' 2013-07-18 14:47:31 34471 [Note] InnoDB: Table '"test"."t"' flushed to disk
UNLOCK TABLES
가 소스 인스턴스에서 실행 된 경우.
이진 .cfg 파일이 삭제되었습니다.
가져온 테이블 (또는 여러 테이블) 공유 잠금이 해제되어 퍼지 코디네이터 스레드가 다시 시작되었습니다.
이 작업에서 예상되는 오류 로그 메시지입니다.
2013-07-18 15:01:40 34471 [Note] InnoDB: Deleting the meta-data file './test/t.cfg' 2013-07-18 15:01:40 34471 [Note] InnoDB: Resuming purge
ALTER TABLE ... IMPORT TABLESPACE
가 원하는 인스턴스에서 실행되면 가져 알고리즘 가져온 테이블 공간에 대해 다음 작업을 수행합니다.
테이블 공간의 각 페이지에 손상이 있는지를 확인합니다.
각 페이지의 공간 ID와 로그 시퀀스 번호 (LSN)가 업데이트됩니다.
플래그가 검증 된 헤더 페이지의 LSN이 업데이트됩니다.
B 트리 페이지가 업데이트됩니다.
페이지의 상태가 디스크에 기록 된 바와 같이,이 상태를 더티 설정합니다.
이 작업에서 예상되는 오류 로그 메시지입니다.
2013-07-18 15:15:01 34960 [Note] InnoDB: Importing tablespace for table 'test/t' that was exported
from host 'ubuntu' 2013-07-18 15:15:01 34960 [Note] InnoDB: Phase I - Update all pages 2013-07-18 15:15:01 34960 [Note] InnoDB: Sync to disk 2013-07-18 15:15:01 34960 [Note] InnoDB: Sync to disk - done! 2013-07-18 15:15:01 34960 [Note] InnoDB: Phase III - Flush changes to disk 2013-07-18 15:15:01 34960 [Note] InnoDB: Phase IV - Flush complete
테이블 스페이스가 파기 된 것 (목표 테이블의 테이블 스페이스를 파기 한 경우)에 대한 경고 및 .ibd
파일이 없기 때문에 통계 값을 계산하지 못했음을 알리는 메시지도받을 수 있습니다.
2013-07-18 15:14:38 34960 [Warning] InnoDB: Table "test"."t" tablespace is set as discarded. 2013-07-18 15:14:38 7f34d9a37700 InnoDB: cannot calculate statistics for table "test"."t"
because the .ibd file is missing. For help, please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html