ORACLE常用脚本

2024年 1月 29日 90.9k 0

1、查看表空间的名称及大小

     select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
     from dba_tablespaces t, dba_data_files d
     where t.tablespace_name = d.tablespace_name
     group by t.tablespace_name;

2、查看表空间物理文件的名称及大小

   select tablespace_name, file_id, file_name,
   round(bytes/(1024*1024),0) total_space
   from dba_data_files
   order by tablespace_name;

3、查看回滚段名称及大小

   select segment_name, tablespace_name, r.status,
   (initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
   max_extents, v.curext CurExtent
   From dba_rollback_segs r, v$rollstat v
   Where r.segment_id = v.usn(+)
   order by segment_name ;

4、查看控制文件

  select name from v$controlfile;

5、查看日志文件

  select member from v$logfile;

6、查看表空间的使用情况
   --显示表空间大小、剩余大小、剩余百分比
select f.tablespace_name 表空间名,curG-file_freeG 实际使用G,curG 磁盘占用G,maxG 最大空间G,ext_freeG+file_freeG 剩余空间G
from
(select tablespace_name,round(sum(bytes/(1024*1024*1024)),2) as file_freeG
from dba_free_space group by tablespace_name) f
join
(select tablespace_name,round(sum(bytes/(1024*1024*1024)),2) as curG,
round(sum(maxbytes/(1024*1024*1024)),2) as maxG,round(sum(maxbytes-bytes)/(1024*1024*1024),2) as ext_freeG
from dba_data_files group by tablespace_name) d
on f.tablespace_name=d.tablespace_name;

  --显示数据文件大小、最大大小、剩余百分比
select tablespace_name,file_name,file_id,
round(bytes/(1024*1024),0) as 当前占用M,round(maxbytes/(1024*1024),0) 最大空间M,
round((maxbytes-bytes)/(1024*1024),0) as 剩余空间M,
to_char(100*(maxbytes-bytes)/DECODE(maxbytes,0,maxbytes-bytes,maxbytes), '999.99')||'%' as 剩余百分比
from dba_data_files order by tablespace_name,file_id

  SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
   (B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
   FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
   WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;

7、查看数据库库对象

   select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;

8、查看数据库的版本 

   Select version FROM Product_component_version Where SUBSTR(PRODUCT,1,6)='Oracle';

   select * from v$version;

9、查看数据库的创建日期和归档方式

  Select Created, Log_Mode, Log_Mode From V$Database;

10、查看当前所有对象

   SQL> select * from tab;

11、建一个和a表结构一样的空表

   SQL> create table b as select * from a where 1=2;

   SQL> create table b(b1,b2,b3) as select a1,a2,a3 from a where 1=2;

12、察看数据库的大小,和空间使用情况

   SQL> col tablespace format a20
   SQL> select b.file_id  文件ID,
   b.tablespace_name  表空间,
   b.file_name     物理文件名,
   b.bytes       总字节数,
   (b.bytes-sum(nvl(a.bytes,0)))   已使用,
   sum(nvl(a.bytes,0))        剩余,
   sum(nvl(a.bytes,0))/(b.bytes)*100 剩余百分比
   from dba_free_space a,dba_data_files b
   where a.file_id=b.file_id
   group by b.tablespace_name,b.file_name,b.file_id,b.bytes
   order by b.tablespace_name
   /
   dba_free_space --表空间剩余空间状况
   dba_data_files --数据文件空间占用情况

13、查看现有回滚段及其状态

   SQL> col segment format a30
   SQL> SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS;

14、查看数据文件放置的路径

   SQL> col file_name format a50
   SQL> select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id;

15、显示当前连接用户

   SQL> show user

16、把SQL*Plus当计算器

   SQL> select 100*20 from dual;

17、连接字符串

   SQL> select 列1||列2 from 表1;
   SQL> select concat(列1,列2) from 表1;

18、查询当前日期

   SQL> select to_char(sysdate,'yyyy-mm-dd,hh24:mi:ss') from dual;

19、用户间复制数据

   SQL> copy from user1 to user2 create table2 using select * from table1;

20、视图中不能使用order by,但可用group by代替来达到排序目的

   SQL> create view a as select b1,b2 from b group by b1,b2;

21、通过授权的方式来创建用户

   SQL> grant connect,resource to test identified by test;

   SQL> conn test/test

   create user SXK identified by ncsxk default tablespace ncbdcsxk;
   grant connect,create session,create table,select any table to sxk;

22、How to find the tablespace of a table?

   SELECT tablespace_name
   FROM all_tables
   WHERE table_name = 'YOURTABLENAME';

23、How to remove duplicate rows from a table

   If the unique/primary keys can be identified from the table, it is easier to remove the records from the table using the following query:
   DELETE FROM tablename
   WHERE rowid not in (SELECT MIN(rowid)
   FROM tablename
   GROUP BY column1, column2, column3...);
   Here column1, column2, column3 constitute the identifying key for each record.
   If the keys cannot be identified for the table, you may create a temporary table using the query
   CREATE TABLE temptablename
   AS SELECT DISTINCT *
   FROM tablename;
   Then drop the original table and rename the temp table to original tablename.

24、检查无效的数据库对象 

   col owner for a20
 col object_name for a30
 SELECT owner, object_name, object_type
   FROM dba_objects
   WHERE status= 'INVALID';

25、检查不起作用的约束

   SELECT owner, constraint_name, table_name, constraint_type, status
   FROM dba_constraints
   WHERE status = 'DISABLED' AND constraint_type = 'P' ;

27、检查无效的trigger 

   SELECT owner, trigger_name, table_name, status
  FROM dba_triggers
  WHERE status = 'DISABLED';

28、密码有效期的查看、修改

   --查看概要文件名
     select username,profile from dba_users where username='user';
   --检查概要文件(默认为default)的密码有效期设置
     select * from dba_profiles s where s.profile='DEFAULT' and resource_name='PASSWORD_LIFE_TIME';
   --将密码有效期修改成无限制
     alter profile default limit password_life_time unlimited;
   --检查“RESOURCE_LIMIT”是否配置为“FLASE”
     show parameter resource_limit;
     alter system set resource_limit=false scope=both;
   --修改有效期后,还没有被提示ORA-28002警告的用户账号不会再碰到同样的提示,而已经被提示的用户账号必须再改一次密码
     alter user user_name identified by account unlock;  --不用换密码

29、DOS链接提示"无效选项"的处理

   $sqlplus /nolog
   sql>conn / as sysdba 或 sql>conn user_name/psw as sysdba

30、数据库密码如果忘了怎么办

   开始-->运行-->cmd
   输入 :sqlplus /nolog 回车
   输入 :connect / as sysdba 回车
   用户解锁 : alter user system account unlock 回车
   修改密码:alter user system identified by manager

31、资源文件

   --查看RESOURCE_LIMIT值
     show parameter resource_limit;
   --启动当前资源限制
     alter system set RESOURCE_LIMIT=true;
   --创建资源配置(时间单位:分钟)
     create profile [profilename] limit connect_time unlimited idle_time unlimited;
   --把某种配置文件赋给某个用户
     alter user [user_name] profile [profilename];
   --查看用户使用了哪个资源文件
     select username,profile from dba_users;
   --查看资源文件设置的权限
     select profile,resource_name,limit from dba_profiles;

32、断开用户连接

   --查看哪些用户连接了数据库
     select sid,serial#,username from v$session;
   --断开用户的连接
     alter system kill session '118,1394'; --'118,1394' : 'sid,serial#'

33、查看数据库服务器连接参数
   --专用服务器连接(dedicated server),共享服务器连接(shared server)
   --如果VALUE_COL_PLUS_SHOW_PARAM大于0为()dedicated模式
     show parameter shared_server mts_servers;

34、查看数据库名及其他属性
     select name from v$database;
     show parameter db
     查看参数文件。

35、密码过期的处理
   --查询该用户所使用的profile,如果没有特别设置,一般会是default:
     SELECT username,PROFILE FROM dba_users;
   --查询default的profile设置是否有密码限制,发现密码生命期限为180天:
     SELECT * FROM dba_profiles WHERE resource_name='PASSWORD_LIFE_TIME';
   --修改default的profile密码策略为无限制:
     alter profile default limit password_life_time unlimited;
   --策略已更改,但如果修改profile时候已经有该提示的用户还是需要修改密码,保持原密码即可,无提示的用户将不会再提示
     alter user username identified by xxx;
   --密码的历史,password_reuse_time=30,password_reuse_max=10,用户可以在30天以后重用该密码,要求密码必须被改变超过10次。
     create profile p1 limit password_reuse_time 1/1440 password_reuse_max 1;
     alter user scott profile p1;
   --5分钟后可重用该密码,但这期间必须要被改成其他密码一次
     alter profile p1 limit password_reuse_time 5/1440 password_reuse_max 1;

36、查找表中字段重复的数据
   --count函数不能与列同时使用,但加group by后就可以了。分组后找出组中多余一条记录的,然后作为查询条件。
     select * from bdc_fwsx where 不动产单元号 in (select 不动产单元号 from (
     select count(1) as a,不动产单元号 from bdc_fwsx where 状态=1 group by 不动产单元号)
     where a>1) and 状态=1 order by 不动产单元号

37、查询对象占用空间大小
   --查询段占用的空间
     select bytes from user_segments where segment_name='tablename';
   --查询段剩余空间和已用空间
     analyze table tablename compute statistics;
     select empty_blocks,blocks from user_table where table_name='tablename';

38、查询系统是以pfile还是spfile启动
   --如果isspecified里有true,表明用spfile进行了指定配置
   --如果全为false,则表明用pfile启动
     select isspecified,count(*) from v$spparameter group by isspecified;
     select decode(count(*),1,'spfile','pfile') from v$spparameter
     where rownum=1 and isspecified='TRUE';

39、DBLink的创建、删除、查询
   --跨库查询数据时可以建立数据库连接,create后不加public,则创建的dblink只有创建者可以使用
     create [public] database link link_name connect to user_name identified by user_pwd using 'server_name';
     drop database link link_name;
   --使用时,只要在表名后加“@link_name”即可。
   --应避免使用connect by, start with, prior关键字。BLOB字段不可用。
   --当本地global_names为TRUE时,link_name必须与远程的global_name一致
     show parameter global_name;
     select * from dba_db_links;
     alter system set global_names=FALSE;
   --如果创建连接后还是无法查询,可以试一下把server_name换成连接字符串。
     create [public] database link link_name connect to user_name identified by user_pwd using
'(DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 17.16.27.251)(PORT = 1521))
     )
     (CONNECT_DATA =
       (SERVICE_NAME = GHY)
     )
)';
   --查看dblink详细信息,如是否在使用中
     select * from v$dblink;

40、查看数据库版本
   select * from v$version;

41、移动表或表分区
   --移动表的语法
     Alter table tablename move [Tablespace new_name Storage(initial 50M next 50M
     pctincrease 0 pctfree 10 pctused 50 initrans 2) nologging];
   --移动分区的语法
     alter table tablename move (partition partname) [update global indexes];
   --之后之后必须重建索引
     Alter index indexname rebuild;
   --如果表有Lob段,那么正常的Alter不能移动Lob段到别的表空间,而仅仅是移动了表段,
   --可以采用如下的方法移动Lob段
     alter table tablename move lob(lobsegname) store as (tablespace newts);

42、查看数据文件是否被存储占用
   --如果找不到记录,说明数据文件没有存储任何数据
     select segment_name,file_id,blocks from dba_extents where file_id=5;

43、删除表空间的空数据文件
   --首先查询到数据文件的file_id(dba_data_files),然后查看数据文件是否是空数据文件(dba_extents)
     alter tablespace tbs_name drop datafile 'datafile_path_name.dbf';

44、不配置网络,直接连接
   --启动cmd
     sqlplus /nolog
     conn user/pwd@IP:1521/DBName;

45、锁定对象后的解锁
   --查出锁定的对象sid与serial#,杀死会话(两列数据用逗号连接)
     select * from v$session where sid in (select session_id from v$locked_object);
   --结果
     SID    SERIAL#
     ================
     136    14178
   --杀死会话
     alter system kill session '136,14178';

46、取得一段时间内的所有日期
   --两个日期之间的天数
     select to_char(to_date('2017-01-01','yyyy-mm-dd')+level-1) dt,level
     from dual connect by level

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论