如何将 phpmyadmin 的服务器备份分成数据库备份?

如何将 phpmyadmin 的服务器备份分成数据库备份?

我有一个很大的 .sql 文件,是使用 phpmyadmin 创建的,用于备份我的开发数据库。有没有办法将这个大备份拆分成几个文件,每个文件对应一个独立的数据库?文件太大,无法手动处理

答案1

看看这里也许会对你有帮助http://www.rusiczki.net/2007/01/24/sql-dump-file-splitter/

但是如果您可以远程连接到数据库,甚至可以访问 shell,您应该使用 mysqldump 为每个数据库甚至每个表进行备份。

这个简单的脚本可以帮你完成这个任务:


#!/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 文件数据库中的每个表)。此示例应在服务器上执行,但只需进行少量修改,您就可以使用它进行远程转储。

答案2

如果您只是想为了开发而拆分文件,而不是为了恢复 - 应该有一个用于拆分.sql文件的脚本/工具,但从未见过 - 也许有人会发布。

如果您正在恢复备份:

对于大文件 - 您可能总是会遇到这个问题。您不能确定所有数据库都很小。足以稍后导入数据

如果服务器在您手中 - 从 mysql 控制台导入它: http://dev.mysql.com/doc/refman/5.5/en/mysqlimport.html

phpMyAdmin 也可以处理大文件,但必须将 Web 服务器和 php 限制设置为更高的值。此外,phpMyAdmin 支持 gzip 和 bzip2,请使用 bzip2 压缩并重试。

现在,您可以尝试从控制台导入大文件,然后使用 mysqldump 分别重新导出所有数据库: http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html

答案3

这是我编写的将 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);

?>

相关内容