使用纯PHP5创建MySQL转储文件

4
我是一个有用的助手,可以为您翻译内容。以下是您需要翻译的 IT 技术相关内容:

我正在为我的项目创建一个备份脚本,它将通过 cron 执行。

现在我正在使用:

<?php
include("config.php");

/* Misc */
$pathtobackup = realpath('.');
$backupfolder = realpath("backup");
$sqlfilename = "SQLDUMP-".date("d-m-Y--H-i").".sql";
$backupfilename = "BACKUP-".date("d-m-Y--H-i").".zip";
$backupfilepath = $backupfolder."/".$backupfilename;

/* Systemcall */
exec("/usr/bin/mysqldump -u{$mysqluser} -p{$mysqlpw} -h {$mysqlserver} {$mysqldb}", $sqldata, $fp);

$sqldump = implode("\n", $sqldata);

if ($fp!=0){
    die("could not create mysql dump\n");
}

/* Create Zip */
$zip = new ZipArchive();

if ($zip->open($backupfilepath, ZIPARCHIVE::CREATE)!==TRUE) {
    die("cannot open <{$backupfilepath}>\n");
}


$path = realpath('.');

$iterator  = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathtobackup, FilesystemIterator::SKIP_DOTS));

foreach($iterator as $name=>$object){

    $zip->addFile($name);

}

$zip->addFromString($sqlfilename, $sqldump);

if ($zip->close()!==TRUE) {
    die("cannot write <{$backupfilepath}>\n");
}

?>

但是我想使用纯PHP创建MySQL Dump,以使其更兼容,并能够在其他服务器上使用,其中无法使用systemmysqldump的方法。

我希望您知道一种解决方案,而不使用150个文件库:)

问候, 弗雷德里克


我建议不要这样做,因为转储数据库并不是一项轻松的任务,在SO上询问这个问题并不能真正增强信心。例如,PHPMyAdmin多年来一直在使用PHP进行此操作,但这一直是问题的源泉。 - lanzz
2个回答

1
如果您真的必须这样做,那么在创建此类脚本时,应考虑以下几个mysql查询: SHOW TABLES - 返回所有数据库表名 SHOW CREATE TABLE table_name - 返回用于创建表的SQL查询语句 SHOW PROCEDURE STATUSSHOW FUNCTION STATUS - 返回存储过程和函数列表 SHOW CREATE PROCEDURE procedure_nameSHOW CREATE FUNCTION function_name - 返回用于创建存储过程和函数的查询语句
其余的是通常的SELECTINSERT查询。

0
看这里: https://github.com/ifsnop/mysqldump-php! 它是使用PHP编写的本地解决方案,具有测试功能,支持存储过程,触发器,视图hexblobs,regexps...

您可以使用composer安装它,非常简单:
<?php

use Ifsnop\Mysqldump as IMysqldump;

try {
    $dump = new IMysqldump\Mysqldump('database', 'username', 'password');
    $dump->start('storage/work/dump.sql');
} catch (\Exception $e) {
    echo 'mysqldump-php error: ' . $e->getMessage();
}

?>

它支持高级用户,具有从原始mysqldump复制的许多选项。

所有选项都在github页面上解释,但更多或更少是自动说明的(摘自文档的小片段):

$dumpSettingsDefault = array(
    'include-tables' => array(),
    'exclude-tables' => array(),
    'compress' => 'None',
    'no-data' => false,
    'add-drop-database' => false,
    'add-drop-table' => false,
    'single-transaction' => true,
    'lock-tables' => false,
    'add-locks' => true,
    'extended-insert' => true,
    'disable-foreign-keys-check' => false,
    'where' => '',
    'no-create-info' => false
);

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