mysql如何导出600万条记录的数据表?

1.mysql如何导出600万条记录的数据表?
2.我试过直接导出会让数据库过载。

阅读 663
评论
    3 个回答

    目前我这么写:

    <?php
    /**
     * Created by IntelliJ IDEA.
     * User: felix
     * Date: 2019-03-01
     * Time: 18:49
     */
    
    set_time_limit(0);
    
    $servername = 'localhost';
    $username   = '';
    $password   = '';
    $dbname     = '';
    
    $i = 57007;
    
    $bingTime = microtime(true);
    echo 'bing ' . $bingTime . ' s' . PHP_EOL;
    
    while (9690183 > $i) {
        $i++;
    
        A:
    
        // 创建连接
        $conn = new mysqli($servername, $username, $password, $dbname);
    
        /* check connection */
        if ($conn->connect_errno) {
            printf("Connect failed: %s\n", $conn->connect_error);
            sleep(3);
            goto A;
        }
    
        $pySql = "select count(*) as sum from wzjs_product_journal_21_6 where product_journal_id = {$i}";
    
        $result = $conn->query($pySql);
    
        if ($result === false) {
            printf("Invalid query: %s\nWhole query: %s\n", $conn->error, $pySql);
        }
    
        if ($result->fetch_assoc()['sum'] == 0) {
            $pySql = "INSERT INTO wzjs_product_journal_21_6 SELECT * FROM wzjs_product_journal_21 WHERE product_journal_id = {$i}";
    
            $result = $conn->query($pySql);
    
            if ($result === false) {
                printf("Invalid query: %s\nWhole query: %s\n", $conn->error, $pySql);
            }
        }
    
        usleep(5);
    
        $conn->close();
    
        usleep(5);
    }
    
    $endTime = microtime(true);
    echo ' end ' . $endTime . ' s' . PHP_EOL;
    
    $diffTime = $endTime - $bingTime;
    
    echo 'Diff Time ' . $diffTime . ' s' . PHP_EOL;
    
    echo 'i:' . $i . "\n";
    

    根据主键一条一条复制。我有 9690183 多条数据需要迁移,因为之前的表加不上索引了……

    不过不知为啥,经常出

    PHP Warning:  mysqli::mysqli(): (HY000/2002): No such file or directory in /data/wwwroot/www.scienceport.cn/copy_2.php on line 24

    上面的 goto 就是打算解决这个问题。目前正在测试。
    之所以先查询后复制是之前老是自己就停了。而且现在也这样,连接着 shell 才会执行的比较久, 用的阿里云,关掉 shell 没多久就自己停了。就是必须看着它,要不然就自己跑不见了……
    这样运行的

    php copy.php > copy.log &

    在写这个的时候,又打印log了,不过这个程序挺过去了……

    2019年03月04日
    这个也不可靠,有100多万条不知道为啥没过去……正在寻找故障原因。
    No such file or directory 貌似是阿里云出故障了,反正今天有新闻。

    2019年03月11日
    发现写入数据不等会有的情况索引是不会加上的,而且还丢东西。现在都能复制走了。

    2019年03月12日
    https://my.oschina.net/guodap...
    这个链接写了如何退出ssh也能继续运行。

      如果只是单纯的查询然后到处,可以以流式读取,这样客户端以只读方式查询数据,然后将查询结果写到文件。
      如果需要对一条数据多次处理,则建议分页查询。

        肯定是后台任务分页读取 然后不断往excel或者csv里面append,最后完成之后直接zip包压缩

          撰写回答

          登录后参与交流、获取后续更新提醒

          相似问题
          推荐文章