Нарезка дампа c mysql-базами на отдельные базы или таблицы: различия между версиями

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску
(Ы)
Строка 5: Строка 5:
----
----
<source lang=bash>
<source lang=bash>
#!/bin/bash
#!/bin/bash                                                                                                                  
# By Rain ;)
# By Rain ;)


Строка 11: Строка 11:
# Изменен 2008-04-17: добавлено описание
# Изменен 2008-04-17: добавлено описание
# Изменен 2008-04-18: добавлено удаление "USE DATABASE" в начале дампов
# Изменен 2008-04-18: добавлено удаление "USE DATABASE" в начале дампов
 
# Изменен 2009-06-08: переписал с использованием awk
# Файл для резки
inputfile="$1"
 
# Куда складывать файлы дампов
outdir="$2"


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


dbn=0
# Весь процесс
# Собственно, процесс
awk '/^CREATE DATABASE/{nodb+=1; print "Processing DB "nodb"..."}; {print >> "'$2'/"nodb".sql"}' "${1}"
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"
}


# Выборка номеров строк начала дампа, передача их функции.
echo -e "Renaming dumps..."
cutter `grep -n "^CREATE DATABASE" $1 | awk -F':' '{print $1}' | tr ':\n' ' '`
ls -1 ${2}/*.sql |
while read file
        do     
                dumpname="$(head -n1 "${file}" |  sed -re "s/^CREATE DATABASE|[\` ;]//g" -e "s@/\\*[\!a-zA-Z0-9_ ]*\*\/@@g")"
                sed  -i -n '/^CREATE DATABASE/,/^USE/!p' "${file}"
# Конечно, вряд ли окажутся 2 базы с одним именем, но кто знает...
                [ ! -e "${file%/*}/${dumpname}.sql" ] && mv "${file}" "${file%/*}/${dumpname}.sql"
done
echo "All done"
</source>
</source>
----
----


[[Category:Sed]][[Category:MySQL]][[Category:Bash-скрипт]][[Category:Скрипт]]
[[Category:Sed]][[Category:MySQL]][[Category:Bash-скрипт]][[Category:Скрипт]]

Версия 20:11, 8 июня 2009

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

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

#!/bin/bash                                                                                                                   
# By Rain ;)

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

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

# Весь процесс
awk '/^CREATE DATABASE/{nodb+=1; print "Processing DB "nodb"..."}; {print >> "'$2'/"nodb".sql"}' "${1}"

echo -e "Renaming dumps..."
ls -1 ${2}/*.sql |
while read file
        do      
                dumpname="$(head -n1 "${file}" |  sed -re "s/^CREATE DATABASE|[\` ;]//g" -e "s@/\\*[\!a-zA-Z0-9_ ]*\*\/@@g")"
                sed  -i -n '/^CREATE DATABASE/,/^USE/!p' "${file}"
# Конечно, вряд ли окажутся 2 базы с одним именем, но кто знает...
                [ ! -e "${file%/*}/${dumpname}.sql" ] && mv "${file}" "${file%/*}/${dumpname}.sql"
done
echo "All done"