복붙노트

[SQL] mysqldump를 가진 특정 테이블을 건너 뛰기

SQL

mysqldump를 가진 특정 테이블을 건너 뛰기

mysqldump는 명령에서 특정 테이블을 제한하는 방법이 있나요?

예를 들어, 난 단지 표 1과 표 2를 덤프하려면 다음 구문을 사용하십시오 :

mysqldump -u username -p database table1 table2 > database.sql

그러나 표 1과 표 2를 제외한 모든 테이블을 덤프 유사한 방법은 무엇입니까? 그래서 무차별 대입 (모든 테이블 이름을 지정)를 갈 수있는 유일한 방법은 mysqldump는 문서에서 아무것도 발견하지 않았습니다?

해결법

  1. ==============================

    1.당신은 --ignore-테이블 옵션을 사용할 수 있습니다. 당신이 할 수 있도록

    당신은 --ignore-테이블 옵션을 사용할 수 있습니다. 당신이 할 수 있도록

    mysqldump -u USERNAME -pPASSWORD DATABASE --ignore-table=DATABASE.table1 > database.sql
    

    -p 이후에 공백 (이 오타 아니다)이 없습니다.

    여러 테이블을 무시하려면이 같은 간단한 스크립트를 사용할 수 있습니다

    #!/bin/bash
    PASSWORD=XXXXXX
    HOST=XXXXXX
    USER=XXXXXX
    DATABASE=databasename
    DB_FILE=dump.sql
    EXCLUDED_TABLES=(
    table1
    table2
    table3
    table4
    tableN   
    )
    
    IGNORED_TABLES_STRING=''
    for TABLE in "${EXCLUDED_TABLES[@]}"
    do :
       IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
    done
    
    echo "Dump structure"
    mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} --single-transaction --no-data --routines ${DATABASE} > ${DB_FILE}
    
    echo "Dump content"
    mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info --skip-triggers ${IGNORED_TABLES_STRING} >> ${DB_FILE}
    
  2. ==============================

    2.브라이언 - 피셔 @로부터 답변을 구축하고이 게시물에 대한 일부 사람들의 의견에 응답, 나는 복사 내용을 건너 뛰고 싶었다 그래서 내 데이터베이스에 거대한 (불필요한) 테이블의 무리가 있지만, 구조를 유지 :

    브라이언 - 피셔 @로부터 답변을 구축하고이 게시물에 대한 일부 사람들의 의견에 응답, 나는 복사 내용을 건너 뛰고 싶었다 그래서 내 데이터베이스에 거대한 (불필요한) 테이블의 무리가 있지만, 구조를 유지 :

    mysqldump -h <host> -u <username> -p <schema> --no-data > db-structure.sql
    mysqldump -h <host> -u <username> -p <schema> --no-create-info --ignore-table=schema.table1 --ignore-table=schema.table2 > db-data.sql
    

    지금 그 결과이 개 파일은 구조적으로 소리가되지만 데이터를 덤프 ~ 더 나은 나를 위해 오히려 9기가바이트보다는 5백메가바이트. 지금은 데이터 9기가바이트를 조작 또는 디스크 공간이 부족에 대해 걱정할 필요없이 테스트 목적으로 또 다른 데이터베이스에이 두 파일을 가져올 수 있습니다.

  3. ==============================

    3.다중 데이터베이스 :

    다중 데이터베이스 :

    mysqldump -u user -p --ignore-table=db1.tbl1 --ignore-table=db2.tbl1 --databases db1 db2 ..
    
  4. ==============================

    4.여러 테이블을 무시하는 또 다른 예

    여러 테이블을 무시하는 또 다른 예

    /usr/bin/mysqldump -uUSER -pPASS --ignore-table={db_test.test1,db_test.test3} db_test> db_test.sql
    

    database.table와 같은 syntaxs 들인다 테이블을 이용하여 테이블의 배열을 만들

    --ignore-table={db_test.table1,db_test.table3,db_test.table4}
    

    당신에게 도움이되는 정보와 링크

    압축 출력 mysqldump는

    가져 오기 데이터베이스

     mysql -uUSER  -pPASS db_test < db_test.sql
    

    테이블을 무시하는 간단한 스크립트

    #!/bin/bash
    
    #tables to ignore
    _TIGNORE=(
    my_database.table1
    my_database.table2
    my_database.tablex
    )
    
    #create text for ignore tables
    _TDELIMITED="$(IFS=" "; echo "${_TIGNORE[*]/#/--ignore-table=}")"
    
    #don't forget to include user and password
    /usr/bin/mysqldump -uUSER -pPASSWORD --events ${_TDELIMITED} --databases my_database | gzip -v > backup_database.sql.gz
    
  5. ==============================

    5.테이블 구조를 일부 테이블의 데이터를 제외 있지만합니다. 여기에 내가 그것을 할 방법입니다 :

    테이블 구조를 일부 테이블의 데이터를 제외 있지만합니다. 여기에 내가 그것을 할 방법입니다 :

    데이터없이, 모든 테이블의 데이터베이스 구조를 덤프 :

    mysqldump -u user -p --no-data database > database_structure.sql
    

    그런 다음, 데이터베이스를 덤프 제외 된 테이블을 제외시켰다 및 구조를 덤프하지 않습니다

    mysqldump -u user -p --no-create-info \
        --ignore-table=database.table1 \
        --ignore-table=database.table2 database > database_data.sql
    

    그런 다음, 새 데이터베이스에로드합니다 :

    mysql -u user -p newdatabase < database_structure.sql
    mysql -u user -p newdatabase < database_data.sql
    
  6. ==============================

    6.당신은 함께 mysqlpump 명령을 사용할 수 있습니다

    당신은 함께 mysqlpump 명령을 사용할 수 있습니다

    --exclude-tables=name
    

    명령. 그것은 제외 할 테이블의 쉼표로 구분 된 목록을 지정합니다.

    mysqlpump의 구문, mysqldump는 매우 유사하다 그것의 방법보다 성능이 좋은 꾸물 거리지. 을 사용하는 방법에 대한 자세한 내용은 여기에서 읽을 수있는 옵션을 제외 : https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#mysqlpump-filtering

  7. ==============================

    7.GitHub의에 : https://github.com/rubo77/mysql-backup.sh/blob/master/mysql-backup.sh

    GitHub의에 : https://github.com/rubo77/mysql-backup.sh/blob/master/mysql-backup.sh

    #!/bin/bash
    # mysql-backup.sh
    
    if [ -z "$1" ] ; then
      echo
      echo "ERROR: root password Parameter missing."
      exit
    fi
    DB_host=localhost
    MYSQL_USER=root
    MYSQL_PASS=$1
    MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
    #MYSQL_CONN=""
    
    BACKUP_DIR=/backup/mysql/
    
    mkdir $BACKUP_DIR -p
    
    MYSQLPATH=/var/lib/mysql/
    
    IGNORE="database1.table1, database1.table2, database2.table1,"
    
    # strpos $1 $2 [$3]
    # strpos haystack needle [optional offset of an input string]
    strpos()
    {
        local str=${1}
        local offset=${3}
        if [ -n "${offset}" ]; then
            str=`substr "${str}" ${offset}`
        else
            offset=0
        fi
        str=${str/${2}*/}
        if [ "${#str}" -eq "${#1}" ]; then
            return 0
        fi
        echo $((${#str}+${offset}))
    }
    
    cd $MYSQLPATH
    for i in */; do
        if [ $i != 'performance_schema/' ] ; then 
        DB=`basename "$i"` 
        #echo "backup $DB->$BACKUP_DIR$DB.sql.lzo"
        mysqlcheck "$DB" $MYSQL_CONN --silent --auto-repair >/tmp/tmp_grep_mysql-backup
        grep -E -B1 "note|warning|support|auto_increment|required|locks" /tmp/tmp_grep_mysql-backup>/tmp/tmp_grep_mysql-backup_not
        grep -v "$(cat /tmp/tmp_grep_mysql-backup_not)" /tmp/tmp_grep_mysql-backup
    
        tbl_count=0
        for t in $(mysql -NBA -h $DB_host $MYSQL_CONN -D $DB -e 'show tables') 
        do
          found=$(strpos "$IGNORE" "$DB"."$t,")
          if [ "$found" == "" ] ; then 
            echo "DUMPING TABLE: $DB.$t"
            mysqldump -h $DB_host $MYSQL_CONN $DB $t --events --skip-lock-tables | lzop -3 -f -o $BACKUP_DIR/$DB.$t.sql.lzo
            tbl_count=$(( tbl_count + 1 ))
          fi
        done
        echo "$tbl_count tables dumped from database '$DB' into dir=$BACKUP_DIR"
        fi
    done
    

    https://stackoverflow.com/a/17016410/1069083의 작은 도움으로

    그것은 훨씬 빠릅니다 lzop를 사용, 참조 : HTTP : //pokecraft.first-world.info/wiki/Quick_Benchmark을 : _Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO를

  8. ==============================

    8.나는 바울을 수정하기 전에 Rubo77의 솔루션처럼 나는, 나는 그것을 보지 못했다. 이것은 의지의 백업 당신이 원하지 않는 테이블을 제외하고 단일 데이터베이스. 그런 다음 그것을 gzip을, 8 일 이상 된 모든 파일을 삭제합니다. 아마이 개 전체 (마이너스 로그 테이블)을 수행하는이 버전 하루에 한 번, 또 다른를 사용하는 몇 cron 작업을 사용하여 모든 대부분의 시간을 변경하는 가장 중요한 테이블 위로 바로 백업합니다.

    나는 바울을 수정하기 전에 Rubo77의 솔루션처럼 나는, 나는 그것을 보지 못했다. 이것은 의지의 백업 당신이 원하지 않는 테이블을 제외하고 단일 데이터베이스. 그런 다음 그것을 gzip을, 8 일 이상 된 모든 파일을 삭제합니다. 아마이 개 전체 (마이너스 로그 테이블)을 수행하는이 버전 하루에 한 번, 또 다른를 사용하는 몇 cron 작업을 사용하여 모든 대부분의 시간을 변경하는 가장 중요한 테이블 위로 바로 백업합니다.

    #!/bin/sh
    PASSWORD=XXXX
    HOST=127.0.0.1
    USER=root
    DATABASE=MyFavoriteDB
    
    now="$(date +'%d_%m_%Y_%H_%M')"
    filename="${DATABASE}_db_backup_$now"
    backupfolder="/opt/backups/mysql"
    DB_FILE="$backupfolder/$filename"
    logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt
    
    EXCLUDED_TABLES=(
    logs
    )
    IGNORED_TABLES_STRING=''
    for TABLE in "${EXCLUDED_TABLES[@]}"
    do :
       IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
    done
    
    echo "Dump structure started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
    mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} --single-transaction --no-data --routines ${DATABASE}  > ${DB_FILE} 
    echo "Dump structure finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
    echo "Dump content"
    mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info --skip-triggers ${IGNORED_TABLES_STRING} >> ${DB_FILE}
    gzip ${DB_FILE}
    
    find "$backupfolder" -name ${DATABASE}_db_backup_* -mtime +8 -exec rm {} \;
    echo "old files deleted" >> "$logfile"
    echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
    echo "*****************" >> "$logfile"
    exit 0
    
  9. ==============================

    9.완벽을 위해, 여기에 실제로 한 줄이 모든 의견을 (무시)를 제외한 데이터베이스에서 백업을 얻을 수있는 스크립트입니다. DB를 이름을 직원으로 간주됩니다 :

    완벽을 위해, 여기에 실제로 한 줄이 모든 의견을 (무시)를 제외한 데이터베이스에서 백업을 얻을 수있는 스크립트입니다. DB를 이름을 직원으로 간주됩니다 :

    ignore=$(mysql --login-path=root1 INFORMATION_SCHEMA \
        --skip-column-names --batch \
        -e "select 
              group_concat(
                concat('--ignore-table=', table_schema, '.', table_name) SEPARATOR ' '
              ) 
            from tables 
            where table_type = 'VIEW' and table_schema = 'employees'")
    
    mysqldump --login-path=root1 --column-statistics=0 --no-data employees $ignore > "./backups/som_file.sql"   
    

    당신은 쿼리의 논리를 업데이트 할 수 있습니다. 일반적으로 사용 GROUP_CONCAT에서 당신은 거의 모든 원하는 문자열이나 쉘 명령을 생성 할 수 있습니다 CONCAT.

  10. from https://stackoverflow.com/questions/425158/skip-certain-tables-with-mysqldump by cc-by-sa and MIT license