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

Представьте следующую ситуацию: кто-то сделал бэкап всей базы данных 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

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *