我对数据库管理相当陌生。目前我必须解决以下情况。我有一个来自MySQL InnoDB表的256 to转储文件(大约300万条记录),必须加载到数据库中。
问题是,对于转储中的每一条记录,数据库必须运行一系列触发器才能从特定的表中重建数据。我可以这样说明这个过程:
dump.record (inserts) => schema.table_a =>{fires_trigger_a} (inserts)=> schema.table_b =>{fires_trigger_b} (inserts)=> ... {fires_trigger_x}(inserts)=> schema.table_final
我已经尝试过三种方法:
LOCK TABLE WRITE语句和/或上述转储开始时的DROP TABLE - CREATE TABLE语句)LOCK TABLE WRITE和DROP TABLE - CREATE TABLE语句的导入编辑转储,只在转储中保留INSERT INTO语句。(这种方法按预期的方式触发触发器,但使数据导入非常慢,而且数据库在取消后无法使用,仅在30分钟内上传了所有记录的2%。)mysqldump创建的txt文件,该文件只包含由选项卡分隔的数据。( 15分钟后,进程被中止,初始表没有得到任何记录。)上述任何一种方法都没有成功,因为这是几种导入中的第一种,而且目前我不能让服务器运行导入很长一段时间。我在想,也许有一种配置MySQL社区服务器安装的方法,我目前正在使用它来优化流程,但正如我之前所说的,我只是在学习。
感谢您的时间,并为任何拼写错误的单词或语法错误的借口。
发布于 2018-04-05 02:13:09
为了装一张大桌子(S),我会
LOAD DATA或拉入转储)加载到表中--但是没有触发器或外键,至少没有启用。“正常化”是一项工作量很大的共同任务。它可以在两个语句中完成,比300万次触发器调用要快得多:
INSERT IGNORE INTO norm
SELECT DISTINCT name FROM loaded_table;
UPDATE loaded_table JOIN norm USING(name)
SET loaded_table.id = norm.id;这个特别的例子给出了更详细的这里。
https://dba.stackexchange.com/questions/202350
复制相似问题