mysqldump는 와일드 카드로 테이블을 무시한다


8

접두사가있는 약 15 개의 홀수를 제외하려는 50 개의 홀수 테이블이 포함 된 데이터베이스 덤프를 가져와야합니다. exam_

나는 시도 mysqldump --ignore-table=dbname.exam_* 하고 심지어 시도했다 --ignore-table=dbname.exam_% 그것은 예상대로 작동하지 않았다. --ignore-table여러 번 사용해야 했습니다.

편집 : 나는 목록 tables not like tablename_%으로 전달 하는 몇 가지 쉘 스크립트를 보았습니다 mysqldump.

그러나 mysqldump 또는 mysql에 옵션이 있는지 알고 싶습니다. 스크립팅하지 않고도 동일하게 수행 할 수 있습니다.

편집 추가 : 결국 스크립트를 사용하여 테이블을 제외하고 DB를 ignore-table=여러 번 덤프 합니다.


사용한 스크립트를 게시 할 수 있습니까? 어쩌면 그것을 호스트 gist.github.com
rubo77

@ rubo77 : 더 이상 스크립트가 없습니다. 기본 스크립트였습니다. mysql 명령을 사용하여 제외하려는 테이블 목록을 얻었습니다. 필요할 때마다 덤프를 생성하기 위해 목록을 BASH 스크립트로 하드 코딩했습니다. 운 좋게도 목록은 일정했습니다. 또는 여기에 게시 된 솔루션 이 스크립팅과 관련하여 유용 할 수 있습니다.
anup

더 나은 아직도 : TABLES=`mysql --skip-column-names [DB-NAME] -e 'show tables' | grep -v 'exam_'` mysqldump [DB-NAME] $TABLES > mysqldump.sql
anup

답변:


13

문서에서 말한 mysqldump것처럼 명령에는 이와 같은 옵션이 없습니다 .

--ignore-table = db_name.tbl_name


데이터베이스와 테이블 이름 을 모두 사용하여 지정된 테이블을 덤프하지 마십시오 . 여러 테이블을 무시하려면이 옵션을
여러 번 사용하십시오 . 이 옵션을 사용하여 뷰를 무시할 수도 있습니다.


따로, 해당 테이블에 액세스 할 수없는 mysql 덤프 사용자를 작성하고 mysqldump --all-databases오류가 발생했는지 확인하거나 다음 dDB로 건너 뛰는 것이 좋습니다.
NickW

시도하지는 않았지만 소리가 좋습니다. 솔루션에 관해서는 테이블을 피하기 위해 쉘 스크립트를 작성했습니다.
anup

@NickW 작동 할 수도 있습니다. 그러나 유연성을 높이려면 테이블 이름을 얻기 위해 별도의 쿼리를 수행해야합니다. 아래 답변을 참조하십시오.
Buttle Butkus

빠르고 더러운 버전 : 데이터베이스를 제거합니다. phpMyAdmin의 웹 인터페이스를 사용하여 원하지 않는 테이블을 쉽게 삭제하십시오. 그런 다음 덤프하고 와일드 카드가 필요하지 않습니다. CLI 실행을 원하고 세 번째 단계 sitepoint.com/community/t/drop-tables-with-wildcard/18537/4를
TheSatinKnight

3

mysql에서 원하는 테이블 이름을 얻은 다음이를 사용하여 mysql 덤프 매개 변수를 빌드 할 수 있습니다.

아래 예에서 "someprefix"를 접두사 (예 : "exam_")로 바꾸십시오.

SHOW TABLES쿼리는 테이블의 다른 세트를 찾아 변경 될 수 있습니다. 또는 INFORMATION_SCHEMA테이블에 대해 쿼리 를 사용하여 더 많은 기준을 사용할 수 있습니다.

#/bin/bash

#this could be improved but it works
read -p "Mysql username and password" user pass

#specify your database, e.g. "mydb"
DB="mydb"

SQL_STRING='SHOW TABLES LIKE "someprefix%";'
DBS=$(echo $SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#next two lines untested, but intended to add a second excluded table prefix
#ANOTHER_SQL_STRING='SHOW TABLES LIKE "otherprefix%";'
#DBS="$DBS""\n"$(echo $ANOTHER_SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#-B is for batch - tab-separated columns, newlines between rows
#-s is for silent - produce less output
#both result in escaping special characters

#but the following might not work if you have special characters in your table names
IFS=$'\n' read -r -a TABLES <<< $DBS

IGNORE="--ignore_table="$DB"."
IGNORE_TABLES=""

for table in $TABLES; do
        IGNORE_TABLES=$IGNORE_TABLES" --ignore_table="$DB"."$table
done

#Now you have a string in $IGNORE_TABLES like this: "--ignore_table=someprefix1 --ignore_table=someprefix2 ..."

mysqldump $DB --routines -u $user -p$pass $IGNORE_TABLES > specialdump.sql

이것은 "bash를 제외한 모든 테이블"을 얻는 것에 대한이 답변의 도움으로 작성되었습니다. https : //.com/a/9232076/631764

bash를 사용하여 테이블을 건너 뛰는 것에 대한이 답변 : https : //.com/a/425172/631764


선택한 답변을 바탕으로 귀하의 답변과 유사한 스크립트를 작성했습니다. 이것을 올려 주셔서 감사합니다. 편집 : 방금 파이프와 grep 제외 패턴으로 두 개의 명령을 사용했음을 기억했습니다.
anup

0

나는 이것을 사용하는 information_schema것이 좋은 길이 라고 생각 합니다.

select group_concat(concat('--ignore-table=', TABLE_SCHEMA, '.', table_name) SEPARATOR ' ') 
from information_schema.tables 
where TABLE_SCHEMA = 'Actual_DB_NAME' and TABLE_NAME like 'Actual_TABLE_NAME%';
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.