Как получить отдельную таблицу MySQL из массивного файла .SQL бэкапа базы данных (разделитель дампов MySQL)

Как получить отдельную таблицу MySQL из массивного файла .SQL бэкапа базы данных (разделитель дампов MySQL)

Life-Hack

Представьте следующую ситуацию: кто-то сделал бэкап всей базы данных MySQL — очень большой бэкап — обычными инструментами. Результатом этого обычно является файлы tar или gzip, содержание ВСЕ созданные/заполненные значения для ВСЕХ таблиц этой базы данных. Все таблицы в одном файле. Это также является обычным когда клиенты с третьей стороны доставляют бэкап базы данных.

Эта ситуация может стать досадной, если ваш бэкап в районе 100+ GB и вам нужна ОДНА таблица (или по крайней мере не все). Повторное развёртывание бэкапа этих размерах (например для тестирования) — убьёт уйму времени (в приведённом примере это займёт дни!), определённо, использование только нужной таблицы на 2 GB — это намного более лучший вариант, чем полный скрипт, когда вам в действительности нужна одна таблица.

Это было обычной задачей в моей бывшей компании, и, к сожалению, все профессиональные инструменты были неспособны прочитать такой файл или полностью «вылетали» делая это. Окончательным решением решившим эту проблему стал крошечный самописный баш скрипт, который был найден в блоге разработчика. Этот потрясающий скрипт крайне легко использовать и просто извлечь одну конкретную таблицу из гигантского файла (и положить её в другой файл) или выдрать ряд таблиц, вы можете даже использовать регулярные выражения. Фантастика!


#!/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}"


Использование

Вы можете использовать mysqldumpsplitter следующим образом (подразумевается, что вы скопировали скрипт в файл mysqldumpsplitter.sh):

Извлечь все таблицы из файла XXX во множество отдельных sql файлов:

sh mysqldumpsplitter.sh XXX


Извлечь таблицу ZZZ в единичный файл XXX:

sh mysqldumpsplitter.sh XXX ZZZ


Извлечь таблицу(ы) с использованием регулярных выражений (regex) из файла XXX:

sh mysqldumpsplitter.sh XXX -S REGEX


Источник




Report Page