DDL이 동시에 사용될 때 MySQLdump 및 단일 전송을 사용하여 올바른 덤프를 얻는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/451404

  •  19-08-2019
  •  | 
  •  

문제

나는 MySQL을 처음 접했고 온라인 핫 논리 백업을 사용하는 가장 좋은 방법을 알아 내고 있습니다. mysqldump. 이 페이지 이 명령 줄을 제안합니다.

mysqldump --single-transaction --flush-logs --master-data=2
          --all-databases > backup_sunday_1_PM.sql

그러나 ... 문서를주의 깊게 읽으면 당신은 그것을 찾습니다:

a --single-transaction 덤프가 진행 중이며, 유효한 덤프 파일 (올바른 테이블 내용 및 이진 로그 위치)을 보장하기 위해 다른 연결은 다음과 같은 설명을 사용해서는 안됩니다. ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE. 일관된 읽기는 해당 진술에서 분리되지 않으므로 버릴 테이블에 사용하면 SELECT 수행 mysqldump 테이블 내용을 검색하여 잘못된 내용을 얻거나 실패합니다.

그렇다면이 가능한 덤프 부패 시나리오를 방지 할 수있는 방법이 있습니까? 즉, 그 진술을 일시적으로 차단할 수있는 명령.

추신 :이 주제에 대한 MySQL 버그 항목 http://bugs.mysql.com/bug.php?id=27850

도움이 되었습니까?

해결책

a mysql 명령 창 및이 명령을 발행합니다.

mysql> FLUSH TABLES WITH READ LOCK;

이것은 잠금 될 것입니다 모두 테이블 모두 이 mySQL 인스턴스에 대한 데이터베이스가 발행 될 때까지 UNLOCK TABLES (또는이 읽기 잠금 장치를 보유하는 클라이언트 연결을 종료합니다).

이를 확인하려면 다른 명령 창을 열고 ALTER, DROP, RENAME 또는 TRUNCATE. 이 명령은 중단되어 읽기 잠금이 해제되기를 기다리고 있습니다. 대기를 끝내기 위해 Ctrl-C를 치십시오.

그러나 테이블에는 읽기 잠금 장치가 있지만 여전히 수행 할 수 있습니다. mysqldump 지원.

그만큼 FLUSH TABLES WITH READ LOCK 명령 5월 사용하는 것과 동일합니다 --lock-all-tables 옵션 mysqldump. 완전히 명확하지는 않지만 이 문서 그것을 지원하는 것 같습니다 :

잠금 해제 테이블의 또 다른 용도는 읽기 잠금 장치가있는 플러시 테이블로 획득 한 글로벌 읽기 잠금을 해제하는 것입니다.

둘 다 FLUSH TABLES WITH READ LOCK 그리고 --lock-all-tables "Global Read Lock"이라는 문구를 사용하십시오. 따라서 이것이 같은 일을 할 가능성이 높다고 생각합니다. 따라서 해당 옵션을 사용할 수 있어야합니다. mysqldump 동시체 변경, 드롭, 이름 변경 및 자리로부터 보호하십시오.


답장. 귀하의 의견 : 다음은 MySQL 버그 로그에있는 Guilhem Bichot에서 다음과 링크했습니다.

안녕. -Lock-all-Tables는 Read Lock과 함께 플러시 테이블을 호출합니다. 따라서 Alter, Drop, Rename 또는 Truncate를 차단해야합니다 (버그가 있거나 잘못되지 않는 한). 그러나-lock-all-tables-single transaction은 작동 할 수 없습니다 (MysqlDump는 오류 메시지를 던집니다) : Lock-all 테이블은 서버의 모든 테이블을 백업 지속 시간에 대해 쓰기에 대해 잠그기 때문에 단일 변환은 IS입니다. 백업 중에 쓰기가 발생하도록 의도 된 (거래에서 일관된 읽기 선택을 사용하여) 자연과 호환되지 않습니다.

이것으로부터 백업 중에 동시 액세스를 얻을 수 없으며 동시에 변경, 드롭, 이름 변경 및 자르기를 차단합니다.

다른 팁

그래도 문서의 일부를 읽는 것과 같은 것을 생각했지만 더 많은 정보를 찾았습니다.

4.5.4. MysqlDump - 데이터베이스 백업 프로그램http://dev.mysql.com/doc/en/mysqldump.html

InnoDB 테이블의 경우 MySqlDump는 온라인 백업을 만드는 방법을 제공합니다.

shell> mysqldump --all-databases --single-transaction > all_databases.sql

이 백업은 덤프 시작시 모든 테이블 (읽기 잠금 장치를 사용하여 플러시 테이블 사용)의 전역 읽기 잠금을 획득합니다. 이 잠금이 획득 되 자마자 바이너리 로그 좌표가 읽히고 잠금이 해제됩니다. Flush 문이 발행 될 때 긴 업데이트 명령문이 실행되면 MySQL 서버가 해당 명령문이 완료 될 때까지 정체 될 수 있습니다. 그 후, 덤프는 잠금이 없어지고 테이블을 읽고 쓰지 않습니다. MySQL 서버가 수신하는 업데이트 문이 짧은 경우 (실행 시간에 따라) 초기 잠금 기간은 많은 업데이트를 통해서도 눈에 띄지 않아야합니다.

상충이 있습니다 --opt 그리고 --single-transaction 옵션 :

--고르다

이 옵션은 속기입니다. -add-drop-table-add-locks (create-options-disable-keys)-extended-insert-quick-set-charset을 지정하는 것과 동일합니다. 빠른 덤프 작업을 제공하고 MySQL 서버에 빠르게 다시로드 할 수있는 덤프 파일을 생성해야합니다.

-opt 옵션은 기본적으로 활성화됩니다. -skip-opt를 사용하여 비활성화하십시오.

질문을 올바르게 이해하면 실제 데이터와 DDL (데이터 정의 언어)을 함께 원합니다. DDL 만 원한다면 사용하므로 --no-data. 이에 대한 자세한 내용은 다음에서 확인할 수 있습니다.

http://dev.mysql.com/doc/workbench/en/wb-reverse-engineer-create-script.html

데이터베이스와 모든 객체를 만들려면 mysqldump와 함께 -databases 옵션을 사용하십시오. 스크립트 파일에 데이터베이스 생성 DB_NAME 문이없는 경우 데이터베이스 개체를 기존 스키마로 가져 오거나 스키마가없는 경우 새 이름없는 스키마가 생성됩니다.

제안한대로 Michael Kofler의 MySQL 5에 대한 결정적인 안내서 다음 옵션을 제안합니다.

--skip-opt
--single-transaction
--add-drop-table
--create-options
--quick
--extended-insert
--set-charset
--disable-keys

또한 언급되지 않았습니다 --order-by-primary또한 사용중인 경우 --databases 옵션, 또한 사용해야합니다 --add-drop-database 특히 이것과 결합된다면 대답 다른 네트워크에 연결되는 데이터베이스를 백업하는 경우 사용해야 할 수도 있습니다. --compress 옵션.

따라서 mysqldump 명령 (사용하지 않고 --compress, --databases, 또는 --add-drop-database 옵션)은 다음과 같습니다.

mysqldump --skip-opt --order-by-primary --single-transaction --add-drop-table --create-options --quick --extended-insert --set-charset -h db_host -u username --password="myPassword" db_name | mysql --host=other_host db_name

나는 참조를 제거했다 --disable-keys 그것은 내가 이해하는 것처럼 Innodb에 효과적이지 않기 때문에 책에서 주어졌습니다. 그만큼 MySQL 매뉴얼 상태 :

각 테이블에 대해 /*! 40000 Alter Table TBL_NAME 키를 사용하여 삽입 문을 둘러싸십시오. /; 그리고 /! 40000 ALTER 테이블 TBL_NAME 키를 활성화 */; 진술. 따라서 모든 행을 삽입 한 후 인덱스가 생성되므로 덤프 파일을 더 빨리로드 할 수 있습니다. 이 옵션은 MyISAM 테이블의 비 유적 인덱스에만 유용합니다.

또한이 버그 보고서를 찾았습니다 http://bugs.mysql.com/bug.php?id=64309 바닥에 댓글이 있습니다 몇 권의 책을 쓴 Paul Dubois 해당 버그 보고서에서 발견 된 의견 이외 의이 특정 문제에 대해서는 언급하지 않습니다.

이제 "궁극적 인 백업"이 쉘 스크립트의 선을 따라 무언가를 고려할 것을 제안합니다

  1. https://github.com/red-ant/mysql-svn-backup/blob/master/mysql-svn.sh

테이블을 잠그지 않으면 일관된 덤프를 얻을 수 없습니다. 나는 단지 하루 중 2 분 동안 덤프를하는 데 걸리는 시간이 눈치 채지 못했습니다.

한 가지 해결책은 복제를 한 다음 마스터 대신 슬레이브를 백업하는 것입니다. 백업 중에 슬레이브가 쓰여지면 나중에 따라 잡을 것입니다. 또한 마스터가 실패 할 경우 라이브 백업 서버가 있습니다. 좋은 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top