Linux / mysql : cp 명령으로 mysql db 파일을 한 db에서 다른 db로 복사하는 것이 안전합니까?


11

대부분의 가이드는 하나의 테이블을 anoter db에 복사하기 위해 mysqldump와 간단한 SQL을 권장합니다. 리눅스 쉘 CP는 어떻습니까? 그냥 할 수 있을까요

cp /db1/mytable.frm /db2/mytable.frm

답변:


21

복사는 MyISAM에서 매우 간단하며 InnoDB를 통해 100 % 위험합니다 (자살 근처)

당신의 질문에서, 당신은 제기

cp /db1/mytable.frm /db2/mytable.frm

MyISAM

괜찮습니다. 그러나 .frm 만 이동할 수는 없습니다. 모든 구성 요소를 이동해야합니다. 질문에서 db1.mytable이라는 테이블을 보자. 일반 설치에서 테이블은 / var / lib / mysql / db1에 있습니다. 테이블을 구성하는 3 개의 파일이 있습니다.

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.MYD (테이블 데이터베이스)
  • /var/lib/mysql/db1/mytable.MYI (테이블 인덱스)

하나의 테이블을 이동하려면 세 파일을 모두 이동해야합니다. 모든 테이블이 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

복사는 InnoDB가 작동하는 인프라 때문에 매우 위험합니다. 1) innodb_file_per_table 비활성화 및 2) innodb_file_per_table 활성화의 두 가지 기본 인프라가 있습니다.

InnoDB의 Achilles 'Heel은 ibdata1 (일반적으로 / var / lib / mysql에 있음)으로 알려진 시스템 테이블 스페이스 파일입니다. 그 파일에는 무엇이 포함되어 있습니까?

  • 테이블 데이터 페이지
  • 테이블 인덱스 페이지
  • 테이블 메타 데이터 (테이블 스페이스 ID 관리 목록)
  • MVCC 데이터 (트랜잭션 격리 및 ACID 준수 지원)

InnoDB (innodb_file_per_table 비활성화)

innodb_file_per_table을 비활성화하면 이러한 모든 유형의 InnoDB 정보가 ibdata1 내에 있습니다. ibdata1 외부에있는 InnoDB 테이블의 유일한 표시는 InnoDB 테이블의 .frm 파일입니다. 모든 InnoDB 데이터를 한 번에 복사하려면 모든 / var / lib / mysql을 복사해야합니다.

개별 InnoDB 테이블을 복사하는 것은 불가능합니다. 테이블의 덤프를 데이터 및 해당 인덱스 정의의 논리적 표현으로 추출하려면 mysqldump가 있어야합니다. 그런 다음 해당 덤프를 동일한 서버 또는 다른 서버의 다른 데이터베이스에로드합니다.

InnoDB (innodb_file_per_table 사용 가능)

innodb_file_per_table을 사용하면 테이블 데이터 및 해당 인덱스가 .frm 파일 옆의 데이터베이스 폴더에 있습니다. 예를 들어, db1.mytable 테이블의 경우 ibdata1 외부에서 해당 InnoDB 테이블의 표시는 다음과 같습니다.

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.ibd

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를 사용하십시오.


4
다른 응답은 이것을 말했을 것입니다. "아무 말도 안 돼요"라고 말하지만 어쨌든 이렇게 말할 수 있습니다. 데이터베이스가 유휴 상태 인 경우에도 InnoDB는 파일에 계속 쓰기를 수행하므로 MySQL이 실행되는 동안 파일을 복사하면 손상이 거의 확실합니다! 이 문제를 해결하기 위해 시스템 종료, 파일 시스템 스냅 샷 또는 Percona XtraBackup을 사용할 수 있습니다.
Baron Schwartz

1
언제나처럼 훌륭한 답변 @Rolando! 내가 가진 유일한 큰 질문 : 왜 누군가가 MySQL 덤프 및 가져 오기를하는 대신 왜 이것을하고 싶습니까? 나는 단순한 데이터베이스 크기를 가정하고 있지만 그것이 제기되어야한다고 생각합니다.
JakeGould

1
@JakeGould mysqldump 스크립트를 mysql에로드하려면 많은 SQL을 처리하고 한 번에 수천 개의 행을 삽입하고 CPU주기를 사용하고 Explain 계획을 크랭크하고 인덱스를 다시 작성합니다 (BTree Insertions, Leaf Node Splits, Rebalancing Keys, 각각에 대한 테이블 스캔 필요) -고유의 빌드) 같은 테이블을 생성합니다. MyISAM의 경우 왜 바퀴를 재발 명합니까? .frm, .MYD및 사본 만 복사하면 .MYI됩니다.
RolandoMySQLDBA

@JakeGould InnoDB의 경우 모든 InnoDB를 rsync와 함께 사용하는 라이브 데이터베이스를 복사했습니다. rsync를 사용하여 복사 한 후 mysql을 종료하고 최종 rsync를 수행 한 다음 문제없이 mysql을 다시 시작했습니다. 이전과 같은 글을 썼습니다 : serverfault.com/questions/288140/…
RolandoMySQLDBA

8

전체 MySQL 데이터를 복사하는 것은 MySQL 서비스가 중지되고 전체 데이터베이스 서버가 복사되기를 원한다고 가정하는 실용적인 기술입니다.

이것은 큰 인덱스가있는 데이터베이스를 이동시키는 데 유용한 기술이며 mysql 덤프에는 인덱스가 포함되어 있지 않으므로 가져 오기 시점에 재생성해야합니다. MySQL 슬레이브를 설정할 때이 기술이 유용하다는 것을 알았습니다.

개별 파일 복사는 사용중인 테이블 스키마에 따라 달라 지지만 대부분의 경우 적합한 솔루션이 아닙니다.


2
설명 : 서비스 자체를 중지 할 필요는 없습니다. 파일 시스템이 가능한 경우 LVM 스냅 샷을 수행하고 백업 할 수 있습니다. 또는 파일 시스템 자체를 정지시킵니다.
thinice

개인이 다운 타임을 먹을 수있는 한 이것이 가장 쉬운 방법입니다. +1 !!!
RolandoMySQLDBA

2

사용 xtrabackup / 흐름 w / O를 innobackupex 래퍼 승 그리고 당신의 MyISAM과 InnoDB의 데이터베이스에 모두 잘 될 것입니다. xtrabackup을 사용하더라도 innodb 데이터베이스를 복원하는 것만으로는 파일을 다시 복사 할 수 없습니다. 더 많은 정보가 필요한지 알려주세요


1

아니요, mysqdump를 사용하여 백업하고 mysql cli 유틸리티를 사용하여 복원해야합니다. frm 파일은 데이터가 아닌 테이블 구조 만 복사하고 innodb 복사를 사용하는 경우 파일을 직접 사용할 수 없습니다.

가장 좋은 방법은 테이블을 덤프하고 복원하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.