蓝皮书的自留地

运筹帷幄,决胜千里

[toc]

适用范围

oracle 19c dataguard 主库alert日志告警:TNS-12564: TNS: 拒绝连接 TT00 (PID:2865): Error 12528 received logging on to the standby”;主库v$archive_dest报错:archive_dest ORA-16058: 未装载备用数据库实例

阅读全文 »

迅速汇总 listener.log 里面信息的脚本

统计连接拒绝IP

1
2
3
tail -10000 listener.log | awk -F "Incoming connection from|rejected " '{print $2}'| sort | uniq -c | sort -nr

tail -10000 listener.log |grep Incoming|awk '{print $4}'| sort | uniq -c | sort -nr

HOST/Program/OSUser简版

按HOST/Program/OSUser汇总lister log最近 10000行的记录

1
2
3
echo "CNT     # PROGRAM@HOST[OSUSER]";tail -10000 listener.log | awk  -F"[()=]" '/establish/{
for(i=1;i<=NF;i++){if($i=="PROGRAM")pro=$(i+1);if($i=="HOST")host=$(i+1);if($i=="USER")usr=$(i+1);}cnt[pro"@"host"["usr"]"]++}
END{for(x in cnt)print cnt[x]"\t# "x}'|sort -nr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HOST简版:
按HOST汇总lister log最近 10000行的记录。
echo "CNT # HOST";tail -10000 listener.log | awk -F"[()=]" '/establish/{
for(i=1;i<=NF;i++){if($i=="HOST")host=$(i+1)}cnt[host]++}
END{for(x in cnt)print cnt[x]"\t# "x}'|sort -nr


=============================================================================================
PROGRAM简版:
按HOST汇总lister log最近 10000行的记录。
echo "CNT # PROGRAM";tail -10000 listener.log | awk -F"[()=]" '/establish/{
for(i=1;i<=NF;i++){if($i=="PROGRAM")pro=$(i+1)}cnt[pro]++}
END{for(x in cnt)print cnt[x]"\t# "x}'|sort -nr


=============================================================================================
PROGRAM@HOST简版:
按HOST汇总lister log最近 10000行的记录。
echo "CNT # PROGRAM@HOST";tail -10000 listener.log | awk -F"[()=]" '/establish/{
for(i=1;i<=NF;i++){if($i=="PROGRAM")pro=$(i+1);if($i=="HOST")host=$(i+1)}cnt[pro"@"host]++}
END{for(x in cnt)print cnt[x]"\t# "x}'|sort -nr

=============================================================================================error

HOST/Program/OSUser完整版(无排序):

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
tail -10000 listener.log | awk  -F"[()=]" '/CONNECT_DATA/{
for(i=1;i<=NF;i++){
if($i=="PROGRAM")pro=$(i+1);
if($i=="HOST")host=$(i+1);
if($i=="USER")usr=$(i+1);
}
cnt[pro"@"host"["usr"]"]++;
cnt_usr[usr]++;
cnt_host[host]++;
cnt_pro[pro]++;
}
END{
print "\n+++++++++++By OSUser+++++++++++++";
print "CNT\t# OSUSER";
for(x in cnt_usr)print cnt_usr[x]"\t# "x
print "\n+++++++++++By Host+++++++++++++";
print "CNT\t# HOST";
for(x in cnt_host)print cnt_host[x]"\t# "x
print "\n+++++++++++By Program+++++++++++++";
print "CNT\t# PROGRAM";
for(x in cnt_pro)print cnt_pro[x]"\t# "x
print "\n+++++++++++By OSUSER/Host/Program+++++++++++++";
print "CNT\t# PROGRAM@HOST[OSUSER]";
for(x in cnt)print cnt[x]"\t# "x
}'

安装时间趋势汇总

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
=============================================================================================
时间趋势/Day: 按天汇总,按天排序
tail -10000 listener.log | awk '/establish/{c=substr($0,1,11);if(c!=f){n++;f=c};d[n"\t"c]++}END{for(x in d)print x"--- "d[x]}'|sort -n
按天汇总,按次数排序
tail -10000 listener.log | awk '/establish/{c=substr($0,1,11);d[c]++}END{for(x in d)print d[x]"\t"x}'|sort -nr

时间趋势/Hour:按小时汇总,按小时排序
tail -10000 listener.log | awk '/establish/{c=substr($0,1,14);if(c!=f){n++;f=c};d[n"\t"c]++}END{for(x in d)print x"--- "d[x]}'|sort -n
按小时汇总,按次数排序
tail -10000 listener.log | awk '/establish/{c=substr($0,1,14);d[c]++}END{for(x in d)print d[x]"\t"x":00"}'|sort -nr

时间趋势/10min:按10分钟汇总,按10分钟排序
tail -10000 listener.log | awk '/establish/{c=substr($0,1,16);if(c!=f){n++;f=c};d[n"\t"c"0"]++}END{for(x in d)print x"--- "d[x]}'|sort -n
按10分钟汇总,按次数排序
tail -10000 listener.log | awk '/establish/{c=substr($0,1,16);d[c]++}END{for(x in d)print d[x]"\t"x"0"}'|sort -nr

时间趋势/1min:按分钟汇总,按分钟排序
tail -10000 listener.log | awk '/establish/{c=substr($0,1,17);if(c!=f){n++;f=c};d[n"\t"c]++}END{for(x in d)print x"--- "d[x]}'|sort -n
按分钟汇总,按次数排序
tail -10000 listener.log | awk '/establish/{c=substr($0,1,17);d[c]++}END{for(x in d)print d[x]"\t"x}'|sort -nr

由于awk各发行版本特性不一,未必能完美支持。如果是UNIX系统程序不正确,考虑把awk换成nawk再看看。还是不行的话,反馈一下操作系统及awk版本。

显示连接的服务名或SID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
=============================================================================================
显示连接的服务名或SID,以及连接过来的IP地址的次数统计脚本(由于监听日志中显示的service_name, sid等信息有位置上的差别,因而用正则表达式做了相关处理):
--AIX
cat listener.log | grep "01-JAN-2017 14:" |grep 'establish'| sed 's/service_name=/SERVICE_NAME=/g;s/sid=/SID=/g' | sed -n 's/^\([0-9]\{2\}-\{1\}[A-Z]\{3\}-\{1\}[0-9]\{4\}.\{1\}[0-9]\{2\}:\{1\}[0-9]\{2\}:\{1\}[0-9]\{2\}\)\(.\{1\}\*\{1\}.\{1\}\)\(.*(CONNECT_DATA=.*\)\((SERVICE_NAME=[A-Z0-9a-z.-_+]*)\{1\}\).*\(.\{1\}\*\{1\}.\{1\}\).*\((HOST=[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\})\{1\}\).*/ , \4 , \6 /p;s/^\([0-9]\{2\}-\{1\}[A-Z]\{3\}-\{1\}[0-9]\{4\}.\{1\}[0-9]\{2\}:\{1\}[0-9]\{2\}:\{1\}[0-9]\{2\}\)\(.\{1\}\*\{1\}.\{1\}\)\(.*(CONNECT_DATA=.*\)\((SID=[A-Z0-9a-z.-_]*)\{1\}\).*\(.\{1\}\*\{1\}.\{1\}\).*\((HOST=[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\}[.]\{1\}[0-9]\{1,3\})\{1\}\).*/ , \4 , \6 , /p' | sort | uniq -c | sort -k3 -k2 -t ',' | awk -F ',' '{printf "%-10d ,%-50s ,%-30s\n", $1, $2, $3}'

--LINUX
echo "CNT # SID/SERVICE_NAME # HOST";tail -10000 listener.log | awk -F"[()=]" '/establish/{
for(i=1;i<=NF;i++){
if($i=="SID" || $i=="sid" )sid="SID="$(i+1)"\t";
if($i=="SERVICE_NAME" || $i=="service_name" )sid="SERVICE_NAME="$(i+1);
if($i=="HOST")host=$(i+1);
}cnt[sid"\t# "host]++
}END{for(x in cnt)print cnt[x]"\t# "x}'|sort -nr

=============================================================================================
假如其中在某一行 SID/SERVICE_NAME不存在,值会自动按上一行的来显示。所以,在每行处理前,需要把相关值给清空才行。
另外service_name也可能存在小写的情况。

awk -F"[()=]" 'BEGIN{IGNORECASE=1} /establish/ {for(i=1;i<=NF;i++){if($i=="PROGRAM")pro=$(i+1);if($i=="HOST")host=$(i+1);if($i=="USER")usr=$(i+1);if($i=="SID")sev=$(i+1);if($i=="SERVICE_NAME")sev=$(i+1)}cnt[host"|"usr"|"sev"|"pro]++;host=null;usr=null;sev=null;pro=null}END{for(x in cnt)print x"|"cnt[x]}' listener.log|sort

[toc]

在一次处理 ORACLE 19.5 DG 密码错误的过程中偶然发现 DG 的密码文件在通过 sqlplus sys/paxxx@dgtns  远程登录之后,md5  值就会发生一次变化,通过搜索mos 查到如下文章:Why do the timestamp and md5 hash values of a password file change? (Doc ID 2821102.1)

出现此现象的前提条件是 :密码文件通过 orapwd 创建   并且没有使用 format 参数(默认 format=12.2),或者 format=12.2 设置为 12.2 ,会出现md5 在每次远程登录之后,就会发生变化,这是由于从 ORACLE 12.2.0.1 and later, oracle 引入了 密码限制和密码复杂度满足度的要求,同时密码文件也会记录 last login time 也就是上一次的登录时间,从而出现了密码文件的md5会发生变化。

阅读全文 »

MySQL 8.0.26 之后数据库参数变化

使用之前的 MySQL 8.0 的参数文件安装完成 8.0.26 之后发现数据库日志报了 The syntax ‘log_slave_updates’ is deprecated and will be removed in a future release. Please use log_replica_upda tes instead. 等一堆 Warning,具体如下:

阅读全文 »

[toc]

MySQL 如何确认从库的 IP

show slave hosts

1
2
3
4
5
6
7
8
show slave hosts;
mysql> show slave hosts;
+------------+---------------+------+------------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+------------+---------------+------+------------+--------------------------------------+
| 1647312172 | 192.168.11.14 | 3306 | 1647312173 | af5b1a5b-a409-11ec-b404-0050568a5583 |
+------------+---------------+------+------------+--------------------------------------+
1 row in set (0.00 sec)

主库上通过 show slave hosts 可以很直观的显示从库信息,当然包含ip了。

在从库上执行 show slave hosts 是没有结果的。

1
2
mysql> show slave hosts;
Empty set (0.00 sec)

如果不知道当前主机是主库还是从库,可以通过 show slave hosts 来判断,如果有信息说明当前是主库,同时也会显示从库的信息。如果没有信息,然后通过show slave status\G 进一步确认从库信息,同时也可以 Master_Host 看到主库的ip信息。

show process list

阅读全文 »

[toc]

今天在进行 yum 安装软件包的时候,非常慢,然后进行了 kill -9 操作,准备重新 make cache,出现了Thread died in Berkeley DB library错误,搜索一番进行如下解决。

os :CentOS Linux release 7.6.1810 (Core)

1
2
3
4
5
6
7
[root@bjproxy log]# yum make cache
error: rpmdb: BDB0113 Thread/process 12349/140335812044608 failed: BDB1507 Thread died in Berkeley DB library
error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db5 - (-30973)
error: cannot open Packages database in /var/lib/rpm
CRITICAL:yum.main:
Error: rpmdb open failed
阅读全文 »

PDB的创建、插拔、克隆等功能测试

[toc]

PDB的创建、插拔、克隆等功能测试

https://docs.oracle.com/database/121/ADMIN/cdb_plug.htm#ADMIN13549

普通 pdb

1
2
3
create pluggable database notedpdb admin user pdbadmin identified by "Password123";
alter pluggable database notedpdb open instances=all;
alter pluggable database notedpdb save state instances=all;

导入示例数据

1
@mksample Password123 Password123 Password123 Password123 Password123 Password123 Password123 Password123 users temp /tmp/log localhost:1521/notedpdb

通过 配置环境变量可以很方便的看到是在哪个 pdb 下面操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vi $ORACLE_HOME/sqlplus/admin/glogin.sql

define _editor=vi
set serveroutput on size 1000000
set trimspool on
set long 5000
set pagesize 5000
set linesize 256
column plan_plus_exp format a80
column global_name new_value gname
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
set termout off
define gname=idle
column global_name new_value gname
select lower(user)||'@'||'('||(select distinct sid from v$mystat ) ||'_'||(select sys_context('USERENV','CON_NAME') from dual)||')' global_name from v$instance;
set sqlprompt '&gname> '
set termout on
阅读全文 »

[toc]

TDE 与 RAC 测试

How to configure TDE in pluggable database in 12c for standalone and RAC environment (Doc ID 2107821.1)

This document details step by step instructions to configure TDE in 12c pluggable database for standalone and RAC environment.

1. Add the below entry in sqlnet.ora file

阅读全文 »

[TOC]

TDE 与 ADG 测试

说明:采用rman duplicate 进行搭建ADG,与常规的ADG相同,但是需要在 duplicate 之前,配置好tde,并将钱包打开。

ADG 建议配置自动登录钱包。

1
ADMINISTER KEY MANAGEMENT CREATE  AUTO_LOGIN KEYSTORE FROM KEYSTORE '/etc/ORACLE/WALLETS/tdecdb' IDENTIFIED BY pwd200;

搭建DG,需要将源库的密钥复制到目标库,配置 sqlnet.ora ,然后启用Software Keystore,即可,以下是具体步骤。

阅读全文 »
0%