gpt4 book ai didi

php - mysql获取行内存错误

转载 作者:行者123 更新时间:2023-11-29 05:34:14 25 4
gpt4 key购买 nike

我正在使用我在网上找到的修改后的 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 新手

附言。这是我使用的链接 http://www.htmlcenter.com/blog/back-up-your-mysql-database-with-php/

编辑:mysqldump 在备份这些大型数据库时工作正常,但大型数据库是修改最多的数据库,当有人需要处理它们时,我无法在转储时锁定我的数据库。这就是我使用这个脚本的原因。

最佳答案

正如其他发帖者所提到的,您最好使用现成的工具,但现在让我们谈谈您的脚本。

如果您有一个非常大的表,那么就没有办法分配那么多的内存。您必须将数据集分成多个 block 。使用如下查询:

$result = mysql_query('SELECT * FROM '.$table.' LIMIT '.$start.', 10000');

然后只需使用 $start 进行迭代或执行 while 循环来检查您是否仍在获得结果。像这样,您将获得 10000 条记录的数据 block ,因此它肯定适合您的内存。

但仍然存在一个问题 – 一致性。如果在您仍在获取 block 时某些行发生变化怎么办?那么,您可以将 SELECT 循环包装在一个事务中,并在获取数据时锁定表。我知道您正试图避免锁定,但锁定表比锁定整个数据库要好。这仍然不能确保表间一致性,但这是在您设置的条件下可以做到的最好。

编辑:这是循环的代码。我实现了 while 解决方案。有一个等效的 for 循环,但两者之间的比较超出了本文的范围。

foreach($tables as $table)
{
fwrite( $handle, 'DROP TABLE '.$table.';' );

$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
fwrite( $handle, "\n\n".$row2[1].";\n\n" );

$start = 0;
do {
$result = mysql_query( 'SELECT * FROM '.$table.' LIMIT '.$start.', 10000' );
$start += 10000;
$num_rows = mysql_num_rows( $result );

while( $row = mysql_fetch_row( $result ) ) {
$line = 'INSERT INTO '.$table.' VALUES(';
foreach( $row as $value ) {
$value = addslashes( $value );
$value = ereg_replace( "\n","\\n", $value );
$line .= '"'.$value.'",';
}
$line = substr( $line, 0, -1 ); // cut the final ','
$line .= ');\n';
fwrite( $handle, $line );
}
} while( $num_rows !== 0 );
}

关于php - mysql获取行内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12064522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com