4

我正在为我的项目创建一个备份脚本,该脚本将通过 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 文件库的解决方案 :)

问候,弗雷德里克

4

2 回答 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-return 用于创建存储过程和函数的查询

其余的是通常SELECTINSERT查询。

于 2012-06-03T20:46:39.390 回答
0

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

您可以使用 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
);
于 2017-03-27T23:07:19.977 回答