Нарезка дампа c mysql-базами на отдельные базы или таблицы

Материал из Linux Wiki
Версия от 14:53, 15 октября 2008; Rain (обсуждение | вклад) (Новая: Cкрипт предназначен для разрезания MySQL-дампа с несколькими базами на отдельные базы. Файлы именуются ...)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигацииПерейти к поиску

Cкрипт предназначен для разрезания MySQL-дампа с несколькими базами на отдельные базы. Файлы именуются по принципу название_базы.номер_в_общем_дампе.sql

Использование
./db_split.sh файл_дампа.sql каталог_куда_складывать_дампы

#!/bin/bash
# By Rain ;)

# Создан 2008-04-01
# Изменен 2008-04-17: добавлено описание
# Изменен 2008-04-18: добавлено удаление "USE DATABASE" в начале дампов

# Файл для резки
inputfile="$1"

# Куда складывать файлы дампов
outdir="$2"

# Проверка передачи переменных (да-да, примитивно, но надо ж ему хоть что-то проверять? :))
[ -z "$2" ]	&&	echo "Error: directory is not set" && exit 1
[ ! -d "$2" ]	&&	echo "Error: $2 not a directory" && exit 1

dbn=0
# Собственно, процесс
cutter() {
while [ ! -z $1 ] ;
	do
	# Проверка конца дампа, задание конца дампа
	if [ -z "$2" ] ;
	then
		head="-0"
	else
		head=`echo $[$2-$1]`
	fi
#	Вырезание имени дампа (вроде работает даже)
	dumpname=`tail -n+"$1" $inputfile | head -n1 | sed -re "s/^CREATE DATABASE//g" -e "s@/\\*[\!a-zA-Z0-9_ ]*\*\/@@g" -e "s/\;//g" -e 's/\`//g' -e "s/ //g"`
#	Проверка существования дампа (в общем-то, если каталог назначения чистый, то использоваться не должно)
	if [ -e "$outdir"/"$dumpname"."$dbn".sql ]
	then
		echo -e "\e[5;31m$dumpname.$dbn.sql already exist\e[0m"
	else
		echo -e "\e[36mCreating\t\e[35m$dumpname.\e[32m$dbn\e[0m.sql"
#		Собственно, процесс нарезки. По полученному первому числу отрезаем начало дампа, 
#		по разнице между вторым и первым отрезается конец дампа.
		tail -n+"$1" $inputfile | head -n"$head" > "$outdir"/"$dumpname"."$dbn".sql
#		В полученных дампах обрезаются все промежутки от "CREATE DATABASE" до "USE DATABASE"
		sed  -i -n '/^CREATE DATABASE/,/^USE/!p' "$outdir"/"$dumpname"."$dbn".sql
	fi
#	Выполнение сдвига полученных номеров и увеличение счетчика обработанных дампов
	shift
	let dbn+=1
	done
echo -e "\e[31mTotal:\t\t\e[35m$dbn dumps\e[0m"
}

# Выборка номеров строк начала дампа, передача их функции.
cutter `grep -n "^CREATE DATABASE" $1 | awk -F':' '{print $1}' | tr ':\n' ' '`