How do I split the output from mysqldump into smaller files?

前端 未结 18 1506
孤城傲影
孤城傲影 2020-11-27 13:50

I need to move entire tables from one MySQL database to another. I don\'t have full access to the second one, only phpMyAdmin access. I can only upload (compressed) sql file

相关标签:
18条回答
  • 2020-11-27 14:20

    You can dump individual tables with mysqldump by running mysqldump database table1 table2 ... tableN

    If none of the tables are too large, that will be enough. Otherwise, you'll have to start splitting the data in the larger tables.

    0 讨论(0)
  • 2020-11-27 14:20

    I've created MySQLDumpSplitter.java which, unlike bash scripts, works on Windows. It's available here https://github.com/Verace/MySQLDumpSplitter.

    0 讨论(0)
  • 2020-11-27 14:21

    I wrote a new version of the SQLDumpSplitter, this time with a proper parser, allowing nice things like INSERTs with many values to be split over files and it is multi platform now: https://philiplb.de/sqldumpsplitter3/

    0 讨论(0)
  • 2020-11-27 14:22

    A clarification on the answer of @Vérace :

    I specially like the interactive method; you can split a large file in Eclipse. I have tried a 105GB file in Windows successfully:

    Just add the MySQLDumpSplitter library to your project: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

    Quick note on how to import:

    - 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.
    
    0 讨论(0)
  • 2020-11-27 14:23

    You say that you don't have access to the second server. But if you have shell access to the first server, where the tables are, you can split your dump by table:

    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

    This will create a gzip file for each table.

    Another way of splitting the output of mysqldump in separate files is using the --tab option.

    mysqldump [connecting options] --tab=directory_name dbname 

    where directory_name is the name of an empty directory. This command creates a .sql file for each table, containing the CREATE TABLE statement, and a .txt file, containing the data, to be restored using LOAD DATA INFILE. I am not sure if phpMyAdmin can handle these files with your particular restriction, though.

    0 讨论(0)
  • 2020-11-27 14:23

    There is this excellent mysqldumpsplitter script which comes with tons of option for when it comes to extracting-from-mysqldump.

    I would copy the recipe here to choose your case from:

    1) Extract single database from mysqldump:

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

    Above command will create sql for specified database from specified "filename" sql file and store it in compressed format to database-name.sql.gz.

    2) Extract single table from mysqldump:

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

    Above command will create sql for specified table from specified "filename" mysqldump file and store it in compressed format to database-name.sql.gz.

    3) Extract tables matching regular expression from mysqldump:

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

    Above command will create sqls for tables matching specified regular expression from specified "filename" mysqldump file and store it in compressed format to individual table-name.sql.gz.

    4) Extract all databases from mysqldump:

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

    Above command will extract all databases from specified "filename" mysqldump file and store it in compressed format to individual database-name.sql.gz.

    5) Extract all table from mysqldump:

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

    Above command will extract all tables from specified "filename" mysqldump file and store it in compressed format to individual table-name.sql.gz.

    6) Extract list of tables from mysqldump:

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

    Above command will extract tables from the specified "filename" mysqldump file and store them in compressed format to individual table-name.sql.gz.

    7) Extract a database from compressed mysqldump:

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

    Above command will decompress filename.sql.gz using gzip, extract database named "dbname" from "filename.sql.gz" & store it as out/dbname.sql.gz

    8) Extract a database from compressed mysqldump in an uncompressed format:

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

    Above command will decompress filename.sql.gz using gzip and extract database named "dbname" from "filename.sql.gz" & store it as plain sql out/dbname.sql

    9) Extract alltables from mysqldump in different folder:

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

    Above command will extract all tables from specified "filename" mysqldump file and extracts tables in compressed format to individual files, table-name.sql.gz stored under /path/to/extracts/. The script will create the folder /path/to/extracts/ if not exists.

    10) Extract one or more tables from one database in a full-dump:

    Consider you have a full dump with multiple databases and you want to extract few tables from one database.

    Extract single database: sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none

    Extract all tables sh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)" though we can use another option to do this in single command as follows:

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

    Above command will extract both tbl1 and tbl2 from DBNAME database in sql format under folder "out" in current directory.

    You can extract single table as follows:

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

    11) Extract all tables from specific database:

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

    Above command will extract all tables from DBNAME database in sql format and store it under "out" directory.

    12) List content of the mysqldump file

    mysqldumpsplitter.sh --source filename --desc

    Above command will list databases and tables from the dump file.

    You may later choose to load the files: zcat filename.sql.gz | mysql -uUSER -p -hHOSTNAME

    • Also once you extract single table which you think is still bigger, you can use linux split command with number of lines to further split the dump. split -l 10000 filename.sql

    • That said, if that is your need (coming more often), you might consider using mydumper which actually creates individual dumps you wont need to split!

    0 讨论(0)
提交回复
热议问题