我想要一个基于PHP的解决方案来备份远程服务器的数据库(只有数据而不是代码)并下载文件。我知道基于Shell的解决方案更适合做这样的事情(在本地系统上运行shell脚本并通过SSH连接到远程系统)但是要求有一个基于PHP的解决方案,其中知道URL和拥有数据库凭据就足够了非技术人员进行备份。 PHP脚本可以上传到远程服务器并执行。
以下是我想要的功能: -
在最大可能限制的情况下,应该可以在所有服务器上运行(我知道启用safe_mode
的一些限制,exec()
,system()
功能被禁用等等。)。我想要一个非常通用的解决方案,保证可以在任何地方使用。
进程应进行密码验证(请求数据库凭据)。
现在,我正在分解事物并从基础开始。以下是我对目前的事情的假设和一些问题: -
我不确定是否可以在共享托管服务器中完全禁用exec
,system
等系统功能。如果他们被禁用以便无法覆盖,那么基于mysqldump
的解决方案here将不会普遍适用。
问题 - 但是,如果仅启用safe_mode
以便系统功能可以对safe_mode_exec_dir
内的文件执行,那么解决方案是否可以安全运行?
我问了一个关于security risks of doing this using PHP的问题,并且明白永远不应该创建备份文件(我假设,如果基于mysqldump
的解决方案,需要先创建备份文件在网站空间中下载)。因此,解决方案不应该在那里创建备份文件(如果在其他位置创建,则没有问题)
问题但是,共享托管服务提供商会允许这样做吗?
我检查了各种通用用户贡献的PHP类,如phpmysqldump等,并没有找到使用系统命令进行备份的基于mysqldump
的解决方案的用法。他们执行SHOW CREATE TABLE
等操作来获取所有表创建,数据插入查询,然后下载这些内容而不将其实际保存为文件(因此没有安全风险)。
问题 - 我是否正确地得出结论,他们在没有按照第一点的解决方案中给出的简单mysqldump
执行所有这些操作,因为这不是一个通用且安全的解决方案?<登记/>
问题 - 另外,我读到没有任何好的工作正常。我个人只使用了这个phpmysqldump,当我尝试使用创建的备份恢复数据库时,它给了我mysql错误。转储文件中的查询与PhpMyAdmin的导出模块创建的查询略有不同。我还检查了一些其他免费用户贡献的PHP类。看起来它们中的大多数都不支持InnoDb支持,因此,如果数据库中存在关键约束,则导出中不存在。
问题 - 我猜,PhpMyAdmin本身的导出功能(如果单独存在)可能是我的解决方案。有没有人知道像这样的稳定库?
答案 0 :(得分:2)
我认为您应该在您的服务器上安装phpmyadmin,这将允许您从工作/学校/咖啡馆/等访问您的数据库,MySQL-workbench更高级,并为您提供更多功能,以便您可以处理更改结构和编辑任何行/列,关系等等,看看phpmyadmin的功能,如果不是全部的话。
我真的推荐phpMyAdmin它有许多SQL功能可以帮助你处理MySQL数据库中的所有内容,如果你使用的是innoDB,那么你会得到更多的功能,比如表之间的关系。
上面列出的所有内容都包含在phpMyAdmin中,如果您运行的是debian或基于Debian的系统,只需运行:
root@debian:~ # aptitude install phpmyadmin
root@arch:~ # pacman -S phpmyadmin
顺便说一句:如果您没有使用Apache或lighttpd作为http-server,您需要读取phpmyadmin的conf文件,然后为phpmyadmin编写所需的conf脚本以使用您的http服务器。
顺便说一句:使用<ctrl>+<G>
来转发工程师数据库,我花了一些时间来找到这个。
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);
答案 1 :(得分:0)
PHPMyAdmin通常是一个很好的解决方案,但如果您只想进行备份,可能会有些过分。如果你想要一个通用的解决方案,那么绝对不要依赖于exec可用。 PHP结合正确的SQL查询(正如您在第3点中所述)可以为您提供所需的所有信息,并始终有效。
答案 2 :(得分:0)
根据我自己的经验,依赖基于PHP的备份解决方案是非常糟糕的主意。如果您正在处理大型备份,PHP很容易失败(由于超时,内存消耗或未定义的内容)。
我们已成功在我们的un * x服务器上使用Bacula(http://www.bacula.org/en/)多年。我们自己的备份脚本做了我们想做的事情。您需要对服务器进行shell访问。
如果您需要基于PHP的简单备份解决方案,那么最好自己编写。 :)