--以下用户的数据不会同步到逻辑备库中,比如sys、system等等
select owner from dba_logstdby_skip where statement_opt='INTERNAL SCHEMA';
--列出不属于内部模式和由于使用不支持的数据类型而不会被SQL应用的数据库表:
--注意该视图的 ATTRIBUTES 列,列值会显示表不被sql应用支持的原因
col owner for a20
col table_name for a50
select distinct owner,table_name,ATTRIBUTES from dba_logstdby_unsupported order by owner,table_name;
--查询视图DBA_LOGSTDBY_NOT_UNIQUE列出SQL Apply不能唯一区别的表。
--Oracle 建议你为表创建一个主键或非空的唯一索引/约束,以尽可能确保sql应用能够有效应用redo数据,更新逻辑standby数据库
select owner, table_name from dba_logstdby_not_unique
where (owner, table_name) not in
(select distinct owner, table_name from dba_logstdby_unsupported)
and bad_column = 'Y';
一、先搭建物理备库
参考之前
二、把物理备库转换成逻辑备库
1、物理备库停止应用日志:
recover managed standby database cancel;
2、主库开启附加日志:
alter database add supplemental log data;
3、主库执行LogMiner字典:
exec dbms_logstdby.build;
--该过程会自动启用primary数据库的补充日志(supplemental logging)功能(如果未启用的话)
--生成记录的元数据信息到redo log
--该过程执行需要等待当前所有事务完成,因此如果当前有较长的事务运行,可能该过程执行也需要多花一些等待时间
--该过程是通过闪回查询的方式来获取数据字典的一致性,因此oracle初始化参数UNDO_RETENTION值需要设置的足够大
4、备库执行:转为逻辑备库
alter database recover to logical standby <db_name>;
--如果物理备数据库是RAC,则先关闭其他实例,只保留一个实例,然后设置 cluster_database 参数为FALSE,再作为单实例启动物理备数据库到独占模式:
--ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL 可以取消
--如果转换为逻辑备数据库时一直挂住无法完成转换,可以用以上语句取消转换,然后再次在主库上执行“EXECUTE DBMS_LOGSTDBY.BUILD;”重新创建LogMiner字典,最后再次执行转换语句。
5、修改 逻辑备库的日志归档位置
--如果希望primary数据库能够正常切换为逻辑standby角色的话,需要设置个log_archive_dest_N,并且valid_for属性,需要更改成:(STANDBY_LOGFILES,STANDBY_ROLE)
alter system set log_archive_dest_2='location=/home/oracle/standby_log valid_for=(standby_logfiles,standby_role) db_unique_name=ora19c_dg';
6、备库启动到mount状态,并已resetlogs打开:
shutdown immediate;
startup mount
alter database open resetlogs;
7、备库应用日志
alter database start logical standby apply immediate;
--关闭:ALTER DATABASE STOP LOGICAL STANDBY APPLY;
--如果数据不同步找不到原因的话记得用重启大法
--参考:Oracle Data Guard Concepts and Administration, 19c
8、管理
--1>DBA_LOGSTDBY_EVENTS:可以把该视图看成逻辑standby 操作日志,因此如果发生了错误,可以通过该视图查看近期逻辑standby都做了些什么。
--默认情况下, 该视图保留100 条事件的记录, 不过你可以通过DBMS_LOGSTDBY.APPLY_SET()过程修改该参数。
select event_time,status,event from dba_logstdby_events;
--2>DBA_LOGSTDBY_LOG
--该视图用来记录当前的归档日志应用情况,等同于物理standby 中的v$archived_log,
--多数情况下,你只需要关注SEQUENCE#,APPLIED,即查看日志序号和是否应用,当然该视图还能提供更多信息,比如应用的scn,应用时间等
select sequence#,first_change#,next_change#,timestamp,applied from dba_logstdby_log;
--3>V$LOGSTDBY_PROGRESS:该视图显示log 应用服务当前进展状况,比如当前应用到逻辑standby 的scn 及时间,sql 应用开始应用的scn 及时间,最后接收及应用的scn 和时间等等
select * from v$Logstdby_progress;
APPLIED_SCN APPLIED_TIME RESTART_SCN RESTART_TIME LATEST_SCN LATEST_TIME MINING_SCN MINING_TIME RESETLOGS_ID CON_ID
----------- ------------------- ----------- ------------------- ---------- ------------------- ---------- ------------------- ------------ ----------
3994489 2024-10-14 19:20:27 3994492 2024-10-14 19:20:28 3994496 2024-10-14 19:20:30 3994492 2024-10-14 19:20:28 1088930725 0
--4>指定对象跳过应用,请用DBMS_LOGSTDBY.SKIP
默认情况下,接收自primary 的redo 数据中,所有能够被standby 支持的操作都会在逻辑standby 端执
行,如果你希望跳过对某些对象的某些操作的话,DBMS_LOGSTDBY.SKIP 就能被派上用场了
DBMS_LOGSTDBY.SKIP (
stmt IN VARCHAR2,
schema_name IN VARCHAR2 DEFAULT NULL,
object_name IN VARCHAR2 DEFAULT NULL,
proc_name IN VARCHAR2 DEFAULT NULL,
use_like IN BOOLEAN DEFAULT TRUE,
esc IN CHAR1 DEFAULT NULL);
例如,你想跳过jss 用户下对tmp1 表的dml 操作,可以通过执行下列语句实现(执行该过程前需要先停止redo 应用):
alter database stop logical standby apply;
execute dbms_logstdby.skip('DML','JSS','TMP1');
alter database start logical standby apply;
假如:standby 端有一批表名为tmp 开头的表,这张表不再需要保持与primary 的同步,那么按照步骤执行下列语句,sql 应用即可跳过这些表:
execute dbms_logstdby.skip('SCHEMA_DDL','JSS','TMP%');
execute dbms_logstdby.skip('DML','JSS','TMP%');
--5:可以通过以下命令限制逻辑备库的增删改(不支持同步的用户,比如SYS、system不受影响)
alter session enable guard;
alter session disable guard;
最后修改时间:2024-10-14 19:35:35
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




