【发布时间】:2012-08-21 23:34:37
【问题描述】:
我正在使用我在网上找到的修改后的 php mysql 备份脚本来备份我的 sql 数据库,但我一直遇到 mysql_fetch_row 的问题,我想知道是否有办法解决它。
我用内存错误注释了这一行。
<?php
ini_set('memory_limit','4000M');
$ho = "host";
$us = "username";
$pa = "password";
$da='dbname';
backup_tables($ho,$us,$pa,$da);
/* backup the db OR just a table */
function backup_tables($host,$user,$pass,$name,$tables = '*')
{
$link = mysql_connect($host,$user,$pass);
mysql_select_db($name,$link);
//get all of the tables
if($tables == '*')
{
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);
}
$filename = 'db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql';
$handle = fopen($filename,'w');
//cycle through
foreach($tables as $table)
{
$result = mysql_query('SELECT * FROM '.$table);
$num_fields = mysql_num_fields($result);
fwrite( $handle, 'DROP TABLE '.$table.';' );
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
fwrite( $handle, "\n\n".$row2[1].";\n\n" );
for ($i = 0; $i < $num_fields; $i++)
{
//this is the line with the error******
while($row = mysql_fetch_row($result))
{
fwrite( $handle, 'INSERT INTO '.$table.' VALUES(' );
for($j=0; $j<$num_fields; $j++)
{
$row[$j] = addslashes($row[$j]);
$row[$j] = ereg_replace("\n","\\n",$row[$j]);
if (isset($row[$j])) { fwrite( $handle, '"'.$row[$j].'"' ) ; }
else { fwrite( $handle, '""' ); }
if ($j<($num_fields-1)) { fwrite( $handle, ',' ); }
}
fwrite( $handle, ");\n" );
}
}
fwrite( $handle, "\n\n\n" );
}
//save file
fclose($handle);
}
?>
这是错误:
Fatal error: Out of memory (allocated 1338507264) (tried to allocate 35 bytes) in /home/user/backupSQL/backupmodified.php on line 47
我知道有更好的方法来进行备份,但这满足了我对系统的所有要求,而且我只是在我的庞大数据库中遇到了内存问题。
感谢您的帮助。
-PHP/MySQL 新手
ps。这是我使用的链接http://www.htmlcenter.com/blog/back-up-your-mysql-database-with-php/
编辑:mysqldump 在备份这些大型数据库时工作正常,但大型数据库是修改最多的数据库,当有人需要处理它们时,我无法在转储时锁定我的 dbs。这就是我使用这个脚本的原因。
【问题讨论】:
-
如果您的数据库太大以至于无法满足其内存需求,我认为它无法满足您的要求。这确实是
mysqldump的工作……特别是考虑到这只是转储表,而不是任何触发器或您最终可能需要定义的过程。 -
我最初使用 mysqldump 进行转储,但问题是我会在一夜之间备份,它会在转储期间锁定数据库并防止海外人员修改它们。目前使用 Myisam dbs,这个脚本可以让我在不将 dbs 锁定到远程 PC 的情况下进行备份。我正在购买新服务器,但那是几个月后的事了,所以这是我备份数据库的临时解决方案,因为我将实施一些不同的东西。哦,由于使用了我的服务器需要的临时表,复制也被破坏了。
-
我将编辑我的帖子以进一步说明我的情况。不过感谢您的回复。