暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 非日志加载后跟插入 (记录的) 表是否可恢复?

askTom 2017-06-15
255

问题描述

花了一段时间搜索AskTom档案后,我找不到答案。

为了使以下数据管道可恢复 (来自站点故障): 是否所有操作都必须进行日志记录,或者我们可以假设仅需要将数据最终移动到目标 (已记录) 表中才能使其恢复?

2-步骤:
1) SQLLDR直接路径加载到未登录的暂存表中
2) 标准SQL DML从暂存表插入到 (记录的) 普通表。

AFAIK步骤 (1) 将是不可恢复的,但步骤 (2) 将是可恢复的吗?我们假设步骤 (2)would 生成大量的重做,这种重做是否会包含足够的信息来重新应用这些插入?还是他们迷路了?
具体来说,我想到的是主丢失的故障,DataGuard零数据丢失是有效的,因此备用确实有重做。

提前感谢


专家解答

随后记录的操作不会自动 “修复” 您执行的任何nologging操作。

如果您有DataGuard,则最有可能 (但不能保证) 在数据库上将强制日志记录设置为 “是”。这意味着 “记录” 操作实际上是记录的。

你可以用

从v $ 数据库中选择FORCE_LOGGING

如果未设置此设置,则在nologging操作之后,应备份受影响的数据文件,并且通常DataGuard apply将停止,因为您需要将受影响的数据文件传输到DataGuard节点以使待机恢复同步。

很容易测试


SQL> create table t nologging as select * from dba_objects where 1=0;

Table created.

SQL> insert /*+ APPEND */ into t select * from dba_objects;

77978 rows created.

SQL> commit;

Commit complete.

SQL> @mystat
Enter value for statname: redo size

NAME                                                    VALUE
-------------------------------------------------- ----------
redo size                                              114580  <=== small
redo size for lost write detection                          0
redo size for direct writes                              2112

3 rows selected.

SQL>
SQL> alter database force logging;

Database altered.

SQL> insert /*+ APPEND */ into t select * from dba_objects;

77978 rows created.

SQL> commit;

Commit complete.

SQL> @mystat
Enter value for statname: redo size

NAME                                                    VALUE
-------------------------------------------------- ----------
redo size                                            12613764  <== large
redo size for lost write detection                          0
redo size for direct writes                          12463664

3 rows selected.



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论