Programing

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

crosscheck 2020. 10. 31. 09:22
반응형

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


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

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

bak_테이블을 삭제하는 것은 쉽지만 먼저 '베이킹'하고 싶습니다 (내가 거기에서 무엇을했는지 보시겠습니까?). 내 마음 속에 다음과 같은 명령을 상상할 수 있습니다.

mysqldump -u username -p mydatabase bak_*

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

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


명령 줄에서 테이블 이름을 차례로 지정할 수 있지만 와일드 카드는 사용할 수 없습니다. 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 {}"

다음은 쉬운 방법입니다.

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

내가 좋아하는 것:

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

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


다른 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

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

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 %와 같은 마스크로 테이블 덤프를 단일 파일 로 만들었습니다 . 누군가가 유용하다고 생각하기를 바랍니다.


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

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


여기에 다른 멋진 답변 중 일부를 기반으로 쉘 스크립트를 작성하여 더 쉽게 만들었습니다. 이 스크립트는 출력에 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

내 솔루션 :

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'`

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

참고 URL : https://stackoverflow.com/questions/5268936/mysqldump-only-tables-with-certain-prefix-mysqldump-wildcards

반응형