php实现mysql数据库分表分段备份

5年以前  |  阅读数:509 次  |  编程语言:PHP 

分卷导出思路:统计sql语句变量的长度,按1个字符当成1 字节比较,如果大于设定分卷大小,则写入一个sql文件(我也不知道这样统计是否稳当,这也是借鉴其他的人的)。

分卷导入思路:按行读取sql文件,将每一行当作完整的sql语句存到数组再循环执行插入数据库就可以了,但是在创建表语句分了多行,这个需要单独处理(就这个花了我好长时间的);


    <?php
    //宋正河 转载请注明出处
    set_time_limit(0);
    header('content-type:text/html;charset=utf-8');
    mysql_connect('localhost','root','root');
    mysql_select_db('test');
    $table_array=get_tables('test');
    mysql_query('set names utf8');
    $filesize=1024*1024*4;
    $start=$_GET['start']?$_GET['start']:0;
    $part=$_GET['part']?$_GET['part']:'1';
    $table_index=$_GET['table_index']?$_GET['table_index']:'0';
    $table=$table_array[$table_index];
    $num=200000000;//这个数要足够大,可以是总记录数
    $backupdata='';
    if($start=='0'){
    $query="SHOW CREATE TABLE `{$table}`";
    $result = mysql_query($query);
    $row = mysql_fetch_row($result);
    $backupdata .= "DROP TABLE IF EXISTS `{$table}`;\n" . $row[1] . ";\n\n";
    }
    $limit=($start=='0')?'':" limit $start,$num ";
    $query="select * from `{$table}` $limit ";
    $result=mysql_query($query);
    $numfields = mysql_num_fields($result); //统计字段数
    while($row=mysql_fetch_row($result)){
    $comma = ''; //存储逗号
    $backupdata_tmp = "INSERT INTO `{$table}` VALUES (";
    for($i=0; $i<$numfields; $i++){
    $backupdata_tmp .= $comma . "'" . mysql_escape_string($row[$i]) . "'";
    $comma = ',';
    }
    $backupdata_tmp .= ");\n";
    if(strlen($backupdata)+strlen($backupdata_tmp) > $filesize){
    //写入文件并跳转
    $file='data/'.$table.'-'.$part.'.sql';
    file_put_contents($file,$backupdata);
    echo $file.' 备份完成,程序继续进行!';
    $part++;
    //分段
    //表名
    //起点
    //跳转
    sleep(3);
    echo "<script>location.href='?start={$start}&table;_index={$table_index}∂={$part}';</script>";
    exit;
    }
    $backupdata.=$backupdata_tmp;
    $start++;
    }
    if($backupdata){
    $file='data/'.$table.'-'.$part.'.sql';
    file_put_contents($file,$backupdata);
    }
    echo $table.'备份完成!<br />';
    sleep(2);
    $table_index++;
    if($table_array[$table_index]){
    echo "<script>location.href='?table_index={$table_index}';</script>";
    exit;
    }else{
    echo '恭喜你,数据库备份完毕!';
    }
    function get_tables($db){
    $tq = mysql_list_tables($db);
    while($tr = mysql_fetch_row($tq)){
    $arrtb[] = $tr[0];
    }
    return $arrtb;
    }
    ?>

以上所述就是本文的全部内容了,希望大家能够喜欢。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例