logo
14.04.2015 23:56
1
Server mi servíruje mysql dump všech databází v jednom velkém souboru. Potřeboval bych tento soubor rozdělit na X menších, každý by obsahoval dump pouze jedné databáze. Na internetu jsem stáhl skript v perlu, který funguje a dělá to. Nicméně, jelikož perlu moc nerozumím a určitě to bude jen nějaká drobná ptákovina, potřeboval bych, aby mi ten skript ty malé nově vytvořené soubory vytvořil v té samé složce, ve které je ten originální sql dump.
Tzn. mám následující kód (viz níže) v souboru splitmysqldump.pl, ten spustím přes příkaz
perl splitmysqldump.pl /backup/20150412/mysql.sql
ale on mi to vytvoří v adresáři kde je splitmysqldump.pl, a já potřebuji docílit toho, aby to flákal do adresáře /backup/20150412/.
Můžete na to prosím někdo znalý kouknout a upravit aby to dělalo co chci?

Kód:
#!/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!"
15.04.2015 00:35
2
Kód:
#!/bin/bash

# $Id: mysqlbu.sh 5 2011-06-08 23:58:15Z john $

# Simple MySQL dump script which dumps each database to a compressed
# file with the date included in the file name
# http://johnbokma.com/mexit/2011/06/08/

MYSQL='/usr/bin/mysql'

MYSQLDUMP='/usr/bin/mysqldump'
DUMPOPTS='--opt --hex-blob --skip-extended-insert'

DATEFORMAT='%Y%m%d-%H%M%S'  # See man date

user=root
pass=
dir='.'
while getopts 'u:d:p:h' OPTION
do
    case $OPTION in
     u)
         user="$OPTARG"
            ;;
     d)
         dir="$OPTARG"
            ;;
     p)
         pass="$OPTARG"
            ;;
     h|?)
         printf  "Usage: %s: [-u USER] [-p PASSWORD] [-d DIRECTORY]\n" \
          $(basename $0) >&2
         exit 2
            ;;
    esac
done
if [ -z "$pass" ]
then
    read -s -p "password: " pass ; printf "%b" "\n"
fi

# Get the names of the database tables
databases=`$MYSQL -u$user -p$pass --skip-column-names -e'SHOW DATABASES'`

# Write the compressed dump for each table
for db in $databases; do
    filename=`date +"$dir/$db-$DATEFORMAT.sql.gz"`
    echo "creating $filename"
    $MYSQLDUMP $DUMPOPTS -u$user -p$pass --database $db \
     | gzip -9 > $filename
done
15.04.2015 02:18
3
vdusek: asi jsme si nerozuměli, já nechci dumpovat mysql databáze do jednotlivých malých souborů, dump už mám a je prostě v jednom velkém souboru obsahující všechny databáze...s tímto nemám potřebu nic dělat, prostě to takto mám k dispozici ze záložního serveru a je to OK...stejně OK mi funguje ten skript pro rozdělení do menších dumpů z toho velkého, až na to umístění...takže potřebuji upravit jen ten skript aby mi ty malé cílové dumpy udělal do stejného adresáře jako je ten zdrojový
15.04.2015 08:16
4
Jinak pro zálohování DB nastudujte automysqlbackup - http://sourceforge.net/projects/automysqlbackup/
Bývá v bežných distribucích v balíčku
15.04.2015 17:28
5
vdusek: díky, ze zájmu mrknu, nicméně nepotřebuji, jak jsem psal výše, pro mé účely potřebuji tu zálohu databází rozdělit, abych to měl efektivněji zautomatizováno a nemusel v případě potřeby ztrácet více času než je nezbytné (a starost o server a způsob zálohování není mým cílem, od toho si platím hostera :)