programing

데이터베이스를 가져올 때 특정 MySQL 테이블을 무시하는 방법

copysource 2022. 9. 22. 22:48
반응형

데이터베이스를 가져올 때 특정 MySQL 테이블을 무시하는 방법

하나의 데이터베이스와 약 150개의 테이블이 있는 큰 SQL 파일을 가지고 있습니다.사용하고 싶다mysqlimport그러나 데이터베이스를 Import하려면 Import 프로세스를 무시하거나 몇 개의 테이블을 건너뛰어야 합니다.모든 테이블을 가져오지만 일부 테이블을 무시하기 위한 올바른 구문은 무엇입니까?사합니니다다

Random Seed가 승인한 답변은 시간이 오래 걸릴 수 있습니다.테이블을 Import(나중에 드롭하기 위해서만)하는 것은 크기에 따라서는 매우 낭비가 될 수 있습니다.

다음을 사용하여 작성된 파일의 경우

mysqldump -u user -ppasswd --opt --routines DBname > DBdump.sql

현재 약 7GB의 파일을 입수하고 있으며, 그 중 6GB는 필요 없는 로그 테이블용 데이터입니다.이 파일을 새로고침하려면 몇 시간이 걸립니다.새로고침이 필요한 경우(개발 목적으로 또는 라이브 복구에 필요한 경우) 다음과 같이 파일을 스킵합니다.

sed '/INSERT INTO `TABLE_TO_SKIP`/d' DBdump.sql > reduced.sql

새로고침 방법:

mysql -u user -ppasswd DBname < reduced.sql

이렇게 하면 "원하지 않는" 테이블이 생성되었지만 비어 있는 완전한 데이터베이스를 얻을 수 있습니다.테이블이 전혀 필요 없는 경우 로드가 완료된 후 빈 테이블을 드롭하기만 하면 됩니다.

테이블이 여러 개인 경우 다음과 같은 작업을 수행할 수 있습니다.

sed '/INSERT INTO `TABLE1_TO_SKIP`/d' DBdump.sql | \
sed '/INSERT INTO `TABLE2_TO_SKIP`/d' | \
sed '/INSERT INTO `TABLE3_TO_SKIP`/d' > reduced.sql

'gotcha'가 있습니다. 덤프에서 "INSERT IN TABLE"이 포함될 수 있는 절차에 주의하십시오.TO_SKIP"를 클릭합니다.

mysqlimport「SQL Import」를 선택합니다.CSV 위한 입니다.에 직접 합니다.mysql클라이언트는 다음과 같은 명령을 사용합니다.

bash > mysql -D your_database < your_sql_dump.sql

다 아니다.mysql 않다mysqlimport필요한 기능을 제공합니다.가장 좋은 방법은 덤프 전체를 Import한 후 원하지 않는 테이블을 삭제하는 것입니다.

할 수 있는 는, 「」, 「」, 「」를 사용해 새로운 를 작성할 수 .mysqldump --ignore-table=database.table_you_dont_want1 --ignore-table=database.table_you_dont_want2 ....


일부 테이블 가져오기를 건너뛰는 해결 방법은 이 답변을 확인하십시오.

.sql.gz 파일을 사용하는 모든 사용자에게 다음과 같은 솔루션이 매우 유용하다는 것을 알게 되었습니다.데이터베이스가 25GB 이상이어서 로그 테이블을 삭제해야 했습니다.

gzip -cd "./mydb.sql.gz" | sed -r '/INSERT INTO `(log_table_1|log_table_2|log_table_3|log_table_4)`/d' | gzip > "./mydb2.sql.gz"

Don의 답변과 Xosofox의 코멘트 및 이 관련 게시물 덕분에:zcat 및 sed 또는 awk를 사용하여 압축된 .gz 텍스트 파일을 편집합니다.

좀 낡긴 했지만 그래도 도움이 될 것 같아서...

@Don's https://stackoverflow.com/a/26379517/1446005)의 답변은 마음에 들었지만, 먼저 다른 파일에 써야 하는 것이 매우 귀찮았습니다.
특히 제 경우, 이 작업은 시간과 디스크 공간이 너무 많이 소요됩니다.

그래서 나는 작은 bash 대본을 썼다.

#!/bin/bash

tables=(table1_to_skip table2_to_skip ... tableN_to_skip)


tableString=$(printf "|%s" "${tables[@]}")
trimmed=${tableString:1}
grepExp="INSERT INTO \`($trimmed)\`"

zcat $1 | grep -vE "$grepExp" | mysql -uroot -p

그러면 새 SQL 스크립트가 생성되지 않고 데이터베이스에 직접 파이핑됩니다.
또한 테이블은 생성되지만 데이터를 Import하지 않습니다(그것은 큰 로그 테이블에서 문제가 있었습니다).

덤프 중에 테이블을 무시한 적이 없는 한mysqldump --ignore-table=database.unwanted_table덤프 파일에서 Import하지 않는 데이터를 필터링하기 위해 스크립트 또는 도구를 사용해야 합니다.mysql고객.

다음은 불필요한 테이블을 SQL 덤프(통과 파이프)에서 제외하는 bash/sh 함수입니다.

# Accepts one argument, the list of tables to exclude (case-insensitive).
# Eg. filt_exclude '%session% action_log %_cache'
filt_exclude() {
    local excl_tns;
    if [ -n "$1" ]; then
        # trim & replace /[,;\s]+/ with '|' & replace '%' with '[^`]*'
        excl_tns=$(echo "$1" | sed -r 's/^[[:space:]]*//g; s/[[:space:]]*$//g; s/[[:space:]]+/|/g; s/[,;]+/|/g; s/%/[^\`]\*/g');

        grep -viE "(^INSERT INTO \`($excl_tns)\`)|(^DROP TABLE (IF EXISTS )?\`($excl_tns)\`)|^LOCK TABLES \`($excl_tns)\` WRITE" | \
        sed 's/^CREATE TABLE `/CREATE TABLE IF NOT EXISTS `/g'        
    else
        cat
    fi
}

다음과 같은 덤프가 생성되었다고 가정합니다.

MYSQL_PWD="my-pass" mysqldump -u user --hex-blob db_name | \
pigz -9 > dump.sql.gz

또한 가져오기 전에 일부 원하지 않는 테이블을 제외합니다.

pigz -dckq dump.sql.gz | \
filt_exclude '%session% action_log %_cache' | \
MYSQL_PWD="my-pass" mysql -u user db_name

또는 DB로 가져오기 전에 파일이나 다른 도구에 연결할 수 있습니다.

필요에 따라 한 번에 한 테이블씩 수행할 수 있습니다.

mysqldump -p sourceDatabase tableName > tableName.sql
mysql -p -D targetDatabase < tableName.sql

여기 mysql 덤프에서 일부 테이블을 제외하기 위한 스크립트가 있습니다. 주문 및 결제 데이터를 보관해야 할 때 DB를 복원하기 위해 사용합니다.

exclude_from_syslogs.

#!/bin/bash

if [ ! -f "$1" ];
then
    echo "Usage: $0 mysql_dump.sql"
    exit
fi

declare -a TABLES=(
user
order
order_product
order_status
payments
)

CMD="cat $1"
for TBL in "${TABLES[@]}";do
    CMD+="|sed 's/DROP TABLE IF EXISTS \`${TBL}\`/# DROP TABLE IF EXIST \`${TBL}\`/g'"
    CMD+="|sed 's/CREATE TABLE \`${TBL}\`/CREATE TABLE IF NOT EXISTS \`${TBL}\`/g'"
    CMD+="|sed -r '/INSERT INTO \`${TBL}\`/d'"
    CMD+="|sed '/DELIMITER\ \;\;/,/DELIMITER\ \;/d'"
done

eval $CMD

테이블 폐기 및 재작성 및 이 테이블에 데이터 삽입을 방지합니다.또한 Delimiter ; ;와 Delimiter ; 사이에 저장되어 있는 모든 Functions와 PROCESSURE를 제거합니다.

실가동에서는 사용하지 않지만 작은 테이블이 많이 포함된 백업을 신속하게 Import해야 하는 경우 Import에 몇 시간이 걸릴 수 있는 큰 몬스터 테이블이 하나 있으면 "grep -v wasked_table_name original"이 될 수 있습니다.sql > 축소.sql

다음으로 mysql -f <축소.sql

언급URL : https://stackoverflow.com/questions/16735344/how-to-ignore-certain-mysql-tables-when-importing-a-database

반응형