programing

Mysqldump는 특정 접두사를 가진 테이블만 / Mysqldump 와일드카드입니까?

yoursource 2022. 9. 30. 09:52
반응형

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

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

이것은 나에게 효과가 있다.

mysqldump -u USER -p DATABASE $(mysql -u USER -p -D DATABASE -Bse "show tables like 'PREFIX%'") > /tmp/DATABASE.sql

테이블 이름 목록을 추출할 다른 onelinermysql -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, cf your 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%와 같은 마스크를 사용해 1개의 파일에 테이블 덤프를 작성했다.누군가 유용하게 써주길 바라.

MySQL 5.7에서는mysqlpump도구는 패턴을 사용한 테이블 이름 필터링을 지원합니다.

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

여기 있는 다른 좋은 답변들을 바탕으로 셸 스크립트를 작성했습니다.이 스크립트는 출력에 3개의 파일을 생성합니다.하나는 모든 테이블에 대한 구조, 하나는 제외되지 않은 모든 테이블에 대한 데이터, 이제1개는 모든 "제외된" 테이블에 대한 데이터입니다(꼭 필요하지 않은 경우 코멘트 처리 가능).그런 다음 필요한 것을 사용할 수 있습니다.

#!/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 'show tables like "PREFIX%"' | grep -v Tables_in | xargs mysqldump DATABASE -u USERNAME -p > DUMP.sql

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

반응형