【问题标题】:General purpose remote data backup and download - including InnoDb support通用远程数据备份和下载 - 包括 InnoDb 支持
【发布时间】:2011-01-17 07:35:52
【问题描述】:

我想要一个基于 PHP 的解决方案来备份远程服务器的数据库(仅数据而不是代码)并下载文件。我知道基于 Shell 的解决方案更适合做这些事情(在本地系统上运行 shell 脚本并通过 SSH 连接到远程系统),但需要有一个基于 PHP 的解决方案,其中知道 URL 并拥有数据库凭据就足够了非技术人员进行备份。 PHP脚本可以上传到远程服务器并执行。

以下是我想要的功能:-

  • 至少应该支持 InnoDb 引擎 - 应该导出外键约束。如果它支持所有其他引擎,则无害。
  • 应该在所有服务器上工作,存在最大可能数量的限制(我知道一些限制,如启用safe_modeexec()system() 功能禁用等)。我想要一个非常通用的解决方案,保证在任何地方都可以工作。

  • 进程应通过密码验证(要求提供数据库凭据)。

现在,我正在分解事物并从最基本的开始。以下是我对目前情况的假设和一些问题:-

  1. 我不确定是否可以在共享托管服务器中完全禁用 execsystem 等系统功能。如果它们被禁用以致无法被覆盖,那么基于mysqldump 的解决方案给定here 将无法普遍工作。
    问题 - 但是如果只有safe_mode 在这样的系统上函数可以在safe_mode_exec_dir 中存在的文件上执行,该解决方案能否安全运行?

  2. 我问了一个关于 security risks of doing this using PHP 的问题,并了解到不应该在网络空间。因此,该解决方案不应该需要在那里创建备份文件(如果在其他位置创建没有问题)。
    问题 - 但是,共享托管服务提供商是否允许这样做?

  3. 我检查了各种通用用户贡献的 PHP 类,如 phpmysqldump 等,但没有找到使用系统命令进行备份的基于 mysqldump 的解决方案的用法。他们会执行SHOW CREATE TABLE 等操作来创建所有表、数据插入查询,然后下载这些内容而不实际将其保存为文件(因此没有安全风险)。
    问题 -我是否正确地得出结论,他们没有按照第一点的解决方案中给出的简单 mysqldump 做所有这些事情,因为这不是通用且安全的解决方案?
    问题 -另外,我读到没有任何好的方法可以很好地工作。我个人只使用了这个phpmysqldump,当我尝试使用创建的备份恢复数据库时,它给了我 mysql 错误。转储文件中的查询看起来也与 PhpMyAdmin 的导出模块创建的查询有些不同。我还检查了其他一些免费用户贡献的 PHP 类。看起来它们中的大多数不支持 InnoDb 支持,因此外键约束(如果存在于数据库中)不会出现在导出中。
    问题 - PhpMyAdmin 本身的导出功能(如果存在)我想,单独可能是我的解决方案。有人知道像这样的稳定​​库吗?

【问题讨论】:

  • 好问题。相关(但更多关于文件备份方面):stackoverflow.com/questions/4576025/web-site-backup-in-php
  • @Pekka 谢谢。是的,我检查了您的问题,但我认为它涉及一些更高级的问题。我仍然坚持更基本的事情,坦率地说,你的问题似乎超出了我的想象 :) 如果你至少可以清除我在这里提出的一些基本疑问?谢谢
  • mysqldump 默认写入标准输出,因此您实际上不需要临时文件。更不用说,如果处理得当,临时人员并不是真正的安全风险。
  • @derobert:你的意思是在mysqldump的情况下不需要创建实际的临时文件并且可以直接下载输出吗?您还可以提供更多关于如何正确执行以避免安全风险的线索吗?谢谢
  • @Sandeepan 是的,这是一个复杂的问题 :) 不过一般来说:如果临时文件存储在 Web 根目录之外,则不是问题。大多数物有所值的供应商都提供了这样做的可能性。您不能依赖 mysqldump 出现在共享主机包上,这就是这些脚本使用 SHOW CREATE TABLE 等的原因。但是,无论您最终采用何种解决方案,确保彻底测试它。我见过并使用过 PHP mysql 备份脚本,这些脚本只会产生损坏的数据。

标签: php shared-hosting database-backups


【解决方案1】:

我认为你应该怎么做:

我认为您应该在您的服务器上安装 phpmyadmin,这将允许您从工作/学校/咖啡馆/等访问您的数据库,MySQL-workbench 更高级并为您提供更多功能,因此您可以处理更改结构和编辑任何行/列、关系等等,看看 phpmyadmin 的功能,如果不是全部的话,它也是最多的。

phpmyadmin 它适用于任何网络浏览器:

我真的推荐 phpMyAdmin,它有许多 SQL 功能,可以帮助您处理涉及 MySQL 数据库的所有事情,如果您使用的是 innoDB,那么您可以获得更多功能,例如表之间的关系。

phpMyAdmin具有以下特点:

  • 直观的网络界面
  • 支持大多数 MySQL 功能:
  • 浏览和删除数据库、表、视图、字段和索引
  • 创建、复制、删除、重命名和更改数据库、表、字段和索引
  • 维护服务器、数据库和表,并提供服务器配置建议
  • 执行、编辑和收藏任何 SQL 语句,甚至是批处理查询
  • 管理 MySQL 用户和权限
  • 管理存储过程和触发器
  • 从 CSV 和 SQL 导入数据
  • 将数据导出为各种格式:CSV、SQL、XML、PDF、ISO/IEC 26300 - OpenDocument 文本和电子表格、Word、Excel、LATEX 等
  • 管理多台服务器
  • 为您的数据库布局创建 PDF 图形
  • 使用 Query-by-example (QBE) 创建复杂查询
  • 在数据库或其子集中全局搜索
  • 使用一组预定义函数将存储的数据转换为任何格式,例如将 BLOB 数据显示为图像或下载链接
  • 还有更多...

您上面列出的所有内容都包含在 phpMyAdmin 中,如果您运行的是 debian 或基于 Debian 的系统,只需运行:

root@debian:~ # aptitude install phpmyadmin
root@arch:~ # pacman -S phpmyadmin

顺便说一句:如果您不使用 Apache 或 lighttpd 作为 http-server,则需要通读 phpmyadmin 的 conf 文件,然后为 phpmyadmin 编写所需的 conf 脚本以使用您的 http-server。

MySQL workbench。它是跨平台的,效果很好。

MySQL workbench visurally see what you are doing with your database. http://diariolinux.com/wp-content/uploads/2008/08/wb51linuxpreview2a.png

顺便说一句:使用<ctrl>+<G> 对数据库进行正向工程,我花了一段时间才找到这样做的。

配置后即可运行的独立 perl 文件:(未经测试)

use DBI;
my $user = "username";   # MySQL Username
my $pass = "xxxx";       # MySQL Password
my $host = "localhost";  # MySQL Host
my $mydb = "zzzz";       # MySQL Database
my $file = "test.sql";   # Import file
my $sqlServer = "mysql"; # What sql-server are we using, oracle/mysql/etc
    # I would use the following method to configure it, though the above works fine too.
($user,$pass,$host,$mydb,$file,sqlServer) = (
    "username",  # MySQL Username
    "password",  # MySQL Password
    "localhost", # MySQL Host
    "myDB",      # MySQL Database
    "test.sql",  # Imported file
    "mysql"      # What sql-server are we using, oracle/mysql/etc
);
    # Now lets connect to the MySQL server.
my $dbh  = DBI->connect("DBI:$sqlServer:$mydb:$host",$user,$pass)or die DBI->errstr();
    # Lets now open the .sql file.
open(INPUT,$file);
    # Now lets run each sql-statement.
while ($line = <INPUT>){
    print $line;
    $dbh->do($line);
    print "Query failed (run manually):\n$line\n\n ". $dbh->errstr()."\n" if $dbh->errstr();
}
    # Now close the file.
close(INPUT);

【讨论】:

  • 我很清楚PhpMyAdmin支持的功能,我已经提到了PhpMyAdmin的导出模块。 PhpMyAdmin 的其他功能实际上并不能帮助解决这个问题。只有一个有效的导出脚本(就像我说过的,PhpMyAdmin 的一个单独的工作导出模块)才是一个很好的解决方案(单个脚本而不是整个 Web 应用程序)。如果您知道任何类似的工作脚本,我将不胜感激。谢谢。
  • @Sandeepan @Sandeepan Nath :我在上面添加了另一个条目,我还将包含一个单独的脚本,它将为 SQL 脚本提供一个参数。虽然 MySQL 工作台是最好的选择,但我知道它是另一个程序,但它适用于大多数(如果不是全部)操作系统。
  • @Sandeepan Nath :但首先我需要知道您是否使用 perl 运行操作系统?如果是的话,我可以给你一个简单的脚本,它接受一个参数并将 SQL 命令读出到 mysql。
【解决方案2】:

一般来说,PHPMyAdmin 是一个很好的解决方案,但如果您只想进行备份,则可能会有点矫枉过正。如果您想要一个通用的解决方案,那么绝对不要依赖 exec 可用。 PHP 与正确的 SQL 查询相结合(正如您在第 3 点中所指出的那样)可以为您提供所需的所有信息,并且将始终有效。

【讨论】:

  • 如果您知道任何此类经过适当测试的脚本,我将不胜感激。谢谢。
  • @Sandeepan Nath 自己写一个很容易。我已经为生产环境完成了它。很抱歉,我无法提供详细信息,但如果您了解 SQL 的使用方法,您可以计算出运行所需的查询。查找 DESCRIBE mysql 查询以获取表的信息,这可能是唯一棘手的地方。
【解决方案3】:

根据我自己的经验,依赖基于 PHP 的备份解决方案是非常糟糕的主意。如果您正在处理大型备份,PHP 很容易失败(由于超时、内存消耗或未定义的原因)。

多年来,我们一直在我们的 un*x 服务器上成功使用 Bacula (http://www.bacula.org/en/)。做了我们自己的备份脚本来做我们想做的任何事情。您需要对服务器进行 shell 访问。

如果您需要基于 php 的简单备份解决方案,最好自己编写。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多