我有一个很大的 .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);
?>