약 440 megs의 모든 테이블로 구성된 mysql 데이터베이스의 mysqldump 백업이 있습니다. mysqldump에서 테이블 중 하나의 내용을 복원하고 싶습니다. 이게 가능해? 이론적으로 원하는 테이블을 다시 작성하는 섹션을 잘라낼 수는 있지만 해당 크기의 텍스트 문서를 효과적으로 편집하는 방법조차 모릅니다.
약 440 megs의 모든 테이블로 구성된 mysql 데이터베이스의 mysqldump 백업이 있습니다. mysqldump에서 테이블 중 하나의 내용을 복원하고 싶습니다. 이게 가능해? 이론적으로 원하는 테이블을 다시 작성하는 섹션을 잘라낼 수는 있지만 해당 크기의 텍스트 문서를 효과적으로 편집하는 방법조차 모릅니다.
답변:
원하는 테이블 만 추출하기 위해 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.dump
테이블 구조가 포함 된 파일 mytable
과 데이터 (목록 INSERT
) 를 조정할 수 있습니다 .
Table structure for table
CREATE TABLE이 아닌 주석 으로 일치시키는 것이 더 유용합니다 . 이렇게하면 DROP TABLE 문을 제거하는 것을 잊어 버린 경우 다음 테이블이 삭제되지 않고 단일 명령 테이블 복원 (gzip | sed | mysql)을위한 파이핑이 허용됩니다. 그러나이 솔루션은 mysqldump 주석 구문에 의존합니다 (표준이 무엇인지 모르겠습니다).
uloBasEI의 sed 명령의 수정 된 버전을 사용했습니다. 여기에는 이전 DROP 명령이 포함되며 mysql이 테이블에 데이터 덤프를 완료 할 때까지 읽습니다 (UNLOCK). wp_users 를 여러 Wordpress 사이트로 가져 오기 위해 다시 일했습니다 .
sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
`mytable`
테이블 mytable2
과 일치하는 것을 피하기 위해 테이블 이름에 최소한 백틱 따옴표를 추가하는 것이 좋습니다 .
sed
인코딩을 방해해서는 안됩니다 ...
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 */;
포함 얻을.
이것은 더 쉽게 할 수 있습니까? 이것이 내가 한 방법입니다.
임시 데이터베이스를 작성하십시오 (예 : 복원).
mysqladmin -u root -p 복원 생성
임시 데이터베이스에서 전체 덤프를 복원하십시오.
mysql -u 루트 -p 복원 <fulldump.sql
복구하려는 테이블을 덤프하십시오.
mysqldump 복원 mytable> mytable.sql
다른 데이터베이스에서 테이블을 가져 오십시오.
mysql -u 루트 -p 데이터베이스 <mytable.sql
어떤 식 으로든 그렇게하는 모든 프로세스는 덤프의 전체 텍스트를 거쳐 어떤 방식 으로든 구문 분석해야합니다. 난 그냥 grep 것
INSERT INTO `the_table_i_want`
그리고 출력을 mysql에 파이프하십시오. INSERT가 올바른 방법인지 확인하기 위해 덤프의 첫 번째 테이블을 살펴보십시오.
편집 : 좋아, 이번에는 포맷을했습니다.
@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
이 도구는 원하는 도구 일 수 있습니다. 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
이것도 도움이 될 수 있습니다.
# 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'
대부분의 최신 텍스트 편집기는 시스템이 최대 인 경우 해당 크기의 텍스트 파일을 처리 할 수 있어야합니다.
어쨌든, 나는 한 번 매우 빨리해야했고 도구를 찾을 시간이 없었습니다. 새 MySQL 인스턴스를 설정하고 전체 백업을 가져온 다음 원하는 테이블 만 뱉었습니다.
그런 다음 해당 테이블을 기본 데이터베이스로 가져 왔습니다.
지루하지만 다소 쉬웠다. 행운을 빕니다.
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 크기의 파일로 작업했습니다.
Notepad ++ 또는 Vim과 같은 적절한 텍스트 편집기를 사용하십시오 (이미 능숙한 경우). 테이블 이름을 검색하면 해당 테이블의 CREATE, ALTER 및 INSERT 명령 만 강조 표시 할 수 있습니다. 마우스보다는 키보드로 탐색하는 것이 더 쉬울 수 있습니다. 그리고 전체 파일을 한 번에로드하는 데 문제가 없도록 RAM이 많은 컴퓨터에 있는지 확인하십시오. 필요한 행을 강조 표시하고 복사 한 후에는 복사 된 부분 만 자체 백업 파일에 백업 한 다음 MySQL로 가져 오는 것이 좋습니다.
"테이블에 대한 테이블 구조 my_table
"및 "테이블에 대한 덤프 데이터" 를 사용하여 SQL 청크가 차단됩니다 my_table
.
다음과 같이 Windows 명령 행을 사용하여 다양한 섹션의 행 번호를 얻을 수 있습니다. 필요에 따라 검색된 문자열을 조정하십시오.
sql.txt / n "테이블`"찾기
다음이 반환됩니다 :
---------- SQL.TXT
[4384]-테이블의 테이블 구조 my_table
[4500]-테이블에 대한 데이터 덤프 my_table
[4514]-테이블의 테이블 구조 some_other_table
... 등
그러면 필요한 줄 번호를 얻을 수 있습니다. 이제는 사용법 만 알면 조사 중입니다.
'08 년으로 돌아가서 나는 이것을해야했다. 나는 그것을 할 Perl 스크립트를 썼다. 그리고 그것은 나의 선택의 방법이다. 또한 awk에서 수행하는 방법이나 다른 곳에서 복원하고 추출하는 방법을 요약했습니다. 최근 에이 sed 메소드를 목록에 추가했습니다. 스크립트 및 기타 방법은 여기에서 찾을 수 있습니다. http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html
나는 매우 느린 몇 가지 옵션을 시도했다. 몇 분 안에 360GB 덤프가 테이블로 분할되었습니다.
앞에서 언급 한 '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