oracle 常用指令

oracle常用指令

表空间查询

--表空间查询
set linesize 1000; 
column file_name format a50 
column tablespace_name format a10 
-- 表空间使用情况
SELECT *   FROM (SELECT a.file_id "FileNo",  
                a.tablespace_name tablespace_name, 
                a.bytes / (1024 * 1024) "Bytes",
                (a.bytes - SUM(nvl(b.bytes, 0))) / (1024 * 1024) "Used",
                SUM(nvl(b.bytes, 0)) / (1024 * 1024) "Free",
                SUM(nvl(b.bytes, 0)) / a.bytes * 100 "%free",
                file_name          
 FROM dba_data_files a, dba_free_space b          
 WHERE a.file_id = b.file_id(+)          
 GROUP BY a.tablespace_name, a.file_id, a.bytes, file_name        
 UNION        
 SELECT a.file_id "FileNo",
        a.tablespace_name tablespace_name,
        a.bytes / (1024 * 1024) "Bytes",
        (a.bytes - SUM(nvl(b.bytes, 0))) / (1024 * 1024) "Used",
                               SUM(nvl(b.bytes, 0)) / (1024 * 1024) "Free",
                               SUM(nvl(b.bytes, 0)) / a.bytes * 100 "%free",
                               file_name           
                FROM dba_temp_files a, dba_free_space b          
                WHERE a.file_id = b.file_id(+)          
                GROUP BY a.tablespace_name, a.file_id, a.bytes, file_name) 
 ORDER BY tablespace_name;

查询表空间中对象的详细信息

--查询表空间中对象的详细信息
SELECT 
 OWNER                  AS OWNER       
 ,SEGMENT_NAME           AS SEGMENT_NAME      
 ,SEGMENT_TYPE           AS SEGMENT_TYPE      
 ,SUM(BYTES)/1024/1024   AS SEGMENT_SIZE
FROM DBA_SEGMENTS
WHERE TABLESPACE_NAME=&TABLESPACE_NAME
 GROUP BY OWNER,SEGMENT_NAME,SEGMENT_TYPE
 ORDER BY 4;

重建索引

alter index index_name rebuild;

创建表空间

create tablespace [name]   
 logging   
 datafile '[/home/oracle/oracledata/test.dbf]'  
 size 2048m   
 autoextend on   
 next 50m 
 maxsize 20480m   
 extent management local;

查询表文件是否自动扩展

 select 
                file_name,
                tablespace_name, 
                t.AUTOEXTENSIBLE 
 from dba_data_files t 
 order by t.AUTOEXTENSIBLE;

优化表空间

alter tablespace tablespace_name coalesce; 
alter tablespace users coalesce;

扩展原表空间文件

alter database datafile '/oraapp/app/oracle/proc/oradata/test.dbf' resize 500M

为指定表空间增加新的表空间文件

alter tablespace tablespace_name add datafile '/opt/oracle/oradata/test.dbf' size 200M;

往临时表空间中增加数据文件

ALTER TABLESPACE TEMP
    ADD TEMPFILE '/opt/oracle/oradata/temp02.dbf'
    SIZE 1G 
    AUTOEXTEND ON

修改临时表空间大小

ALTER DATABASE TEMPFILE '/opt/oracle/oradata/temp02.dbf' RESIZE 1G;

删除表空间

 DROP TABLESPACE ipmdata INCLUDING CONTENTS AND DATAFILES;

生成缩小空间脚本

 select /*+ ordered use_hash(a,c) */ 
   'alter database datafile '''||a.file_name||''' resize ' 
    ||round(a.filesize - (a.filesize - c.hwmsize-100) *0.8)||'M;', 
   a.filesize,
   c.hwmsize
 from 
 ( 
 select file_id,file_name,round(bytes/1024/1024) filesize from dba_data_files 
 ) a, 
 ( 
 select file_id,round(max(block_id)*8/1024) HWMsize from dba_extents 
 group by file_id
 ) c
 where a.file_id = c.file_id>
   and a.filesize - c.hwmsize > 100;

关闭数据库表空间自动扩展

alter database datafile '.../test.dbf' autoextend off;

扩展指定表空间

alter tablespace users add datafile '.../test.dbf' size 500m autoextend on maxsize 20G;

临时表空间

alter database tempfile '.../temp01.dbf' resize sizes;
```sql
## 查询用户占表空间,而不管空间是否被使用。
```sql
SELECT owner, tablespace_name, ROUND (SUM (BYTES) / 1024 / 1024, 2) "USED(M)" 
 FROM dba_segments
 GROUP BY owner, tablespace_name
 ORDER BY SUM (BYTES) DESC;

查询业务表使用空间

对表进行分析计算后执行以下语句。

 analyze table 'TABLE_NAME' compute statistics;
查询表记录数
select table_name,tablespace_name,num_rows,avg_row_len,num_rows * avg_row_len/1024/1024 astable_sizes
 from user_tables 
 order by table_sizes desc;

参数

table_name -表名
tablespace_name -表空间名
cluster_name -群集名称
iot_name -IOT(Index Organized Table)索引组织表的名称
status -状态
pct_free -为一个块保留的空间百分比
pct_used -一个块的使用水位的百分比
ini_trans -初始交易的数量
max_trans -交易的最大数量
initial_extent -初始扩展数
next_extent -下一次扩展数
min_extents -最小扩展数
max_extents -最大扩展数
pct_increase -表在做了第一次extent后,下次再扩展时的增量,它是一个百分比值
freelists -可用列表是表中的一组可插入数据的可用块
freelist_groups -列表所属组
logging -是否记录日志
backed_up -指示自上次修改表是否已备份(Y)或否(N)的
num_rows -表中的行数
blocks -所使用的数据块数量
empty_blocks -空数据块的数量
avg_space -自由空间的平均量
chain_cnt -从一个数据块,或迁移到一个新块链接表中的行数
avg_row_len -行表中的平均长度
avg_space_freelist_blocks -一个freelist上的所有块的平均可用空间
num_freelist_blocks -空闲列表上的块数量
degree -每个实例的线程数量扫描表
instances -跨表进行扫描的实例数量
cache -是否是要在缓冲区高速缓存
table_lock -是否启用表锁
sample_size -分析这个表所使用的样本大小
last_analyzed -最近分析的日期
partitioned -表是否已分区
iot_type -表是否是索引组织表
temporary -表是否是暂时的
secondary -表是否是次要的对象
nested -是否是一个嵌套表
buffer_pool -缓冲池的表
flash_cache -智能闪存缓存提示可用于表块
cell_flash_cache -细胞闪存缓存提示可用于表块
row_movement -是否启用分区行运动
global_stats -作为一个整体(全球统计)表的统计的是否准确
user_stats -是否有统计
duration -临时表的时间
skip_corrupt -是否忽略损坏的块标记在表和索引扫描(ENABLED)状态的或将引发一个错误(已禁用)。
monitoring -是否有监测属性集
cluster_owner -群集的所有者
dependencies -行依赖性跟踪是否已启用
compression -是否启用表压缩
compress_for -什么样的操作的默认压缩
dropped -是否已经删除并在回收站
read_only -表是否是只读
segment_created -是否创建表段
result_cache -结果缓存表的模式注释

对用户表开展分析计算语句生成

语法

analyze table 'TABLE_NAME' compute statistics;
-- 生成上述语句执行语句,手工清除不需要更新的表
select 'analyze table '||TABLE_NAME||' compute statistics; ',t.* from user_tables t;

会话、进程

vsession 每一个连接到数据库实例中的session都拥有一条记录。包括用户session及后台进程如DBWR,LGWR,arcchiver等等。 Vprocess 本视图包含当前系统oracle运行的所有进程信息。常被用于将oracle或服务进程的操作系统进程ID与数据库session之间建立联系。

--查看当前session配置
show parameter sessions
--查看当前process配置
show parameter processes   
--更改配置,更改完后需要重启数据库。
alter system set processes=1000 scope=spfile  

修改oracle配置文件中process进行修改

查询当前活跃session机器链接数量

 select MACHINE, COUNT(*) from V$session T
 WHERE STATUS='ACTIVE'
 group by machine
 order by count(*) desc

更换业务表空间

alter table table_name  move tablespace tablespace_name;

警告日志

--查询xml文件的目录
select value from v$diag_info where name='Diag Alert';
--查询文本文件的目录
select value from v$diag_info where name='Diag Trace';
show parameter background_dump_dest;
select value from v$parameter where name='background_dump_dest';

启动

sqlplus "/as sysdba"
startup

关闭

shutdown immediate; -- 常规关闭
shutdown abort ; --  强制关闭,一般情况下不建议采用此方式。

不记录日志

表数据量大、复制创建表命令如下,更改信息不记录到重做日志和回滚段中,以提高创建装载数据的速度。

create table tablename1 as select * from tablename2 nologging;
delete from tablename nologging;

查询当前用户被锁记录语句

SELECT s.username,
              s.sid,
              s.status,
              sq.sql_text sql_text,
              t.used_urec records,
              t.used_ublk blocks,
              t.used_ublk * (SELECT VALUE FROM v$parameter WHERE name = 'db_block_size') / 1024 kbytes
FROM v$transaction t, v$session s, v$sql sq
WHERE t.addr = s.taddr
AND s.prev_sql_id = sq.sql_id;

oracle 链接数据库串格式

sqlplus user/password@ip:prot/sid

修改用户缺省临时表空间

-- 执行以下命令当前用户临时表空间修改为更新后的临时表空间。
alter user xxxx temporary tablespace xxxx

临时表空间增长异常,下面是查询在sort排序区使用的执行耗时的SQL

 select se.username,
 se.sid,
 su.extents,
 su.blocks * to_number(rtrim(p.value)) as Space,
 tablespace,
 segtype,
 sql_text
 from v$sort_usage su, v$parameter p, v$session se, v$sql s
 where p.name = 'db_block_size'
 and su.session_addr = se.saddr
 and s.hash_value = su.sqlhash
 and s.address = su.sqladdr
 order by se.username, se.sid;

授权

 GRANT privilege[, ...] ON object[, ...] TO { PUBLIC | GROUP group| username}
privilege:
  select:查询
  insert:插入
  update:更新
  delete:删除
 rule:
 all:所有
 grant select,insert,update on tablename to public;

1、有用户授予查询、插入、更新tablename表的权限

--收回所有用户查询、插入、更新tablename表的权限
revoke select,insert,update on tablename from public;
 object:
  table:表
  view:视图
  sequence:序列
  index:索引
--授权所有用户查询、插入、更新权限
grant select,insert,update on tablename,viewname,sequencename,indexname to public;
public:对所有用户开放权限
 GROUP groupname:对该组所有用户开放权限
 username:对指定用户开放权限

2、给数据库用户授权(对象多为系统表,如dba可以查看的表)

grant dba to username;
--不给用户授予dba权限,用户将无法查看系统表,例如v$datafile,dba_data_files等
--对用户username回收dba权限
revoke dba from username;
--理解:数据库的所有权限操作,都是以会话为单位,如果当前会话执行时没有dba权限,即便是已经重新赋予了权限,在当前会话中也是不起作用的
--而如果当前会话有dba权限,而后台取消了权限,那么当前会话的dba权限也不会消失

grant connect to username;
--不给新建用户授予connect权限,新建用户无法通过SID或SERVICE_NAME连接数据库实例,即无法登录数据库

--对用户username回收connect权限
revoke connect to username;

grant resource to username with admin option;
grant unlimited tablespace to username with admin option;
--不给新建用户授予resource权限,新建用户无法创建表
revoke resource from username;//对用户回收resource权限

3、查看指定用户有哪些系统权限

 select * from dba_role_privs where grantee=upper('username');

4、查看指定用户有哪些对象权限

select * from dba_tab_privs where grantee=upper('username');

可能遇到问题:
1、当在一个新建数据库用户上创建表失败时,可以查看系统权限
在当前用户执行select * from dba_role_privs where grantee=upper('username');如果不能执行(提示表或视图不存在),说明没有dba权限
解决方法:可以登录sys账户赋予dba权限
登录sys:sqlplus / as sysdba
给username赋权限:grant dba to username;

也可以直接登录sys账户,select * from dba_role_privs where grantee=upper('username'),如果granted_role的值没有dba,说明没有dba权限

权限相关的查询和赋予:
所有权限的赋予均是在有赋予权限的用户下进行,此处授权用户都是sys用户
1、select * from dba_role_privs where grantee=upper('luyongpeng');
其中,admin_option是通过在授权时添加with admin option 选项定义
grant dba to luyongpeng with admin option;//admin_option为YES,如果不加with admin option 选项,则admin_option为NO
使用grant dba to luyongpeng;无法覆盖之前的权限
但grant dba to luyongpeng with admin option 可以覆盖grant dba to luyongpeng;的权限
2、select * from dba_sys_privs where grantee=upper('luyongpeng');
该权限可以通过执行grant dba to luyongpeng;时自动加上,但admin_option默认为NO
可以通过grant unlimited tablespace to luyongpeng with admin option;将admin_option修改为YES
当执行revoke dba from luyongpeng;时,系统会同时回收dba权限和unlimite tablespace权限
如果想保留dba权限,但回收unlimited tablespace权限,可以通过revoke unlimited tablespace from luyongpeng;实现

备注:个人博客同步至。

你可能感兴趣的:(oracle 常用指令)