MySQL split dump to different databases

MySQL split dump to different databasesПривет,

Днес ми се наложи да възтановявам счупени бази (главно с InnoDB таблици) , като за целта имах общ бекъп, голям около 6GB. Една от базите ми беше много голяма, а останалите малки – проблема беше обаче точно с тях. За целта ми трябваше нещо което да направи: MySQL split dump to different databases , или да ми раздели този голям общ бекъп на отделни файлове за всяка една от базите, за да мога да си ги възтановя една по една.

За целта се разрових из нета и попаднах на няколко решения, като в този пост ще споделя за 2 от тях. Едното изкарва бекъп само за определна база, а второто за всички наведнъж.

Ето и първият вариянт :

sed -n '/^-- Current Database: `c20elenhen`/,/^-- Current Database: `/p' 20160628025005-db-all.sql > c20elenhen.sql

Накратко – желаната от мен база, която изках да изкарам от бекъпа се казва: c20elenhen , бекъп-а ми се казва : 20160628025005-db-all.sql , а файла в който искам да запиша всичко се казва: c20elenhen.sql  – бързо и лесно! 🙂

Вторият вариянт обаче повече ми харесва, чащото директно ми раздели всички бази по отделно, без да трябва да описвам всяка след всяка. Ето и perl скрипт-а:

#!/usr/bin/perl -w
#
# splitmysqldump - split mysqldump file into per-database dump files.

use strict;
use warnings;

my $dbfile;
my $dbname = q{};
my $header = q{};

while (<>) {

# Beginning of a new database section:
# close currently open file and start a new one
if (m/-- Current Database\: \`([-\w]+)\`/) {
if (defined $dbfile && tell $dbfile != -1) {
close $dbfile or die "Could not close file!"
}
$dbname = $1;
open $dbfile, ">>", "$1_dump.sql" or die "Could not create file!";
print $dbfile $header;
print "Writing file $1_dump.sql ...\n";
}

if (defined $dbfile && tell $dbfile != -1) {
print $dbfile $_;
}

# Catch dump file header in the beginning
# to be printed to each separate dump file.
if (! $dbname) { $header .= $_; }
}
close $dbfile or die "Could not close file!"

А схемата става по следният начин :

mac-mini: nikolay$ perl splitmysqldump.pl < 20160628025005-db-all.sql
Writing file c15mobileroundcube_dump.sql ...
Writing file c15roundcube_dump.sql ...
Writing file c1aps1_dump.sql ...
Writing file c1aps2_dump.sql ...
Writing file c1aps4_dump.sql ...
Writing file c1hdbox_dump.sql ...
Writing file c1luxbeton_dump.sql ...
Writing file c1newhdbox_dump.sql ...
Writing file c1newtester_dump.sql ...
Writing file c1paste_dump.sql ...
......

Това е общо взето…