0%

2节点RAC数据库只能任一启动一个 – 故障小计

关键词

oracle 12.2 rac rp_filter

No reconfig messages from other instances

LMON is terminating the instanc

Pending Sends: Yes Unacked Sends: Yes

startup: ORA-03113: end-of-file on communication channel

前言

前面安装的2套12.2的集群,主库正常使用了2周,今天给另一套做备库的集群搭建standby启动2个备库instance出现问题,2节点的rac其中一个始终无法启动,但是测试2个关闭后启动任意一个,都是可以正常启动的,再启动另一个就不行,因此判断db应该是没问题的,初步判断是网络问题导致instance通讯故障导致其中1个节点无法加入cluster。(加上甲方说前几天刚改过网络路由,于是自己更加相信是网路问题,同样2个集群4个服务器一起提供的资源,为啥主库没问题,更觉得是网络问题)

环境

阅读全文 »

xag 配置ogg高可用简单介绍

简介

GI的独立代理简称为xag,通过这个xag独立代理,可以将tomcat、ogg、jde、mysql等作为资源加入GI管理,从而为资源保障高可用性,本次主要针对单实例运行的ogg。

从11.2.0.3以后,XAG作为GI安装的一部分,无需额外安装,但XAG的新版本需独立安装。
综上,建议安装新版本XAG。

环境

源库 11.2.0.4 单实例
目标库 和源库相同(不通schema测试table同步)
downstream库 11.2.0.4 RAC
ogg version 12.2.0.1.1
xag version v7

本次由于xag要与gi结合使用,而gi是11.2所以使用低版本v7的xag,如果集群版本高的话推荐使用v10,支持微服务模式ogg。

正好练习downstream库,所以源库需要和集群rac版本保持一致,方便redo发送到rac中间库进行解析,至于ogg搭建过程就省略了,主要简单介绍一下xag。

安装

1
2
3
4
5
6
7
8
9
10
-- 下载解压

-- 安装(使用grid用户)
./xagsetup.sh --install --directory /u01/app/grid/xag_v7 --all_nodes

-- 配置grid、oracle xag环境变量path
PATH=$PATH:/u01/app/grid/xag_v7/bin

-- 查询version
agctl query releaseversion
阅读全文 »

redhat7.6 安装 oracle 12.2.0.1 RAC 小计

1.简介

虽说博客能总结、提炼技能,整理思路,拓展相关知识点,但是比较浪费时间,所以自己一般小的知识点或者技巧都是喜欢笔记,遇到复杂一点,网上没有的才写一下,希望能帮到需要的人。

客户这边很多11g的环境都因oracle服务支持到期,计划或者已经进行升级到19c了,但客户win8上面有几套12.2.0.1的暂时不升级,需要在Linux安装新的12.2.0.1环境对接,而且使用的服务器资源池是最新的redhat7系列,安装还是遇到了不少问题,网上大都是7.3/7.4,本次7.6不太适用,但好在最后也安装成功了,所以后续总结一下,有问题的地方欢迎帮忙指正。

2.环境

操作系统 redhat 7.6
内核版本 3.10.0-1062.9.1.el7.x86_64
GI版本 12.2.0.1
节点数 2节点
安装方式 静默

查看12.2.0.1官网gi安装redhat7操作系统要求:Red Hat Enterprise Linux 7: 3.10.0-123.el7.x86_64 or later

虽然是满足的,但是此次环境的内核已经安装最新补丁升级到3.10.0-1062版本,相比123高太多,所以安装时候遇到很多问题。

3.GI安装

1.基本环境准备:略(内核参数、系统调整、用户和文件夹、存储、网络、安装介质、补丁…)

阅读全文 »

19c adg 与 clone pdb

前言

​ 哎,又好久没写博客 ^.^

​ 最近在客户系统作升级演练时候遇到一些dg问题,之前19c基本都是新库搭建好dg环境,然后再create新的业务pdb,或者是有一些业务pdb然后再搭建好高可用的dg环境,基本没问题。但这次由于需求,在搭建好的dg环境,进行remote hot clone pdb进入主库,备库上面的新clone的pdb出现问题,以此记录一下。


一、adg主库remote hot clone pdb 出错

1
2
3
4
5
-- 故障场景:
主库和备库都是19.3 RAC,19.4 RU环境,有4个ADG备库。
主库新建create和删除pdb备库正常同步进行,然后当主库通过dblink clone pdb进入cdb时,主库正常,备库正常接收日志,但是alter报错,新clone的pdb无法recover

本次特殊的是源库11.2.0.4升级成19c nocdb,然后再clone这个nocdb进来主库rac作为目标pdb,然后执行noncdb_to_pdb脚本转换为正常pdb。本次pdb大小300G左右,rman压缩备份后为36G,通过rman恢复40分钟左右,升级到19c耗时1个小时左右,转为pdb耗时30多分钟,具体时间根据库大小和机器环境配置决定。
1
2
3
4
5
-- 发现问题
当时主库clone完成后查询备库dg应用延时为零,未打开备库上面的的pdb和查看备库的alert日志,以为一切正常。结果第二天打开standby中的pdb无法正常打开为read only,报错数据文件unname,才发现备库有问题,检查备库DB_FILE_NAME_CONVERT参数正常,4个dg都有相同问题,判断应该不是dg参数有问题,估计应该是主库clone和create pdb不太一样,于是谷歌,找到一篇相似的文章对4个dg进行了修复。
-- https://codeleading.com/article/15241304236

难道19c adg主库不支持hot clone pdb进入cdb吗?于是后面自己进行测试,被clone的源库pdb状态设置为read write或者read only都不行,库虽然不大,受限于网络带框,测试真是难受。于是细心去查看官方手册,发现在高可用章节已经明确提醒DG clone pdb时需要配置额外参数了,19c之前需要手动修复备库的datafile19c可以设置参数自动完成standby clone,下面开始介绍。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

-- 排查问题

-- standby查看主库新clone进来的pdb,一切看似正常,同步延时为0,熟不知后台已经报错了(cdb mount和open都一样会有问题)
-- 因为备库的这个故障pdb被认定为offline不再进行recover同步,所以cdb全局的同步延时显示为0,后台alert很明显提示了
SQL> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 TEST_PDB MOUNTED


SQL> select value from v$dataguard_stats;

VALUE
----------------------------------------------------------------
+00 00:00:00
+00 00:00:00
+00 00:00:00.000


SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ ONLY WITH APPLY
1
2
3
4
5
6
-- 打开备库pdb开始报错
SQL> alter pluggable database all open;
alter pluggable database all open
*
ERROR at line 1:
ORA-01111: name for data file 40 is unknown - rename to correct file
阅读全文 »

前言:

​ 之前一直学习oracle,鉴于国产替代化和去o,就了解学习一下其他mysql和pg数据库,发现pg很小巧灵活,特别是psql客户端感觉很好用,就是不知道实际生产使用时性能和安全相比怎么样。

环境:(同一个主机)

主机1 主机2
os_version oracle Linux Server release 5.4 32位 oracle Linux Server release 5.4 32位
ip 192.168.100.203 192.168.100.203
pg_version PostgreSQL 10.0 on i686-pc-linux-gnu PostgreSQL 10.0 on i686-pc-linux-gnu
pg_install_dir /opt/pgsql /opt/pgsql
pg_data_dir /pgdata/10/data /pgdata2/10/data

1. 修改主库相关参数

1
2
3
4
5
6
alter system set archive_mode = 'on';     -- 启动归档模式
alter system set archive_command = 'cp %p /pgdata/10/archive_wals/%f'; -- 归档命令
alter system set wal_level = 'replica';
alter system set max_wal_senders = 10; -- 默认就是10, 归档进程数
alter system set wal_keep_segments = 512; -- 默认为0,pg_wal保留的最小wal文件数量
alter system set hot_standby = 'on'; -- 默认为on,备库为read only状态

2. 修改主库访问权限文件(本次是同机,如果是异机,需要主备host都加上各一行)

1
2
3
vim pg_hba.conf
#增加一行
host replication repuser 192.168.100.203/32 md5

3. 重启主库(生效参数),新建replication用户

1
2
3
4
5
6
7
pg_ctl stop -D /pgdata/10/data
pg_ctl start -D /pgdata/10/data

CREATE USER repuser REPLICATION LOGIN CONNECTION LIMIT 5 ENCRYPTED PASSWORD 're12a345';
-- 查看新建的用户角色
\d pg_roles
select rolname from pg_roles;
阅读全文 »

1. 基础概念:

oracle block是逻辑存储数据(table、index、undo…的segment)分配的最小unit,对应到多个底层物理数据文件的os block。

![1596452902805][]

![1596452916075][]

  • db_block_size一般默认为8k,在创建db时指定,为了最优性能,推荐选择合适的OS bs大小倍数。

  • 8k的普通表空间单个文件最大32g,32k的单个文件最大128g

  • 不同block size的db进行tts,可以手动指定DB_nK_CACHE_SIZE参数,区别于默认8k的db_buffer;或者为了防止太多字段和太长列的表发生行链接,还有一些DSS环境也可以指定db或ts较大的blocksize。


2. 块结构:

![1596452980314][]

![1596452990006][]

一个data block从上到下可以简单理解为 3 层:

阅读全文 »

七彩虹C.h61u v25-BIOS升级

前言

由于穷,所以一直是个入门的垃圾佬,之前原配是 i3-2130、h61u v25、hd-7700,玩lol基本100FPS以上,日常还能用,但是其他就…毕竟牙膏厂。

最近出于其他目的,拼多多200不到搞了块i5-3570爽一爽,忘记问一下客服,以为都是1155针脚应该没问题,结果悲剧了。装上主板都不供电,无法识别(风扇灰是真的多^_^)。 咨询了客服,才发现老h61主板可能不支持3代u,毕竟3代U后出的,架构和工艺新一些,但好在可以升级主板BIOS进行识别使用。

由于之前没搞过,技术比较菜,这次升级成功亮机,还是费了一些时间,简单记录一下,希望给有需要的人参考帮助一下,哈哈。

据说这入门二代板会限制3代U或者e3性能,我不是发烧友,就懒得去测了。

正文

升级前

1589338387488

升级后
阅读全文 »

sql trace 和 10046 event


什么是sql trace?

1
2
即sql语句跟踪,将sql语句的执行过程,资源消耗,统计信息都dump到trace文件中,它比单独使用explain plan更详细有效对于sql执行跟踪分析。
-- 真的很强大,从普通SQL执行,到mount和open database的很多SQL执行过程都可以跟踪分析和学习,推荐大家学习使用提升自己。

什么是event?

1
event表示从一个状态改变为另一个状态的行为,发生错误或者是执行操作也可以是一个event,可以通过设置event来获取oracle内部一些详细跟踪信息,比如10046 event就相当于sql_trace=true。

设置sql跟踪的几种方法: (注意可以再system全局或者session会话级别开启,全局注意资源消耗,某个不常用事件跟踪请不要在生产测试和做好数据备份)

1
2
3
4
5
6
7
8
9
10
SQL> alter session set sql_trace = true;
SQL> alter session set events '10046 trace name context forever, level 16'; -- 可以同时设置多个event跟踪,也可以简写: alter session set events '10046 level 16';
SQL> exec dbms_system.set_ev(9,437,10046,8,'');
SQL> exec dbms_monitor.session_trace_enable(9,437);

SQL> oradebug setmypid
SQL> oradebug event 10046 [off]
SQL> oradebug tracefile_name

-- 关闭跟踪的话sql_trace=false,或者event level 0,或者调用相关过程即可。

event设置说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
alter session set events '[eventnumber|immediate] trace name eventname [forever] [, level levelnumber] : .......'

event_number通常可以指定:0124812[1632],也可以随意指定100哈,也不会报错应该是被重置为最大级别了。
对于10046事件可以指定:
0level:关闭sql跟踪
1level:打开sql跟踪
2level:打开sql跟踪
4level:打开并跟踪绑定变量
8level:打开并跟踪wait事件
12level:全部跟踪
-- 个别事件不一定有这么多级别,但一般0都是关闭跟踪,level越高跟踪越详细,消耗资源也相对越多,一般与10046一起常用的event还有10053,针对CBO的执行计划跟踪。


通过:符号,可以连续设置多个事件,也可以通过连续使用alter session set events 来设置多个事件。
格式说明: eventnumber指触发dump的事件号,事件号可以是Oracle错误号(出现相应错误时跟踪指定的事件)或oralce内部事件号,内部事件号在1000010999之间,不能与immediate关键字同用。
immediate关键字表示命令发出后,立即将指定的结构dump到跟踪文件中,这个关键字只用在alter session语句中,并且不能与 eventnumber、forever关键字同用。
trace name 是关键字。
eventname指事件名称(见后面),即要进行dump的实际结构名。若eventname为context,则指根据内部事件号进行跟踪。
forever关键字表示事件在实例或会话的周期内保持有效状态,不能与immediate同用。
level为事件级别关键字。但在dump错误栈(errorstack)时不存在级别。
levelnumber表示事件级别号,一般从1101表示只dump结构头部信息,10表示dump结构的所有信息。

常用事件:
1、buffers事件:dump SGA缓冲区中的db buffer结构
alter session set events 'immediate trace name buffers level 1'; --表示dump缓冲区的头部。

2、blockdump事件:dump数据文件、索引文件、回滚段文件结构
alter session set events 'immediate trace name blockdump level 66666'; --表示dump块地址为6666的数据块。
在Oracle 8以后该命令已改为:
alter system dump datafile 11 block 9; --表示dump数据文件号为11中的第9个数据块。

3、controlf事件:dump控制文件结构
alter session set events 'immediate trace name controlf level 10'; --表示dump控制文件的所有内容。

4、locks事件:dump LCK进程的锁信息
alter session set events 'immediate trace name locks level 5';

5、redohdr事件:dump redo日志的头部信息
alter session set events 'immediate trace name redohdr level 1'; --表示dump redo日志头部的控制文件项。
alter session set events 'immediate trace name redohdr level 2'; --表示dump redo日志的通用文件头。
alter session set events 'immediate trace name redohdr level 10'; --表示dump redo日志的完整文件头。
注意:redo日志的内容dump可以采用下面的语句:
alter system dump logfile 'logfilename';

6、loghist事件:dump控制文件中的日志历史项
alter session set events 'immediate trace name loghist level 1'; --表示只dump最早和最迟的日志历史项。
levelnumber大于等于2时,表示2的levelnumber次方个日志历史项。
alter session set events 'immediate trace name loghist level 4'; --表示dump 16个日志历史项。

7、file_hdrs事件:dump 所有数据文件的头部信息
alter session set events 'immediate trace name file_hdrs level 1'; --表示dump 所有数据文件头部的控制文件项。
alter session set events 'immediate trace name file_hdrs level 2'; --表示dump 所有数据文件的通用文件头。
alter session set events 'immediate trace name file_hdrs level 10'; --表示dump 所有数据文件的完整文件头。

8、errorstack事件:dump 错误栈信息,通常Oracle发生错误时前台进程将得到一条错误信息,但某些情况下得不到错误信息,可以采用这种方式得到Oracle错误。
alter session set events '604 trace name errorstack forever'; --表示当出现604错误时,dump 错误栈和进程栈。

9、systemstate事件:dump所有系统状态和进程状态
alter session set events 'immediate trace name systemstate level 10'; --表示dump 所有系统状态和进程状态。

10、coalesec事件:dump指定表空间中的自由区间
levelnumber以十六进制表示时,两个高位字节表示自由区间数目,两个低位字节表示表空间号,如0x00050000表示dump系统表空间中的5个自由区间,转换成十进制就是327680,即:
alter session set events 'immediate trace name coalesec level 327680';

11、processsate事件:dump进程状态
alter session set events 'immediate trace name processsate level 10';

12、library_cache事件:dump library cache信息
alter session set events 'immediate trace name library_cache level 10';

13、heapdump事件:dump PGA、SGA、UGA中的信息
alter session set events 'immediate trace name heapdump level 1';

14、row_cache事件:dump数据字典缓冲区中的信息
alter session set events 'immediate trace name row_cache level 1';
阅读全文 »

linux 正向代理

项目上web服务器不给访问外网,迁移服务器环境又太麻烦,决定给web服务器做正向代理,刚开始使用nginx,但是http代理一直不成功,后面大佬建议使用squid来达到相同目的,在不考虑安全和性能等其他问题下使用squid正式太简单了,下面进去正文

这里先贴出nginx代理,http没问题,但https不成功,如果有成功的希望留下几句指导一下,哈哈,谢谢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {  
resolver 114.114.114.114;
listen 10002;
location / {
proxy_pass http://$http_host$request_uri;
proxy_set_header HOST $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
}

server {
resolver 114.114.114.114;
listen 10001;
location / {
proxy_pass https://$host$request_uri;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
}

curl https://bizapi.jd.com/api/area/getProvince # 在另外机器上面测试成

需要注意上面访问https时只能使用http,但是我成功

配置squid代理

1.安装squid

1
yum -y install squid    //centos环境

2.修改内核参数,打开ip转发

1
2
vim /etc/sysctl.conf    # 修改0为1 :# net.ipv4.ip_forward = 1
sysctl -p # 使内核参数修改生效
阅读全文 »

RMAN-20207: UNTIL TIME or RECOVERY WINDOW is before RESETLOGS time

1
2
RMAN> list incarnation;
RMAN> reset database to incarnation {INCARNATION#};

昨天在客户IT在备份环境做DBPITR时,突然报上面错误,谷歌一下,简单解决了,表面原因是他rman执行until time还原DB时设置的时间超前当前incarnation的时间了。但是什么事incarnation,查了一下一头雾水,还是要看官网,个人知识和翻译不同导致见解不同,我个人把它理解成:化身,或者阶段来描述它。


查看官网视图,与incarnation相关有2个,DBA_RESOURCE_INCARNATIONS 和 V$DATABASE_INCARNATION:
其中DBA_RESOURCE_INCARNATIONS是关于instance的,一般应该用不到,记录的信息其他视图也能找到。

1
2
3
4
5
6
7
8
9
set lin 200 pages 3000
col RESOURCE_TYPE for a20
col RESOURCE_NAME for a20
col DB_UNIQUE_NAME for a20
col DB_DOMAIN for a20
col INSTANCE_NAME for a20
col HOST_NAME for a20
col STARTUP_TIME for a20
select * from dba_resource_incarnations;

image-20200303215437181.png

1
2
col FLASHBACK_DATABASE_ALLOWED for a3
select * from V$DATABASE_INCARNATION;

1583335025532

第一列是number唯一标识号,第二列是open resetlogs时的redo记录的scn,其中status有 父态、孤儿态、当前态,有点难理解,其实官方手册说还有祖先态,但我这里没显示,请看下面理解

阅读全文 »