Mysql Innodb—在SELECT中运行INSERT—在整个操作完成之前,记录不会显示吗?
我有一个2600万条记录的表,并且想向其中添加一些列,所以我用添加的列创建了一个新表,然后做了一个 在表格中插入新字段,从表格中选择字段1和字段2 我被告知这比尝试向现有表中添加列要快 在任何情况下,有2600万条记录,这花费了很长的时间,并且使用MySQL Workbench监控该进程,我看到该进程仍在运行40个小时,而且还在计数 但是,当我从新表中选择*时,我还没有看到任何记录。对于InnoDB,是否要等到整个事务完成后才能在新表中看到2600万条记录中的任何一条?或者我应该实时查看一个接一个插入的记录吗 我正在查看状态变量Innodb_rows_inserted,它昨天一直在稳定地计数,我认为它应该代表我从0到2600万的进度,但现在它稳定在1400万,不再实时增加:S,但我的INSERT INTO SELECT进程仍在运行。我担心出了什么事Mysql Innodb—在SELECT中运行INSERT—在整个操作完成之前,记录不会显示吗?,mysql,sql,innodb,Mysql,Sql,Innodb,我有一个2600万条记录的表,并且想向其中添加一些列,所以我用添加的列创建了一个新表,然后做了一个 在表格中插入新字段,从表格中选择字段1和字段2 我被告知这比尝试向现有表中添加列要快 在任何情况下,有2600万条记录,这花费了很长的时间,并且使用MySQL Workbench监控该进程,我看到该进程仍在运行40个小时,而且还在计数 但是,当我从新表中选择*时,我还没有看到任何记录。对于InnoDB,是否要等到整个事务完成后才能在新表中看到2600万条记录中的任何一条?或者我应该实时查看一个接一
如何检查一切是否按预期工作?如果希望在大型提交运行时跟踪其进度,可以将插入作为过程运行 这会增加一点开销,但是您可以在每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俱乐部;