系统上线前,发现有业务用户将表建到了system的系统表空间用户下,建到了非默认表空间下。甚至有发现把集群的数据文件创建到了本地目录中的情况。
因此,业务系统上线前,应该首先检查数据库的权限是否合理,是否有不按规划的情况,及时治理,然后再进行清库和导入数据。防止留下隐患。

查看Oracle用户的权限或角色

一、查看用户

1.查看所有用户:

select * from dba_users;
select * from all_users;
select * from user_users;    //查看当前用户

二、查看角色

1.当前用户被激活的全部角色

  select * from session_roles;

2.当前当前用户被授予的角色

  select * from user_role_privs;

3.全部用户被授予的角色

  select * from dba_role_privs;

4、查看某个用户所拥有的角色

select * from dba_role_privs where grantee='用户名';


5、查看某个角色所拥有的权限

select * from dba_sys_privs where grantee='CONNECT';


6.查看所有角色

  select * from dba_roles;


三、查看权限

1.基本权限查询:

select * from session_privs; --当前用户所拥有的全部权限
select * from user_sys_privs;--当前用户的系统权限
select * from user_tab_privs;--当前用户的对象权限
select * from dba_sys_privs ;--查询某个用户所拥有的系统权限
select * from role_sys_privs;--查看角色(只能查看登陆用户拥有的角色)所包含的权限
  1. 查看用户的系统权限(直接赋值给用户或角色的系统权限)

    select * from dba_sys_privs;

    select * from user_sys_privs;

2.查看用户的对象权限:

 select * from dba_tab_privs;
 select * from all_tab_privs;
 select * from user_tab_privs;

3.查看哪些用户有sysdba或sysoper系统权限(查询时需要相应权限)

  select * from v$pwfile_users;

扩展

1、以下语句可以查看Oracle提供的系统权限

select name from sys.system_privilege_map

2、查看一个用户的所有系统权限(包含角色的系统权限)

select privilege from dba_sys_privs where grantee='SCOTT'  
union  
select privilege from dba_sys_privs where grantee in (select granted_role from dba_role_privs where grantee='SCOTT' ); 


3、 查询当前用户可以访问的所有数据字典视图。

select * from dict where comments like '%grant%';   


4、显示当前数据库的全称

select * from global_name;   


问题 1:如何查询一个角色包括的权限?
a.一个角色包含的系统权限

select * from dba_sys_privs where grantee='角色名'  

 select * from dba_sya_privs where grantee='COONNECT'; connect要大写
     另外也可以这样查看:   
 select * from role_sys_privs where role='角色名'   

b.一个角色包含的对象权限

 select * from dba_tab_privs where grantee='角色名'   

问题 2:Oracle究竟有多少种角色?

select * from dba_roles; 



问题 3:如何查看某个用户,具有什么样的角色?

select * from dba_role_privs where grantee='用户名'  


问题4:查看哪些用户具有DBA的角色

select grantee from dba_role_privs where granted_role='DBA';

转载http://blog.itpub.net/31015730/viewspace-2150322/

认知很重要

网上一直流传着一句话:你赚不到你认知水平以外的钱,你挣到钱就是你认知水平的反映,即使偶尔暴富了,也会有无数方法让你还给社会。

虽然这句话有很多种方式可以证伪,比如:如果我奶奶中彩票了,他又是一个习惯存钱的人,就会把钱放在银行里面不用,即使通货膨胀了,也比世界上大部分人有钱,但未必认知水平就一定比大部分人高,但依然不可否认认知的重要性。

如何提高认知水平呢?

认知水平的提高,首先一定是足够思考能力的作用在大量的问题处理上形成的经验。就像人工智能,需要拥有足够的算力以及数据进行训练。认知水平的提高,也是一种计算的结果。不满足于别人给答案,善于思考总结,才能不浪费行万里路,读万卷书,否则都是刷视频一样,没有留下有用的内容。提高认知水平的关键在于思考力。

最近和一个技术专家一起工作,发现一个对方的一个特质,就是对问题本质的探究,保持着好奇心。一般的工程师可能认为,这个问题大家都这么说,那就应该是这样的。但是专家的想法就不一样,喜欢去实践,去思考问题的原理,这样遇到问题不会被表面现象所迷惑。

我在工作中也有这种感觉,例如在linux中安装oracle数据库的时候,都知道要开大页内存管理。因为操作系统本身的内存是4kb的页,在大内存的系统中,会浪费大量的内存资源用于管理内存,而不是存储数据,所以用大页内存,可以减少管理消耗的内存资源,而透明大页是动态伸缩的,不满足数据库申请固定大小内存的要求,而且会导致出现集群稳定性和单机性能问题。通过oracle提供的脚本就知道要要设置多少页数量。但是我以前就没有想过脚本中数据是如何计算出来的?自己跑一遍之后才发现,原来是根据oracle需要的内存块大小决定的。如果一个需要100GB的共享内存块,就要拿100GB除以块大小2MB,其中aix中的块默认大小又不一样。 理解了原理之后,就不用去找脚本计算了,心算也知道大概设置多少是合理的。

为什么我第一次接触的时候,没有理解这个问题呢?因为大脑的懒惰,大脑习惯于处理和思考熟悉的事务,对未知领域是充满恐惧的。这是基因决定的,但是通过练习是能够改变的。
不断的总记录,思考,总结就能提高认知水平。

提高认知的好处
很多时候,多问一问为什么,多思考总结事务的内在逻辑,就不会被人云亦云的网络信息带节奏。当自己遇到问题的时候,就会从多个角度去思考,而不是盲目的相信对或不对,不会盲从家人或领导的建议,给人没有主心骨的感觉。

提高认知水平就能够增加自己的社会竞争力、让自己过得更好。

数据库锁表分析

1、会话1 update Scott.emp set deptno=10;
2、会话2 update scott.emp set deptno=30;

查询是否存在锁定

select s1.INST_ID,
       s1.username || '@' || s1.machine || ' (SID=' || s1.sid ||
       ' ) is blocking ' || s2.username || '@' || s2.machine || ' ( SID=' ||
       s2.sid || ' ) ' AS blocking_status
  from gv$lock l1, gv$session s1, gv$lock l2, gv$session s2
 where l1.INST_ID = s1.INST_ID
   and s1.INST_ID = s2.INST_ID
   and s2.INST_ID = l2.INST_ID
   and s1.sid = l1.sid
   and s2.sid = l2.sid
   and l1.BLOCK = 1
   and l2.request > 0
   and l1.id1 = l2.id1
   and l2.id2 = l2.id2;

19:22:53 SQL> select s1.INST_ID,
19:24:50   2         s1.username || '@' || s1.machine || ' (SID=' || s1.sid ||
19:24:50   3         ' ) is blocking ' || s2.username || '@' || s2.machine || ' ( SID=' ||
19:24:50   4         s2.sid || ' ) ' AS blocking_status
19:24:50   5    from gv$lock l1, gv$session s1, gv$lock l2, gv$session s2
19:24:50   6   where l1.INST_ID = s1.INST_ID
19:24:50   7     and s1.INST_ID = s2.INST_ID
19:24:50   8     and s2.INST_ID = l2.INST_ID
19:24:50   9     and s1.sid = l1.sid
19:24:50  10     and s2.sid = l2.sid
19:24:50  11     and l1.BLOCK = 1
19:24:50  12     and l2.request > 0
19:24:50  13     and l1.id1 = l2.id1
19:24:50  14     and l2.id2 = l2.id2;

   INST_ID
----------
BLOCKING_STATUS
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         1
SYS@localhost.localdomain (SID=16 ) is blocking SYS@WORKGROUP\LAPTOP-5RF2B7J0 ( SID=15 )

查询update后未提交的会话

SELECT
    A.SID,
    A.SERIAL#,
    A.USERNAME,
    A.EVENT,
    A.WAIT_CLASS,
    A.SECONDS_IN_WAIT,
    A.PREV_EXEC_START,
    B.LOCKED_MODE,
    C.OWNER,
    C.OBJECT_NAME,
    C.OBJECT_TYPE 
FROM
    V$SESSION A
    INNER JOIN V$LOCKED_OBJECT B ON A.SID = B.SESSION_ID
    INNER JOIN DBA_OBJECTS C ON B.OBJECT_ID = C.OBJECT_ID 
WHERE
    A.WAIT_CLASS = 'Idle'
    AND A.SECONDS_IN_WAIT >10

/SESSION空闲后一段时间还锁定的才算有问题,这里随便给了个数值10秒/

19:27:05 SQL> SELECT
19:27:07   2    A.SID,
19:27:07   3    A.SERIAL#,
19:27:07   4    A.USERNAME,
19:27:07   5    A.EVENT,
19:27:07   6    A.WAIT_CLASS,
19:27:07   7    A.SECONDS_IN_WAIT,
19:27:07   8    A.PREV_EXEC_START,
19:27:07   9    B.LOCKED_MODE,
19:27:07  10    C.OWNER,
19:27:07  11    C.OBJECT_NAME,
19:27:07  12    C.OBJECT_TYPE 
19:27:07  13  FROM
19:27:07  14    V$SESSION A
19:27:07  15    INNER JOIN V$LOCKED_OBJECT B ON A.SID = B.SESSION_ID
19:27:08  16    INNER JOIN DBA_OBJECTS C ON B.OBJECT_ID = C.OBJECT_ID 
19:27:08  17  WHERE
19:27:08  18    A.WAIT_CLASS = 'Idle'
19:27:08  19    AND A.SECONDS_IN_WAIT >10;

   SID    SERIAL# USERNAME             EVENT                                         WAIT_CLASS                                                       SECONDS_IN_WAIT PREV_EXEC_START     LOCKED_MODE OWNER     OBJECT_NAME                    OBJECT_TYPE
------ ---------- -------------------- --------------------------------------------- ---------------------------------------------------------------- --------------- ------------------- ----------- ---------- ------------------------------ -------------------
    16         61 SYS                  SQL*Net message from client                   Idle                                                                          38 2021-12-15 19:26:31           3 SCOTT     DEPT                           TABLE
    16         61 SYS                  SQL*Net message from client                   Idle                                                                          38 2021-12-15 19:26:31           3 SCOTT     EMP                            TABLE

Elapsed: 00:00:00.06

----------查看被锁对象
set lin 400 pages 49999
col USERNAME for a15
col owner for a15
col OBJECT_NAME for a35
col PROGRAM for a35
col PROCESS for a15
select a.LOCKED_MODE,a.inst_id,b.owner,b.object_name,a.object_id,a.session_id,c.serial#,c.username,c.sql_id,c.PROCESS ,c.PROGRAM
from gv$locked_object  a, dba_objects b,gv$session c
 where a.object_id=b.object_id and c.sid=a.session_id;

19:32:51 SQL> set lin 400 pages 49999
19:33:07 SQL> col USERNAME for a15
19:33:07 SQL> col owner for a15
19:33:07 SQL> col OBJECT_NAME for a35
19:33:07 SQL> col PROGRAM for a35
19:33:07 SQL> col PROCESS for a15
19:33:07 SQL> select a.LOCKED_MODE,a.inst_id,b.owner,b.object_name,a.object_id,a.session_id,c.serial#,c.username,c.sql_id,c.PROCESS ,c.PROGRAM
19:33:07   2  from gv$locked_object  a, dba_objects b,gv$session c
19:33:07   3   where a.object_id=b.object_id and c.sid=a.session_id;

LOCKED_MODE    INST_ID OWNER           OBJECT_NAME                          OBJECT_ID SESSION_ID    SERIAL# USERNAME        SQL_ID             PROCESS         PROGRAM
----------- ---------- --------------- ----------------------------------- ---------- ---------- ---------- --------------- ------------------ --------------- -----------------------------------
          3          1 SCOTT           DEPT                                     87106         15          9 SYS             022scd5v03tnp      23708:31696     navicat.exe
          3          1 SCOTT           DEPT                                     87106         16         61 SYS                                19093           sqlplus@localhost.localdomain (TNS
                                                                                                                                                               V1-V3)

alter system kill session 'sid,serial#'



安装python3.5可能使用的依赖

yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
到python官网找到下载路径, 用wget下载

wget https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tgz
解压tgz包

tar -zxvf Python-3.5.3.tgz
把python移到/usr/local下面

mv Python-3.5.3 /usr/local
删除旧版本的python依赖

ll /usr/bin | grep python
rm -rf /usr/bin/python
进入python目录

cd /usr/local/Python-3.5.3/
配置

./configure
编译 make

make
编译,安装

make install
删除旧的软链接,创建新的软链接到最新的python

rm -rf /usr/bin/python
ln -s /usr/local/bin/python3.5 /usr/bin/python
python -V

操作背景:

压力测试期间,发现一个进程未执行任何sql,在V$SQL中未找到sql_id,因此无法判断阻塞原因,需要通过跟踪进程进行分析
操作如下:
1、查询该阻塞进程的spid

SQL> select spid from v$process where addr in (select paddr from v$session where sid='15');

SPID
------------------------
3417

2、oracle debug

SQL>oradebug set ospid 93773
SQL>oradebug event 10046 trace name context forever ,level 12
SQL>oradebug tracefile_name

SQL>oradebug close_trace

3、操作系统跟踪

strace -o /tmp/93773 -p 93773
tail -f /tmp/93773

经过跟踪,发现进程无任何信息打印,故认为该进程已经异常,且通过v$sql无法查到产生阻塞的语句,最后联系负责该应用的工程师,重启应用后,该阻塞被释放。 如果重启依然未被释放,则在数据库层面杀掉该会话。

备注:
当应用端认为没有未提交的会话,且数据库端查找不到指定的语句,可以创建新的profiles,并设置IDLE_TIME的值为15-30(分钟),设置resource_limit=true,自动断开inactive的会话,配合sqlnet.ora中的SQLNET.EXPIRE_TIME=10 (分钟)防止未提交的空闲会话阻塞数据库的其他会话。