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

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску
Строка 1: Строка 1:
== Разбивка дампа на базы ==
Cкрипт предназначен для разрезания MySQL-дампа с несколькими базами на отдельные базы. Файлы именуются по принципу '''название_базы.номер_в_общем_дампе.sql'''
Cкрипт предназначен для разрезания MySQL-дампа с несколькими базами на отдельные базы. Файлы именуются по принципу '''название_базы.номер_в_общем_дампе.sql'''


Строка 43: Строка 45:
nice -n 19 ${cmd} "${1}" | pv -N 'Total' |
nice -n 19 ${cmd} "${1}" | pv -N 'Total' |
mawk 'BEGIN {f="_-_database_-_header_-_.sql"}; /DROP DATABASE IF EXIST/{close(f) ; print f ; f=$6".sql" ; gsub(/`|;|\*|\//, "", f)}; {print >> f} END {print f}' ; }
mawk 'BEGIN {f="_-_database_-_header_-_.sql"}; /DROP DATABASE IF EXIST/{close(f) ; print f ; f=$6".sql" ; gsub(/`|;|\*|\//, "", f)}; {print >> f} END {print f}' ; }
</source>
== Скрипт для параллельной заливки таблиц дампа ==
Этот скрипт делает параллельную заливку нескольких таблиц в дампе одной базы. Использование:
'''sqlpar-restore''' '''dump.sql''' '''host''' '''user''' '''password''' '''database'''
Опционально можно задавать следующие флаги:
'''THR''' - число параллельных тредов для заливки
'''MYSQL_ADD_FLAGS''' - параметры, передаваемые напрямую MySQL (например, установка default charset)
<source lang=bash>
sqlpar-restore() {
[ -z "${THR}" ] && THR='25'
pwait() {
while [ $(jobs | grep -c Run) -ge $1 ]
do sleep 1
done
}
type="$(file "${1}" | grep -oE 'gzip|bzip')" ; case "${type}" in gzip) cmd='unpigz -c' ;; bzip) cmd='pbunzip2 -c' ;; *) cmd='cat' ;; esac
nice -n 19 ${cmd} "${1}" | pv -N 'Total' |
mawk 'BEGIN {f="_-_database_-_header_-_.sql"}; /DROP TABLE IF EXIST/{close(f) ; print f ; f=$5".sql" ; gsub(/`|;/, "", f)}; {print >> f} END {print f}' |
while read table
do { sleep .1 ; pv -N "${table}" "${table}" | mysql $MYSQL_ADD_FLAGS  -h"${2}" -u"${3}" -p"${4}" "${5}" 2>>/tmp/parrestore.log && rm "${table}" ; } & pwait "${THR}"
done
}
</source>
</source>


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

Версия 13:33, 2 марта 2012

Разбивка дампа на базы

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"

Функция на AWK'e:


dbsplit() {
type="$(file "${1}" | grep -oE 'gzip|bzip')"
case "${type}" in gzip) cmd='unpigz -c' ;; bzip) cmd='pbunzip2 -c' ;; *) cmd='cat' ;; esac
nice -n 19 ${cmd} "${1}" | pv -N 'Total' |
mawk 'BEGIN {f="_-_database_-_header_-_.sql"}; /DROP DATABASE IF EXIST/{close(f) ; print f ; f=$6".sql" ; gsub(/`|;|\*|\//, "", f)}; {print >> f} END {print f}' ; }

Скрипт для параллельной заливки таблиц дампа

Этот скрипт делает параллельную заливку нескольких таблиц в дампе одной базы. Использование:

sqlpar-restore dump.sql host user password database

Опционально можно задавать следующие флаги:

THR - число параллельных тредов для заливки
MYSQL_ADD_FLAGS - параметры, передаваемые напрямую MySQL (например, установка default charset)

sqlpar-restore() {
[ -z "${THR}" ] && THR='25'

pwait() {
while [ $(jobs | grep -c Run) -ge $1 ]
do sleep 1
done
}

type="$(file "${1}" | grep -oE 'gzip|bzip')" ; case "${type}" in gzip) cmd='unpigz -c' ;; bzip) cmd='pbunzip2 -c' ;; *) cmd='cat' ;; esac

nice -n 19 ${cmd} "${1}" | pv -N 'Total' |
mawk 'BEGIN {f="_-_database_-_header_-_.sql"}; /DROP TABLE IF EXIST/{close(f) ; print f ; f=$5".sql" ; gsub(/`|;/, "", f)}; {print >> f} END {print f}' |
while read table
do { sleep .1 ; pv -N "${table}" "${table}" | mysql $MYSQL_ADD_FLAGS  -h"${2}" -u"${3}" -p"${4}" "${5}" 2>>/tmp/parrestore.log && rm "${table}" ; } & pwait "${THR}"
done
}