전체 mysql mysqldump 파일에서 단일 테이블을 복원 할 수 있습니까?


194

약 440 megs의 모든 테이블로 구성된 mysql 데이터베이스의 mysqldump 백업이 있습니다. mysqldump에서 테이블 중 하나의 내용을 복원하고 싶습니다. 이게 가능해? 이론적으로 원하는 테이블을 다시 작성하는 섹션을 잘라낼 수는 있지만 해당 크기의 텍스트 문서를 효과적으로 편집하는 방법조차 모릅니다.


2
FWIW, 당신은 또한 mydumper 를 사용할 수 있습니다 . 이것은 mysqldump와 같은 논리적 덤프를 생성하지만 테이블 당 별도의 파일을 출력하며 덤프 및 로딩 멀티 스레드를 모두 수행 할 수 있으므로 시간이 덜 걸립니다.
Bill Karwin

답변:


290

원하는 테이블 만 추출하기 위해 sed를 사용할 수 있습니다.

테이블 이름이 mytablemysql.dump 파일에 거대한 덤프가 들어있는 파일 이라고 가정 해 보겠습니다 .

$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump

이 파일에 복사합니다 mytable.dump사이에 위치 무엇을 CREATE TABLE mytable하고 다음 CREATE TABLE다음 표에 해당.

그런 다음 mytable.dump테이블 구조가 포함 된 파일 mytable과 데이터 (목록 INSERT) 를 조정할 수 있습니다 .


5
CREATE TABLE도 처리하기 때문에 내 대답보다 훨씬 좋지만 "thisismytabletoo"라는 다른 테이블을 얻지 않도록 백 따옴표로 검색해야합니다.
JCCyC

1
진실. 모든 mysql 덤프의 테이블 이름이 항상 역 따옴표로 묶여 있는지 또는 "CREATE TABLE mytable"도 가능한지 확실하지 않습니다. 덤프가 어떻게 생겼는지 알면 첫 정규 표현식을 쉽게 적용 할 수 있습니다. 두 번째 문제점은 mytable 테이블이 고유하지 않은 경우 (데이터베이스 db1에 있고 다른 하나는 데이터베이스 db2에있는 것) 일 수 있습니다. 둘 다 mytable.dump 파일로 내보내집니다. 테이블이 고유하지 않은 경우 먼저 올바른 데이터베이스 만 추출하기 위해 CREATE DATABASE와 동일한 sed 명령을 사용할 수 있습니다. 그런 다음 CREATE TABLE과 함께 sed 명령을 사용하십시오.
uloBasEI 2016 년

13
단! DROP TABLE을 맨 위에 추가하고 파일 맨 아래에서 DROP TABLE [다음 테이블]을 제거해야합니다.
Nathan

20
DROP TABLE을 추가 / 제거하지 않으려면 Table structure for tableCREATE TABLE이 아닌 주석 으로 일치시키는 것이 더 유용합니다 . 이렇게하면 DROP TABLE 문을 제거하는 것을 잊어 버린 경우 다음 테이블이 삭제되지 않고 단일 명령 테이블 복원 (gzip | sed | mysql)을위한 파이핑이 허용됩니다. 그러나이 솔루션은 mysqldump 주석 구문에 의존합니다 (표준이 무엇인지 모르겠습니다).
Olexa

12
Olexa의 수정으로 완벽 : SED -n -e '에 대한 / 테이블 구조 *`MYTABLE /, / 테이블 구조 / P.'whole.sql> mytable.sql
deeenes

120

uloBasEI의 sed 명령의 수정 된 버전을 사용했습니다. 여기에는 이전 DROP 명령이 포함되며 mysql이 테이블에 데이터 덤프를 완료 할 때까지 읽습니다 (UNLOCK). wp_users 를 여러 Wordpress 사이트로 가져 오기 위해 다시 일했습니다 .

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql

3
이것은 실제로 위의 답변으로 선택한 솔루션보다 훨씬 나은 솔루션입니다. 더 많은지지를 얻지 못했다는 것을 믿을 수 없습니다.
rICh 2016 년

9
필자의 경우와 같이 `mytable`테이블 mytable2과 일치하는 것을 피하기 위해 테이블 이름에 최소한 백틱 따옴표를 추가하는 것이 좋습니다 .
bartekbrak

3
방금 내 엉덩이를
구했어

1
@ user706420 흠, 터미널이 비난받지 않았다고 확신하십니까? sed인코딩을 방해해서는 안됩니다 ...
bryn

6
SQL을 가진 사람들을 위해 파일을하지 포함 된 DROP TABLE(이 없었다 내 MySQL의 덤프)를 사용할 수 있습니다 : sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql 이 차종은 MySQL의 덤프 각 테이블 전에 제공되는 테이블 주석의 사용 및 보장하지만 라인은 같은 /*!40101 SET @saved_cs_client = @@character_set_client */;포함 얻을.
hamx0r

50

이것은 더 쉽게 할 수 있습니까? 이것이 내가 한 방법입니다.

임시 데이터베이스를 작성하십시오 (예 : 복원).

mysqladmin -u root -p 복원 생성

임시 데이터베이스에서 전체 덤프를 복원하십시오.

mysql -u 루트 -p 복원 <fulldump.sql

복구하려는 테이블을 덤프하십시오.

mysqldump 복원 mytable> mytable.sql

다른 데이터베이스에서 테이블을 가져 오십시오.

mysql -u 루트 -p 데이터베이스 <mytable.sql


2
이것이 대부분의 사람들이 필요로하는 것입니다.
sjas

2
이 편집 제안 에 따르면 "--one-database"매개 변수를 추가하여 하나의 데이터베이스 만 복원하고 다른 데이터베이스는 모두 파괴하지 않아야합니다.
SL 바스-복원 모니카

7
정말 큰 db의 경우 매우 이상 할 수 있습니다-100MB의 한 테이블에 150GB의 데이터를 복원하십시오.
Enyby

방금 "-하나의 데이터베이스"없이 이것을 실행했지만 여전히 테이블을 잘 병합했습니다. 기존 테이블을 제거하지 않았습니다.
Qasim

1
아주 나쁜 연습! 덤프에 DB가 거의 없었으며 하나만 복원하려고 시도했지만 나머지는 모두 삭제했습니다.
AndreyP

11

간단한 해결책은 별도로 복원하려는 테이블의 덤프를 작성하는 것입니다. mysqldump 명령을 사용하여 다음 구문으로 수행 할 수 있습니다.

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql

그런 다음 정상적으로 가져 오면 덤프 된 테이블 만 가져옵니다.


9

어떤 식 으로든 그렇게하는 모든 프로세스는 덤프의 전체 텍스트를 거쳐 어떤 방식 으로든 구문 분석해야합니다. 난 그냥 grep 것

INSERT INTO `the_table_i_want`

그리고 출력을 mysql에 파이프하십시오. INSERT가 올바른 방법인지 확인하기 위해 덤프의 첫 번째 테이블을 살펴보십시오.

편집 : 좋아, 이번에는 포맷을했습니다.


나는 그것을 잡는 것을 즉시 생각하지 않는 것에 대해 바보입니다. Grep은 매일 베이컨을 저장합니다. 다른 두 제안은 또한 뱅업 제안과 grep을 사용할 수있는 놀라운 일없이 내가했을 것입니다. 다들 감사 해요!
Mobius

6
grep을 좋아한다고 생각되면 awk를 배우면 행복한 성 노예가 될 것입니다. en.wikipedia.org/wiki/Awk
JCCyC

7

@bryn 명령을 시도해야하지만`구분 기호를 사용하면 접두사 또는 접미사가있는 테이블을 추출합니다. 이것은 내가 일반적으로하는 일입니다.

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql

또한 테스트 목적으로 가져 오기 전에 테이블 이름을 변경할 수 있습니다.

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql

가져 오려면 mysql 명령을 사용하십시오.

mysql -u root -p'password' mydatabase < mytable_restore.sql

6
  1. 지원

    $ mysqldump -A | gzip > mysqldump-A.gz
  2. 단일 테이블 복원

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME

4

이를 처리 할 수있는 한 가지 방법은 임시 데이터베이스로 복원하고 임시 데이터베이스에서 해당 테이블 만 덤프하는 것입니다. 그런 다음 새 스크립트를 사용하십시오.



3
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

모든 SQL 덤프에 DROP TABLE명령문이 포함되어 있지 않기 때문에 위의 다른 것보다 더 나은 솔루션 입니다. 이것은 모든 종류의 덤프에서 작동합니다.


2

이것도 도움이 될 수 있습니다.

# mysqldump -u root -p database0 > /tmp/database0.sql
# mysql -u root -p -e 'create database database0_bkp'
# mysql -u root -p database0_bkp < /tmp/database0.sql
# mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want'

2

테이블은 덤프와 데이터베이스 모두에서 동일한 구조로 존재해야합니다.

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

또는

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`

1

대부분의 최신 텍스트 편집기는 시스템이 최대 인 경우 해당 크기의 텍스트 파일을 처리 할 수 ​​있어야합니다.

어쨌든, 나는 한 번 매우 빨리해야했고 도구를 찾을 시간이 없었습니다. 새 MySQL 인스턴스를 설정하고 전체 백업을 가져온 다음 원하는 테이블 만 뱉었습니다.

그런 다음 해당 테이블을 기본 데이터베이스로 가져 왔습니다.

지루하지만 다소 쉬웠다. 행운을 빕니다.


1

vi 편집기를 사용할 수 있습니다. 유형:

vi -o mysql.dump mytable.dump

전체 덤프 mysql.dump와 새 파일을 모두 엽니 다 mytable.dump. 를 눌러 적절한 삽입 줄을 /찾은 다음 문구를 입력하십시오 (예 : "insert into`mytable`"). 그리고를 사용하여 해당 줄을 복사하십시오 yy. ctrl+w그런 다음 다음 파일로 전환 down arrow key하고로 복사 한 행을 붙여 넣습니다 pp. 마지막으로를 입력 :wq하고 vi 편집기를 사용하여 새 파일을 저장하십시오 :q.

참고 여러 삽입을 사용하여 데이터를 덤프 한 경우 사용 한 번에 (양키) 모두를 복사 할 수 Nyy있는 N복사 할 행의 수입니다.

920MB 크기의 파일로 작업했습니다.


0

Notepad ++ 또는 Vim과 같은 적절한 텍스트 편집기를 사용하십시오 (이미 능숙한 경우). 테이블 이름을 검색하면 해당 테이블의 CREATE, ALTER 및 INSERT 명령 만 강조 표시 할 수 있습니다. 마우스보다는 키보드로 탐색하는 것이 더 쉬울 수 있습니다. 그리고 전체 파일을 한 번에로드하는 데 문제가 없도록 RAM이 많은 컴퓨터에 있는지 확인하십시오. 필요한 행을 강조 표시하고 복사 한 후에는 복사 된 부분 만 자체 백업 파일에 백업 한 다음 MySQL로 가져 오는 것이 좋습니다.


1
이것은 실제로 초보자도 이해할 수 있고 이해하기 쉽습니다. 왜 이것이 다운 보트인지 모르겠습니다.
Karl Johan Vallner

0

"테이블에 대한 테이블 구조 my_table"및 "테이블에 대한 덤프 데이터" 를 사용하여 SQL 청크가 차단됩니다 my_table.

다음과 같이 Windows 명령 행을 사용하여 다양한 섹션의 행 번호를 얻을 수 있습니다. 필요에 따라 검색된 문자열을 조정하십시오.

sql.txt / n "테이블`"찾기

다음이 반환됩니다 :

---------- SQL.TXT

[4384]-테이블의 테이블 구조 my_table

[4500]-테이블에 대한 데이터 덤프 my_table

[4514]-테이블의 테이블 구조 some_other_table

... 등

그러면 필요한 줄 번호를 얻을 수 있습니다. 이제는 사용법 만 알면 조사 중입니다.


0

'08 년으로 돌아가서 나는 이것을해야했다. 나는 그것을 할 Perl 스크립트를 썼다. 그리고 그것은 나의 선택의 방법이다. 또한 awk에서 수행하는 방법이나 다른 곳에서 복원하고 추출하는 방법을 요약했습니다. 최근 에이 sed 메소드를 목록에 추가했습니다. 스크립트 및 기타 방법은 여기에서 찾을 수 있습니다. http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html



0

앞에서 언급 한 'sed'솔루션은 훌륭하지만 100 % 안전하지는 않습니다.

  • ... CREATE TABLE ... (무엇이든) ... mytable ...을 포함하는 데이터가 포함 된 INSERT 명령이있을 수 있습니다.

  • 또는 심지어 정확한 문자열 "CREATE TABLE`mytable`;" 예를 들어 DML 명령을 저장하는 경우!

(그리고 테이블이 크면 수동으로 확인하고 싶지 않습니다)

사용 된 덤프 버전의 정확한 구문을 확인하고보다 제한적인 패턴 검색을 수행합니다.

". *"를 피하고 "^"를 사용하여 줄의 시작 부분을 시작하십시오. 그리고 초기 'DROP'을 잡고 싶습니다.

대체로 이것은 나를 위해 더 잘 작동합니다.

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.