특정 접두사 / 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
'Programing' 카테고리의 다른 글
"예쁜"디렉토리 트리를 만들기위한 ASCII 라이브러리? (0) | 2020.10.31 |
---|---|
반복자를 사용하는 방법? (0) | 2020.10.31 |
읽기 전용 파일은 어떻게 삭제합니까? (0) | 2020.10.31 |
PHP에서 ++ $ i와 $ i ++의 차이점은 무엇입니까? (0) | 2020.10.31 |
IEnumerable을 일괄 적으로 반복하는 방법 (0) | 2020.10.31 |