Oracle经验

Oracle 常见语句记录

查看用户连接信息

select sessionid,userid,userhost,comment$text,spare1,to_char(ntimestamp#+1/3,'yyyy-mm-dd hh24:mi:ss') from sys.aud$
where returncode=1017 order by ntimestamp# desc

查询当前用户下得分区表:

select * from user_tables where partitioned='YES'

如果要查询整个数据库中的分区表:

select * from dba_tables where partitioned='YES'

如果要查询某个用户下得分区表:

select * from dba_tables where partitioned='YES' and owner='ABCDEFG'

USER_TAB_PARTITIONS:可查看分区表的名字、归属表空间以及表的详细分区情况。

USER_PART_TABLES:可查看用户所有的分区表,以及分区方式。

查询数据库中带数据的表

select t.table_name,t.num_rows from user_tables t ORDER BY NUM_ROWS DESC;

查询数据量不准确时 分析一下表就准了

analyze table tablename compute statistics;

–查找数据库中带索引和主键的表

select cu.* from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P';
select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name;

select a.uniqueness 索引类型,b.index_name 索引名称,b.column_name 字段 ,b.TABLE_NAME 表名 from user_indexes a ,user_ind_columns b
where a.table_name=b.table_name and a.index_name = b.index_name
and a.table_owner=upper('abc') order by a.uniqueness desc;

select a.constraint_name,  a.column_name ,a.table_name
from user_cons_columns a, user_constraints b 
where a.constraint_name = b.constraint_name 
and b.constraint_type = 'P';

–替换掉数据中回车

update tablename set columnName=replace(columnName,chr(10),'') where columnNamelike '%'||chr(10) || '%';

删除重复记录保留rowid最大的记录 column为字段名


```scala
delete from abc a
 where (column) in
       (select t.column  from abc t group by t.column having count(1)>1)
   and rowid not in (select min(rowid)
                       from abc
                      group by column
                     having count(*) > 1);

导出空表

select ' alter table  '|| table_name || ' allocate extent;' 
from user_tables where segment_created='NO';

select * from all_tab_comments -- 查询所有用户的表,视图等
select * from user_tab_comments -- 查询本用户的表,视图等
select * from all_col_comments  --查询所有用户的表的列名和注释.
select * from user_col_comments -- 查询本用户的表的列名和注释
select * from all_tab_columns --查询所有用户的表的列名等信息(详细但是没有备注).
select * from user_tab_columns --查询本用户的表的列名等信息(详细但是没有备注).

–查询某些表数据量

select t.table_name,t.NUM_ROWS,t.* from user_tables t where table_name in('abc','bcd')

–Oracle 空表无法导出处理

1、用以下这句查找空表:select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;

–oracle查表数据量

select u.TABLE_NAME,u.NUM_ROWS from user_tables u order by u.NUM_ROWS desc

–1.正则判断,适用于10g以上版本

--非正整数 
select 字段 fromwhere regexp_replace(字段,'\d','') is not null;
--非数值类型
select 字段 fromwhere regexp_replace(字段,'^[-\+]?\d+(\.\d+)?$','') is not null;

–查询锁定进程

select * from gv$process
where addr in (
select paddr from gv$session where sid =1
);

–查询表中字段类型

select DATA_TYPE  
from User_Tab_Columns t 
where t.column_name=upper('columnName') 
  and  t.table_name =upper(trim('abc'));


--guid是raw类型,转成varchar类型
rawtohex(sys_guid())  as "SERIALNUM_ID"

字符集客户端

select userenv('language') from dual
select * from nls_database_parameters


--出现already use by another user
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;


alter system kill session '29,525';

–查询uuid

select sys_guid() from dual;

//oracle 11g 导出空表

show parameter deferred_segment_creation;

alter system set deferred_segment_creation=false; 

select table_name from user_tables where NUM_ROWS=0;

select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0

//树形结构迭代查询

–子取父

select * from tb_org CONNECT BY PRIOR orgparent=orgid START WITH orgid='newsroom'

–子取父变形

select * from tb_org CONNECT BY PRIOR orgparent=orgid START WITH orgparent='newsroom'

–父取子(结果中没有父这条记录)

select * from tb_org CONNECT BY PRIOR orgid=orgparent START WITH orgparent='newsroom'

—父取子变形(多了父这一级)

select * from tb_org connect by prior orgid=orgparent start with orgid ='newsroom'

//查找用户号

select name,password, user# from sys.user$;

//修改用户名

1、windows 平台下运行 cmd2、sqlplus /nolog3、

SQL> connsys/lmis@lmisdx_localas sysdba 连接到数据库。

通常可以用sys用户登陆。

SQL> select * from user$; 找到 name为需要修改的用户的user#。
SQL> UPDATE USER$ SET NAME='新用户名' WHERE USER#=38;   已更新 1 行。6、SQL> COMMIT;提交完成。
SQL> ALTER SYSTEM CHECKPOINT;   系统已更改。
SQL> ALTER USER 新用户名 IDENTIFIED BY 新密码;   此时会提示新用户不存在。
SQL> ALTER USER 新用户名 IDENTIFIED BY 新密码        *ERROR 位于第 1 行:ORA-01918: 用户'新用户'不存在
SQL> ALTER SYSTEM FLUSH SHARED_POOL;   系统已更改。
SQL> ALTER USER 新用户 IDENTIFIED BY 新密码;    用户已更改。

11、测试连接

SQL> CONN 新用户/新密码@lmisdx_local;    

已连接。

//修改DBF文件名称

2、在操作系统层面移动数据文件
下面以把文件“/u01/app/oradata/demo/history.dbf”移动到“/data/oracle/oradata/history01.dbf”为例介绍。
(1)、关闭数据库
[oracle@DB_SERVER ~]$ sqlplus / as sysdba(回车)

SQL>  shutdown   immediate(回车) #等待数据库提示关闭
SQL> exit

(2)移动文件(linux命令 windows下直接到路径下找到文件修改名字即可)

[oracle@DB_SERVER ~]$ mv /u01/app/oradata/demo/history.dbf /data/oracle/oradata/history01.dbf

3、修改数据库的文件挂载

[oracle@DB_SERVER ~]$ sqlplus / as sysdba(回车)
SQL> startup   mount(回车) #等待数据库提示装载成功
SQL> alter database rename file '/u01/app/oradata/demo/history.dbf' to '/data/oracle/oradata/history01.dbf';

#完成后打开数据库。

SQL> alter   database   open;
SQL> exit

数据库文件移动成功。

1.查询oracle表空间的使用情况

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 

–整体表空间查询语句

SELECT TABLESPACE_NAME 表空间,
       TO_CHAR(ROUND(BYTES / 1024, 2), '99990.00') || '' 实有,
       TO_CHAR(ROUND(FREE / 1024, 2), '99990.00') || 'G' 现有,
       TO_CHAR(ROUND((BYTES - FREE) / 1024, 2), '99990.00') || 'G' 使用,
       TO_CHAR(ROUND(10000 * USED / BYTES) / 100, '99990.00') || '%' 比例
  FROM (SELECT A.TABLESPACE_NAME TABLESPACE_NAME,
               FLOOR(A.BYTES / (1024 * 1024)) BYTES,
               FLOOR(B.FREE / (1024 * 1024)) FREE,
               FLOOR((A.BYTES - B.FREE) / (1024 * 1024)) USED
          FROM (SELECT TABLESPACE_NAME TABLESPACE_NAME, SUM(BYTES) BYTES
                  FROM DBA_DATA_FILES
                 GROUP BY TABLESPACE_NAME) A,
               (SELECT TABLESPACE_NAME TABLESPACE_NAME, SUM(BYTES) FREE
                  FROM DBA_FREE_SPACE
                 GROUP BY TABLESPACE_NAME) B
         WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME)
  --WHERE TABLESPACE_NAME LIKE 'CDR%'
 ORDER BY FLOOR(10000 * USED / BYTES) DESC;

2.查询oracle系统用户的默认表间和临时表空间

select default_tablespace,temporary_tablespace from dba_users 

3.查询单张表的使用情况

select segment_name,bytes from dba_segments where segment_name = 'abc' and owner = USER 

abc是您要查询的表名称

4.查询所有用户表使用大小的前三十名

select * from (select segment_name,bytes from dba_segments where owner = USER order by bytes desc ) where rownum <= 30 

5.查询当前用户默认表空间的使用情况

select tablespacename,sum(totalContent),sum(usecontent),sum(sparecontent),avg(sparepercent) 
from 
( 
SELECT b.file_id as id,b.tablespace_name as tablespacename,b.bytes as totalContent,(b.bytes-sum(nvl(a.bytes,0))) as usecontent,sum(nvl(a.bytes,0)) as sparecontent,sum(nvl(a.bytes,0))/(b.bytes)*100 as sparepercent 
FROM dba_free_space a,dba_data_files b 
WHERE a.file_id=b.file_id and b.tablespace_name = (select default_tablespace from dba_users where username = user) 
group by b.tablespace_name,b.file_name,b.file_id,b.bytes 
) 
GROUP BY tablespacename 

6.查询用户表空间的表

select * from user_tables 

–解锁用户abc

ALTER USER abc ACCOUNT UNLOCK;  

—解决连接oracle 11g报ORA-01034和ORA-27101的错误

我本机安装的数据库版本是ORACLE 11G R2,用plsql连接时候,报ora-12514如下错误:

但是在cmd里用sqlplus连接已经创建的用户时候,报如下错误:

ORA-01034 - Oracle not available
ORA-27101 - shared memory realm does not exist
网上查了几个解决资料,说是oracle home和sid的问题,或者是让使用Net Configuration Assistant重建本地网络服务名。实践了一下,都不管用。

经过总结,使用如下方法解决比较好:

1、首先看一下 ORACLE_BASE\ORACLE_HOME\DATABASE 下面的 ORADIM.LOG 文件
E:\app\psun\product\11.2.0\dbhome_1\database:
看日志才发现原来报的下面的错误

ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00132: syntax error or unresolved network name 'LISTENER_ORCL'

2、进过查找该错误,发现是tnsnames.ora文件中少了如下语句的原因
LISTENER_MAXIMO =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
添加后,重启数据库实例服务,重启监听程序:

再次使用SQLPLUS、plsql连接,好了!

–查询是否有回车的语句

select t.sqlserver_code from DXC_RANGE_STREETCODE t where t.sqlserver_code like '%'|| chr(10) ||'%'

–计算长度字段中有中文不按一位计算

LENGTHB

–不受group by 限制查看

 TO_CHAR(WMSYS.WM_CONCAT(T1.CNT)) AS CNT,

–oracle 导出时遇到exp 00003错误

最近接到一个case,由于服务器已经升级到9.2.0.7.0,而客户端还是原来的9.2.0.1.0。根据oracle的版本兼容性,这个应该是不应该存在很大问题,但是当某个表中含有lob(包括clob、blob等)大对象字段的情况下,如果使用低版本的客户端来export该表,则会报“未找到段 (X,XXXXXX) 的存储定义其它可正常导出”。这其实是oracle的一个bug。不同版本间大对象export间出现问题。
追根溯源,就是那个exu9tne视图中少了一句话。
于是找到rdbms\admin\catexp.sql获取exu9tne视图的定义:

CREATE OR REPLACE VIEW exu9tne (tsno, fileno, blockno, length) AS
SELECT ts#, segfile#, segblock#, length
FROM sys.uet$WHERE ext# = 1

根据oracle的处理方法,应该在其后再增加一句话,即可处理版本间大对象的export问题。
Union ALLSELECT * FROM SYS.EXU9TNEB
则最后该视图的定义应该为:

CREATE OR REPLACE VIEW exu9tne (tsno, fileno, blockno, length) AS
SELECT ts#, segfile#, segblock#, length
FROM sys.uet$WHERE ext# = 1
Union ALLSELECT * FROM SYS.EXU9TNEB

以sys用户来执行之,不过建议修改前备份好catexp.Sql脚本,以免出错。
经过不断test,发现这种方法是可行的。所以就记录下来,如大家分享。

–导出命令

 1、完全: 
imp abc/password@127.0.0.1/orcl BUFFER=64000 FILE=E:\aa.DMP FULL=Y 
 
 2、用户模式: 
imp abc/password@127.0.0.1/orcl    BUFFER=64000 FILE=E:\FULLConsole.DMP FROMUSER=console TOUSER=CONSOLE1

exp abc/password@127.0.0.1/orcl  BUFFER=64000 FILE=E:\aaa.DMP owner=abc

3、表模式: 
      EXP abc/password@127.0.0.1/orcl    BUFFER=64000 FILE=E:\abc.DMP OWNER=abc TABLES=(aaa) 

–查询排查某些表后剩余待导出表

select  
listagg(table_name, ',') within group (order by table_name)
  from dba_tables
  where owner  in ('aaa') 
  and table_name not in                           
  ('tablename')    
  order by owner; 

bat 命令中这样写:D:\instantclient12\exp.exe abc/pass@127.0.0.1/orcl file=E:\14oracle-aaa.DMP logfile=OracleExp.LOG tables=(待导出表)

–数据泵方式导出

expdp abc/pass@127.0.0.1/orcl dumpfile=abc.DUMP logfile=abc.LOG schemas=(abc)

–数据泵方式导入(导入导出用户名一致时)

impdp abc/pass@127.0.0.1/orcl dumpfile=文件名.DUMP logfile=abc.LOG schemas=(abc)

–数据泵方式导入(导入导出用户名不一致时)

//abc是dump文件里的用户名,bcd待导入用户

impdp abc/pass@127.0.0.1/orcl dumpfile=abc.DUMP logfile=abc.LOG REMAP_SCHEMA=abc:bcd

–带目标端版本

expdp abc/pass@127.0.0.1/orcl dumpfile=abc.dmp schemas=abcversion=10.2.0.1.0

–导出出错ORACLE 错误 904

EXP-00008: 遇到

ORA-00904: "POLTYP": invalid identifier

EXP-00000: 导出终止失败

发生EXP-00008: 遇到 ORACLE 错误 904 的导出报错。

根据网上的资料和总结,分析可能是本地使用的exp导出工具的版本与数据库服务器端exp版本不一致导致。

在命令操作中发现,本地安装的Oracle 版本是Release 11.2.0.1.0,而数据库服务器端安装的Oracle 是Release 10.2.0.4.0 .

由于Oracle的imp/exp组件的操作原则--向下兼容,且有一些规则:

规则1:低版本的exp/imp可以连接到高版本(或同版本)的数据库服务器,但高版本的exp/imp不能连接到低版本的数据库服务器;

规则2:高版本exp出的dmp文件,低版本无法imp(无法识别dmp文件);低版本exp出的dmp文件,高版本可以imp(向下兼容);

规则3:从Oracle 低版本Export的数据可以Import到Oracle高版本中,但限于Oracle的相邻版本,如从Oracle 10 到 Oracle 11.对于两个不相邻版本间进行转换,如从Oracle 9 到 Oracle 11,则应先将数据输入到中间版本-Oracle 10,再从中间数据库转入更高版本Oracle 11.

据此,最快捷的解决方案就是使用安装了10g Oracle 的机子,进行服务器上数据库数据的导出。4

–修改表空间为自动增长

alter database datafile 'd:/OracleTest/test001.dbf' autoextend on;

–修改表空间大小

alter database datafile 'E:\oracle\product\10.2.0\oradata\test.dbf' resize 2000m;

–查看表空间大小

select tablespace_name,sum(bytes)/1024/1024 from dba_data_files
group by tablespace_name 

–删除表空间

DROP TABLESPACE EHR INCLUDING CONTENTS AND DATAFILES;

–查看表空间地址

select file_Name from dba_data_files 

–创建表空间

CREATE SMALLFILE TABLESPACE "abc" DATAFILE 'E:\app\Administrator\oradata\orcl\abc.DBF' SIZE 50M REUSE LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; 

–创建用户 用户授权

create user abcidentified by 1 default tablespace abc;
-- Grant/Revoke role privileges 
grant exp_full_database to abc;
grant imp_full_database to abc;
grant resource to abc;
-- Grant/Revoke system privileges 
grant create any job to abc;
grant create any procedure to abc;
grant select any table to abc;
grant unlimited tablespace to abc;

grant connect,resource,dba to hb_ph_mchis;

–删除所有表数据

SELECT 'TRUNCATE TABLE '|| table_name || ';' FROM USER_TABLES
ORDER BY TABLE_NAME;

–查询所有表数据量

select u.TABLE_NAME,u.NUM_ROWS from user_tables u order by u.NUM_ROWS desc



SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
  D.TOT_GROOTTE_MB "表空间大小(M)",
  D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
  TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",
  F.TOTAL_BYTES "空闲空间(M)",
  F.MAX_BYTES "最大块(M)"
  FROM (SELECT TABLESPACE_NAME,
  ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
  ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
  FROM SYS.DBA_FREE_SPACE
  GROUP BY TABLESPACE_NAME) F,
  (SELECT DD.TABLESPACE_NAME,
   ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
  FROM SYS.DBA_DATA_FILES DD
  GROUP BY DD.TABLESPACE_NAME) D
  WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
  ORDER BY 1;

–给表加主键

alter table  abcadd constraint  PK_abc  primary key (id);

–添加字段

alter table abc add upload_time date default sysdate;
comment on column abc.upload_time is '上传数据时间';

–查询字典表

select distinct table_name from user_tab_columns t 
where column_name = 'OPERATETIME' order by t.TABLE_NAME

–建立数据link

1未配置本地服务
create database link linkname
   connect to dbuser identified by dbpassword
   using '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = rac)
    )
  )';

其中 linkname 是数据链名称 ,dbuser 登陆用户名 ,dbpassword 登陆密码 ,HOST= 对方ip,PORT =端口,SERVICE_NAME=数据库的sid

2 已配置本地服务
CREATE DATABASE LINK数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘本地配置的数据的实例名’;
例如

create public database link linkfwq connect to dbuser
  identified by dbpassword using 'dora'

–触发器创建

create or replace trigger auditinfotrigger
  after update on auditinfo  
  for each row
declare
  -- local variables here
begin
  update auditinfo set upload_time = sysdate;end trigger;

–输出

dbms_output.put_line();

–查看oracle版本

select * from product_component_version

MySQL经验

查看表数据量

SELECT TABLE_NAME,TABLE_ROWS FROM information_schema.`TABLES`
WHERE TABLE_SCHEMA = (SELECT database()) order by table_name;

分析表-用于查询准确数据量

analyze table tablename 
  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值