ORACLE数据库DBA运维常用语句脚本

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mochou111/article/details/78070795

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

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

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

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

--启动oracle的三个步骤
--切换到oracle用户下,启动监听
lsnrctl start   

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

startup;       --启动oracle     

--创建表空间,创建表用户并指定表空间,赋予表用户权限
create tablespace TABLEPLACE_NAME datafile '/oracle/TABLEPLACE_NAME' size 100m autoextend on next 50m maxsize unlimited;

create user USER_NAME identified by PASSWORD default tablespace TABLEPLACE_NAME;

grant connect,resource,dba to USER_NAME;   


--删除用户和表空间,先删除用户再删除表空间
drop user USER_NAME cascade;

drop tablespace TABLEPLACE_NAME including contents and datafiles; 
--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文件导入导出

--导出:exp

exp USER/PASSWORD@ORACLE_SID file=/home/oracle/daochu.dmp owner=(USER1,USER2)  
exp USER/PASSWORD@ORACLE_SID file=/home/oracle/daochu.dmp tables=(table_name)
exp USER/PASSWORD@ORACLE_SID file=/home/oracle/daochu.dmp tables=(table_name1,table_name2...)  query=\"where TABLE_COLUMN1 >to_date('xxxx-xx-xx')and TABLE_COLUMN2 like '%%'\"  
--注释:linux系统要加转义

--导入:imp

--一般导入时目标库即被导入库需要配置与导出库相同的表空间
--看导入日志,需要配置什么表空间就直接创建同名表空间即可,oracle会自动寻找该表空间
--此外表空间最大为32G,如果一个表空间被占满,无法扩展时,可以创造一个表空间(名字任取)关联该表空间即可

alter tablespace TABLEPLACE_NAME add datafile '/home/oracle/TABLEPLACE_NAME' SIZE 100M

AUTOEXTEND ON NEXT 50M


--开始导入

imp USER/PASSWORD@ORACLE_SID file=/home/oracle/daochu.dmp full=y  ignore=y 
--注释:ignore代表了即使导入库有该表,不报错,继续导入  
imp USER/PASSWORD@ORACLE_SID file=/home/oracle/daochu.dmp fromuser=USER1 touser=USER2 
--注释:这样可以把不同用户下的表都放在同一用户下
--查看表空间实际占用内存量,从而压缩腾出内存

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/TABLEPLACE_NAME' resize 28200m;

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

--查看表下数据量,初识单位值是byte,除以/1024的数量依次对应K,M,G,T
select num_rows * avg_row_len/1024/1024 from all_tables where table_name IN('')  

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

//小技巧

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的参考部署配置可查看楼主的另外一篇文字

猜你喜欢

转载自blog.csdn.net/mochou111/article/details/78070795