Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Innodb—在SELECT中运行INSERT—在整个操作完成之前,记录不会显示吗?_Mysql_Sql_Innodb - Fatal编程技术网

Mysql Innodb—在SELECT中运行INSERT—在整个操作完成之前,记录不会显示吗?

Mysql Innodb—在SELECT中运行INSERT—在整个操作完成之前,记录不会显示吗?,mysql,sql,innodb,Mysql,Sql,Innodb,我有一个2600万条记录的表,并且想向其中添加一些列,所以我用添加的列创建了一个新表,然后做了一个 在表格中插入新字段,从表格中选择字段1和字段2 我被告知这比尝试向现有表中添加列要快 在任何情况下,有2600万条记录,这花费了很长的时间,并且使用MySQL Workbench监控该进程,我看到该进程仍在运行40个小时,而且还在计数 但是,当我从新表中选择*时,我还没有看到任何记录。对于InnoDB,是否要等到整个事务完成后才能在新表中看到2600万条记录中的任何一条?或者我应该实时查看一个接一

我有一个2600万条记录的表,并且想向其中添加一些列,所以我用添加的列创建了一个新表,然后做了一个 在表格中插入新字段,从表格中选择字段1和字段2

我被告知这比尝试向现有表中添加列要快

在任何情况下,有2600万条记录,这花费了很长的时间,并且使用MySQL Workbench监控该进程,我看到该进程仍在运行40个小时,而且还在计数

但是,当我从新表中选择*时,我还没有看到任何记录。对于InnoDB,是否要等到整个事务完成后才能在新表中看到2600万条记录中的任何一条?或者我应该实时查看一个接一个插入的记录吗

我正在查看状态变量Innodb_rows_inserted,它昨天一直在稳定地计数,我认为它应该代表我从0到2600万的进度,但现在它稳定在1400万,不再实时增加:S,但我的INSERT INTO SELECT进程仍在运行。我担心出了什么事


如何检查一切是否按预期工作?

如果希望在大型提交运行时跟踪其进度,可以将插入作为过程运行

这会增加一点开销,但是您可以在每x条记录之后添加一个提交点,例如在下面的示例中,在每100条记录之后提交

注意:这是在考虑Oracle的情况下编写的,因此您的里程数可能会有所不同,但希望您能够根据需要进行翻译

declare
    v_counter       NUMBER := 0;
    cursor c_table_old is
        select *
        from table_old;
begin

    FOR l_table_old in c_table_old LOOP
        insert into table_new (field1, field2) 
        values (l_table_old.field1,
                l_table_old.field2);

        v_counter := v_counter + 1;

        IF (MOD(v_counter, 100) = 0) THEN
            commit;
        END IF;

    END LOOP;

end;
/

谢谢,这对以后的尝试是个好主意。但是我想InnoDB是真的,它会等到整个事务完成后,才能在新表中看到2600万条记录中的任何一条?然而,由于我没有看到更多的innodb_rows_inserted被递增,我担心整个过程以某种方式失败了,但是这个过程仍然有效,我无法检查是否有进展。有什么想法吗?这里有一个DBA StackExchange关于InnoDB上类似问题的答案,看起来很有用:任何自尊的DBMS都会确保尚未提交的事务的效果不会被其他事务看到。通过合并InnoDB,MySQL最终加入了DBMS俱乐部;