oracle 中如何将一张500万数据的表从一个库快速转移到另外一个库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 中如何将一张500万数据的表从一个库快速转移到另外一个库相关的知识,希望对你有一定的参考价值。

大家好,如题,因为优化需求的原因,目前需要处理的历史数据有500万左右,现在我需要在一张新表中生成500万的数据,但是由于关联比较复杂,在投产的时候要执行完这段程序测试了下需要近10个小时,而这个时间客户接受不了,我自己也接受不了。所以我想在其它环境先生成这500万数据,在投产的时候直接将这500导进去。

可是目前发现导进去的速度一样慢,我这样做的,在测试环境将生产投产时应该生成的数据插进这个新表中,数据约500万,执行完后将测试环境的这个表及其数据全导出来,然后投产的时候直接导进去。我测试的时候导出的是sql脚本,然后我在其它环境测试导入的时候发现还是一样慢,怎么回事呢?直接导入的话应该很快的呀?

我应该怎么做呢?大家有没有更好的办法?投产时间太长啦,谁也不可能守着,而且生产环境不能停这么久

你说的测试库和正式库之间可以创建dblink么?
另外,你可以在测试库生成的500万数据的那个表上建索引,
这两点可以实现的话,
直接用insert ....select 来做就可以了,,
导入前,把目标表的索引主键全删掉(记得备份,我看你说的意思目标表应该是个空表,所以这样做没有神马坏处),数据导入后再建。
500万的数据,应该上不了半个小时就全部插进去了,
我经常在测试库和正式库之间转换数据,数据量也是百万千万级的,一直用的就是这个方法。
参考技术A 一 如果是9i以上操作系统可以通过数据泵,expdp/impdp导出在导入
二 如果是9i之前的数据库,但服务器性能比较好,可以通过exp/imp导出导入
三 可以通过rman进行数据迁移
四 可以通过ogg进行表同步
五 可以通过dg进行表同步
六 可以通过物化视图进行表同步
七 可以通过快照进行表同步
参考技术B 把整个DBF文件直接覆盖系统的DBF文件。追问

朋友,能具体点不,如何替换呢,我们没有dba权限的,比如说如何找到当前库的dbf,然后又如何替换其它库的dbf,谢谢你啦

参考技术C 直接用命令导出来吧,再把它导进去就OK了,参考二楼的哥们的回答。

在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?

【中文标题】在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?【英文标题】:In MySQL, how to copy the content of one table to another table within the same database? 【发布时间】:2022-01-06 00:49:07 【问题描述】:

我是 MySQL 新手。我想将一个表的内容复制到同一个数据库中的另一个表。基本上,我想从另一个表插入一个表。有没有简单的方法可以做到这一点?

【问题讨论】:

【参考方案1】:

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

编辑:或者如果表格具有不同的结构,您也可以:

INSERT INTO TARGET_TABLE (`col1`,`col2`) SELECT `col1`,`col2` FROM SOURCE_TABLE;

编辑:限制这个..

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1

【讨论】:

如果有人想在运行这个查询期间在源表中执行插入操作会发生什么?它是否锁定插入操作?【参考方案2】:

如果表不存在,您可以创建一个具有相同架构的表,如下所示:

CREATE TABLE table2 LIKE table1;

然后,复制数据:

INSERT INTO table2 SELECT * FROM table1

【讨论】:

我在w3school 中找到了此代码SELECT * INTO newTable FROM sourceTable,为什么它在MySQL 中不起作用 @KasunSiyambalapitiya SELECT ... INTO 用于将表导出到输出文件或变量;不直接放入表中。见dev.mysql.com/doc/refman/5.7/en/select-into.html @Kasun Siyambalapitiya w3school 页面用于不同的 SQL,而不是用于 MySQL。 w3schools 现在有错误报告功能,如果您发现问题,请在他们的网站上报告以帮助获得准确的知识。【参考方案3】:

如果 table1 很大并且您不想在复制过程中锁定它,您可以改为执行转储和加载:

CREATE TABLE table2 LIKE table1;

SELECT * INTO OUTFILE '/tmp/table1.txt' FROM table1;
LOAD DATA INFILE '/tmp/table1.txt' INTO TABLE table2;

【讨论】:

我尝试在 RDS 上转储,使用 ***.com/a/9536680/351903 解决方案。该文件已创建,但很长一段时间仍保持 0 大小。此外,在检查show processlist 时,我看不到任何查询正在运行。不知道是什么问题。 这对于非常大的表来说是最佳选择! 这个方法比上面列出的要慢很多。【参考方案4】:

这对我有用,

CREATE TABLE newtable LIKE oldtable;

用旧表复制新表

INSERT newtable SELECT * FROM oldtable;

将所有行数据复制到新表中。

【讨论】:

【参考方案5】:

如果您想一次性创建和复制内容,只需使用SELECT

CREATE TABLE new_tbl SELECT * FROM orig_tbl;

【讨论】:

+1 - 虽然新表不会有第一个索引定义。 “create ... like ...”方法也会复制索引定义。【参考方案6】:

这对我有用。您可以使用 WHERE 和 LIMIT 子句使 SELECT 语句更复杂。

首先复制您的大表(不包含数据),运行以下查询,然后截断较大的表。

INSERT INTO table_small (SELECT * FROM table_large WHERE column = 'value' LIMIT 100)

超级简单。 :-)

【讨论】:

【参考方案7】:
CREATE TABLE target_table SELECT * FROM source_table;

它只是创建一个与源表结构相同的新表,并将所有行从 source_table 复制到 target_table。

CREATE TABLE target_table SELECT * FROM source_table WHERE condition;

如果您需要将一些行复制到 target_table 中,则在 where 子句中应用条件

【讨论】:

【参考方案8】:

试试这个。在我的 Oracle 10g 中运行良好,

CREATE TABLE new_table
  AS (SELECT * FROM old_table);

【讨论】:

但问题是关于 MySQL 的。 它为此提供了 +,因为它也适用于 MySQL。 dev.mysql.com/doc/refman/5.7/en/create-table-select.html

以上是关于oracle 中如何将一张500万数据的表从一个库快速转移到另外一个库的主要内容,如果未能解决你的问题,请参考以下文章

将一张表从 RDS / postgres 加载到 Redshift

oracle数据库如何把表从一个表空间移到另一个表空间

oracle数据库如何把表从一个表空间移到另一个表空间

oracle 将一张表的数据插入到另一张表

oracle 如何导入相同名称的表

oracle怎样导入海量数据(100万+)