테이블을 잠그지 않고 MySQLDump 실행


437

라이브 프로덕션 데이터베이스를 로컬 개발 데이터베이스에 복사하고 싶습니다. 프로덕션 데이터베이스를 잠그지 않고이를 수행 할 수있는 방법이 있습니까?

나는 현재 다음을 사용하고 있습니다 :

mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1

그러나 각 테이블이 실행될 때마다 잠 깁니다.


또 다른 최신 솔루션 : Percona XtraBackup을 사용하여 트랜잭션 처리와 관련하여 중단없이 프로덕션 데이터베이스를 덤프 할 수도 있습니다. 핫 백업을 수행 할 수 있습니다. 즉 현재 활동에 영향을 미치지 않습니다. 여기를 참조하십시오 : percona.com/software/mysql-database/percona-xtrabackup (Percona와 아무런 관련이 없습니다.)
delx

답변:


625

합니까 --lock-tables=false옵션 작업을?

매뉴얼 페이지 에 따르면 InnoDB 테이블을 덤프하는 경우 다음 --single-transaction옵션을 사용할 수 있습니다 .

--lock-tables, -l

Lock all tables before dumping them. The tables are locked with READ
LOCAL to allow concurrent inserts in the case of MyISAM tables. For
transactional tables such as InnoDB and BDB, --single-transaction is
a much better option, because it does not need to lock the tables at
all.

들어 이노 DB :

mysqldump --single-transaction=TRUE -u username -p DB

23
innodb DB의 경우 mysqldump --single-transaction = TRUE -u username -p DB
AMB

19
innodb와 myisam이 있다면 어떨까요?
CMCDragonkai

기본적으로 켜져 있습니까?
CMCDragonkai

분명히 켜져 있습니다 (즉, 잠겨 있음)?
evandrix

290

나이가 너무 늦었지만 주제를 검색하는 모든 사람에게 좋습니다. innoDB가 아니고 덤프하는 동안 잠금이 걱정되지 않으면 다음 옵션을 사용하십시오.

--lock-tables=false

1
Warren 응답에 감사드립니다. 이것은 매우 도움이되었으며 매력처럼 작동했습니다.
Gavin

7
'--lock-table = false --quick'사용은 가장 적은 서버 리소스를 사용합니다.
SyntaxGoonoo

43
그러나 테이블 잠금에 대해 걱정 해야 합니다. mysqldump가 실행되는 동안 여러 테이블에 기록되고 외래 키를 사용하면 덤프가 일치하지 않을 수 있습니다. 복원하고 일치하지 않는 데이터에 대해 JOIN 쿼리를 실행할 때까지 알 수 없습니다. JOIN이 Mysql (MyISAM 테이블 사용)이 아닌 응용 프로그램에서 사용되기 때문에 일치하지 않는 데이터가 검색되는 데 시간이 걸릴 수 있습니다. 복원은 정상적으로 작동하며 mysql은 불일치에 대해 경고하지 않습니다. 따라서 : MyIsam-> 항상 테이블을 잠급니다. InnoDB-> 사용 --single-transaction.
Costa

12
@Costa 나는 잠금 테이블이 MyISAM 테이블에 충분하다고 생각하지 않습니다. mysqldump 가 애플리케이션이 실행하는 쿼리 사이 에서 테이블 잠그면 동일한 불일치가 발생합니다. 대답은 훨씬 간단합니다. MyISAM-> 대신 InnoDB를 사용하십시오.
cdhowie

@Costa는 확실히 테이블 잠금에 대해 걱정 해야 하지만 , 일관성있는 덤프가 필요한 경우 에만 가능합니다 . 그렇지 않은 경우는 드물다. 예를 들어, 데이터베이스 전체 덤프에 대한 조잡한 fgrep (디버깅) : 사용자가 프로덕션 데이터베이스 덤프를 만들기 위해 ~ 20 분 동안 기다리지 않기를 바랍니다 (사실). 요점은 ASAP뿐만 아니라 CONSISTENT도 덤프하는 경우 복제 된 슬레이브를 덤프하거나 하위 레벨 스냅 샷 (lvm, zfs, btrfs 등)을 사용해야합니다 FLUSH TABLES WITH READ LOCK.
Alex Offshore

44

답변은 사용중인 스토리지 엔진에 따라 다릅니다. 이상적인 시나리오는 InnoDB를 사용하는 경우입니다. 이 경우 --single-transaction덤프를 시작할 때 데이터베이스의 일관된 스냅 샷을 제공 하는 플래그를 사용할 수 있습니다 .


35

--skip-add-locks 나를 위해 도움이


2
또는 다른 최적화와 함께 건너 뛰기 잠금을 포함하도록 --compact.
ppostma1

77
덤프 파일에서 LOCK TABLES 및 UNLOCK TABLES 문이 제거되며 내보내기 중 잠금에 영향을 미치지 않습니다.
dabest1

11
아니요, 원하는 것이 아닙니다! dabest1의 의견을 참조하십시오. 이것은 mysqldump를 수행하는 동안 테이블이 잠기지 않도록하는 것이 아닙니다. 이것은 질문에 대한 답변이 아닙니다.
orrd

@dabest 및 @orrd가 정확합니다. --skip-add-locks덤프 복원 속도가 더 빨라집니다. 이것은 정답 이 아닙니다 .
dr_



10

솔직히, 나는 테이블을 잠그지 않으면 덤프에서 일관되지 않은 데이터를 얻는 것처럼 복제를 설정합니다.

덤프 시간이 더 오래 걸리면 이미 덤프 된 테이블이 덤프 될 일부 테이블과 함께 변경되었을 수 있습니다.

따라서 테이블을 잠 그거나 복제를 사용하십시오.


이 전체 DB는 거의 완전히 읽기 전용이므로 변경에 대해 너무 걱정하지 않습니다.
그렉

2
이 댓글이 잘못되었습니다. MVCC를 사용하면 InnoDB를 잠그지 않고 일관성있는 상태를 읽을 수 있습니다.
Scott Hyndman

5
복제가 아직 설정되지 않은 경우 덤프를 설정하여 설정해야합니다. 같은 문제가 존재합니다.
매트 코놀리

3
복제가 아직 설정되지 않은 경우 데이터 무결성을 보장하기 위해 덤프를 수행하기 위해 테이블을 잠 가야합니다. 그래서 그것은 캐치 22입니다.
JordanC

9

이것은 원래 답변에 늦었다 고 말한 사람과 비교할 때 늦었지만 내 경우 (Windows 7의 WAMP를 통한 MySQL)에는 다음을 사용해야했습니다.

--skip-lock-tables

이것은 "LOCK TABLES를 사용할 때 'debian-sys-maint'@ 'localhost'사용자가 데이터베이스 'information_schema'에 액세스가 거부되었습니다"라는 오류없이 information_schema를 덤프하는 데 도움이되었습니다.
Rui F Ribeiro

6
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db

위로 투표, 이것은 나를 위해 일했다 --skip-opt --single-transaction --max_allowed_packet = 1G
Steven Lizarazo

1
이 목적으로 "--skip-opt"를 권장하지 않습니다. 그것은 원래의 질문에서 요구 한 것보다 훨씬 더 많은 일을합니다. 빠른 모드를 끄고 문자셋 등을 포함하지 않습니다.
orrd

3

MySQL Workbench를 사용하는 경우 데이터 내보내기에서 고급 옵션을 클릭하고 "잠금 테이블"옵션을 선택 취소하십시오.

여기에 이미지 설명을 입력하십시오


1

이러한 접근법 중 어느 것도 나를 위해 효과가 없었기 때문에 간단히 다음과 같이했습니다.

mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]

LOCK TABLE <x>UNLOCK TABLES명령을 모두 제외 합니다.

참고 : 데이터에 해당 문자열이 포함되어 있지 않기를 바랍니다.


2
덤프 도중 --skip-add-locks도 그렇게합니다
codewandler


0

또 다른 답변 :

(리눅스 환경에서) 서버 데이터베이스의 핫 카피를 만들려고하고 모든 테이블의 데이터베이스 엔진이 MyISAM 인 경우을 사용해야 합니다 mysqlhotcopy.

설명서에 따르면 :

FLUSH TABLES, LOCK TABLES 및 cp 또는 scp를 사용하여 데이터베이스 백업을 만듭니다. 데이터베이스 또는 단일 테이블을 백업하는 빠른 방법이지만 데이터베이스 디렉토리가있는 동일한 머신에서만 실행할 수 있습니다. mysqlhotcopy는 MyISAM 및 ARCHIVE 테이블 백업에만 작동합니다.

LOCK TABLES시간은 서버가 MySQL 파일을 복사 할 수 있는 시간에 달려 있습니다 (덤프하지는 않습니다).


0

오늘도 같은 문제에 직면했지만 명령 줄에 액세스 할 수 없었으므로 메모장 편집기에서 SQL 파일을 열고 테이블에서 아래 줄을 제거했습니다.

LOCK TABLES `yourtable name` WRITE;

그런 다음 개발 환경으로 가져 왔습니다. 그것이 도움이되기를 바랍니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.