在纯 PHP5 中创建 MySQL 转储


create MySQL dump in pure PHP5

我正在为我的项目创建一个备份脚本,该脚本将通过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转储,以使其更加兼容,并且也可以在其他服务器上使用它,而其他服务器无法使用systemmysqldump

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

问候弗雷德里克

如果您真的必须这样做,那么在创建此类脚本时应考虑以下几个mysql查询:

SHOW TABLES - 返回所有数据库表名

SHOW CREATE TABLE table_name返回用于创建表的 SQL 查询

SHOW PROCEDURE STATUSSHOW FUNCTION STATUS - 返回存储过程和函数的列表

用于创建存储过程和函数的SHOW CREATE PROCEDURE procedure_nameSHOW CREATE FUNCTION function_name返回查询

其余的通常是SELECTINSERT查询。

看看这里: https://github.com/ifsnop/mysqldump-php !它是一个用php编写的本机解决方案,带有测试,支持存储过程,触发器,视图hexblobs,正则表达式...

您可以使用作曲家安装它,就像执行以下操作一样简单:

<?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
);