San*_*ath 11 php shared-hosting database-backups
我想要一个基于PHP的解决方案来备份远程服务器的数据库(只有数据而不是代码)并下载文件.我知道基于Shell的解决方案更适合做这样的事情(在本地系统上运行shell脚本并通过SSH连接到远程系统)但是要求有一个基于PHP的解决方案,其中知道URL和拥有数据库凭据就足够了非技术人员进行备份.PHP脚本可以上载到远程服务器并执行.
以下是我想要的功能: -
应该在所有服务器上工作,存在最大可能的限制(我知道一些限制,如safe_mode启用exec(),system()功能禁用等).我想要一个非常通用的解决方案,保证可以在任何地方工作.
进程应进行密码验证(请求数据库凭据).
现在,我正在分解事物并从基础开始.以下是我对目前的事情的假设以及一些问题: -
我不知道,如果系统的功能,如exec,system等可以共享主机服务器或不能完全禁止.如果它们被禁用以便它们不能被覆盖,那么这里mysqldump给出的基础解决方案将无法普遍适用.问题 -但是,如果系统功能只能在内部存在的文件上执行,那么解决方案是否可以安全运行?
safe_modesafe_mode_exec_dir
我问了一个关于使用PHP执行此操作的安全风险的问题,并且了解在网站空间中永远不应该创建备份文件(我假设,如果是mysqldump基于解决方案,则需要在下载之前首先创建备份文件).因此,解决方案不应该在那里创建备份文件(如果在其他位置创建,则没有问题).
问题 -但是,共享主机提供商会允许这样做吗?
我检查了各种通用用户贡献的PHP类,如phpmysqldump等,并没有找到mysqldump使用系统命令进行备份的基于解决方案的用法.他们做类似的事情SHOW CREATE TABLE来获取所有表创建,数据插入查询,然后下载这些东西而不实际将其保存为文件(因此没有安全风险).
问题 -我是否正确地得出结论,他们在没有mysqldump像第一点的解决方案中给出的那样简单的情况下完成所有这些事情,因为这不是一个通用且安全的解决方案?
问题 -另外,我读到没有任何好的方法效果很好.我个人只使用这个phpmysqldump,当我尝试使用创建的备份恢复数据库时,它会给我mysql错误.转储文件中的查询与PhpMyAdmin的导出模块创建的查询略有不同.我还检查了一些其他免费用户贡献的PHP类.看起来它们中的大多数都不支持InnoDb支持,因此如果数据库中存在关键约束,则导出中不存在.
问题 - PhpMyAdmin本身的导出功能,如果单独出现,可能是我的解决方案,我想.有没有人知道像这样的稳定库吗?
我认为你应该在你的服务器上安装 phpmyadmin,这将允许你从工作/学校/咖啡馆/等访问你的数据库,MySQL-workbench 更先进,并为你提供更多功能,这样你就可以处理更改结构和编辑任何行/列、关系等等,看看 phpmyadmin 的功能,它拥有大部分(如果不是全部的话)。
我真的推荐 phpMyAdmin,它有很多 SQL 功能,可以帮助您处理涉及 MySQL 数据库的所有事务,如果您使用 innoDB,那么您可以获得更多功能,例如表之间的关系。
上面列出的所有内容都包含在 phpMyAdmin 中,如果您运行的是 debian 或基于 Debian 的系统,只需运行:
root@debian:~ # aptitude install phpmyadmin
root@arch:~ # pacman -S phpmyadmin
Run Code Online (Sandbox Code Playgroud)
顺便说一句:如果您没有使用 Apache 或 lighttpd 作为 http 服务器,您将需要阅读 phpmyadmin 的 conf 文件,然后编写 phpmyadmin 所需的 conf 脚本以与您的 http 服务器一起使用。
MySQL 工作台直观地看到您正在对数据库执行的操作。http://diariolinux.com/wp-content/uploads/2008/08/wb51linuxpreview2a.png
顺便说一句:用于<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);
Run Code Online (Sandbox Code Playgroud)