파일을 복사하여 MySQL 데이터베이스를 복사할 수 있나요? 이 파일에는 정확히 무엇이 포함되어 있나요?

파일을 복사하여 MySQL 데이터베이스를 복사할 수 있나요? 이 파일에는 정확히 무엇이 포함되어 있나요?

저는 MySQL 데이터베이스와 Ubuntu Linux 시스템을 사용하고 있습니다.

내 데이터베이스 이름은 db_test이며 아래와 같이 경로 에 /var/lib/mysql/db_test접미사가 붙은 일부 .frm파일이 있음을 확인했습니다..MYD.MYI

/var/lib/mysql/db_test# ls

cars.frm 
cars.MYD 
cars.MYI

customers.frm
customers.MYD
customers.MYI

departments.frm
departments.MYD
departments.MYI

... 

.frm각 , .MYD, .MYI파일 그룹이 데이터베이스의 테이블에 매핑된 것 같습니다 .

다음과 같은 두 가지 질문이 있습니다.

  1. 이 세 파일은 정확히 무엇을 하는 걸까요?

  2. /var/lib/mysql/say라는 경로 아래에 새 디렉터리를 만들고 db_test_2디렉터리 db_test_1의 모든 파일을 에 복사 하면 정확히 동일한 내용(테이블)이 포함된 새 데이터베이스 db_test_2도 생성됩니까 ?db_test_2db_test_1

이 물리적 데이터베이스 파일 이동 작업은 다음 명령줄 작업과 동일한 결과를 생성합니까?

  1. db_test_1데이터베이스 덤프

  2. 새 데이터베이스 만들기db_test_2

  3. 그런 다음 db_test_1데이터베이스를 새 데이터베이스로 다시 덤프하시겠습니까 db_test_2?

mysqldump그렇다면 파일을 이동하는 것이 데이터베이스를 복사하는 것(또는 MySQL의 한 데이터베이스에서 다른 데이터베이스로 데이터를 가져오는 것)보다 훨씬 빠른 것 같습니다. 이에 대한 의견이 있으십니까?

답변1

  1. AFAIR에서 .frm은 데이터베이스 테이블 구조를 설명하는 설명 파일이고, .MYD는 데이터가 포함된 파일이고, .MYI는 인덱스가 포함된 파일입니다.

  2. 예, 복사가 훨씬 빨라질 것입니다. 그러나 문제가 있습니다. 원자적이지 않습니다. 부하가 높으면 복사된 파일이 일관성이 없으며 전혀 손상될 수도 있습니다. 특히 InnoDB와 같은 좀 더 "지능적인" 엔진을 사용하는 경우에는 더욱 그렇습니다.

편집하다:p.s. 이 파일을 안전하게 복사할 수 있지만 그 전에 mysql 서버를 중지해야 합니다.

답변2

다음을 수행하는 명령줄 도구가 있습니다.mysqlhotcopy

myisam 테이블에서는 작동하지만 InnoDb 테이블에서는 작동하지 않습니다.

lvm으로 서버를 구성하고 /var/lib/mysql을 전용 볼륨에 저장한 경우 비차단 방식으로 모든 데이터베이스를 신속하게 백업하는 것이 좋습니다.

mysql -U root -p
  > flush tables with read lock;

이렇게 하면 모든 테이블이 디스크로 플러시되고 읽기/쓰기 작업이 방지됩니다.

  > system "lvcreate -s -L 1G -n lvMysql_snap /dev/vg_myserver/lv_mysql" ;

구성에 맞게 조정하면 데이터베이스 파일 시스템의 스냅샷이 생성됩니다. 시간이 필요하지 않습니다

  > unlock tables;

완료되면 R/W 작업이 재개됩니다.

이제 /dev/vg_myserver/lvMysql_snap을 마운트하고 데이터베이스의 tar 아카이브를 생성할 수 있습니다!

답변3

이는 MyISAM에서는 작동하지만 InnoDB에서는 작동하지 않습니다. 바라보다https://serverfault.com/a/367321/57569

InnoDB에 관한 이 답변으로 판단하면 다음과 같습니다.

.frm 및 .ibd 파일만 복사하려는 경우 어려운 상황에 처하게 됩니다. InnoDB 테이블에 대한 .frm 및 .ibd 파일 복사는 .ibd 파일의 테이블스페이스 ID가 ibdata1 파일의 메타데이터에 있는 테이블스페이스 ID 항목과 정확히 일치한다고 보장할 수 있는 경우에만 효과적입니다.

답변4

동일한 머신/mysql 서버에서 6GB 데이터베이스를 복제하는 방법조차 너무 느린 것을 발견하여 mysqldump | mysql데이터베이스의 datadir 폴더 전체를 복사하여 다른 데이터베이스(동일 인스턴스)의 다른 폴더에 붙여넣기를 시도했고, I 거기에서 엉망으로 만들어도 괜찮습니다. mysql을 시작할 때 손상된 것으로 나타났습니다. 성공하지 못한 채 auto_recover 테이블 설정을 시도했습니다.

동일한 데이터베이스 이름에서만 작동하는 것 같습니다. 내가 한 일은 mysql을 실행하는 2개의 도커 컨테이너를 만드는 것이었습니다. 하나는 내 프로덕션 슬레이브의 슬레이브로, 다른 하나는 도커 맵 파일을 통한 직접 복제용이었습니다. 아래 내 구조를 참조하세요.

          +-----------+
          | Master DB |
          +-----------+
                |
 (Replication)  |
        +-----------------+
        | Slave/Master DB |
        +-----------------+
                |
                |         Cloud / Production Server
                V
======================================================================
                |
                |         My Local Computer
 (Replication)  |
          +-----------+    - Docker Container: AppDBLive.readonly
          | Slave  DB |    - DB Name: MyAppDB
          +-----------+    - READ Only (If I want to test live data)
                |          - Consistently cloning from prod slave/master
                |
  (Rsync/Copy datadir of MyAppDB)
                |
                V
        +----------------+  - Docker Container: AppDBLive.readwrite
        | No Replication |  - DB Name: MyAppDB
        +----------------+  - Can Write and mess with all the data for testing/dev
                            - clone via sh script to trigger rsync from AppDBLive.read

다음은 Docker 컨테이너를 빌드하는 스크립트입니다.

/local/path/to/AppDBLive.readonly/run.sh:

_PWD=`pwd`
docker run --name=MyAppDB \
--mount type=bind,src=$_PWD/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=$_PWD/datadir,dst=/var/lib/mysql \
--mount type=bind,src=$_PWD/logs,dst=/var/log/mysql \
-p 3336:3306 \
-d mysql/mysql-server:5.7

/local/path/to/AppDBLive.readwrite/run.sh:

_PWD=`pwd`
docker run --name=MyAppDB.dev \
--mount type=bind,src=$_PWD/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=$_PWD/datadir,dst=/var/lib/mysql \
--mount type=bind,src=$_PWD/logs,dst=/var/log/mysql \
-p 3337:3306 \
-d mysql/mysql-server:5.7

두 컨테이너의 포트 번호 차이에 유의하세요. 애플리케이션이 올바른 포트에 연결되어 있는지 확인하세요.

또한 복제 스크립트를 실행할 때 두 컨테이너가 모두 종료되는지 확인하세요.

관련 정보