mysqldump의 출력을 더 작은 파일로 분할하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/132902

  •  02-07-2019
  •  | 
  •  

문제

한 MySQL 데이터베이스에서 다른 MySQL 데이터베이스로 전체 테이블을 이동해야 합니다.두 번째 액세스 권한에는 전체 액세스 권한이 없고 phpMyAdmin 액세스 권한만 있습니다.2MB보다 작은 sql 파일만 업로드(압축)할 수 있습니다.그러나 첫 번째 데이터베이스 테이블의 mysqldump에서 압축된 출력은 10MB보다 큽니다.

mysqldump의 출력을 더 작은 파일로 분할하는 방법이 있습니까?원격 서버에 파일을 다시 cat(1)할 수 없기 때문에 Split(1)을 사용할 수 없습니다.

아니면 제가 놓친 또 다른 해결책이 있나요?

편집하다

첫 번째 포스터에서 제안한 mysqldump에 대한 --extended-insert=FALSE 옵션은 분할(1)이 적절한 --lines 옵션과 함께 호출되는 경우 가져오기 가능한 파일로 분할할 수 있는 .sql 파일을 생성합니다.시행착오를 통해 bzip2가 .sql 파일을 20배로 압축한다는 사실을 발견했습니다. 따라서 SQL 코드의 몇 줄이 대략 40MB에 해당하는지 알아내야 했습니다.

도움이 되었습니까?

해결책

먼저 스키마를 덤프하십시오 (반드시 2MB에 맞습니다.

mysqldump -d --all-databases 

복원하십시오.

그 후에는 데이터 만 별도의 삽입 문에 덤프하므로 원격 서버에서 연결하지 않고도 파일을 분할하고 복원 할 수 있습니다.

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE

다른 팁

이 bash 스크립트는 하나의 데이터베이스의 덤프 파일을 각 테이블의 별도 파일과 이름으로 나눕니다. CSPLIT 그리고 그에 따라 이름을 지정합니다.

#!/bin/bash

####
# Split MySQL dump SQL file into one file per table
# based on https://gist.github.com/jasny/1608062
####

#adjust this to your case:
START="/-- Table structure for table/"
# or 
#START="/DROP TABLE IF EXISTS/"


if [ $# -lt 1 ] || [[ $1 == "--help" ]] || [[ $1 == "-h" ]] ; then
        echo "USAGE: extract all tables:"
        echo " $0 DUMP_FILE"
        echo "extract one table:"
        echo " $0 DUMP_FILE [TABLE]"
        exit
fi

if [ $# -ge 2 ] ; then
        #extract one table $2
        csplit -s -ftable $1 "/-- Table structure for table/" "%-- Table structure for table \`$2\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
        #extract all tables
        csplit -s -ftable $1 "$START" {*}
fi

[ $? -eq 0 ] || exit

mv table00 head

FILE=`ls -1 table* | tail -n 1`
if [ $# -ge 2 ] ; then
        mv $FILE foot
else
        csplit -b '%d' -s -f$FILE $FILE "/40103 SET TIME_ZONE=@OLD_TIME_ZONE/" {*}
        mv ${FILE}1 foot
fi

for FILE in `ls -1 table*`; do
        NAME=`head -n1 $FILE | cut -d$'\x60' -f2`
        cat head $FILE foot > "$NAME.sql"
done

rm head foot table*

기반 https://gist.github.com/jasny/1608062
그리고 https://stackoverflow.com/a/16840625/1069083

두 번째 서버에 접근할 수 없다고 하셨습니다.그러나 테이블이 있는 첫 번째 서버에 대한 셸 액세스 권한이 있는 경우 덤프를 테이블별로 분할할 수 있습니다.

for T in `mysql -N -B -e 'show tables from dbname'`; \
   do echo $T; \
   mysqldump [connecting_options] dbname $T \
   | gzip -c > dbname_$T.dump.gz ; \
   done

그러면 각 테이블에 대한 gzip 파일이 생성됩니다.

mysqldump의 출력을 별도의 파일로 분할하는 또 다른 방법은 --tab 옵션을 사용하는 것입니다.

mysqldump [connecting options] --tab=directory_name dbname 

어디 디렉토리_이름 빈 디렉토리의 이름입니다.이 명령은 CREATE TABLE 문을 포함하는 각 테이블에 대한 .sql 파일과 LOAD DATA INFILE을 사용하여 복원할 데이터를 포함하는 .txt 파일을 생성합니다.하지만 phpMyAdmin이 특정 제한 사항에 따라 이러한 파일을 처리할 수 있는지 확실하지 않습니다.

늦은 답장이지만 동일한 솔루션을 찾고 있었고 아래 웹 사이트에서 다음 코드를 발견했습니다.

for I in $(mysql -e 'show databases' -s --skip-column-names); do mysqldump $I | gzip > "$I.sql.gz"; done

http://www.commandlinefu.com/commands/view/2916/backup-all-mysql-databases-to- individual-files

이 훌륭한 것이 있습니다 mysqldumpsplitter mysqldump에서 추출 할 때 수많은 옵션과 함께 제공되는 스크립트.

나는 당신의 케이스를 선택하기 위해 여기에 레시피를 복사 할 것입니다.

1) mysqldump에서 단일 데이터베이스 추출 :

sh mysqldumpsplitter.sh --source filename --extract DB --match_str database-name

위 명령은 지정된 "Filename"SQL 파일에서 지정된 데이터베이스에 대한 SQL을 생성하고 압축 형식으로 데이터베이스 -name.sql.gz에 저장합니다.

2) mysqldump에서 단일 테이블 추출 :

sh mysqldumpsplitter.sh --source filename --extract TABLE --match_str table-name

위 명령은 지정된 "Filename"MySQLDump 파일에서 지정된 테이블에 대한 SQL을 생성하고 압축 형식으로 Database-Name.sql.gz에 저장합니다.

3) mysqldump에서 정규 표현식과 일치하는 테이블 추출 :

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str regular-expression

위의 명령은 지정된 "파일 이름"MySQLDump 파일에서 지정된 정규 표현식과 일치하는 테이블에 대한 SQL을 생성하고이를 압축 형식으로 개별 테이블 -name.sql.gz에 저장합니다.

4) mysqldump에서 모든 데이터베이스를 추출합니다.

sh mysqldumpsplitter.sh --source filename --extract ALLDBS

위의 명령은 지정된 "Filename"MySQLDump 파일에서 모든 데이터베이스를 추출하여 압축 형식으로 개별 데이터베이스 -name.sql.gz에 저장합니다.

5) mysqldump에서 모든 테이블을 추출합니다.

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES

위의 명령은 지정된 "Filename"MySQLDump 파일에서 모든 테이블을 추출하여 압축 된 형식으로 개별 테이블 -name.sql.gz에 저장합니다.

6) mysqldump에서 테이블 목록 추출 :

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str '(table1|table2|table3)'

위의 명령은 지정된 "Filename"MySQLDump 파일에서 테이블을 추출하여 압축 형식으로 개별 테이블 -name.sql.gz에 저장합니다.

7) 압축 된 mysqldump에서 데이터베이스 추출 :

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip

위의 명령은 gzip을 사용하여 filename.sql.gz를 압축하고 "filename.sql.gz"에서 "dbname"이라는 데이터베이스를 추출하고 out/dbname.sql.gz로 저장합니다.

8) 압축 된 MySQLDump에서 데이터베이스를 압축되지 않은 형식으로 추출하십시오.

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip --compression none

위의 명령은 "filename.sql.gz"에서 gzip을 사용하여 filename.sql.gz를 압축하고 "dbname"이라는 데이터베이스를 추출하고 일반 SQL Out/dbname.sql로 저장합니다.

9) 다른 폴더에서 mysqldump에서 alltables를 추출합니다.

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES --output_dir /path/to/extracts/

위의 명령은 지정된 "Filename"MySqlDump 파일에서 모든 테이블을 추출하고/path/to/extracs/아래에 저장된 개별 파일에 압축 형식으로 테이블을 추출합니다. 스크립트는 폴더/Path/To/Extracts/가 존재하지 않으면 생성됩니다.

10) 하나의 데이터베이스에서 하나 이상의 테이블을 전체 덤프로 추출합니다.

여러 데이터베이스가있는 전체 덤프가 있고 하나의 데이터베이스에서 몇 가지 테이블을 추출하려고합니다.

단일 데이터베이스 추출 : sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none

모든 테이블을 추출하십시오 sh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)" 다른 옵션을 사용하여 다음과 같이 단일 명령으로이를 수행 할 수 있습니다.

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1|tbl2)" --compression none

위 명령은 현재 디렉토리의 "Out"폴더 아래의 SQL 형식의 dbname 데이터베이스에서 tbl1 및 tbl2를 추출합니다.

다음과 같이 단일 테이블을 추출 할 수 있습니다.

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1)" --compression none

11) 특정 데이터베이스에서 모든 테이블 추출 :

mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.*" --compression none

위 명령은 DBNAME 데이터베이스에서 모든 테이블을 SQL 형식으로 추출하고 "out"디렉토리 아래에 저장합니다.

12) mysqldump 파일의 내용을 나열하십시오

mysqldumpsplitter.sh --source filename --desc

위 명령에는 덤프 파일의 데이터베이스 및 테이블이 나열됩니다.

나중에 파일을로드하도록 선택할 수 있습니다. zcat filename.sql.gz | mysql -uuser -p -hhostname

  • 또한 여전히 더 크다고 생각하는 단일 테이블을 추출하면 Linux Split 명령을 사용하여 덤프를 추가로 분할 할 수 있습니다.split -l 10000 filename.sql

  • 즉, 그것이 당신의 필요가 있다면 (더 자주 오는 것), 당신은 사용을 고려할 수 있습니다. MyDumper 실제로 분할 할 필요가없는 개별 덤프를 만듭니다!

최근에 만들었습니다 sqlsplit.com. 시도해보십시오.

서버 중 하나에 대한 SSH 액세스가 필요하지 않습니다. MySQL [덤프] 클라이언트 만 괜찮습니다. MySQL [덤프]를 사용하면 데이터베이스를 버리고 다시 가져올 수 있습니다.

PC에서는 다음과 같은 작업을 수행 할 수 있습니다.

$ mysqldump -u or mysql -u newuser -pnewpassword -h newhost newdatabase

그리고 당신은 끝났습니다. :-)

도움이 되었기를 바랍니다

실행하여 MySQLDump로 개별 테이블을 버릴 수 있습니다 mysqldump database table1 table2 ... tableN

테이블 중 어느 것도 너무 크지 않으면 충분할 것입니다. 그렇지 않으면 더 큰 테이블에서 데이터를 분할해야합니다.

유틸리티 BigDump를 추천합니다. 여기서 가져갈 수 있습니다. http://www.ozerov.de/bigdump.php이렇게하면 한계에 전체 라인을 실행할 수있는만큼 덤프의 실행이 비틀 거리며 한 번에 전체 라인을 실행합니다.

@vérace의 답변에 대한 설명 :

나는 특히 대화식 방법을 좋아합니다. 일식으로 큰 파일을 분할 할 수 있습니다. Windows에서 105GB 파일을 성공적으로 시도했습니다.

프로젝트에 mysqldumpsplitter 라이브러리를 추가하십시오.http://dl.bintray.com/verace/mysqldumpsplitter/jar/

가져 오는 방법에 대한 빠른 메모 :

- In Eclipse, Right click on your project --> Import
- Select "File System" and then "Next"
- Browse the path of the jar file and press "Ok"
- Select (thick) the "MySQLDumpSplitter.jar" file and then "Finish"
- It will be added to your project and shown in the project folder in Package Explorer in Eclipse
- Double click on the jar file in Eclipse (in Package Explorer)
- The "MySQL Dump file splitter" window opens which you can specify the address of your dump file and proceed with split.

CSPLIT (1)를 사용하여 정규 표현식을 기반으로 개별 테이블로 출력을 잘라냅니다 (생각할 테이블 경계와 일치).

이것 스크립트 해야 할 것 :

#!/bin/sh

#edit these
USER=""
PASSWORD=""
MYSQLDIR="/path/to/backupdir"

MYSQLDUMP="/usr/bin/mysqldump"
MYSQL="/usr/bin/mysql"

echo - Dumping tables for each DB
databases=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`
for db in $databases; do
    echo - Creating "$db" DB
    mkdir $MYSQLDIR/$db
    chmod -R 777 $MYSQLDIR/$db
    for tb in `$MYSQL  --user=$USER --password=$PASSWORD -N -B -e "use $db ;show tables"`
        do 
            echo -- Creating table $tb
            $MYSQLDUMP --opt  --delayed-insert --insert-ignore --user=$USER --password=$PASSWORD $db $tb | bzip2 -c > $MYSQLDIR/$db/$tb.sql.bz2
    done
    echo
done

sqldumpsplitter 2를 확인하십시오. 방금 40MB 덤프를 성공으로 나누는 데 사용했습니다. 아래 링크에서 얻을 수 있습니다.

sqldumpsplitter.com

이 도움을 바랍니다.

Bash 스크립트와 달리 Windows에서 작동하는 MysqlDumpsplitter.java를 만들었습니다. 여기에서 사용할 수 있습니다 https://github.com/verace/mysqldumpsplitter.

awk로 기존 파일을 분할 할 수 있습니다. 매우 퀴크이고 간단합니다

'테이블'으로 테이블 덤프를 분할합시다.

cat dump.sql | awk 'BEGIN {output = "comments"; }
$data ~ /^CREATE TABLE/ {close(output); output = substr($3,2,length($3)-2); }
{ print $data >> output }';

또는 '데이터베이스'로 덤프를 분할 할 수 있습니다.

cat backup.sql | awk 'BEGIN {output="comments";} $data ~ /Current Database/ {close(output);output=$4;} {print $data>>output}';

이 시도: https://github.com/shenli/mysqldump-hugetable데이터를 많은 작은 파일에 덤프합니다. 각 파일에는 max_records 레코드가 적거나 동일합니다. 이 매개 변수를 Env.sh에서 설정할 수 있습니다.

이번에는 적절한 파서가있는 새 버전의 SqlDumpSplitter를 작성하여 파일을 통해 많은 값을 가진 인서트와 같은 멋진 것들을 허용하며 지금은 멀티 플랫폼입니다. https://philiplb.de/sqldumpsplitter3/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top