DDL이 동시에 사용될 때 MySQLdump 및 단일 전송을 사용하여 올바른 덤프를 얻는 방법은 무엇입니까?
-
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 해당 버그 보고서에서 발견 된 의견 이외 의이 특정 문제에 대해서는 언급하지 않습니다.
이제 "궁극적 인 백업"이 쉘 스크립트의 선을 따라 무언가를 고려할 것을 제안합니다
테이블을 잠그지 않으면 일관된 덤프를 얻을 수 없습니다. 나는 단지 하루 중 2 분 동안 덤프를하는 데 걸리는 시간이 눈치 채지 못했습니다.
한 가지 해결책은 복제를 한 다음 마스터 대신 슬레이브를 백업하는 것입니다. 백업 중에 슬레이브가 쓰여지면 나중에 따라 잡을 것입니다. 또한 마스터가 실패 할 경우 라이브 백업 서버가 있습니다. 좋은 것입니다.