我想在生产环境中导出Oracle数据库的内容,而使用该数据库的应用程序必须在执行导出时运行。做一个简单的"转储"在文件中,例如通过简单地选择数据库的内容并使用PL / SQL将表格写入文件后,似乎不能保证一致性。例如,通过将表B的所有内容写入文件,可以在导出表B时更改先前导出的表A.因此,B的导出内容可能会引用" new"表A的数据,它们不是表A的导出文件的一部分。出于性能原因(应用程序正在运行),我无法在一个大事务中运行此导出。
可以使用哪些技术,工具等将一致的数据集导出到Oracle数据库的文件中?
非常感谢!
答案 0 :(得分:1)
Flashback使您可以一致地导出数据。
每个数据库更改都会记录UNDO中的旧数据。 Oracle使用该数据进行回滚和读取一致性 - SELECT语句可以从特定时间点读取数据。闪回使用相同的机制,但是通过闪回,可以手动设置时间点。如果为每个查询将时间设置为相同的值,则它们将从相同的一致时间读取。如果有太多更改且没有足够的UNDO表空间,您可能会遇到类似ORA-01555: snapshot too old
的错误。
如果您构建自己的导出过程,可以使用这样的闪回查询:
select * from test1 as of timestamp timestamp '2015-01-13 20:59:00';
如果您使用导出数据泵,则可以使用flashback_time选项:
FLASHBACK_TIME="TO_TIMESTAMP('25-08-2008 14:35:00', 'DD-MM-YYYY HH24:MI:SS')"
答案 1 :(得分:1)
您使用的是哪个Oracle版本?
您可以使用Oracle数据泵,正如John Heller所说,包括该条款 FLASHBACK_TIME =" TO_TIMESTAMP(' 25-08-2008 14:35:00',' DD-MM-YYYY HH24:MI:SS')"。 如果要导出当前时间一致的数据,可以按以下方式配置该子句: FLASHBACK_TIME = SYSTIMESTAMP
如果您的Oracle版本早于10.2.0.4,我建议您使用exp二进制文件,包括" consistent = y"。
使用数据泵,您可以过去导出数据(但并非总是如此)。使用exp,您可以在运行命令时导出数据一致。
请注意,在任何情况下,您都可以拍摄过快的"快照"错误。这是因为undo表空间空间不足。