답변:
복사는 MyISAM에서 매우 간단하며 InnoDB를 통해 100 % 위험합니다 (자살 근처)
당신의 질문에서, 당신은 제기
cp /db1/mytable.frm /db2/mytable.frm
괜찮습니다. 그러나 .frm 만 이동할 수는 없습니다. 모든 구성 요소를 이동해야합니다. 질문에서 db1.mytable이라는 테이블을 보자. 일반 설치에서 테이블은 / var / lib / mysql / db1에 있습니다. 테이블을 구성하는 3 개의 파일이 있습니다.
하나의 테이블을 이동하려면 세 파일을 모두 이동해야합니다. 모든 테이블이 MyISAM 스토리지 엔진을 사용하는 경우 mysql을 종료하고 복사 할 수 있습니다. 단순히 테이블의 사본을 작성하여 다른 데이터베이스에 배치하는 경우 SQL을 사용하여 수행해야합니다.
예를 들어, db1.mytable을 데이터베이스 db2에 복사하려면 다음을 수행하십시오.
CREATE TABLE db2.mytable LIKE db1.mytable;
ALTER TABLE db2.mytable DISABLE KEYS;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
ALTER TABLE db2.mytable ENABLE KEYS;
이제 테이블을 db1에서 db2로 이동하면 다음을 수행 할 수 있습니다.
ALTER TABLE db1.mytable RENAME db2.mytable;
복사는 InnoDB가 작동하는 인프라 때문에 매우 위험합니다. 1) innodb_file_per_table 비활성화 및 2) innodb_file_per_table 활성화의 두 가지 기본 인프라가 있습니다.
InnoDB의 Achilles 'Heel은 ibdata1 (일반적으로 / var / lib / mysql에 있음)으로 알려진 시스템 테이블 스페이스 파일입니다. 그 파일에는 무엇이 포함되어 있습니까?
innodb_file_per_table을 비활성화하면 이러한 모든 유형의 InnoDB 정보가 ibdata1 내에 있습니다. ibdata1 외부에있는 InnoDB 테이블의 유일한 표시는 InnoDB 테이블의 .frm 파일입니다. 모든 InnoDB 데이터를 한 번에 복사하려면 모든 / var / lib / mysql을 복사해야합니다.
개별 InnoDB 테이블을 복사하는 것은 불가능합니다. 테이블의 덤프를 데이터 및 해당 인덱스 정의의 논리적 표현으로 추출하려면 mysqldump가 있어야합니다. 그런 다음 해당 덤프를 동일한 서버 또는 다른 서버의 다른 데이터베이스에로드합니다.
innodb_file_per_table을 사용하면 테이블 데이터 및 해당 인덱스가 .frm 파일 옆의 데이터베이스 폴더에 있습니다. 예를 들어, db1.mytable 테이블의 경우 ibdata1 외부에서 해당 InnoDB 테이블의 표시는 다음과 같습니다.
db1.mytable의 모든 메타 데이터는 여전히 ibdata1에 상주하며 그 방법은 전혀 없습니다 . 리두 로그 및 MVCC 데이터도 여전히 ibdata1과 함께 작동합니다.
.frm 및 .ibd 파일을 복사하려고 생각하는 경우 상처를 입을 수 있습니다. InnoDB 테이블의 .frm 및 .ibd 파일을 복사하는 것은 .ibd 파일의 테이블 스페이스 ID가 ibdata1 파일의 metdata에있는 테이블 스페이스 ID 항목과 정확히 일치 함을 보장 할 수있는 경우에만 적합합니다.
이 테이블 스페이스 ID 개념에 대해 DBA StackExchange에 두 개의 게시물을 작성했습니다.
다음은 일치하지 않는 테이블 스페이스 ID가있는 경우 .ibd 파일을 ibdata1에 다시 첨부하고 .ibd 파일에 다시 연결하는 방법에 대한 훌륭한 링크입니다. http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . 이 글을 읽은 후 내가 자살 근처에서 내가 왜 말했는지 알 수있을 것입니다.
InnoDB의 경우이 작업 만하면됩니다
CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
InnoDB 테이블의 복사본을 만듭니다. 다른 DB 서버로 마이그레이션하는 경우 mysqldump를 사용하십시오.
.frm
, .MYD
및 사본 만 복사하면 .MYI
됩니다.
전체 MySQL 데이터를 복사하는 것은 MySQL 서비스가 중지되고 전체 데이터베이스 서버가 복사되기를 원한다고 가정하는 실용적인 기술입니다.
이것은 큰 인덱스가있는 데이터베이스를 이동시키는 데 유용한 기술이며 mysql 덤프에는 인덱스가 포함되어 있지 않으므로 가져 오기 시점에 재생성해야합니다. MySQL 슬레이브를 설정할 때이 기술이 유용하다는 것을 알았습니다.
개별 파일 복사는 사용중인 테이블 스키마에 따라 달라 지지만 대부분의 경우 적합한 솔루션이 아닙니다.
사용 xtrabackup / 흐름 w / O를 innobackupex 래퍼 승 그리고 당신의 MyISAM과 InnoDB의 데이터베이스에 모두 잘 될 것입니다. xtrabackup을 사용하더라도 innodb 데이터베이스를 복원하는 것만으로는 파일을 다시 복사 할 수 없습니다. 더 많은 정보가 필요한지 알려주세요