programing

mysqdump와 일관된 InnoDB 덤프

stoneblock 2023. 6. 28. 21:16

mysqdump와 일관된 InnoDB 덤프

MySQL 문서에서는 사용할 mysqdump가 포함된 InnoDB를 덤프할 때 단일 트랜잭션을 사용하여 다른 트랜잭션을 최소화하면서 트랜잭션 일관성 있는 데이터베이스 스냅샷을 얻는 것을 권장합니다.유감스럽게도 덤프 중에 다른 연결이 스키마 변경을 실행하지 못하도록 막을 수 있는 경우에만 이 기능이 작동합니다.

https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html

--single-transaction 덤프가 처리되는 동안 유효한 덤프 파일(올바른 테이블 내용 및 이진 로그 좌표)을 보장하기 위해 다른 연결에서는 ALTER TABLE, CREATE TABLE, Drop TABLE, RNAME TABLE, TRUNKATE TABLE 문을 사용하면 안 됩니다.일관된 읽기는 이러한 문에서 분리되지 않으므로 덤프할 테이블에서 이를 사용하면 mysqdump에서 수행하는 SELECT가 테이블 내용을 검색하여 잘못된 내용을 얻거나 실패할 수 있습니다.

덤프 중에 스키마가 변경되지 않도록 하는 좋은 방법은 무엇입니까?사용 사례는 mysqdump 유틸리티를 사용하여 매 시간마다 정기적으로 데이터베이스를 백업(크론 작업)하는 것입니다.

대신 mysqdump의 기본값인 --lock-tables를 사용하면 트랜잭션 일관성을 얻을 수 있다고 생각했지만,

--single-transaction 옵션과 --lock-tables 옵션은 보류 중인 트랜잭션이 암시적으로 커밋되도록 하므로 상호 배타적입니다.

누군가 InnoDB에 대해 mysqdump --lock-table을 실행하면 실제로 다른 세션에서 진행 중인 트랜잭션이 더 이상 트랜잭션이 되지 않을 수 있다는 것입니까?아니길 바랍니다. 미친 것처럼 보입니다.기타:

https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html#lock-tables-and-transactions

LOCK TABLES 및 UNLOCK TABLES는 다음과 같이 트랜잭션 사용과 상호 작용합니다.

LOCK TABLES는 트랜잭션 안전하지 않으며 테이블을 잠그기 전에 모든 활성 트랜잭션을 암묵적으로 커밋합니다.

이는 단일 DB 세션의 컨텍스트 내에서 의미가 있습니다.만약 당신이 거래 중이고 이것을 한다면, 그것은 암묵적으로 당신의 공개 거래를 먼저 커밋합니다.다른 세션의 트랜잭션에 어떤 영향을 미치는지는 명확하지 않습니다.저는 그것이 아무 효과가 없기를 바라거나, 오히려 다른 세션에서 진행 중인 모든 거래와 관련하여 지속적으로 주문되기를 바랍니다.

mysqdump 문서를 너무 많이 읽고 --lock-tables를 사용하면 트랜잭션 일관성을 얻을 수 있습니까?

mysqdump 문서는 --lock-tables와 함께 --lock-tables를 수행하는 것이 단일 트랜잭션을 즉시 암시적으로 닫을 것이기 때문에 비논리적이라고 단순히 설명하고 있습니까?하지만 그렇지 않으면 mysqdump --lock-tables는 트랜잭션적으로 일관성이 있습니까?

감사합니다!

테이블 잠금은 동일한 세션에서 트랜잭션을 강제로 커밋합니다.다른 세션에서는 강제로 커밋하지 않습니다.

mysqdump와 함께 두 옵션을 모두 사용한 경우 mysqdump 클라이언트에서 열린 세션에서 트랜잭션이 시작되고 잠금 테이블이 발생하면 즉시 해당 트랜잭션이 커밋됩니다.그래서 그것들을 함께 사용하는 것은 의미가 없습니다.

또한 다른 클라이언트의 트랜잭션은 커밋되지 않지만 mysqdump의 잠금 테이블 작업을 차단합니다.모든 쿼리(읽기 전용 SELECT)는 메타데이터 잠금을 획득하고 잠금 테이블은 해당 메타데이터 잠금이 해제될 때까지 기다립니다.그래서 mysqdump는 테이블 잠금 장치를 얻으려고 시도하고 기다려야 합니다.

한편, mysqdump가 대기를 시작한 후에 새로운 트랜잭션을 시작하려는 모든 클라이언트는 mysqdump 뒤에 있는 대기열에 있는 것처럼 대기합니다.이렇게 하면 프로그램 진행이 중단될 수 있습니다.

이러한 대기 유형은 50초 후에 시간 초과되는 일반 행 잠금과 다릅니다.메타데이터 잠금 대기의 기본 시간 초과는 1년입니다(https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_lock_wait_timeout) 참조).

생산 현장에서 mysqdump -- lock-tables를 사용하는 것은 거의 불가능합니다. 그렇죠?트랜잭션 테이블을 사용하지 않는 경우에만 사용해야 합니다.--lock-tables 옵션을 몇 년 동안 사용하지 않았습니다.

--lock-tables를 사용하는 경우 DDL 문에도 전용 메타데이터 잠금이 필요하므로 모든 DDL 문이 차단됩니다.

--single-transaction을 사용할 때 DDL 문을 차단할 수 있는 방법을 모르겠습니다.백업이 실행되는 동안에는 이러한 작업을 자제하면 됩니다.

또한 1시간마다 완벽한 mysqdump를 만드는 것이 최선의 백업 전략이 아닐 수도 있습니다.백업 빈도를 줄인 다음 이진 로그를 사용하여 시점 복구를 수행해야 합니다.https://dev.mysql.com/doc/refman/8.0/en/point-in-time-recovery.html 을 참조하십시오.

언급URL : https://stackoverflow.com/questions/65695166/consistent-innodb-dumps-with-mysqldump