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

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

阅读 4.1k
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包压缩

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题