mysqldump-자동 증가없이 구조 내보내기


87

MySQL 데이터베이스가 있고 자동 증분 값없이 구조 만 내보내는 방법을 찾으려고합니다. mysqldump --no-data거의 작업을 수행하지만 auto_increment 값을 유지합니다. PHPMyAdmin을 사용하지 않고 할 수있는 방법이 있습니까?


MySQL 5.5 (서버) 에서처럼 보이며 --no-data기본적으로 auto_increment 값을 생략합니다.
Joey Adams

@JoeyAdams 확실합니까? 그것은 내가 경험하는 행동이 아닙니다
aland

2
@JoeyAdams MySQL 5.7. *의 mysqldump는 --no-data를 사용할 때 auto_increment를 생략하지 않습니다.
Tiberiu-Ionuț Stan

답변:


68

다음과 같이 할 수 있습니다.

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//' > <filename>.sql

다른 사람에 의해 언급 한 바와 같이 원하는 경우 sed올바르게 작동에 추가 g(대한 g 이 같은 lobal 교체) 매개 변수를 :

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > <filename>.sql

(당신이 GUI 도구를 설치 한 경우에만 작동합니다 mysqldump --skip-auto-increment)

댓글 덕분에 새로운 업데이트.

\b쓸모가 때로는 명령을 중단합니다. 설명 은이 SO 주제 를 참조하십시오 . 따라서 최적화 된 대답은 다음과 같습니다.

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql

11
나는 이것이 --skip-auto-increment진정한 선택 이라고 생각하지 않는다 . 문서 에서 찾을 수 없습니다 . 이 문제에 대한 두 MySQL 버그는 20786 , 30957 입니다. 이 옵션이있는 mysqldump 버전은 무엇입니까?
Rich

1
--skip-auto-increment올바르게 기억한다면 MySQL GUI 도구에 추가 된 옵션입니다. (확실하지 않아요 ^^) 사실 정말 해결책이 아닙니다! 그러나 두 번째 인라인 명령은 정확합니다. 여기 에서 자동 증가 문제 에 대해 이야기하고 sed필터링에 대한 아이디어를 제공하는 주제를 여기 에서 찾았습니다 !
JoDev

4
Sed 옵션은 여러 테이블을 내보내는 경우 모든 자동 증분을 제거하지 않고 마지막 테이블 만 제거합니다. 또한 --skip-auto-increment는 기존 옵션이 아닙니다. 이 답변은 어떻게 그렇게 높은 평가를 받았습니까?
Lex

3
sed 명령 끝에 ag가 필요합니다. sed 's /.../.../ g'모든 항목을 대체합니다.
p91paul

이 명령은 올바르지 않습니다. --skip-auto-increment가 존재하지 않습니다. 정규식이 올바르지 않습니다. p91paul이 언급했듯이 모든 발생을 대체하려면 g 수정자를 추가해야합니다. 대신 @JohnW 솔루션을 사용하십시오.
Aalex Gabi

52

JoDev의 대답은 sed 정규식을 약간 조정하여 완벽하게 작동했습니다.

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql

1
\b, sed 문 내에서 이것이 무엇을하는지 잘 모르겠지만 @JohnW의 제안에 따라 해당 스위치를 제거하면 나에게도 트릭이 있습니다.
David

4

기본적으로 --opt에 포함되어 AUTO_INCREMENT 테이블 정의를 생성하는 --create-options입니다.

기본 테이블 만 원하는 경우

mysql -hlocalhost -uuser -ppass --skip-column-names --batch \
    -e "select table_name from tables where table_type = 'BASE TABLE' and table_schema = 'schemaname'" INFORMATION_SCHEMA \
| xargs mysqldump -hlocalhost -uuser -ppass \
    --no-data --skip-triggers --skip-opt --no-create-db \
    schemaname

뷰, 트리거 및 루틴도 원한다면

mysqldump -hlocalhost -uuser -ppass \
    --skip-opt --events --routines --no-data \
    schemaname

3
이것은 또한 자동 증가 필드, drop tables, 문자 세트 등을 삭제합니다 .
Deanna

2

이 게시물 덕분에 내 질문에 답할 수있었습니다.

DB에서 버전 관리를 어떻게 할 수 있습니까?

그런 다음 방금이 스크립트를 만들었습니다. db_bkp.sh

#!/bin/sh
filename="db_structure.sql"
backupfolder="/var/www/"
fpath="$backupfolder/$filename"
usr="DBUSER"
pass="DBPASS"
db="DBNAME"
mysqldump --user=$usr --password=$pass --no-data $db | sed 's/ AUTO_INCREMENT=[0-9]*//g' > "$fpath"

그런 다음 이것을 crontab에 추가했습니다.

30 5 * * * sh /home/scripts/db_bkp.sh

그런 다음 내 저장소에서 결과 db_structure.sql를 git에 추가하고 변경 사항을 prod로 푸시하기 전에 항상 모든 db에서 수행하는 것을 잊은 구조적 변경 사항이 있는지 확인합니다.


-1

mysqldump -u [사용자] -p [비밀번호] -d --skip-opt-단일 트랜잭션 [DB_SCHEMA]> [FILE.ESTENSIONE]


6
이렇게하면 마지막에있는 auto_increment 값뿐만 아니라 활성화 된 필드에서 auto_increment 플래그도 제거됩니다.
Aquarion

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