我得到的主題。當我嘗試在文本文件中備份我的數據庫時。「PHP致命錯誤:允許的內存大小134217728字節耗盡」,同時生成數據庫備份
function backup_tables($backup_filename, $tables = '*')
{
$conf = new JConfig();
$dbhost = $conf->host;
$dbuser = $conf->user;
$dbpassword = $conf->password;
$dbname = $conf->db;
$link = mysql_connect($dbhost, $dbuser, $dbpassword);
mysql_select_db($dbname, $link) or die(mysql_error());
$return = "drop database if exists `$dbname`;\n\ncreate database `$dbname`;\n\nuse `$dbname`;\n\n";
$return .= "/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */;\n\n";
$return .= "/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */;\n\n";
$return .= "/*!40101 SET @[email protected]@COLLATION_CONNECTION */;\n\n";
$return .= "/*!40101 SET NAMES utf8 */;\n\n";
$handle = fopen($backup_filename, 'w+');
fwrite($handle, $return); $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 {
$tables = is_array($tables) ? $tables : explode(',', $tables);
}
// cycle through
foreach ($tables as $table) {
$result = mysql_query('SELECT * FROM ' . $table);
$num_fields = mysql_num_fields($result);
$return .= 'DROP TABLE IF EXISTS `' . $table . '`;';
$return .= "\n\n" . mysql_fetch_row(mysql_query('SHOW CREATE TABLE `' . $table . '`;'))[1] . " DEFAULT CHARSET=cp1251;\n\n";
while ($row = mysql_fetch_row($result)) {
$return .= 'INSERT INTO ' . $table . ' VALUES(';
for ($i = 0; $i < $num_fields; $i++) {
$row[$i] = str_replace("\n", "\\n", addslashes($row[$i]));
$return .= '"' . (isset($row[$i])? $row[$i] : '') . '"';
if ($num_fields - $i - 1) {
$return .= ',';
}
}
$return .= ");\n";
fwrite($handle, $return); $return = "";
}
if($return) {
fwrite($handle, $return);
$return .= "\n\n\n";
}
}
fclose($handle);
}
這個函數可以很好的處理內存泄漏的異常。它創建一個〜30 MiB的文件,並提及提及的錯誤。正在進行文件生成時,httpd進程的內存使用量會一致增加。還有一件事:在一張大桌子(包含一個日誌)上生成一代,但我認爲這不是因爲逐行寫入的原因信息。
我建議使用數據庫工具來提取您的SQL數據庫,然後將其導出爲CSV或其他格式。如果你這樣做,它會消耗更多的內存和時間。 – Newbi3
如果你堅持使用這個腳本,我會建議在你的'php.ini'文件中設置內存限制,並且可以修復它。但它比使用專門的數據庫ETL(提取轉換加載)工具要慢很多,這些工具內置在TOAD,Sequel Pro和其他DB工具中,這些工具不是用PHP編寫的,並專門用於此目的。 – Newbi3
在這個項目中使用外部工具是非常不可取的。 –