Example #1
0
function mysql_bak_out($tabledb)
{
    global $db, $rowsnum, $fileNUM, $bak_path, $baksize, $tableid, $page;
    //此page指的是每个表数据大的时候.需要多次跳转页面读取
    if (!$page) {
        $page = 1;
    }
    $min = ($page - 1) * $rowsnum;
    $tableid = intval($tableid);
    if ($show = mysql_get_table_value($tabledb[$tableid], $min, $rowsnum)) {
        //表中有数据,还要继续读取
        $page++;
    } else {
        //表中无数据的情况,继续下一个表
        $page = 0;
        $tableid++;
    }
    //分卷是从0开始的
    $fileNUM = intval($fileNUM);
    $filename = "{$fileNUM}.sql";
    $show && write_file("{$bak_path}/{$filename}", $show, 'a+');
    //对文件做精确大小分卷处理
    $show && cksize("{$bak_path}/{$filename}", $baksize);
    //如果还存在表时.继续,否则结束
    if ($tabledb[$tableid]) {
        //不断变化的变量有 $page,$tableid,$fileNUM
        return true;
    } else {
        @unlink(ROOT_PATH . "cache/bak_mysql.txt");
        return false;
    }
}
Example #2
0
function bak_out($tabledb)
{
    global $db, $pre, $rowsnum, $tableid, $page, $timestamp, $step, $rand_dir, $lfj, $baksize;
    //还没有随机生成目录之前
    if (!$rand_dir) {
        /*特地处理有些服务器不能创建目录的情况,此时必须手工创建mysql目录*/
        if (file_exists(ROOT_PATH . "cache/mysql_bak/mysql")) {
            if (!is_writable(ROOT_PATH . "cache/mysql_bak/mysql")) {
                showmsg(ROOT_PATH . "cache/mysql_bak/mysql目录不可写,请改属性为0777");
            }
            $rand_dir = "mysql";
            $d = opendir(ROOT_PATH . "cache/mysql_bak/mysql/");
            while ($f = readdir($d)) {
                if (eregi("\\.sql\$", $f)) {
                    unlink(ROOT_PATH . "cache/mysql_bak/mysql/{$f}");
                }
            }
            write_file(ROOT_PATH . "cache/mysql_bak/mysql/index.php", str_replace('<?php die();', '<?php', read_file('mysql_into.php')));
            $show = create_table_all($tabledb);
            //备份数据表结构
            //$db->query("TRUNCATE TABLE {$pre}bak");
            //bak_dir('../data/');		//备份缓存
        } else {
            $rand_dir = date("Y-m-d.", time()) . strtolower(rands(3));
            $show = create_table_all($tabledb);
            //备份数据表结构
            if (!file_exists(ROOT_PATH . "cache/mysql_bak")) {
                if (!@mkdir(ROOT_PATH . "cache/mysql_bak", 0777)) {
                    showmsg(ROOT_PATH . "cache/mysql_bak目录不能创建");
                }
            }
            if (!@mkdir(ROOT_PATH . "cache/mysql_bak/{$rand_dir}", 0777)) {
                showmsg(ROOT_PATH . "cache/mysql_bak/{$rand_dir},目录不可写,请改属性为0777");
            }
            //复制一个自动还原的文件到SQL目录.方便日后还原
            write_file(ROOT_PATH . "cache/mysql_bak/{$rand_dir}/index.php", str_replace('<?php die();', '<?php', read_file('mysql_into.php')));
            //$db->query("TRUNCATE TABLE {$pre}bak");
            //bak_dir('../data/');		//备份缓存
        }
    }
    !$rowsnum && ($rowsnum = 500);
    //每次读取多少条数据
    //此page指的是每个表大的时候.需要多次跳转页面读取
    if (!$page) {
        $page = 1;
    }
    $min = ($page - 1) * $rowsnum;
    $tableid = intval($tableid);
    //$show.=$tablerows=bak_table($tabledb[$tableid],$min,$rowsnum);
    //当前表能取到数据时,继续此表下一页取数据,否则从下一个表的0开始
    if ($tablerows = bak_table($tabledb[$tableid], $min, $rowsnum)) {
        $show .= $tablerows;
        unset($tablerows);
        //释放内存
        $page++;
    } else {
        $page = 0;
        $tableid++;
    }
    //分卷是从0开始的
    $step = intval($step);
    $filename = "{$step}.sql";
    write_file(ROOT_PATH . "cache/mysql_bak/" . $rand_dir . "/" . $filename, $show, 'a+');
    //如果不指定每卷大小.将默认为1M
    $baksize = $baksize ? $baksize : 1024;
    //对文件做精确大小分卷处理
    $step = cksize(ROOT_PATH . "cache/mysql_bak/" . $rand_dir . "/" . $filename, $step, 1024 * $baksize);
    //如果还存在表时.继续,否则结束
    if ($tabledb[$tableid]) {
        foreach ($tabledb as $value) {
            $Table .= "{$value}|";
        }
        //记录下来.防止中途备份失败
        write_file(ROOT_PATH . "cache/bak_mysql.txt", "index.php?lfj={$lfj}&action=out&page={$page}&rowsnum={$rowsnum}&tableid={$tableid}&rand_dir={$rand_dir}&step={$step}&tabledbreto={$Table}&baksize={$baksize}");
        echo "<CENTER>已备份 <font color=red>{$step}</font> 卷, 进度条 <font color=blue>{$page}</font> 当前正在备份数据库 <font color=red>{$tabledb[$tableid]}</font></CENTER>";
        print <<<EOT
<form name="form1" method="post" action="index.php?lfj={$lfj}&action=out&page={$page}&rowsnum={$rowsnum}&tableid={$tableid}&rand_dir={$rand_dir}&step={$step}&baksize={$baksize}">
  <input type="hidden" name="tabledbreto" value="{$Table}">
</form>
<SCRIPT LANGUAGE="JavaScript">
<!--
function autosub(){
\tdocument.form1.submit();
}
autosub();
//-->
</SCRIPT>
EOT;
        //echo "<META HTTP-EQUIV=REFRESH CONTENT='0;URL=index.php?lfj=$lfj&action=out&page=$page&rowsnum=$rowsnum&tableid=$tableid&rand_dir=$rand_dir&step=$step&tabledbreto=$Table&baksize=$baksize'>";
        exit;
    } else {
        $dir = opendir(ROOT_PATH . "cache/mysql_bak/{$rand_dir}");
        while ($file = readdir($dir)) {
            if (eregi('.sql$', $file)) {
                $totalsize += $sqlfilesize = @filesize(ROOT_PATH . "cache/mysql_bak/{$rand_dir}/{$file}");
                $rs[sqlsize][] = number_format($sqlfilesize / 1024, 3);
            }
        }
        $totalsize = number_format($totalsize / 1048576, 3);
        @unlink(ROOT_PATH . "cache/bak_mysql.txt");
        $rs[totalsize] = $totalsize;
        $rs[timedir] = $rand_dir;
        if (!@is_writable(ROOT_PATH . "cache/mysql_bak/{$rand_dir}/0.sql")) {
            showmsg("备份失败,请在cache/mysql_bak/目录下创建一个目录mysql然后改其属性为0777,如果此目录已存在,请删除他,重新创建,并改属性为0777");
        }
        return $rs;
    }
}