특정 접두사 / Mysqldump 와일드 카드가있는 테이블 만 Mysqldump?


84

이 거대하고 지저분한 데이터베이스를 정리하고 있습니다. Magento Enterprise와 Joomla를 단일 DB에 결합한 결과 인 500 개 이상의 테이블이 있습니다.

설상가상으로, 전혀 사용되지 않는 70 개 이상의 Joomla 테이블 세트가 있습니다. 모두 접두사가 붙습니다 bak_.

bak_테이블을 삭제하는 것은 쉬울 것이지만 먼저 테이블을 '적용'하고 싶습니다. 내 마음에 다음과 같은 명령을 상상할 수 있습니다.

mysqldump -u username -p mydatabase bak_*

그러나 이것은 작동하지 않습니다. 이를 수행하는 가장 좋은 방법은 무엇입니까? 감사!

편집 : 예, 포함 할 70 개 테이블 또는 제외 할 ~ 430 개 테이블을 명시 적으로 나열 할 수 있지만 가능하면 더 나은 방법을 찾고 있습니다.


대답은 쿼리로 해당 테이블을 선택하고 mysqldump로 해당 쿼리를 전달하는 것입니다. mysqldump는 정규식을 지원하지 않기 때문입니다. 행운을 빌어 요
Daric

1
귀하의 질문에 대한 답은 다음과 같습니다. stackoverflow.com/questions/2949330/…
raghu

@minaz의 답변은 현재 최고로 표시된 답변보다 분명히 낫습니다. 물론 동의한다면 더 나은 것으로 표시하는 데 도움이 될 것입니다.
Dan Dascalescu 2012 년

답변:


121

명령 줄에서 테이블 이름을 차례로 지정할 수 있지만 와일드 카드는 사용할 수 없습니다. mysqldump databasename table1 table2 table3

--ignore-table더 짧은 경우 에도 사용할 수 있습니다 .

또 다른 아이디어는 테이블을 다음과 같은 파일로 가져 오는 것입니다.

mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'bak_%'" > tables.txt 

파일을 편집하고 모든 데이터베이스를 한 줄로 가져옵니다. 그런 다음

mysqldump dbname `cat tables.txt` > dump_file.sql

한 줄로 테이블을 삭제하려면 (권장되지 않음) 다음을 수행 할 수 있습니다.

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"

4
그러나 어느 쪽이든 무시할 테이블 70 개 또는 포함 할 테이블 430 개를 나열해야합니다. 이것이 제가하지 않으려 고하는 것입니다. 나는 내 질문에 대해 더 명확해야했지만 대답에 감사드립니다. 이 작업, 예;)
thaddeusmt 2011 년

1
또 다른 아이디어는 파일 mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txt편집 과 같은 파일로 테이블을 가져 오고 모든 데이터베이스를 한 줄에 가져 오는 것입니다. 그리고 할mysqldump dbname `cat tables.txt`
sreimer

결국 bak_ 테이블을 삭제했지만 여전히 이것을 사용하여 테이블 목록을 가져 왔습니다. 그런 다음 큰 DROP TABLE 문을 만들기 위해 쉼표와 함께 이들을 꾸몄습니다 gawk '{print $1"," }' tables.txt > baktables.sql. 감사!
thaddeusmt

한 줄로 할 수있는 방법은 없나요? 즉 : 임시 파일을 중개자로 사용하지 않고?
Tom Auger 2011 년

3
이 그것을 할 것입니다mysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
sreimer

59

다음은 쉬운 방법입니다.

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]

4
그것은해야 show tables like "<prefix>\_%"하기 때문에 _또한 와일드 카드 이스케이프해야한다, 그렇지 않으면 당신은 bak_ 및 bak2_ 같은 같은 접두사 접두사가 테이블에 문제가 얻을 수 ... 것에 모두 일치bak_%
reox

5
-N을 전달할 수 있으며 행 을 필터링하기 위해 mysql를 실행할 필요가 없습니다 . grepTables_in
Dan Dascalescu 2012 년

1
나를 위해 일했지만 mysql -NB를 사용했습니다.
wesamly

show tables like "bak\_%"아무것도 반환하지 않으면 모든 데이터베이스가 덤프됩니다. 이것을 막을 방법이 있습니까?
Seb33300

57

내가 좋아하는 것:

mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql

모든 답변은 거의 동일한 접근 방식을 취하지 만 가장 간결한 구문입니다.


11
궁금해하는 사람들을 위해,이 플래그 -B 배치 -s 자동 모드 (이하 출력) 실행 -e 있습니다 dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html
JSH

나는 이것을 사랑한다. 이 스 니펫을 잡기 위해 여러 번 여기로 돌아 왔습니다!
Jason Galuten

약간의 문제 : mysqldump 및 mysql 명령 모두에 대해 사용자 이름 및 암호 매개 변수를 입력해야 할 수 있습니다. 그리고 mysql 호출이 실패하면 mysqldump는 기본적으로 전체 데이터베이스를 덤프합니다. 이는 특히 데이터의 하위 집합 만 덤프하려는 경우 매우 클 수 있습니다.
gwideman 19

이 작동하지 않습니다mysql -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" -N -e 'show databases like "auth\_%"' | xargs mysqldump -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" > test
cloudbud

2

다른 oneliner로 테이블 이름 목록을 추출한 mysql -sN …다음 "for… in…"쉘 루프에서 각 항목을 사용하여 삭제합니다.

for f in `mysql dbname -sN -e "SHOW TABLES LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

또는 (확장 버전)

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

또는 테이블 이름이 충분히 짧은 경우 "group_concat"을 사용하여 * 테이블 이름을 연결합니다.

tables=`mysql dbname -srN -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ',') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'  AND TABLE_NAME LIKE 'bak\_%' "`; mysql dbname -rsN -e "DROP TABLE $tables"

* "group_concat_max_len"값과 같은 일부 제한 (일반적으로 1024와 같음, 70 개의 테이블 참조)이 방해를받을 수 있습니다.


동일한 원칙이지만 "bak_"로 시작하는 테이블을 제외한 모든 테이블을 덤프합니다.

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND NOT(TABLE_NAME LIKE 'bak\_%') "` ; do mysqldump -u [u] -p dbname "$f" >> dump_dbname.sql; done

2

이미 많은 좋은 답변이 있지만 여기에는 이러한 변형이 있습니다.

mysql MY_DATABASE -N -u MY_MYSQLUSER -p -e 'show tables like "%MY_LIKE_CODE%";' |
xargs mysqldump MY_DATABASE -u MY_MYSQLUSER -p |
gzip > ~/backup/`date +%Y%m%d:::%H:%M:%S-MY_DAMP.sql.gz`

이 작업으로 데이터베이스에서 % mask %와 같은 마스크로 테이블 덤프를 단일 파일 로 만들었습니다 . 누군가가 유용하다고 생각하기를 바랍니다.


2

MySQL 5.7부터이 mysqlpump도구는 패턴이있는 테이블 이름 필터링을 지원합니다.

반쯤 구운 도구이므로 필요한 기능을 지원하고 올바르게 수행하는지 확인해야합니다 (예 : MySQL 5.7.12부터 트리거 내보내기가 중단됨).


3
"mysqlpump"는 오타가 아닙니다. dev.mysql.com/doc/refman/5.7/en/mysqlpump.html . 예, --include-tables abc % 옵션을 사용하면 와일드 카드를 사용하여 덤프 할 테이블을 지정할 수 있습니다. 그러나 mysqlpump가 뷰를 제외하도록 할 방법이없는 것 같습니다. 네, 실제로 반쯤 구운 것입니다.
gwideman

1

여기에 다른 멋진 답변 중 일부를 기반으로 쉘 스크립트를 작성하여 더 쉽게 만들었습니다. 이 스크립트는 출력에 3 개의 파일을 생성합니다. 하나는 모든 테이블에 대한 구조, 하나는 모든 제외되지 않은 테이블에 대한 데이터를 포함하고 다른 하나는 모든 "제외 된"테이블에 대한 데이터를 포함합니다. t 필요). 그런 다음 필요한 것을 사용할 수 있습니다.

#!/bin/bash

echo -n "DB Password: "
read -s PASSWORD

HOST=yourhostname.com
USER=youruser
DATABASE=yourdatabase

MAIN_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES WHERE Tables_in_dashboard NOT LIKE 'bigtable_%';")
STATS_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES LIKE 'bigtable_%';")

echo "Dumping structure..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-data | gzip > structure.sql.gz

echo "Dumping main data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $MAIN_TABLES | gzip > data.sql.gz

echo "Dumping big table data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $STATS_TABLES | gzip > big_table_data.sql.gz

0

내 솔루션 :

mysqldump -u username -p mydatabase `mysql -B --disable-column-names -u username -p mydatabase -e "SHOW TABLES LIKE 'bak\_%'" | sed ':a;N;$!ba;s/\n/ /g'`

0

mysql DATABASE -u USERNAME -p -e ' "PREFIX %"와 같은 테이블 표시'| grep -v Tables_in | xargs mysqldump DATABASE -u 사용자 이름 -p> DUMP.sql

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