【问题标题】:backup MySQL using PHP only (with server restrictions)仅使用 PHP 备份 MySQL(有服务器限制)
【发布时间】:2014-08-21 19:14:01
【问题描述】:

我正在尝试使用 PHP 备份我的 MySQL 数据库。 我想将它备份到一个 .SQL 中,这样如果出现任何问题,我可以将它导入 MySQL。

我在尝试使用ExecSystem 时发现的唯一问题是,这些功能已被我的主机关闭,出于安全原因,他们不会激活它。

我也不能使用:SELECT ... INTO OUTFILE.

我的想法是: 是否可以使用SELECT * FROM [Table] 并从该查询中获取一个 php 数组。 然后将这些数据推送到 SQL 文件中?

即使我尝试了一些方法,我也找不到有关此的信息。 我知道你可以制作一个包含正确文本的 .txt 文件并将其称为 .sql 但我需要手动编写所有内容,这需要一段时间。

或者他们是更好的方法吗?

提前致谢!

【问题讨论】:

  • 为什么不要求您的托管服务提供商备份您的数据库?这是一个常见的要求。
  • 在 PHP 中从表生成 SQL 脚本非常复杂。它可以完成(参见 phpMyAdmin),但需要付出很多努力。为什么不直接导入/导出为 CSV?
  • @HAL9000 因为他们已经在进行备份,但我不想依赖他们,因为当我现在需要支持时需要 20 - 30 小时,我不希望我的客户等待时间:)
  • @ToBe CSV 也将是一个完美的选择,对 CSV 有任何意见吗?
  • 如果您有真正的客户,那么您应该通过提供适当支持和定义响应时间的提供商来托管这些东西。

标签: php mysql


【解决方案1】:

$tables 可以是 * 或表名数组或以逗号分隔的表名列表

function backup_tables($host,$user,$pass,$name,$tables = '*') {

    $link = mysql_connect($host,$user,$pass); 
    mysql_select_db($name,$link); 
  mysql_query('SET CHARACTER SET cp1250');
    mysql_query('SET NAMES cp1250');


    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);
    }

    foreach($tables as $table) {
        $result = mysql_query('SELECT * FROM `'.$table.'`');
        $num_fields = mysql_num_fields($result);

        $return.= 'DROP TABLE IF EXISTS `'.$table.'`;';
        $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE `'.$table.'`'));
        $return.= "\n\n".$row2[1].";\n\n";

        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";
    }

    $handle = fopen('db-backup-'.date('Y-m-d-H-i-s').'-'.(md5(implode(',',$tables))).'.sql','w+');
    fwrite($handle,$return);
    fclose($handle);
} 

【讨论】:

  • 请不要在任何代码甚至代码示例中使用除utf8 或其子项之外的任何内容。人们会遇到很多麻烦......
  • ToBe:我知道,但我不得不使用它,因为我在一个非常旧的 CMS 上制作了这个备份脚本,该 CMS 将数据存储在 cp1250 的 db 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2010-12-07
相关资源
最近更新 更多