Назад | Перейти на главную страницу

Как я могу разделить резервную копию сервера phpmyadmin на резервные копии базы данных?

У меня есть большой файл .sql, который я создал с помощью phpmyadmin для резервного копирования моих баз данных разработки. есть ли способ разделить эту большую резервную копию на несколько файлов, каждый файл для отдельной базы данных? файл слишком велик, чтобы с ним вручную работать

Проверьте здесь, возможно, это поможет вам http://www.rusiczki.net/2007/01/24/sql-dump-file-splitter/

Но если вы можете удаленно подключиться к базе данных или даже иметь доступ к оболочке, вы должны использовать mysqldump для создания резервной копии для каждой базы данных или даже для каждой таблицы.

этот простой скрипт id сделает это за вас:


#!/bin/bash
dbuser=
dbpass=
backupdir=
$mysql -e "show databases" --user=$dbuser --password=$dbpass | $grep -v "Database" | while read dbase
    do
            $mkdir -p $backupdir/$dbase/
            $mysqldump  -c -u $dbuser --password=$dbpass $dbase > $backupdir/$dbase/full-$dbase.sql 

            #if dont want to dump one table per sql file then erase next 4 lines then it will dump one database per sql file   
            $mysql -e "show tables" --user=$dbuser --password=$dbpass $dbase | $grep -v "Tables_in_" | while read dbtable
                do
                      $mysqldump -c -u $dbuser --password=$dbpass $dbase $dbtable > $backupdir/$dbase/$dbtable.sql
                done
    done

Вы должны изменить / поместить dbuser dbpass и backupdir, а сценарий должен делать полный дамп каждой базы данных на сервере (одна база данных на файл sql и каждая таблица в базе данных на файл sql). Этот пример должен быть выполнен на сервере, но с небольшими изменениями вы можете использовать его для удаленного дампа.

Если вы просто хотите разделить файл для разработки, а не для восстановления - должен быть скрипт / инструмент для разделения файла .sql, но никогда не видел - возможно, кто-то опубликует.

Если вы восстанавливаете резервную копию:

С большими файлами - эта проблема может быть всегда. Вы не можете быть уверены, что все БД маленькие. достаточно, чтобы импортировать данные позже

Если сервер в ваших руках - импортируйте его из консоли mysql: http://dev.mysql.com/doc/refman/5.5/en/mysqlimport.html

phpMyAdmin также может обрабатывать большие файлы, но ограничения веб-сервера и php должны быть установлены на более высокие значения. Кроме того, phpMyAdmin поддерживает gzip и bzip2, сжимайте с помощью bzip2 и попробуйте еще раз.

На данный момент вы можете попробовать импортировать большой файл с консоли, а затем повторно экспортировать все базы данных отдельно с помощью mysqldump: http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html

Это сценарий, который я написал для разделения резервной копии сервера phpmyadmin на отдельные файлы базы данных:

#!/usr/bin/php
<?php
define('SOURCE_FILE', './localhost.sql');
define('TARGET_DIR', './DBs');

$fhs = fopen(SOURCE_FILE, 'r') or die("e-1!\n"); # source handler
$fht = null; # file handler for database files
$header = ''; # phpmyadmin settings at the begining of the file

while (($str = fgets($fhs)) !== false) {
    if(preg_match('@^CREATE DATABASE `(.*?)`@', $str, $matches)) {
        @fclose($fht);
        $fht = fopen(TARGET_DIR . '/' . $matches[1] . '.sql', 'w') or die("e-2: {$matches[1]}!\n");
        echo "Database: {$matches[1]}\n";
        fwrite($fht, $header);
    }

    if($fht)
        fwrite($fht, $str);
    else
        $header .= $str;
}

echo (feof($fhs)) ? 'All Done :)' : 'e-3: unexpected end!', "\n";

@fclose($fht);
@fclose($fhs);

?>