OGG缺失日志导致进程中断

有时候ogg出现中断,日志里会提示如下错误信息:

ERROR OGG-00868 Oracle GoldenGate Capture for Oracle, eprisk.prm: Error code 1291, error message: ORA-01291: 缺失日志文件

(Missing Log File WAITING FOR REDO: FILE NA, THREAD 2, SEQUENCE 290359, SCN 0x0000002c59bd0176. Read Position SCN: 44.1505736448 (190484297472))

在这种情况下,是因为日志出现了gap,但好消息是通常我们都有这些归档日志的备份。

OGG通过dba_registered_archived_log 里提到的logfile来进行redo日志的挖掘,因此我们需要确定出基于SCN号所需要的所有归档日志(参考 ‘Minimum Archive Log Necessary to Restart Integrated Extract’ - in the Streams’ Healthcheck report output (Note 1448324.1))。

  • 查询抽取进程的当前中断时的APPLIED_SCN
阅读更多

奇怪的ZBX_NOTSUPPORTED问题一则

在监控linux硬件信息的时候,通过system.hw.chassis[serial]监控项来获取设备序列号。本机通过zabbix_agentd命令测试正常

1
2
3
4
[root@localhost ~]# zabbix_agentd -t system.sw.os[name]
system.sw.os[name] [s|Oracle Linux Server 7.8]
[root@localhost ~]# zabbix_agentd -t system.hw.chassis[model]
system.hw.chassis[model] [s|ProLiant DL360 Gen10]

但是在proxy服务器上通过zabbix_get命令获取数据时却发现监控项不支持

1
2
3
4
[root@zabbix-proxy ~]# zabbix_get -s 192.168.2.11 -k system.sw.os[name]
Oracle Linux Server 7.8
[root@zabbix-proxy ~]# zabbix_get -s 192.168.2.11 -k system.hw.chassis[model]
ZBX_NOTSUPPORTED: Cannot obtain hardware information.
阅读更多

Oracle谓词推入

创建测试数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
drop table t1;
drop table t2;
drop table t3;

create table t1(n1 number,n2 varchar2(200));
create table t2(n1 number,n2 varchar2(200));
create table t3(n1 number,n2 varchar2(200));

insert into t1 select object_id,object_name from dba_objects;
insert into t2 select object_id,object_name from dba_objects;
insert into t3 select object_id,object_name from dba_objects;
commit;

create index idx_t1 on t1 (n2);
create index idx_t2 on t2 (n2);
create index idx_t3 on t3 (n2);

exec dbms_stats.gather_table_stats(ownname=>'XB',tabname=>'T1',cascade=>true);
exec dbms_stats.gather_table_stats(ownname=>'XB',tabname=>'T2',cascade=>true);
exec dbms_stats.gather_table_stats(ownname=>'XB',tabname=>'T3',cascade=>true);
阅读更多

对JSON数据创建索引

JSON创建索引概述

对于JSON数据来说并没有什么特殊的SQL数据类型,所以创建索引的方式也并无特别之处。可以对json_value函数返回值创建B-tree索引或者位图索引,也可以对is jsonjs not jsonjson_exists等函数创建位图索引。

一般来说,位图索引通常是创建在那些唯一值很少的字段上,比如性别之类。

函数索引只会在对应函数的查询sql上才会生效,这在具体使用中无可避免存在一些局限性,所以在创建这些函数索引之前需要充分了解到业务经常使用的场景。

对于那些查询场景不确定的情况也有一种对应方式,那就是JSON search index,这是一种常规索引,不局限于特定的JSON路径表达式。它非常适合结构式的查询,比如查找JSON字段中的具体值,并且通过json_textcontains来进行全文查询,在各种字符串值中寻找特定的单词。

对于同一个JSON列来说,可以同时创建函数索引和全文索引,这里要注意的是JSON search index是专门用来对应JSON数据的全文索引。

Oracle建议使用AL32UTF8字符集,否则创建和使用索引时会自动的进行字符集的转换,而这种转换是有损的,也就表示某些数据查询的时候会无法返回

创建一张测试JSON表

阅读更多

18c Treat as Json

从18C开始,对json数据进行了很多增强,其中之一就是treat as json表达式。可以将带有关键字AS JSON的SQL函数treat应用于SQL表达式,以指定该表达式返回JSON数据。 这在Oracle无法确定结果为JSON数据的情况下很有用。 在要强制将某些文本解释为JSON数据的情况下,它也很有用。 例如,您可以使用它告诉Oracle将{}的VARCHAR2值解释为不是字符串,而是解释为空的JSON对象。

treat as json的语法:

oracle从12c开始支持了json的语法,具体可以参考之前的文章:JSON in Oracle

创建测试表

这里创建一张测试表,并插入一些JSON格式数据,注意现在是并没有加IS JSON约束的情况。

阅读更多

Listener使用ip导致dgbroker报ORA-12514

有一套adg环境,数据正常同步,同时也部署配置了dgbroker管理工具, 但是在运行一会后会出现TNS的报错,在做swithover和failover也会失败,根据alert日志可以发现做切换的时候会去访问db_unique_name_DGB的TNS,而查看主备起的监听,却并没有发现这样一个service,经过查资料,这个监听是会在dgbroker服务起来的时候动态注册的,动态注册的时候是去找的隐含参数__dg_broker_service_names

下面是一个正常的环境下的情况

1
2
3
4
5
6
SQL> @pd dg_broker_service
Show all parameters and session values from x$ksppi/x$ksppcv...

NUM N_HEX NAME VALUE DESCRIPTION
---------- ----- -------------------------------------------------------- ------------------------------ ---------------------------------------------------------------------------------------------------
775 307 __dg_broker_service_names ora12c_DGB, ora12c_CFG service names for broker use

正常情况下已经启动的监听

阅读更多

ROWID唯一性

在oracle数据库中rowid是唯一的吗,或许很多人第一反应都是这么认为。这种说法其实并不准确,应该说在oracle 8以前,在整个数据库层面rowid是唯一的,而从oracle 8开始,在数据库层面rowid并不是全局唯一的,针对表空间来说,存储在其中的数据的rowid则是相对唯一的。

我们知道在数据库中存放的每一条记录都有一个ROWID ,代表着这条记录在数据库存放的物理地址。

从oracle 8开始ROWID的格式发生了变化,大小也从8字节增加到了10个字节。当你对某个表进行重组或者导出导入,则ROWID会变化。比如对于一个分区表来说,如果通过update语句将数据行从一个分区迁移到另一个分区,则其rowid会发生变化。

Oracle 7格式

在Oracle 7中ROWID由8个字节组成:

  • 字节1到4 (bits 1 to 32): 数据块编号 (0-4294967295)
  • 字节5到6 (bits 33 to 48): 数据块里的行编号 (0-65535)
  • 字节7到8 (bits 49 to 64): 数据文件编号(0-65535)

每个字节由2个16进制的字符表示 (0-9A-F),同时每个部分由圆点隔开: BBBBBBBB.RRRR.FFFF

这个时候数据库里文件数最大为1022,当时使用已经足够,而随着业务的不断发展,所需要的文件数也越来越大,1022也明显不够用。到oracle 8时,想增加数据文件数量的同时又不想修改已有数据的rowid,因为这会牵涉到在升级过程中需要修改所有数据块的巨大工作量,所以对rowid的组成部分进行了变更。

阅读更多

Result Cache

result cache是用来存储查询sql得到的结果,给之后的重复查询来使用。通过缓存这些结果,oracle能避免那些重复的实际消耗,并且节省了大量的数据库操作,比如排序、合并、物理io和表关联等。result cache是内存里的一块单独区域,要么是SGA里或者客户端应用程序内存里。存放在里面的缓存结果在不同的sql语句或者不同的会话之间是可以共享的,除非缓存结果本身失效了。结果缓存对于应用程序来说是完全透明的,它不需要人为介入,而是直接由oracle内部来进行自动管理和维护。

对于不同的应用系统来说,result cache所带来的收益是不一样的,对于OLAP这种大数据量的分析统计系统来说效果最明显。缓存的最佳选择是查询了大量的数据,但最后却只返回少量的数据,例如数据仓库。除此之外,对于只读或者数据较少变化的SQL来说效果也会更好,因为当数据进行了变化后,相对于的缓存也会失效,而需要重新维护生成新的。

数据库相关配置

oracle与result cache相关的一些初始化参数如下

1
2
3
4
5
6
7
8
9
10
select name, value, isdefault
from v$parameter
where name like 'result_cache%';

NAME VALUE ISDEFAULT
-------------------------------------------------- --------------- ---------------------------
result_cache_mode MANUAL TRUE
result_cache_max_size 42958848 TRUE
result_cache_max_result 5 TRUE
result_cache_remote_expiration 0 TRUE
阅读更多

oracle中只读用户锁表

由于数据查询的需求,我们常常需要在数据库当中建立只读用户,并且都是赋予的select any table权限。但是有没有想过只读权限的用户也能锁表?并且是以排他锁的形式?

这样就意味着很多‘只读‘权限的用户并不是真正意义上的只读,这很有可能会由于人为失误或者故意的某些行为导致生产环境的严重灾难,先通过几个例子来重现这种现象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SQL> conn xb/xb@pdb12c
Connected.

SQL> grant create session to readonly;

Grant succeeded.

SQL> create table t(id integer);

Table created.

SQL> insert into t values(1);

1 row created.

SQL> grant select on t to readonly;

Grant succeeded.
阅读更多