使用查询而不使用mysqldump备份数据库

18

我想将我的数据库导出到文件。

由于某些网站主机不允许远程或命令行访问,因此我必须使用一系列查询来完成这项工作。

所有相关的问题都说“使用 mysqldump”,这是一个很棒的工具,但我没有命令行访问该数据库。

我希望同时创建CREATEINSERT命令-基本上与mysqldump相同的性能。是否应该使用SELECT INTO OUTFILE,或者我是否忽略了其他方案-或者可能不可能?


1
更改您的托管选项以获取MySQL转储。 - Basile Starynkevitch
1
“你是说你做不到这个吗?”如果是这样,那我猜你想要模仿phpMyAdmin在导出表时的做法。 - Prix
@Prix:你粗体的链接使用了 mysqldump,而这正是 OP 想要避免的。 - Basile Starynkevitch
@BasileStarynkevitch,希望您能看到粗体链接中的“无法”部分,而且后续链接也很直接明了。 - Prix
2
@Steve 说实话,我认为你不必放弃它,用 PHP 或 Perl 自己制作相当容易,列出表,显示它们是如何创建的并存储,然后查询每个表中的所有数据并进行预格式化。 - Prix
显示剩余16条评论
3个回答

28

使用 mysqldump-php,它是一个纯 PHP 解决方案,用于在基本到中等复杂度的用例中复制 mysqldump 可执行文件的功能 - 我明白您可能没有远程 CLI 和/或 mysql 直接访问权限,但只要您可以通过主机上的 httpd 上的 HTTP 请求执行它,它就可以工作:

因此,您应该能够直接从 /www/ 中的安全目录运行以下纯 PHP 脚本,并在那里编写输出文件并使用 wget 获取它。

mysqldump-php - GitHub 上的纯 PHP mysqldump

PHP 示例:

<?php
require('database_connection.php');
require('mysql-dump.php')
$dumpSettings = array(
    'include-tables' => array('table1', 'table2'),
    'exclude-tables' => array('table3', 'table4'),
    'compress' => CompressMethod::GZIP, /* CompressMethod::[GZIP, BZIP2, NONE] */
    'no-data' => false,            
    'add-drop-table' => false,      
    'single-transaction' => true,   
    'lock-tables' => false,        
    'add-locks' => true,            
    'extended-insert' => true      
);

$dump = new MySQLDump('database','database_user','database_pass','localhost', $dumpSettings);
$dump->start('forum_dump.sql.gz');
    ?>

这很有可能是个美好的事情。我已经转向另一个问题,但稍后会回来看看这个。会好好研究的,谢谢。 - Ben
那真的是省时的。谢谢你。 - Mandrake
第二行缺少分号 - 我如何在不添加所需的60个字符的情况下修复它? - theremin
非常感激这个库。当我移动服务器时,我遇到了很多mysqldump权限和路径问题,我一直很难解决。但现在我改用了这个库做法。 - shababhsiddique

4

如果您的主机限制了您的操作,您可能需要采取一种相当极端的方法。使用主机提供的任何脚本选项,您可以轻松实现此目标。您可以创建一个仅您知道且足够安全以防止未经授权访问的安全网页或纯文本转储链接。编写构建页面/文本内容的脚本可以遵循以下步骤:

对于您想要备份的每个数据库:

  • 步骤1:运行SHOW TABLES

  • 步骤2:对于以上查询返回的每个表名,运行SHOW CREATE TABLE以获取创建语句,您可以在另一个服务器上运行该语句来重新创建表,并将结果输出到网页。您可能需要在这些查询的结果中生成的每个创建语句之前添加“DROP TABLE X IF EXISTS;”(不要在查询输入中添加!)。

  • 步骤3:再次针对步骤1返回的每个表名运行SELECT *查询并捕获完整结果。您需要对此查询结果应用批量转换,以将每行转换为INSERT INTO tblX语句,并将最终转换后的结果输出到网页/文本文件下载。

最终网页/文本下载将输出所有带有“drop table if exists”保护的创建语句和插入语句。将输出保存到您自己的机器上作为“.sql”文件,并根据需要在任何备份主机上执行。
很抱歉您必须完成这个任务。请注意,保留您所需的mysql用户帐户是完全不同的事情。

1
你应该感到抱歉,鲍勃。>:( 只是开玩笑。谢谢你的帮助。似乎我忘记了一些基本的东西,但是找不到是什么。唉。 - Ben
好的,不是用户账户,谢谢,我想要转储整个东西及其键和创建语句。 - Ben
未来的用户请注意:虽然我已经接受了这个答案作为最可能的方法,但我实际上并没有尝试过(抱歉)。还是谢谢你,Bob。 - Ben
@Steve:没问题。这只是一个最后的备选方案。希望有人能为你的情况提供更好的解决方案。 - bob-the-destroyer

1
在您的Web服务器上使用/安装PhpMySQLAdmin并单击导出。许多Web主机已经为您提供了预配置的服务,如果您没有安装它(纯PHP),则很容易安装:http://www.phpmyadmin.net/ 这使您可以快速轻松地导出数据库以及执行其他繁琐的数据库操作 - 并且它适用于旧版本的PHP <5.3(与此处提供的另一个答案Mysqldump.php不同)。
我知道问题陈述了“使用查询”,但我认为重点在于寻找任何必要的方法,当无法使用shell访问时 - 这就是我来到这个页面的方式,而PhpMyAdmin拯救了我!

1
请注意,您并不总是拥有PHP,并且也不一定想安装它。如果PHP服务仅用于管理目的,则某些人可能还存在安全问题 - 因此在安装时,请务必正确配置它。 - Alex
phpMyAdmin不是自动备份的好选择。此外,对于共享数据库,mysqldump也没有价值可供选择使用。 - MohanBabu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接