超实用!!ORACLE数据库DBA运维常用的语句脚本

来源:互联网 发布:python 远程ssh 编辑:程序博客网 时间:2024/06/01 09:52

一个牛逼的程序员,都是玩linux系统的,linux系统也有比windows更好的权限机制,故大部分公司都是在linux上部署oracle,本文主要以linux系统为基础与众多程序员小伙伴进行探讨。当然windows系统脚本命令也与这差不多

楼主以前在税务方面做了快一年的数据库运维加上大学期间所学的sql server,算是对入门学习数据库有了自己的心得,这些是我积攒下来的一些数据库基础用法。


 du -h --max-depth=1       --查看linux系统当前目录大小,很实用的,可以找到是哪个文件占用了内存

 service iptables stop/start    --关闭/开启防火墙,因为pl/sql和其他的远程都需要linux防火墙的放行,所以测试时可以关闭防火墙,当然正式环境最好只是开放端口而不是全部把防火墙给关掉


lsnrctl start    --切换到oracle用户下,启动监听

sqlplus  / as sysdba   --DBA用户进入到oracle ,或者其他具有dba权限的用户也可以

startup;        --启动oracle     这是启动oracle的三个步骤


create tablespace TS_HX_FPFX_DATA datafile '/oracle/TS_HX_FPFX_DATA' size 100m autoextend on next 50m maxsize unlimited;

create user GZ_HX_SB identified by hxzg default tablespace TS_HX_FPFX_DATA;

grant connect,resource,dba to GZ_HX_SB;   --创建表空间,创建表用户并指定表空间,赋予表用户权限


drop user GZ_HX_SB cascade;

drop tablespace TS_HX_FPFX_DATA including CONTENTS and datafiles;  --删除用户和表空间,先删除用户再删除表空间


select * from all_tables ,all_col_comments,all_users,all_table_columns... --这些all,是oracle很棒的总结查询,譬如你只记得一个表的

部分表名,你就可以这样查询该表

select * from all_tables a where a.table_name like '%KG%DZ%'


ORACLE的数据导入导出:

一般情况下 用pl/sql自带的导入导出即可,但是对于数据量很大的操作,最好是通过dmp文件导入导出,这样几乎可以做到数据丢失率为0

导出:

exp USER/PASSWORD@orcl file=d:\daochu.dmp owner=(HX_DM_QG,HX_DM_ZDY)  
exp USER/PASSWORD@orcl file=d:\daochu.dmp tables=(hxzg.dj_nsrxx)
exp system/manager@TEST file=d:\HTJS5.dmp tables=(HTJS.CB_KPJ_BSXX,HTJS.CB_QY_BSQK_TJB) 
query=\"where QSSJ >to_date('2016-01-01')and swjg_dm like '144%'\"  --注释:linux系统要加转义,即owner=\(HX_DM_QG\)

导入:

一般导入时目标库即被导入库需要配置与导出库相同的表空间,看导入日志,需要配置什么表空间就直接创建同名表空间即可,oracle会

自动寻找该表空间,此外表空间最大为32G,如果一个表空间被占满,无法扩展时,可以创造一个表空间(名字任取)关联该表空间即可

alter tablespace TS_HX_SB_GDFQGZ_DATA add datafile '/home/oracle/TS_HX_SB_GDFQGZ_DATA1' SIZE 100M

AUTOEXTEND ON NEXT 50M

--开始导入

imp USER/PASSWORD@orcl file=/home/daochu.dmp full=y  ignore=y  --注释:ignore代表了即使导入库有该表,不报错,继续导入  
imp USER/PASSWORD@orcl file=/home/daochu.dmp fromuser=GZ_HX_DJ touser=hxzg   --注释:这样可以把所有不同用户下的

表都放在同一用户下


//查看表空间实际占用内存量,从而压缩腾出内存

select file#, name from v$datafile;
select (select max(block_id) from dba_extents where file_id=8)* 8 / 1024 from dual;
alter database datafile '/oracletest/TS_HX_SB_GDFQGZ_DATA' resize 28200m;


select count(1) from all_tables where table_name IN ('') --查看用户下表的数量条数

select num_rows * avg_row_len/1024/1024 from all_tables where table_name IN('')  --查看表下数据量,初识单位值是byte,

除以/1024的数量依次对应K,M,G,T

select /*+ PARALLEL(10)*/ * form 。。。 --开并行,加快查询速度,一般推荐不超过20,不然可能会搞垮数据库,

导致数据库宕机


//小技巧

1.表名后面加别名可以方面记录和书写

2.pl/sql可以设置快速补全,譬如sf=select * from,ii=insert into

3.从内存优化层面来讲,语句脚本大写可以降低运行压力,因为oracle运行时要把小写转化为大写,推荐两个函数upper,lower很实用

4.能用join和union的就不要用子查询,嵌套查询

5.几个常用的子查询结构

select* from table a where a.id in (select b.id from table2 b);

select (select * from table2) from table1; --理论上可以嵌套嵌套再嵌套,但是为何要这么傻呢

6.必会的语法

case when .. and .. then .. end as..

7.拼

select '这是一个来自'|| a.name||'的博客' from table1 a ;

8. in,like,_,% ,这几个很实用。


/**很多初学者分不清甚至不会用join和union,这个多测试几张表就行了

join与union都是用来关联查询的,举个栗子,你要查的内容不只在一张表上,在两张表甚至多张表里,这个时候就需要

用join和union来关联了。

join是列关联,你想要的内容是三列,需要第一张表的两列和另外一张表的一列,这个时候就用join

join比较灵活,可以left join ,right join,inner join ,all join分别对应左关联,右关联,内关联和全关联,左关联就是我

这一列有多少行,你也要多少行,不够空格来凑,其他类似,可以多多测试掌握。

*/

--语法:

select * from table1 a left join table2 b on a.id=b.id where a.id>0;

/**union是行关联,union分为union和all union,我以前面试时就有问过这两个的区别,就是前者是返回不重复项,后者是

全部返回包括重复项,这个从数据库运行优化方面来说,union all最好的,占用数据库内存少一点,但是还是要根据实际情况

需要注意的是union 上下需要一一对应,包括数据类型和行的数量,union执行的是乘积查询,即笛卡尔积,这一点需要注意

*/

语法:

select a.id,a.name from table1 union select b.id,b.name from table2;

用union也可以快速配置脚本,比notepad的一键替换好多了,灵活运用!



最后,最后一点很重要的事情,各位DBA大神在执行drop,delete这些敏感操作时一定要记得备份和加where条件,

不然真的就:程序员的自我修养---从删库到跑路


OGG的参考部署配置可查看楼主的另外一篇文字


阅读全文
0 0
原创粉丝点击