今天看了下discuz的数据库备分功能,感觉是其它程序所比不上的,不知大家有没同感。
虽然discuz整体构架跟某些程序比差的很远,但是不可否认,部分功能做的还是很不错的,我最看中的就是它的备分还原数据库功能,这是某些构架很好的程序都所不及的。
原理:判断mysql版本号是否大于4.1,若大于则替换SQL建表语句
<?php
$sql = syntablestruct(trim($sql), $db->version() > '4.1', $dbcharset);
//此函数用来替换不同版本SQL文件建表语句
function syntablestruct($sql, $version, $dbcharset) {
if(strpos(trim(substr($sql, 0, 18)), 'CREATE TABLE') === FALSE) {
return $sql;
}
$sqlversion = strpos($sql, 'ENGINE=') === FALSE ? FALSE : TRUE;
if($sqlversion === $version) {
return $sqlversion && $dbcharset ? preg_replace(array('/ character set w+/i', '/ collate w+/i', "/DEFAULT CHARSET=w+/is"), array('', '', "DEFAULT CHARSET=$dbcharset"), $sql) : $sql;
}
if($version) {
return preg_replace(array('/TYPE=HEAP/i', '/TYPE=(w+)/is'), array("ENGINE=MEMORY DEFAULT CHARSET=$dbcharset", "ENGINE=\1 DEFAULT CHARSET=$dbcharset"), $sql);
} else {
return preg_replace(array('/character set w+/i', '/collate w+/i', '/ENGINE=MEMORY/i', '/s*DEFAULT CHARSET=w+/is', '/s*COLLATE=w+/is', '/ENGINE=(w+)(.*)/is'), array('', '', 'ENGINE=HEAP', '', '', 'TYPE=\1\2'), $sql);
}
}
?>
下面是利用MYSQL dump备分数据:
原理:同样是判断mysql版本号是否大于4.1,再根据config.php文件中配置的mysql数据库信息可实现备分,但必须PHP支持shell_exec函数。
<?php
$dumpfile = addslashes(dirname(dirname(__FILE__))).'/'.$backupfilename.'.sql'; //备分文件路径
@unlink($dumpfile); //先删除文件,若文件已存在
$mysqlbin = $mysql_base == '/' ? '' : addslashes($mysql_base).'bin/';
@shell_exec($mysqlbin.'mysqldump --force --quick '.($db->version() > '4.1' ? '--skip-opt --create-options' : '-all').' --add-drop-table'.($extendins == 1 ? ' --extended-insert' : '').''.($db->version() > '4.1' && $sqlcompat == 'MYSQL40' ? ' --compatible=mysql40' : '').' --host="'.$dbhost.($dbport ? (is_numeric($dbport) ? ' --port='.$dbport : ' --socket="'.$dbport.'"') : '').'" --user="'.$dbuser.'" --password="'.$dbpw.'" "'.$dbname.'" '.$tablesstr.' > '.$dumpfile);
?>
[ 本帖最后由 zdw999 于 2008-5-16 06:24 PM 编辑 ]