'数据库备份', 'restore' => '数据库恢复', 'optimize' => '数据库优化', 'check' => '数据库检查', 'repair' => '数据库修复');
!(in_array($part, array_keys($allowpart))) && ($part = 'backup');
$here = $allowpart[$part];
$action = (isset($action) ? trim($action) : '');
$tabletype = ('4.1' < $db->version() ? 'Engine' : 'Type');
$version = MPS_VERSION;
if ($admin_cityid) {
write_msg('您没有权限访问该页!');
}
$backupdir = $mymps_global['cfg_backup_dir'];
if ($part == 'backup') {
chk_admin_purview('purview_数据库备份');
if ($action != 'doaction') {
$mymps_tables = fetchtablelist($db_mymps);
$defaultfilename = date('ymd') . '_' . random(8);
include mymps_tpl('db_' . $part);
}
else {
$db->query('SET SQL_QUOTE_SHOW_CREATE=0', 'SILENT');
if (!($filename) || preg_match('/(\\.)(exe|jsp|asp|aspx|cgi|fcgi|pl)(\\.|$)/i', $filename)) {
write_msg('导出文件格式非法');
}
$time = GetTime($timestamp);
if ($type == 'mymps') {
$tables = arraykeys2(fetchtablelist($db_mymps), 'Name');
}
else if ($type == 'custom') {
$tables = array();
if (empty($setup)) {
if ($tables = $db->fetch_first('SELECT value FROM `' . $db_mymps . 'config` WHERE description=\'custombackup\'')) {
$tables = ($charset == 'utf-8' ? utf8_unserialize($tables['value']) : unserialize($tables['value']));
}
}
else {
$customtablesnew = (empty($customtables) ? '' : addslashes(serialize($customtables)));
$db->query('DELETE FROM `' . $db_mymps . 'config` WHERE description = \'custombackup\' AND type = \'database\'');
$db->query('INSERT INTO `' . $db_mymps . 'config` (description, value, type) VALUES (\'custombackup\', \'' . $customtablesnew . '\',\'database\')');
$tables = &$customtables;
}
if (!(is_array($tables)) || empty($tables)) {
write_msg('请选择你要备份的数据库表');
}
}
$volume = intval($volume) + 1;
$idstring = '# Identify: ' . base64_encode($timestamp . ',' . $version . ',' . $type . ',' . $method . ',' . $volume) . "\n";
if($sqlcharset==""){$sqlcharset=$dbcharset;}
$dumpcharset = ($sqlcharset ? $sqlcharset : $dbcharset);
//echo $dumpcharset;
//die();
$setnames = ($sqlcharset && ('4.1' < $db->version()) && (!($sqlcompat) || ($sqlcompat == 'MYSQL41')) ? 'SET NAMES \'' . $dumpcharset . '\';' . "\n\n" : '');
if ('4.1' < $db->version()) {
if ($sqlcharset) {
$db->query('SET NAMES \'' . $sqlcharset . '\';' . "\n\n");
}
if ($sqlcompat == 'MYSQL40') {
$db->query('SET SQL_MODE=\'MYSQL40\'');
}
else if ($sqlcompat == 'MYSQL41') {
$db->query('SET SQL_MODE=\'\'');
}
}
$backupfilename = MYMPS_ROOT . $backupdir . '/' . str_replace(array('/', '\\', '.'), '', $filename);
$sqldump = '';
$tableid = intval($tableid);
$startfrom = intval($startfrom);
$complete = TRUE;
for(; $complete && $tableid < count($tables) && strlen($sqldump) + 500 < $sizelimit * 1000; $tableid++) {
$sqldump .= sqldumptable($tables[$tableid], $startfrom, strlen($sqldump));
if($complete) {
$startfrom = 0;
}
}
$dumpfile = $backupfilename . '-%s' . '.sql';
if(!($complete)){$tableid--;}
if (trim($sqldump)) {
$sqldump = $idstring . '# ' . "\n" . '# Mymps Multi-Volume Data Dump Vol.' . $volume . "\n" . '# Version: Mymps ' . $version . "\n" . '# Time: ' . $time . "\n" . '# Type: ' . $type . "\n" . '# Table Prefix: ' . $db_mymps . "\n" . '#' . "\n" . '# Mymps Home: http://www.mymps.com.cn' . "\n" . '# Please visit our website for newest infomation about Mymps' . "\n" . '# --------------------------------------------------------' . "\n\n\n" . $setnames . $sqldump;
$dumpfilename = sprintf($dumpfile, $volume);
@$fp = fopen($dumpfilename, 'wb');
@flock($fp, 2);
if (@!(fwrite($fp, $sqldump))) {
@fclose($fp);
write_msg('数据库备份失败,请检查备份目录的读写权限');
}
else {
fclose($fp);
unset($sqldump);
unset($content);
write_msg('数据文件 #' . $volume . ' 备份成功,系统将自动继续...', '?part=backup&type=' . rawurlencode($type) . '&filename=' . rawurlencode($filename) . '&method=multivol&sizelimit=' . rawurlencode($sizelimit) . '&volume=' . rawurlencode($volume) . '&tableid=' . rawurlencode($tableid) . '&startfrom=' . rawurlencode($startrow) . '&extendins=' . rawurlencode($extendins) . '&sqlcharset=' . rawurlencode($sqlcharset) . '&sqlcompat=' . rawurlencode($sqlcompat) . '&action=doaction');
}
}
else {
$volume--;
for ($i = 1; $i <= $volume; $i++) {
$filename = sprintf($dumpfile, $i);
$filelist .= $filename . '
';
}
$db->query('DELETE FROM `' . $db_mymps . 'config` WHERE description = \'latestbackup\' AND type = \'database\'');
$db->query('INSERT INTO `' . $db_mymps . 'config` (description, value, type) VALUES (\'latestbackup\', \'' . $timestamp . '\',\'database\')');
write_msg('恭喜您,全部 ' . $volume . ' 个备份文件成功创建,备份完成。
' . $filelist, 'olmsg');
}
}
}
else if ($part == 'restore') {
chk_admin_purview('purview_数据库还原');
if ($action == 'dorestore') {
$readerror = 0;
$datafile = '';
if ($from == 'server') {
$datafile = $datafile_server;
}
if (@$fp = fopen($datafile, 'rb')) {
$sqldump = fgets($fp, 256);
$identify = explode(',', base64_decode(preg_replace('/^# Identify:\\s*(\\w+).*/s', '\\1', $sqldump)));
$dumpinfo = array('method' => $identify[3], 'volume' => intval($identify[4]));
$sqldump .= fread($fp, filesize($datafile));
fclose($fp);
}
else if ($autoimport) {
updatecaches();
write_msg('恭喜,数据还原操作成功!', 'olmsg');
}
else {
write_msg('很遗憾,数据还原失败。', 'olmsg');
}
$sqlquery = splitsql($sqldump);
unset($sqldump);
foreach ($sqlquery as $sql ) {
$sql = syntablestruct(trim($sql), '4.1' < $db->version(), $dbcharset);
if ($sql != '') {
$db->query($sql, 'SILENT');
if (($sqlerror = $db->error()) && ($db->errno() != 1062)) {
$db->halt('MySQL Query Error', $sql);
}
}
}
$datafile_next = preg_replace('/-(' . $dumpinfo['volume'] . ')(\\..+)$/', '-' . ($dumpinfo['volume'] + 1) . '\\2', $datafile_server);
if ($dumpinfo['volume'] == 1) {
write_msg('分卷数据第一卷成功导入数据库。
您需要自动导入本次备份的其他分卷吗?
', 'olmsg');
}
else if ($autoimport) {
write_msg('数据文件 ' . $dumpinfo['volume'] . '# 成功导入,程序将自动继续。', '?part=restore&from=server&datafile_server=' . $datafile_next . '&autoimport=yes&action=dorestore');
}
else {
updatecaches();
write_msg('恭喜,数据还原操作成功。', 'olmsg');
}
}
else if ($action == 'dodelete') {
if (is_array($delete)) {
foreach ($delete as $filename ) {
$file_path = MYMPS_ROOT . $backupdir . '/' . str_replace(array('/', '\\'), '', $filename);
if (is_file($file_path)) {
@unlink($file_path);
}
else {
$i = 1;
while (1) {
$file_path = MYMPS_ROOT . $backupdir . '/' . str_replace(array('/', '\\'), '', $filename . '-' . $i . '.sql');
if (is_file($file_path)) {
@unlink($file_path);
$i++;
}
else {
break;
}
}
}
}
write_msg('恭喜,成功删除指定备份文件。', 'database.php?part=restore');
}
else {
write_msg('操作失败,请检查备份目录的文件读写权限。');
}
}
else {
$backuptype = array('mymps' => 'Mymps全部数据表', 'custom' => '自定义备份');
$exportlog = $exportsize = $exportziplog = array();
if (is_dir(MYMPS_ROOT . $backupdir)) {
$dir = dir(MYMPS_ROOT . $backupdir);
while ($entry = $dir->read()) {
$entry = MYMPS_ROOT . $backupdir . '/' . $entry;
if (is_file($entry)) {
if (preg_match('/\\.sql$/i', $entry)) {
$filesize = filesize($entry);
$fp = fopen($entry, 'rb');
$identify = explode(',', base64_decode(preg_replace('/^# Identify:\\s*(\\w+).*/s', '\\1', fgets($fp, 256))));
fclose($fp);
$key = preg_replace('/^(.+?)(\\-\\d+)\\.sql$/i', '\\1', basename($entry));
$exportlog[$key][$identify[4]] = array('version' => $identify[1], 'type' => $identify[2], 'method' => $identify[3], 'volume' => $identify[4], 'filename' => $entry, 'dateline' => filemtime($entry), 'size' => $filesize);
$exportsize[$key] += $filesize;
}
}
}
$dir->close();
}
else {
write_msg('无法识别备份的数据库文件目录');
}
include mymps_tpl('db_' . $part);
}
}
else if ($part == 'optimize') {
chk_admin_purview('purview_数据库维护');
@set_time_limit(0);
$optimizetable = '';
$totalsize = 0;
$tablearray = array($db_mymps);
include !(submit_check('optimize_submit')) ? mymps_tpl('db_' . $part) : mymps_tpl('db_result');
}
else if ($part == 'check') {
chk_admin_purview('purview_数据库维护');
$optimizetable = '';
$totalsize = 0;
$tablearray = array($db_mymps);
include !(submit_check('check_submit')) ? mymps_tpl('db_' . $part) : mymps_tpl('db_result');
}
else if ($part == 'repair') {
chk_admin_purview('purview_数据库维护');
$optimizetable = '';
$totalsize = 0;
$tablearray = array($db_mymps);
include !(submit_check('repair_submit')) ? mymps_tpl('db_' . $part) : mymps_tpl('db_result');
}
function createtable($sql, $db_charset)
{
$type = strtoupper(preg_replace('/^\\s*CREATE TABLE\\s+.+\\s+\\(.+?\\).*(ENGINE|TYPE)\\s*=\\s*([a-z]+?).*$/isU', '\\2', $sql));
$type = (in_array($type, array('MYISAM', 'HEAP')) ? $type : 'MYISAM');
return preg_replace('/^\\s*(CREATE TABLE\\s+.+\\s+\\(.+?\\)).*$/isU', '\\1', $sql) . ('4.1' < mysql_get_server_info() ? ' ENGINE=' . $type . ' DEFAULT CHARSET=' . $db_charset : ' TYPE=' . $type);
}
function arraykeys2($array, $key2)
{
$return = array();
foreach ($array as $val ) {
$return[] = $val[$key2];
}
return $return;
}
function syntablestruct($sql, $version, $db_charset)
{
if (strpos(trim(substr($sql, 0, 18)), 'CREATE TABLE') === false) {
return $sql;
}
$sqlversion = (strpos($sql, 'ENGINE=') === false ? false : true);
if ($sqlversion === $version) {
return $sqlversion && $db_charset ? preg_replace(array('/ character set \\w+/i', '/ collate \\w+/i', '/DEFAULT CHARSET=\\w+/is'), array('', '', 'DEFAULT CHARSET=' . $db_charset), $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);
}
}
function sqldumptable($table, $startfrom = 0, $currsize = 0)
{
global $db;
global $sizelimit;
global $startrow;
global $extendins;
global $sqlcompat;
global $sqlcharset;
global $dumpcharset;
global $usehex;
global $complete;
global $excepttables;
global $dbcharset;
$offset = 300;
$tabledump = '';
$tablefields = array();
$db->query("set names ".$dbcharset.";");
$query = $db->query('SHOW FULL COLUMNS FROM ' . $table, 'SILENT');
if (!($query) && ($db->errno() == 1146)) {
return NULL;
}
else if (!($query)) {
$usehex = false;
}
else {
while ($fieldrow = $db->fetch_array($query)) {
$tablefields[] = $fieldrow;
}
}
if (!($startfrom)) {
$createtable = $db->query('SHOW CREATE TABLE ' . $table, 'SILENT');
if (!($db->error())) {
$tabledump = 'DROP TABLE IF EXISTS ' . $table . ';' . "\n";
}
else {
return '';
}
$create = $db->fetch_row($createtable);
if (strpos($table, '.') !== false) {
$tablename = substr($table, strpos($table, '.') + 1);
$create[1] = str_replace('CREATE TABLE ' . $tablename, 'CREATE TABLE ' . $table, $create[1]);
}
$tabledump .= $create[1];
if (($sqlcompat == 'MYSQL41') && ($db->version() < '4.1')) {
$tabledump = preg_replace('/TYPE\\=(.+)/', 'ENGINE=\\1 DEFAULT CHARSET=' . $dumpcharset, $tabledump);
}
if (('4.1' < $db->version()) && $sqlcharset) {
$tabledump = preg_replace('/(DEFAULT)*\\s*CHARSET=.+/', 'DEFAULT CHARSET=' . $sqlcharset, $tabledump);
}
$tablestatus = $db->fetch_first('SHOW TABLE STATUS LIKE \'' . $table . '\'');
$tabledump .= ($tablestatus['Auto_increment'] ? ' AUTO_INCREMENT=' . $tablestatus['Auto_increment'] : '') . ';' . "\n\n";
if (($sqlcompat == 'MYSQL40') && ('4.1' <= $db->version()) && ($db->version() < '5.1')) {
if ($tablestatus['Auto_increment'] != '') {
$temppos = strpos($tabledump, ',');
$tabledump = substr($tabledump, 0, $temppos) . ' auto_increment' . substr($tabledump, $temppos);
}
if ($tablestatus['Engine'] == 'MEMORY') {
$tabledump = str_replace('TYPE=MEMORY', 'TYPE=HEAP', $tabledump);
}
}
}
$tabledumped = 0;
$numrows = $offset;
$firstfield = $tablefields[0];
if ($extendins == '0') {
while ((($currsize + strlen($tabledump) + 500) < ($sizelimit * 1000)) && ($numrows == $offset)) {
if ($firstfield['Extra'] == 'auto_increment') {
$selectsql = 'SELECT * FROM ' . $table . ' WHERE ' . $firstfield['Field'] . ' > ' . $startfrom . ' LIMIT ' . $offset;
}
else {
$selectsql = 'SELECT * FROM ' . $table . ' LIMIT ' . $startfrom . ', ' . $offset;
}
$tabledumped = 1;
$rows = $db->query($selectsql);
$numfields = $db->num_fields($rows);
$numrows = $db->num_rows($rows);
while ($row = $db->fetch_row($rows)) {
$comma = $t = '';
for ($i = 0; $i < $numfields; $i++) {
//if (5.4 <= $db->version()) {
//$t .= $comma . ($usehex && !(empty($row[$i])) && (strexists($tablefields[$i]['Type'], 'char') || strexists($tablefields[$i]['Type'], 'text')) ? '0x' . bin2hex($row[$i]) : '\'' . mysql_real_escape_string($row[$i],$db->link) . '\'');
//}
//else {
$t .= $comma . ($usehex && !(empty($row[$i])) && (strexists($tablefields[$i]['Type'], 'char') || strexists($tablefields[$i]['Type'], 'text')) ? '0x' . bin2hex($row[$i]) : '\'' . @mysql_escape_string($row[$i]) . '\'');
//}
$comma = ',';
}
if ((strlen($t) + $currsize + strlen($tabledump) + 500) < ($sizelimit * 1000)) {
if ($firstfield['Extra'] == 'auto_increment') {
$startfrom = $row[0];
}
else {
$startfrom++;
}
$tabledump .= 'INSERT INTO ' . $table . ' VALUES (' . $t . ');' . "\n";
}
else {
$complete = false;
break 2;
}
}
}
$startrow = $startfrom;
$tabledump .= "\n";
}
return $tabledump;
}
function splitsql($sql)
{
$sql = str_replace("\r", "\n", $sql);
$ret = array();
$num = 0;
$queriesarray = explode(';' . "\n", trim($sql));
unset($sql);
foreach ($queriesarray as $query ) {
$queries = explode("\n", trim($query));
foreach ($queries as $query ) {
$ret[$num] .= ($query[0] == '#' ? NULL : $query);
}
$num++;
}
return $ret;
}
function slowcheck($type1, $type2)
{
$t1 = explode(' ', $type1);
$t1 = $t1[0];
$t2 = explode(' ', $type2);
$t2 = $t2[0];
$arr = array($t1, $t2);
sort($arr);
if ($arr == array('mediumtext', 'text')) {
return true;
}
else {
if ((substr($arr[0], 0, 4) == 'char') && (substr($arr[1], 0, 7) == 'varchar')) {
return true;
}
}
return false;
}
function sizecount($filesize)
{
if (1073741824 <= $filesize) {
$filesize = (round(($filesize / 1073741824) * 100) / 100) . ' GB';
}
else if (1048576 <= $filesize) {
$filesize = (round(($filesize / 1048576) * 100) / 100) . ' MB';
}
else if (1024 <= $filesize) {
$filesize = (round(($filesize / 1024) * 100) / 100) . ' KB';
}
else {
$filesize = $filesize . ' Bytes';
}
return $filesize;
}
is_object($db) && $db->Close();
$db = $mymps_global = $part = $action = $here = NULL;
?>