이 거대하고 지저분한 데이터베이스를 정리하고 있습니다. 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