일부 프로덕션 환경에서는 mysqldump --single-transaction을 사용하여 야간에 데이터베이스 백업을 수행했는데, 백업 기간 동안 동료가 실수로 일부 작업은 성공하고 일부는 실패했습니다.
본 테스트는 MySQL 5.6.36에서 진행되었는데, 이 문제에 대한 버전 차이가 있습니다!
##=========================================== ===== ===========================##
mysqldump의 단일 트랜잭션 매개변수에 대한 설명은 다음과 같습니다.
Creates a consistent snapshot by dumping all tables in a single transaction. Works ONLY for tables stored in storage engines which support multiversioning (currently only InnoDB does); the dump is NOT guaranteed to be consistent for other storage engines. While a --single-transaction dump is in process, to ensure a valid dump file (correct table contents and binary log position), no other connection should use the following statements: ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE, as consistent snapshot is not isolated from them. Option automatically turns off --lock-tables.
빨간색 글씨 부분이 포커스인데 조금 헷갈릴 수 있으니 테스트해보겠습니다.
"Mysqldump의 여러 주요 옵션 탐색" 소개에 따르면 백업을 위해 실행하는 mysqldump --single-transaction --master-data 명령은 다음 코드를 실행하는 것과 같습니다.
FLUSH TABLES; FLUSH TABLES WITH READ LOCK;SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION WITH CONSISTENT SNAPSHOT; SHOW MASTER STATUS; UNLOCK TABLES; SHOW TABLES LIKE 'xxx'SET OPTION SQL_QUOTE_SHOW_CREATE=1SHWO CREATE TABLE 'xxx'SHOW FIELDS FROM 'xxx'SHOW TABLE STATUS LIKE 'xxx'SELECT /*!40001 SQL_NO_CACHE */ * FROM xxx QUIT
시나리오 1: mysqldump가 시작되었지만 아직 백업되지 않았습니다. 테이블 tb001에 도달하면 다른 세션에서 테이블 tb001에 대해 변경 작업을 수행한 후 mysqldump가 테이블 tb001을 내보냅니다. 변경 작업은 성공적으로 완료되었지만 mysqldump 작업은 실패합니다.
시나리오 2: mysqldump가 백업을 시작하고 tb001 내보내기를 완료합니다. 다른 테이블을 내보내는 동안 다른 세션이 해당 테이블에 대해 변경 작업을 수행합니다.
mysqldump가 완료되거나 종료될 때까지 테이블 변경 작업이 차단됩니다. 실패 후.mysqldump를 사용하여 백업할 때 시나리오 2의 환경을 시뮬레이션할 때 오류 메시지는 다음과 같습니다.
mysqldump: 오류 1412: 테이블 정의가 변경되었습니다. 행: 0
에서 테이블 `tb1002`을 덤프할 때 트랜잭션을 다시 시도하십시오. 내보내기 파일 보기, 최종 내용은 다음과 같습니다.
-- -- Dumping data for table `tb1002`--LOCK TABLES `tb1002` WRITE;/*!40000 ALTER TABLE `tb1002` DISABLE KEYS */;
요약:
단일 트랜잭션 매개변수는 여러 버전의 Innodb를 통해 데이터 일관성을 얻는 반면 ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE 등과 같은 작업은 . 데이터 일관성이 손상됩니다. 이러한 작업은 동시에 실행할 수 없습니다. "mysqldump가 시작된 후 수정된 테이블 데이터를 내보내기 전" 기간 내에 테이블 수정 작업이 시작되면 테이블 수정 작업은 성공적으로 완료되지만 mysqldump는 실패합니다.
다음 이후에 테이블 수정 작업이 시작되면; "mysqldum이 내보내졌습니다." "테이블 데이터가 수정되었지만 mysqldump 작업이 완료되기 전에" 테이블 수정 작업이 차단되고 mysqldump 작업이 완료된 후 테이블 수정 작업이 정상적으로 완료될 수 있습니다.
위 내용은 mysqldump 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!