0

我有一个 mysql 数据库的备份,我只需要匆忙中的 1 个表。

它的 4gb 并且我试图用 VIM 之类的程序打开它,但它并不顺利,猜它太大了。即使尝试从如此多的文本中提取一个表也很困难。

所以我遇到了这个: http: //kedar.nitty-witty.com/blog/mydumpsplitter-extract-tables-from-mysql-dump-shell-script

其中解释了如何使用 shell 脚本进行操作。我发现http://cygwin.com可以在 Windows 中运行 shell 脚本,我正在运行 Windows 8.1。

我不太清楚步骤是什么:

所以我运行 cwygin 并进入 shell 脚本窗口,我将我的数据库文件和 mysqldumpsplitter.sh 放在我创建的 C:\cygwin64\usr\mysql 文件夹中。

然后我转到 /usr/mysql 并运行它:

sh mysqldumpsplitter.sh mydatabase.sql tbl_activity

tbl_activity 是我试图访问的表。mydatabase.sql 是 sql 备份

但是当我跑步时,我得到了

mysqldumpsplitter.sh:第 5 行:tput:找不到命令 mysqldumpsplitter.sh:第 6 行:tput:找不到命令 mysqldumpsplitter.sh:第 7 行:tput:找不到命令 mysqldumpsplitter.sh:第 8 行:tput:找不到命令 mysqldumpsplitter。 sh:第 9 行:tput:找不到命令 mysqldumpsplitter.sh:第 10 行:tput:找不到命令 mysqldumpsplitter.sh:第 11 行:tput:找不到命令 mysqldumpsplitter.sh:第 12 行:tput:找不到命令 mysqldumpsplitter.sh:第 13 行:tput:找不到命令 mysqldumpsplitter.sh:第 14 行:tput:找不到命令 0 从 mydatabase.sql 中提取的表。

第 5=14 行在下面

txtund=$(tput sgr 0 1)    # Underline
txtbld=$(tput bold)       # Bold
txtred=$(tput setaf 1)    # Red
txtgrn=$(tput setaf 2)    # Green
txtylw=$(tput setaf 3)    # Yellow
txtblu=$(tput setaf 4)    # Blue
txtpur=$(tput setaf 5)    # Purple
txtcyn=$(tput setaf 6)    # Cyan
txtwht=$(tput setaf 7)    # White
txtrst=$(tput sgr0)       # Text reset

虽然我可能会访问 ubuntu 机器并运行它(我认为这会在那里更好地工作),但我必须等待数小时才能上传 4gb .sql 转储,我希望能快速完成此操作。它只是一个在 Windows 上运行它的黑客,我应该切换到 ubuntu 来运行它吗?

完整的 .sh 文件在这里,因为它很小

#!/bin/sh
# http://kedar.nitty-witty.com
#SPLIT DUMP FILE INTO INDIVIDUAL TABLE DUMPS
# Text color variables
txtund=$(tput sgr 0 1)    # Underline
txtbld=$(tput bold)       # Bold
txtred=$(tput setaf 1)    # Red
txtgrn=$(tput setaf 2)    # Green
txtylw=$(tput setaf 3)    # Yellow
txtblu=$(tput setaf 4)    # Blue
txtpur=$(tput setaf 5)    # Purple
txtcyn=$(tput setaf 6)    # Cyan
txtwht=$(tput setaf 7)    # White
txtrst=$(tput sgr0)       # Text reset

TARGET_DIR="."
DUMP_FILE=$1
TABLE_COUNT=0

if [ $# = 0 ]; then
        echo "${txtbld}${txtred}Usage: sh MyDumpSplitter.sh DUMP-FILE-NAME${txtrst} -- Extract all tables as a separate file from dump."
        echo "${txtbld}${txtred}       sh MyDumpSplitter.sh DUMP-FILE-NAME TABLE-NAME ${txtrst} -- Extract single table from dump."
        echo "${txtbld}${txtred}       sh MyDumpSplitter.sh DUMP-FILE-NAME -S TABLE-NAME-REGEXP ${txtrst} -- Extract tables from dump for specified regular expression."
        exit;
elif [ $# = 1 ]; then
        #Loop for each tablename found in provided dumpfile
        for tablename in $(grep "Table structure for table " $1 | awk -F"\`" {'print $2'})
        do
                #Extract table specific dump to tablename.sql
                sed -n "/^-- Table structure for table \`$tablename\`/,/^-- Table structure for table/p" $1 > $TARGET_DIR/$tablename.sql
                TABLE_COUNT=$((TABLE_COUNT+1))
        done;
elif [ $# = 2  ]; then
        for tablename in $(grep -E "Table structure for table \`$2\`" $1| awk -F"\`" {'print $2'})
        do
                echo "Extracting $tablename..."
                #Extract table specific dump to tablename.sql
                sed -n "/^-- Table structure for table \`$tablename\`/,/^-- Table structure for table/p" $1 > $TARGET_DIR/$tablename.sql
                TABLE_COUNT=$((TABLE_COUNT+1))
        done;
elif [ $# = 3  ]; then

        if [ $2 = "-S" ]; then
                for tablename in $(grep -E "Table structure for table \`$3" $1| awk -F"\`" {'print $2'})
                do
                        echo "Extracting $tablename..."
                        #Extract table specific dump to tablename.sql
                        sed -n "/^-- Table structure for table \`$tablename\`/,/^-- Table structure for table/p" $1 > $TARGET_DIR/$tablename.sql
                        TABLE_COUNT=$((TABLE_COUNT+1))
                done;
        else
                echo "${txtbld}${txtred} Please provide proper parameters. ${txtrst}";
        fi
fi

#Summary
echo "${txtbld}$TABLE_COUNT Table extracted from $DUMP_FILE at $TARGET_DIR${txtrst}"
4

2 回答 2

0

我不会走那么远的路。我只会使用我手头的东西。我想,您知道表结构并且只需要数据。所以我会在中使用类似以下的内容cmd

C:\tmp>findstr "^INSERT INTO your_table" < mydatabase.sql > filtered.sql

可以肯定的是,INSERT 语句在文件中的样子,您可能会运行如下内容:

C:\tmp>findstr "INSERT INTO" < mydatabase.sql | more

然后退出Ctrl+C

于 2013-11-01T16:32:36.550 回答
0

试试 UltraEdit 程序:它打开文件而不缓冲整个内容。我相信您可以使用评估版 30 天。

奇怪的是,这是我所知道的唯一一个不缓冲整个文件的程序(Windows/Linux)。它在很多场合都对我有帮助。

于 2013-11-01T16:18:44.953 回答