DDL和客户端ip监控
DDL触发器监控脚本部署步骤 以下操作请使用sys用户: --第一步:创建表(此表主要保存ddl触发器产生的信息),可以根据不同的业务,使用相关的监控用户,在此监控用户为c##upctest
从可维护性考虑,此表要长期保存ddl触发器产生的信息,建议采用范围分区. CREATE TABLE c##upctest.STATS$DDL_AUDIT
( USER_NAME VARCHAR2(30) ,
SID NUMBER,
INST_ID NUMBER,
IP_ADDRESS VARCHAR2(20),
OSUSER VARCHAR2(30),
MACHINE VARCHAR2(64),
OBJ_OWNER VARCHAR2(30),
OBJ_NAME VARCHAR2(128),
OBJ_TYPE VARCHAR2(18),
DDL_TIME DATE,
DDL_TYPE VARCHAR2(30),
DDL_SQL VARCHAR2(4000)
)
PARTITION BY RANGE (DDL_TIME)
(PARTITION P_R_201912 VALUES LESS THAN (TO_DATE('2019-12-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
PARTITION P_R_202001 VALUES LESS THAN (TO_DATE('2020-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
PARTITION P_R_202002 VALUES LESS THAN (TO_DATE('2020-02-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
PARTITION P_R_202003 VALUES LESS THAN (TO_DATE('2020-03-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202004 VALUES LESS THAN (TO_DATE('2020-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202005 VALUES LESS THAN (TO_DATE('2020-05-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202006 VALUES LESS THAN (TO_DATE('2020-06-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202007 VALUES LESS THAN (TO_DATE('2020-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202008 VALUES LESS THAN (TO_DATE('2020-08-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202009 VALUES LESS THAN (TO_DATE('2020-09-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202010 VALUES LESS THAN (TO_DATE('2020-10-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202011 VALUES LESS THAN (TO_DATE('2020-11-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202012 VALUES LESS THAN (TO_DATE('2020-12-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_PMAX VALUES LESS THAN (TO_DATE('2099-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
)
COMMENT ON COLUMN STATS$DDL_AUDIT.USER_NAME IS '登陆用户名'; COMMENT ON COLUMN STATS$DDL_AUDIT.SID IS 'session id'; COMMENT ON COLUMN STATS$DDL_AUDIT.INST_ID IS '实例号'; COMMENT ON COLUMN STATS$DDL_AUDIT.IP_ADDRESS IS '客户端ip地址'; COMMENT ON COLUMN STATS$DDL_AUDIT.OSUSER IS '客户端操作系统用户名'; COMMENT ON COLUMN STATS$DDL_AUDIT.MACHINE IS '客户端执行的机器'; COMMENT ON COLUMN STATS$DDL_AUDIT.OBJ_OWNER IS 'DDL操作对象的所有者'; COMMENT ON COLUMN STATS$DDL_AUDIT.OBJ_NAME IS 'DDL操作所对应的数据库对象名'; COMMENT ON COLUMN STATS$DDL_AUDIT.OBJ_TYPE IS 'DDL操作所对应的数据库对象的类型'; COMMENT ON COLUMN STATS$DDL_AUDIT.DDL_TIME IS 'DDL操作时间'; COMMENT ON COLUMN STATS$DDL_AUDIT.DDL_TYPE IS '触发器的系统事件名称'; COMMENT ON COLUMN STATS$DDL_AUDIT.DDL_SQL IS 'DDL语句'; --2:创建ddl监控触发器(表STATS$DDL_AUDIT的用户是c##upctest,可根据自己的业务进行修改) CREATE OR REPLACE TRIGGER sys.TRG_DDL_AUDIT
AFTER DDL ON DATABASE
DECLARE
v_sql_text ora_name_list_t;
v_ddl_sql c##upctest.STATS$DDL_AUDIT.ddl_sql%TYPE;
v_len NUMBER;
v_piece_len NUMBER;
v_sid NUMBER;
v_machine VARCHAR2(64);
v_osuser VARCHAR2(30);
BEGIN
-- Get DDL SQL statement
v_len := 0;
FOR i IN 1..ora_sql_txt(v_sql_text) LOOP
v_piece_len := length(v_sql_text(i));
EXIT WHEN v_len + v_piece_len > 4000;
v_ddl_sql := v_ddl_sql||v_sql_text(i);
v_len := v_len + v_piece_len;
END LOOP;
-- get sid and machine from audsid
SELECT sid,machine,osuser INTO v_sid,v_machine,v_osuser
FROM v$session
where sid=userenv('sid');
-- insert to audit table
INSERT INTO c##upctest.STATS$DDL_AUDIT
(
user_name,
sid,
inst_id,
ip_address,
osuser,
machine,
obj_owner,
obj_name,
obj_type,
ddl_time,
ddl_type,
ddl_sql
)
VALUES
(
ora_login_user,
v_sid,
ora_instance_num,
sys_context('userenv','ip_address'), -- ora_client_ip_address seems no use here?
v_osuser,
v_machine,
ora_dict_obj_owner,
ora_dict_obj_name,
ora_dict_obj_type,
SYSDATE,
ora_sysevent,
v_ddl_sql
);
EXCEPTION
WHEN OTHERS THEN
NULL;
END trg_ddl_audit;
此触发器可适用操作范围: alter ,drop create ,truncate ,analyze,comment,grant,revoke,rename,noaudit,audit,disassociate statistics,associate,statistics
以及分区表针对分区的truncate,drop ,split,add,exchange操作(因为分区表的这些操作都属于alter) 第三步:STATS$DDL_AUDIT表维护 1:首先创建好下一年的表STATS$DDL_AUDIT_2020
CREATE TABLE c##upctest.STATS$DDL_AUDIT_2020
( USER_NAME VARCHAR2(30) ,
SID NUMBER,
INST_ID NUMBER,
IP_ADDRESS VARCHAR2(20),
OSUSER VARCHAR2(30),
MACHINE VARCHAR2(64),
OBJ_OWNER VARCHAR2(30),
OBJ_NAME VARCHAR2(128),
OBJ_TYPE VARCHAR2(18),
DDL_TIME DATE,
DDL_TYPE VARCHAR2(30),
DDL_SQL VARCHAR2(4000)
)
PARTITION BY RANGE (DDL_TIME)
(
PARTITION P_R_202001 VALUES LESS THAN (TO_DATE('2020-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
PARTITION P_R_202002 VALUES LESS THAN (TO_DATE('2020-02-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
PARTITION P_R_202003 VALUES LESS THAN (TO_DATE('2020-03-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202004 VALUES LESS THAN (TO_DATE('2020-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202005 VALUES LESS THAN (TO_DATE('2020-05-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202006 VALUES LESS THAN (TO_DATE('2020-06-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202007 VALUES LESS THAN (TO_DATE('2020-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202008 VALUES LESS THAN (TO_DATE('2020-08-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202009 VALUES LESS THAN (TO_DATE('2020-09-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202010 VALUES LESS THAN (TO_DATE('2020-10-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202011 VALUES LESS THAN (TO_DATE('2020-11-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_202012 VALUES LESS THAN (TO_DATE('2020-12-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) ,
PARTITION P_R_PMAX VALUES LESS THAN (TO_DATE('2099-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
) 2:alter TRIGGER sys.TRG_DDL_AUDIT disable; --3,4 两步在c##upctest用户下执行 3:rename STATS$DDL_AUDIT to STATS$DDL_AUDIT_2020 4:rename STATS$DDL_AUDIT_2020 to STATS$DDL_AUDIT; 5:alter trigger sys.TRG_DDL_AUDIT compile; 6:alter TRIGGER sys.TRG_DDL_AUDIT enable; 客户端ip触发器脚本监控 功能说明:记录客户端ip地址到v$session视图中的client_info 字段中 CREATE OR REPLACE TRIGGER SYS.TRG_USER_LOGON
after logon on database
begin
dbms_application_info.set_client_info(sys_context('userenv','ip_address'));
end;
DDL和客户端ip监控的更多相关文章
- PHP获取客户端IP
/** * 获取客户端IP */ function getClientIp() { $ip = 'unknown'; $unknown = 'unknown'; if (isset($_SERVER[ ...
- C#服务器获取客户端IP地址以及归属地探秘
背景:博主本是一位Windows桌面应用程序开发工程师,对网络通信一知半解.一日老婆逛完某宝,问:"为什么他们知道我的地址呢,他们是怎么获取我的地址的呢?" 顺着这个问题我们的探秘 ...
- 在Thinkphp3.2.3框架下实现自动获取客户端IP地址的get_client_ip()函数
在Thinkphp框架下使用get_client_ip()函数获取客户端IP地址十分方便: 一行代码便可以实现:$ip = get_client_ip(); 但当我们测试时会遇到后台获取的IP地址显示 ...
- ASP.NET获取真正的客户端IP地址的6种方法
Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真 ...
- 15.用PHP写出显示客户端IP与服务器IP的代码,如何防止用户使用代理的情况?[添加更多详情]
打印客户端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv('REMOTE_ADDR'); 打印服务器IP:echo gethostbyname("ww ...
- 通过nginx代理之后,获取客户端ip
1.相关nginx配置(通过header将客户端ip,host等信息传入) location ~ .*.do$ { proxy_set_header X-Real-IP $remote_addr; p ...
- 根据Request获取客户端IP 内网IP及外网IP
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实 ...
- tornado 反向代理后 获取真实客户端IP
首先,nginx必定会设置一个Header传送过来真实的IP nginx.conf server { proxy_set_header X-Real-IP $remote_addr; location ...
- JAVA获取客户端IP地址
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
随机推荐
- [考试总结]noip模拟7
为啥博客园 \(\LaTeX\) 老挂???! \(\huge{\text{菜}}\) 刚开始写 \(T1\) 的时候,在看到后缀前缀之后,直接想到 \(AC\) 自动机,在画了半个 \(trie\) ...
- STEVE JOBS: Stanford Commencement【Stay Hungry. Stay Foolish.】
In 2005, a year after he was first diagnosed with cancer, Apple CEO Steve Jobs made a candid speech ...
- Jmeter 学习笔记 1 - Logic Controller -组织执行场景
using this website to practice performance testing: http://advantageonlineshopping.com/#/ Jemeter ho ...
- 【动画消消乐 】HTML+CSS 吃豆豆动画 073
前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...
- 【动画消消乐 】仿ios、android中常见的一个loading动画 074
前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...
- 从 HTTP 切换到 HTTPS,这下我的技术博客安全了吧?
博客园 的小伙伴们,大家好,我是刚脱离险境的二哥呀! 很久(大概两年)之前,我就搞了一个独立的个人博客网站,长下面这样. 大家有访问过的,可以在评论区扣 1 可惜一直没搞备案和 HTTPS,导致每次访 ...
- csredis-in-asp.net core理论实战-哨兵模式-使用示例
csredis 开源地址 https://github.com/2881099/csredis 续上篇 csredis-in-asp.net core理论实战-主从配置.哨兵模式 示例源码 https ...
- 使用Fileupload完成文件的上传下载
目录 使用Fileupload完成文件的上传下载 为什么需要进行文件上传下载? 引入jar包 文件上传 注意事项 编写一个简单的文件上传jsp页面 编写Servlet Student类用于封装数据,后 ...
- Prometheus MySQL监控+grafana展示
前言 最近爱上了研究各种杂七杂八的技术. Prometheus是现如今最火的监控软件之一.做为一个运维DBA,不会这个可就OUT了. 本篇博客,演示一下prometheus之通过mysql expor ...
- 手脱UPX壳的方法
0X00 了解 upx UPX作为一款元老级PE加密壳,在以前的那个年代盛行,著名病毒[熊猫烧香]就是使用这款加密壳. 0X01 单步跟踪法 就是使用ollydbg加载程序后,按F8进行单 ...