11

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

以下是我想要的功能:-

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

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

现在,我正在分解事物并从最基本的开始。以下是我迄今为止对事物的假设和一些问题:-

  1. 我不确定是否可以在共享托管服务器中完全禁用诸如等exec系统功能。system如果它们被禁用以致无法被覆盖,那么此处mysqldump给出的基于解决方案将无法普遍工作。问题 -如果只是这样,系统功能可以在内部存在的文件上执行,该解决方案是否可以安全地工作?
    safe_modesafe_mode_exec_dir

  2. 我问了一个关于使用 PHP 执行此操作的安全风险的问题,并了解不应该mysqldump在网络空间中创建备份文件(我假设,在基于解决方案的情况下,需要先创建备份文件,然后再下载)。因此,该解决方案不需要在那里创建备份文件(如果在其他位置创建也没有问题)。
    问题 -但是,共享主机提供商会允许这样做吗?

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

4

3 回答 3

2

我认为你应该做的:

我认为您应该在您的服务器上安装 phpmyadmin,这将允许您从工作/学校/咖啡馆/等访问您的数据库,MySQL-workbench 更高级并为您提供更多功能,因此您可以处理更改结构和编辑任何行/columns、relationship 等等,看看 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 工作台。它是跨平台的,效果很好。

MySQL 工作台可以直观地看到您对数据库所做的工作。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);
于 2011-01-19T18:27:33.797 回答
0

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

于 2011-01-20T20:51:04.213 回答
0

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

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

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

于 2011-01-26T17:01:33.760 回答