it-swarm-ko.tech

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

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

176
Mobius

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

테이블 이름이 mytable이고 mysql.dump 파일이 거대한 덤프를 포함하는 파일이라고 가정 해 봅시다.

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

이것은 mytable.dump 파일과 CREATE TABLE mytable 및 다음 테이블에 해당하는 다음 CREATE TABLE 사이에있는 파일을 복사합니다.

그런 다음 mytable 테이블의 구조와 데이터 (INSERT 목록)를 포함하는 mytable.dump 파일을 조정할 수 있습니다.

262
uloBasEI

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

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

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

임시 데이터베이스를 만듭니다 (예 : 복원).

mysqladmin -u root -p 복원 생성

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

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

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

mysqldump 복원 mytable> mytable.sql

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

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

46
Martijn Kools

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

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

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

12
Brom558

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

INSERT INTO `the_table_i_want`

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

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

9
JCCyC

@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
7
Maxime Biette
  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
    
6
y.tk

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

4
Tim Hoolihan

이 도구는 원하는 도구 일 수 있습니다. tbdba-restore-mysqldump.pl

https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl

예 : 데이터베이스 덤프 파일에서 테이블을 복원하십시오.

tbdba-restore-mysqldump.pl -t yourtable -s yourdb -f backup.sql

3
user1097790

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

`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`
2
Neminath

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

# 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
Pjl
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

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

2
Weston Ganger

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

vi -o mysql.dump mytable.dump

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

다중 삽입을 사용하여 데이터를 덤프 한 경우 Nyy을 사용하여 모든 데이터를 한 번에 복사 (잉크) 할 수 있습니다. 여기서 N은 복사 할 행 수입니다.

920MB 크기의 파일로 처리했습니다.

1
mtoloo

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

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

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

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

1
Bryan Migliorisi

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

  • ... CREATE TABLE ... (무엇이든) ... mytable ...

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

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

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

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

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

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
0
phil_w

"_ my_table 테이블의 테이블 구조"및 "_ my_table 테이블의 덤핑 데이터"를 사용하여 SQL 청크가 차단됩니다.

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

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

다음이 반환됩니다 :

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

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

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

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

... 등.

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

0
Kuyenda

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

0
Cameron

나는 엄청나게 느린 몇 가지 옵션을 시도했다. 몇 분 안에 360GB 덤프가 테이블로 분할되었습니다.

mysqldump의 출력을 작은 파일로 어떻게 분할합니까?

0
Kohjah Breese

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

0
JaredC