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;
会话、进程
v
process 本视图包含当前系统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;实现
备注:个人博客同步至。