题目部分

在Oracle中,逻辑DG维护中常用到的SQL语句有哪些?

答案部分

1.日志应用的启动和关闭

1ALTER DATABASE STOP LOGICAL STANDBY APPLY; ---停止应用,等待事务完成
2ALTER DATABASE ABORT LOGICAL STANDBY APPLY;--不等待事务完成就停止
3ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE; ---实时
4ALTER DATABASE START LOGICAL STANDBY APPLY; --非实时
5ALTER DATABASE START LOGICAL STANDBY APPLY  IMMEDIATE SKIP FAILED TRANSACTION; --实时应用并跳过失败的事务

如何知道是否开启了实时应用呢?可以查询V$LOGSTDBY_STATE视图或查询是否有lsp进程。

1SQL> SELECT * FROM V$LOGSTDBY_STATE;
2PRIMARY_DBID SESSION_ID REALTIME_APPLY      STATE
3------------ ---------- ------------------  -----------------------------------------
4  1480747539          1 Y                   APPLYING
5[oracle@rhel6_lhr oraljdg]$ ps -ef|grep -i ora_lsp
6oracle   20450     1  0 15:22 ?        00:00:00 ora_lsp0_oraljdg

2.查看日志文件的应用情况

 1COLUMN DICT_BEGIN FORMAT A15;2COLUMN FILE_NAME FORMAT A50;3SET NUMF 9999999;4COL FCHANGE# FORMAT 9999999999999;5COL NCHANGE# FOR 999999999999999999999;6SET LINE 2007SELECT  FILE_NAME, SEQUENCE# AS SEQ#, FIRST_CHANGE# AS FCHANGE#,8        NEXT_CHANGE# AS NCHANGE#, TIMESTAMP, DICT_BEGIN AS BEG,9        DICT_END AS END, THREAD# AS THR#, APPLIED
10    FROM DBA_LOGSTDBY_LOG
11ORDER BY THREAD#,SEQUENCE#;
12
13SET LINE 9999 PAGESIZE 9999
14COL FILE_NAME FORMAT A120
15SELECT THREAD#,SEQUENCE#, FILE_NAME, APPLIED, TIMESTAMP
16FROM DBA_LOGSTDBY_LOG D
17WHERE D.SEQUENCE# >=(SELECT MAX(SEQUENCE#)-3 FROM  DBA_LOGSTDBY_LOG NB WHERE  NB.THREAD#=D.THREAD# AND NB.APPLIED='YES' )
18ORDER BY THREAD#,D.SEQUENCE#;

3.查看备库SQL Apply的进度

1SQL> SELECT LATEST_SCN,MINING_SCN,APPLIED_SCN,LATEST_TIME,MINING_TIME,APPLIED_TIME FROM V$LOGSTDBY_PROGRESS;
2LATEST_SCN MINING_SCN APPLIED_SCN LATEST_TIME         MINING_TIME         APPLIED_TIME
3---------- ---------- ----------- ------------------- ------------------- -------------------
48895794846 8895316681  8895316680 2010-05-18 16:27:08 2010-05-18 16:03:54 2010-05-18 16:03:54

4.查看备库是否有任何DDL/DML语句未成功应用

 1COL EVENT_TIMESTAMP FORMAT A302COL EVENT FORMAT A403COL EVENT_STATUS FORMAT A804SELECT A.EVENT_TIME,5       A.CURRENT_SCN,6       A.COMMIT_SCN,7       XIDUSN,8       XIDSLT,9       XIDSQN,
10       TO_CHAR(EVENT) EVENT,
11       A.STATUS_CODE,
12       STATUS EVENT_STATUS
13  FROM DBA_LOGSTDBY_EVENTS A
14 WHERE A.EVENT_TIME >= SYSDATE - 10 / 1660
15 ORDER BY A.EVENT_TIME ;

5.查看备库SQL Apply的状态

1COL REALTIME_APPLY FORMAT A15
2COL STATE FORMAT A20
3SELECT * FROM V$LOGSTDBY_STATE;
4PRIMARY_DBID SESSION_ID REALTIME_APPLY       STATE
5------------ ---------- --------------- ---------------
6262089084          1                 Y         APPLYING

注意STATE列,该列可能有下述的几种状态:

l INITIALIZING:LogMiner SESSION已创建并初始化

l LOADING DICTIONARY:SQL应用调用LogMiner字典

l WAITING ON GAP:SQL应用正在等待日志文件,可能有中断

l APPLYING:SQL应用正在工作

l WAITING FOR DICTIONARY LOGS:SQL应用正在等待LogMiner字典信息

l IDLE:SQL应用工作非常出色,处于空闲状态

l SQL APPLY NOT ON:没有开启应用

6.取消部分对象或事务的同步

可以利用DBMS_LOGSTDBY.SKIP存储过程跳过特定表或特定用户的DML事务或部分DDL语句。这些跳过的对象或事务可以通过视图DBA_LOGSTDBY_SKIP和DBA_LOGSTDBY_SKIP_TRANSACTION查看。

 1EXECUTE DBMS_LOGSTDBY.SKIP(STMT => 'VIEW');2EXECUTE DBMS_LOGSTDBY.SKIP(STMT => 'PROFILE');3EXECUTE DBMS_LOGSTDBY.SKIP(STMT => 'DATABASE LINK');4EXECUTE DBMS_LOGSTDBY.SKIP(STMT => 'CREATE VIEW');5EXECUTE DBMS_LOGSTDBY.SKIP(STMT => 'DROP VIEW');6EXECUTE DBMS_LOGSTDBY.SKIP(STMT=>'SCHEMA_DDL', SCHEMA_NAME=>'%', OBJECT_NAME=>'%', PROC_NAME=>NULL);7EXECUTE DBMS_LOGSTDBY.SKIP(STMT=>'SCHEMA_DDL', SCHEMA_NAME=>'LHR', OBJECT_NAME=>'%', PROC_NAME=>NULL);8EXECUTE DBMS_LOGSTDBY.SKIP(STMT=>'SCHEMA_DDL', SCHEMA_NAME=>'MDSYS', OBJECT_NAME=>'%', PROC_NAME=>NULL);9
10EXEC DBMS_LOGSTDBY.SKIP_TRANSACTION (3, 3, 827); --(XIDUSN = 3, XIDSLT = 3, XIDSQN = 827)
11SELECT EVENT, STATUS,'EXEC DBMS_LOGSTDBY.SKIP_TRANSACTION ('||XIDUSN||', '||XIDSLT||', '||XIDSQN||');' FROM DBA_LOGSTDBY_EVENTS A WHERE XIDUSN IS NOT NULL AND   A.EVENT_TIME >= SYSDATE - 60 / 1660;
12SELECT 'EXEC DBMS_LOGSTDBY.SKIP_TRANSACTION ('||XIDUSN||', '||XIDSLT||', '||XIDSQN||');' FROM DBA_LOGSTDBY_EVENTS A WHERE XIDUSN IS NOT NULL AND   A.EVENT_TIME >= SYSDATE - 10 / 1660;
13
14SELECT * FROM DBA_LOGSTDBY_SKIP;
15SELECT * FROM DBA_LOGSTDBY_SKIP_TRANSACTION;

7.增加apply进程个数

如果Apply进程过于繁忙,那么可以增加Apply进程个数。以下命令调整为20,默认为5个:

1SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
2SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('APPLY_SERVERS',20);
3SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

8.处理从主库接收到的归档文件

逻辑DG在应用完归档日志后会自动删除该归档文件,这一特性是由逻辑DG中的2个参数控制的,它们分别为LOG_AUTO_DELETE和LOG_AUTO_DEL_RETENTION_TARGET。

LOG_AUTO_DELETE的值默认为TRUE,表示逻辑DG在应用完归档日志后会自动删除该归档文件,默认24小时之后删除(由参数LOG_AUTO_DEL_RETENTION_TARGET控制)。如果希望禁用自动删除的功能,那么可以执行下列语句:

1EXECUTE DBMS_LOGSTDBY.APPLY_SET('LOG_AUTO_DELETE', FALSE);

在告警日志中会有类似如下的记录:

1Fri Jul 27 13:48:53 2018
2LOGMINER: Log Auto Delete - deleting: /u01/app/oracle/flash_recovery_area/ORADGLG/1_202_886695024.dbf
3Deleted file /u01/app/oracle/flash_recovery_area/ORADGLG/1_202_886695024.dbf

在某些情况下确实需要禁用归档文件的自动删除功能,例如逻辑DG需要执行Flashback Database操作,如果你想恢复到之前的某个时间点,然后再接着应用,那么就必须要有该时间点后对应的归档。假如LOG_AUTO_DELETE为TRUE的话,应用过的归档已经被删除,想回都回不去。

参数LOG_AUTO_DEL_RETENTION_TARGET表示逻辑DG在应用完归档日志后的多长时间之后再自动删除该归档文件。该参数仅在LOG_AUTO_DELETE设置为TRUE之后才起作用,默认值为1440分钟,即24小时,可以通过以下命令修改该值的大小:

1exec DBMS_LOGSTDBY.APPLY_SET('LOG_AUTO_DEL_RETENTION_TARGET', 1);

以上命令表示归档日志被应用完之后,再过1分钟才会自动删除该归档日志。需要注意的是,这些设置仅适用于从主库传递过来的归档文件归档到的位置不是闪回恢复区。如果正在使用闪回恢复区,那么这些从主库传递过来的归档文件将不再根据参数LOG_AUTO_DELETE和LOG_AUTO_DEL_RETENTION_TARGET的值做处理。

如果禁止了逻辑DG归档文件的自动删除功能,那么一定要有相应的其他解决方案,不能说取消了自动删除功能,之后逻辑Standby数据库接收到的Standby归档文件就不再管它,这肯定会产生问题,最起码要考虑到逻辑Standby数据库的存储空间是有限的。

逻辑Standby数据库接收到的归档文件并不会显示在V$ARCHIVED_LOG视图中,因此以为通过RMAN中的配置自动删除这些文件的希望也是会落空的。对于这类文件的删除,正确的删除方法通常会按照如下步骤操作:

首先执行DBMS_LOGSTDBY.PURGE_SESSION,该过程会检查当前所有接收到的归档日志文件,对于那些已经应用过,不再需要(这里是当前不再需求,未来是否有可能需要就得由DBA来决定了)的文件进行标记,例如:

1EXECUTE DBMS_LOGSTDBY.PURGE_SESSION;

然后,查询数据字典DBA_LOGMNR_PURGED_LOG,所有被DBMS_LOGSTDBY. PURGE_SESSION标记不再需要的日志都会记录在这里,例如:

1SELECT * FROM DBA_LOGMNR_PURGED_LOG;

该字典只有一列,即归档文件的实际路径。最后根据显示的路径找到这些文件,然后在操作系统中删除即可。

9.调整PREPARER调制机的进程数

如果备库上有很多事务在等待Apply,但是还有空闲的Applier进程,且已经没有idle状态的PREPARER(调制机)进程,这时需要增加PREPARER的进程数。以下命令调整为4个,默认为1个:

1SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
2SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('PREPARE_SERVERS',4);
3SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

10.调整MAX_SGA,防止Paged out

通过以下SQL可以查询到是否发生了Paged out:

1SQL>select value bytes from v$logstdby_stats where name='bytes paged out';

如果以上查询结果在增长,那么查看当前MAX_SGA的大小:

1SQL>select value from v$logstdby_stats where name like 'maximum SGA for LCR cache%';
2VALUE
3---------------------------------------------------------------
430

可以增大MAX_SGA:

1SQL>alter database stop logical standby apply;
2SQL>execute dbms_logstdby.apply_set('MAX_SGA',1000);
3SQL>alter database start logical standby apply immediate;

逻辑备库需要将Redo记录解析成LCR(Logical Change Records),会在Shared Pool里分配一部分空间来作为LCR Cache,如果Cache太小,就会像OS的虚拟内存管理一样,需要做page out,这会严重影响应用日志的性能。在默认情况下,LCR Cache为Shared Pool的四分之一,最少不少于30M(默认为30M,最大可以设置到4096M),否则SQL Apply不能启动。如果机器的内存足够,建议将LCR Cache尽量设大一点,当然,同时Share Pool也要足够大。如果机器内存有限,那么可以考虑将Buffer Cache减少一点来给LCR Cache腾出空间。

11.调整事务应用方式

默认情况下逻辑Standby端事务应用顺序与Primary端提交顺序相同。如果希望逻辑Standby端的事务应用不要按照顺序的话,那么可以按照下列的步骤操作:

①停止SQL应用:

1SQL>ALTER DATABASE STOP LOGICAL STANDBYAPPLY;

②允许事务不按照Primary的提交顺序应用:

1SQL>EXECUTE DBMS_LOGSTDBY.APPLY_SET('PRESERVE_COMMIT_ORDER','FALSE');

③重新启动SQL应用

1SQL>ALTER DATABASE START LOGICAL STANDBYAPPLY IMMEDIATE;

恢复逻辑Standby按照事务提交顺序应用的话,按照下列步骤:

①还是先停止SQL应用:

1SQL>ALTER DATABASE STOP LOGICAL STANDBYAPPLY;

②重置参数PRESERVE_COMMIT_ORDER的初始值:

1SQL>EXECUTE DBMS_LOGSTDBY.APPLY_UNSET('PRESERVE_COMMIT_ORDER');

③重新启动SQL应用:

1SQL>ALTER DATABASE START LOGICAL STANDBYAPPLY IMMEDIATE;

逻辑备库还有很多其它非常实用的SQL语句,这里就不列举了,读者可以关注作者的微信公众号,作者每天会推送一个非常实用的SQL语句。

& 说明:

有关DBMS_LOGSTDBY包的使用可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2136495/

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗

---------------优质麦课------------

详细内容可以添加麦老师微信或QQ私聊。

About Me:小麦苗

● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● QQ:646634621  QQ群:618766405

● 提供OCP、OCM和高可用部分最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

DBA宝典

长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。

【DB笔试面试764】在Oracle中,逻辑DG维护中常用到的SQL语句有哪些?相关推荐

  1. 【DB笔试面试758】在Oracle的DG中,Switchover和Failover的区别有哪些?

    ♣ 题目部分 在Oracle的DG中,Switchover和Failover的区别有哪些? ♣ 答案部分 一个DG环境中只有两种角色:Primary和Standby.所谓角色转换就是让数据库在这两种角 ...

  2. 【DB笔试面试164】在Oracle中,如何彻底停止expdp数据泵进程?

    [DB笔试面试164]在Oracle中,如何彻底停止expdp数据泵进程? 真题1. 如何彻底停止 expdp 进程? 答案:许多同事在使用expdp命令时,不小心按了CTRL+C组合键,然后又输入e ...

  3. Oracle中如何查找未使用绑定变量的SQL语句?

    Oracle中如何查找未使用绑定变量的SQL语句? 利用V$SQL 视图的 FORCE_MATCHING_SIGNATURE 字段可以识别可能从绑定变量或 CURSOR_SHARING 获益的 SQL ...

  4. OA系统二十:请假审批一:审批功能概述;显示【请假审批】这个内嵌界面中【待审批请假数据】的SQL语句;

    本篇博客的主要内容就是:在请假审批这个内嵌界面中,显示待审批请假数据的SQL语句: 目录 1.[请假审批]功能需要实现什么? 2.[请假审批界面]中[待审批请假数据]之:SQL语句 (1)审批列表中需 ...

  5. Access中字段类型及修改字段类型的SQL语句

    Access中字段类型及修改字段类型的SQL语句 Access中的数据类型 Access中有10中数据类型:文本.备注.数值.日期/时间.货币.自动编号.是/否.OLE对象.超级链接.查询向导. 1. ...

  6. 创建oracle 数据库表空间,角色,用户的sql语句

    创建oracle 数据库表空间,角色,用户的sql语句 1.创建角色 CREATE ROLE "QIUDINGROLE" NOT IDENTIFIED; GRANT "C ...

  7. 总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法

    总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法以 及SQL语句中日期格式的表示(#).('') 在Delphi中进行字符变量连接相加时单引号用( ...

  8. (转载)总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法...

    总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法 总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中 ...

  9. SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法

    总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的 ...

  10. 总结一下SQL语句中引号()、quotedstr()、()、format()在SQL语句中的用法

    View Code 总结一下SQL语句中引号('').quotedstr().('''').format()在SQL语句中的用法以及SQL语句中日期格式的表示(#).('''')在Delphi中进行字 ...

最新文章

  1. SAP MM 特性设置问题导致PR审批策略不对之分析
  2. bzoj1935: [Shoi2007]Tree 园丁的烦恼
  3. spark2.1:rdd.combineByKeyWithClassTag的用法示例
  4. 推荐一个好用而且免费的XML文件查看工具,高效,易用而且可定制
  5. (hdu 简单题 128道)平方和与立方和(求一个区间的立方和和平方和)
  6. 取消一个请求(Cancel)
  7. 动态规划求解0-1背包问题
  8. Apache Hadoop下一代MapReduce框架(YARN)简介 (Apache Hadoop NextGen MapReduce (YARN))
  9. java线程轮询_基于springboot实现轮询线程自动执行任务
  10. RecyclerView实现滑动删除和拖拽功能
  11. java 报表模版 打印_Java报表工具技巧--Style Report报表套打模板设计
  12. pvacseq数据分析示例之准备数据,用VEP注释vcffile
  13. 图解机器学习算法(14) | PCA降维算法详解(机器学习通关指南·完结)
  14. 读取没开计算机硬盘,电脑磁盘读取错误开不了机怎么办
  15. 三进制计算机未来的发展趋势,如果研制出三进制计算机会怎样?
  16. 【Windows无法修复问题】“启动修复”无法修复你的电脑解决方法
  17. 使用DS12C887时钟芯片设计高精度时钟(单片机)
  18. khadas与树莓派_抛弃电信机顶盒,单板电脑打造家庭多媒体中心
  19. PXE实现无人值守安装
  20. 今天不务正业的分析下昨天雷总新发布的小米12旗舰机

热门文章

  1. html 在线测试 鱼缸,研究员试图用AR鱼缸欺骗鱼的感官系统,结果反被鱼识破
  2. Python优化算法05——蚁群算法和免疫优化算法
  3. 通过分析周榜前100名专家的博客文章 手把手教你写出爆款文章
  4. AngularJS controller调用factory
  5. 交易系统的高盈亏比怎么实现?
  6. 报错:Container killed by YARN for exceeding memory limits
  7. 专用计算机的运行速度,WIN10专业版下电脑运行速度慢多个解决技巧
  8. PCL点云滤波器总结
  9. 清除显卡右键菜单批处理.bat
  10. oracle odi 变量,ODI----Variables