How do I delete a table from a mysqldump

后端 未结 3 765
无人共我
无人共我 2021-02-04 17:02

How do I delete the output for one big table inside a mysqldump with lots of tables in it?

I have a dump of a database that is 6 GB large, but 90% of it is only one logg

相关标签:
3条回答
  • 2021-02-04 17:33

    I found this bash script, that splits a dump of one database into separate filed for each table, using csplit (that splits a file into sections determined by context lines):

    #!/bin/bash
    
    ####
    # Split MySQL dump SQL file into one file per table
    # based on http://blog.tty.nl/2011/12/28/splitting-a-database-dump
    ####
    
    if [ $# -ne 1 ] ; then
      echo "USAGE $0 DUMP_FILE"
    fi
    
    csplit -s -ftable $1 "/-- Table structure for table/" {*}
    mv table00 head
    
    for FILE in `ls -1 table*`; do
          NAME=`head -n1 $FILE | cut -d$'\x60' -f2`
          cat head $FILE > "$NAME.sql"
    done
    
    rm head table*
    

    Source: gist.github.com/1608062

    and a bit enhanced: How do I split the output from mysqldump into smaller files?

    once, you have separate files for each table, you can delete the unwanted tables and glue them together if needed with

    cat table* >glued_sqldump.sql

    0 讨论(0)
  • 2021-02-04 17:36

    You could use 'n,n d' to remove certain lines. I guess in your case you do want to have the table in question, but don't want the data?

    Change the grep command to include "Dumping data for table":

    grep -n 'Table structure\|Dumping data for table' dump.sql 
    19:-- Table structure for table `t1`
    37:-- Dumping data for table `t1`
    47:-- Table structure for table `t2`
    66:-- Dumping data for table `t2`
    76:-- Table structure for table `t3`
    96:-- Dumping data for table `t3`
    

    Now, if you don't want the data for t2, you could use:

    sed '66,75 d' dump.sql > cleandump.sql
    0 讨论(0)
  • 2021-02-04 17:38

    you need to find the create table statement of your table, and find the next create table statement. say they are n1 and n2.

    then you can just delete them with sed as above. sed 'n1,n2d' dump.sql > new.sql

    you can just grep create table and note the line numbers for your prework.

    here is a demo.

    ubuntu@ubuntu:~$ grep -n [34] a.txt
    3:3
    4:4
    ubuntu@ubuntu:~$ cat a.txt
    1
    2
    3
    4
    5
    6
    ubuntu@ubuntu:~$ grep [34] a.txt
    3
    4
    ubuntu@ubuntu:~$ sed '3,4d' a.txt > b.txt
    ubuntu@ubuntu:~$ cat b.txt
    1
    2
    5
    6
    ubuntu@ubuntu:~$ 
    
    0 讨论(0)
提交回复
热议问题