0

データベースをバックアップおよび復元できる機能があります。この機能は、データベースの量が少ない場合に完全に機能します。ただし、データが大規模な場合、バックアップ プロセスを完了できず、エラー メッセージが表示されます。これは、エラー メッセージのサンプルです。

Fatal error: Out of memory (allocated 192151552) (tried to allocate 63963113 bytes) in C:\wamp\www\samfahEnterprise\processbackup.php on line 69

以下は、バックアッププロセスを実行するために使用するスクリプトです。

<?php
session_start();
// Include settings
include("config.php");
date_default_timezone_set("Asia/Singapore");

set_time_limit(0);
ini_set('memory_limit', '20000M');

 // Set the suffix of the backup filename
if ($table == '*') 
{
    $extname = 'all';
}else
{
    $extname = str_replace(",", "_", $table);
    $extname = str_replace(" ", "_", $extname);
}

// Generate the filename for the backup file
$filess = 'backup/dbbackup_' . date("d.m.Y_H_i_s") . '_' . $extname;

// Call the backup function for all tables in a DB
backup_tables($DBhost,$DBuser,$DBpass,$DBName,$table,$extname,$filess);

// Backup the table and save it to a sql file
function backup_tables($host,$user,$pass,$name,$tables,$bckextname,$filess)
{ 
    $link = mysql_connect($host,$user,$pass);
    mysql_select_db($name,$link);
    $return = "";   

    // Get all of the tables
    if($tables == '*') {
        $tables = array();
        $result = mysql_query('SHOW TABLES');
        while($row = mysql_fetch_row($result)) {
            $tables[] = $row[0];
        }
    } else {
        if (is_array($tables)) {
            $tables = explode(',', $tables);
        }
}

    // Cycle through each provided table
    foreach($tables as $table) 
    {
        $result = mysql_query('SELECT * FROM '.$table);
        $num_fields = mysql_num_fields($result);

        // First part of the output - remove the table
        $return .= 'DROP TABLE ' . $table . ';<|||||||>';

        // Second part of the output - create table
        $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
        $return .= "\n\n" . $row2[1] . ";<|||||||>\n\n";

        // Third part of the output - insert values into new table
        for ($i = 0; $i < $num_fields; $i++) {
            while($row = mysql_fetch_row($result)) 
            {
                $return.= '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]))
                    { 
                        $return .= '"' . $row[$j] . '"'; 
                    } else
                    { 
                        $return .= '""'; 
                    }
                    if ($j<($num_fields-1)) 
                    { 
                        $return.= ','; 
                    }
                }
                $return.= ");<|||||||>\n";
            }
        }
        $return.="\n\n\n";
    }

    // Save the sql file
    $handle = fopen($filess.'.sql','w+');
    fwrite($handle,$return);
    fclose($handle);



// Close MySQL Connection
mysql_close();
} 

$_SESSION['save'] = "<span style='color:#00FF00'>The backup has been created successfully.</span>";
echo "<script>window.location = 'utility.php';</script>";
?>
4

2 に答える 2

0

次のようにデバッグしてみてください。

echo ini_get("memory_limit")."\n";
ini_set("memory_limit","1024M");
echo ini_get("memory_limit")."\n";
exit();

おそらく正しい値を設定する必要があります。

于 2013-10-10T07:02:12.397 に答える