shell中执行sql语句或者sql脚本文件

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:shell中执行sql语句或者sql脚本文件

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

间接执行sql语句或者sql脚本文件

#!bin/bash
--确保只运行oracle用户运行
if [ `whoami` != 'oracle' ]
then
echo "Error: You must be oracle to execute."
exit 99
fi
# 获取ORACLE_SID
ORACLE_SID=$ORACLE_SID
# ORACLE_SID=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f1 -d':'`
export ORACLE_SID
# 获取ORACLE_HOME
# ORACLE_HOME=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
ORACLE_HOME=$ORACLE_HOME
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH
$ORACLE_HOME/bin/sqlplus sys/xifenfei as sysdba<<XFF
--spool 写入文件
--spool /tmp/sql.txt;
--执行sql语句
select name from v\$datafile;
--执行sql文件
@/tmp/select.sql
--spool off
exit
XFF

直接执行sql脚本文件
sqlplus system/manager @/home/oracle/sql/longscript.sql

建立dblink(10g与11g之间)

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:建立dblink(10g与11g之间)

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

1、在10g上建立dblink时,自动加上后缀域名
原因:默认添加global_name后面域名
解决方法:修改global_name 值
UPDATE GLOBAL_NAME SET GLOBAL_NAME = ‘[.db_domain]’;
commit;
重新连接oracle
2、使用pl/sql dev建立dblink(10g连接到11g)时,创建过程中,会自动的把用户名/密码变成大写,使得dblink连接失败
原因:11g用户名/密码区分大小写
解决方法:使用pl/sql图形化界面填写好参数,然后点击view sql,拷贝sql语句,然后把其中的用户名/密码加上双引号,再执行sql语句

Redhat 中裸设备(raw) 的配置和oracle中使用

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:Redhat 中裸设备(raw) 的配置和oracle中使用

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

1、对磁盘进行分区
fdisk -l 查看磁盘情况
fdisk /dev/sdb 进行分区操作
2、配置裸设备(修改/etc/udev/rules.d/60-raw.rules文件)
在redhat5中
1)加载裸设备
ACTION==”add”, KERNEL==”/dev/sdb1″,RUN+=”/bin/raw /dev/raw/raw1 %N”–多个一次累加
2)设置raw设备的用户和权限信息
ACTION==”add”, KERNEL==”raw[1-4]”, OWNER=”oracle”, GROUP=”dba”, MODE=”660″
3)重启服务
start_udev
4)查看raw设备
ls -lrt /dev/raw或者 raw -aq
在redhat4中
1)编辑/etc/sysconfig/rawdevices
vi /etc/sysconfig/rawdevices
/dev/raw/raw31 /dev/sdc5
/dev/raw/raw32 /dev/sdc6
/dev/raw/raw33 /dev/sdc7
/dev/raw/raw34 /dev/sdc8
2)执行绑定操作
/sbin/service rawdevices restart
3)设置权限
vi /etc/rc.local中添加
chown oracle:dba /dev/raw/raw31
chown oracle:dba /dev/raw/raw32
chown oracle:dba /dev/raw/raw33
chown oracle:dba /dev/raw/raw34
chmod 775 /dev/raw/raw31
chmod 775 /dev/raw/raw32
chmod 775 /dev/raw/raw33
chmod 775 /dev/raw/raw34
3、在oracle中使用
1)表空间
create tablespace raw1 datafile ‘/dev/raw/raw31’ size 450m;
2)联机日志
alter database add logfile group 4 (‘/dev/raw/raw32’) size 100m;
3)undo空间
create undo tablespace undo2 datafile ‘/dev/raw/raw33’ size 100m reuse;
4、注意事宜
1)一个裸设备只能放一个oracle文件
2)oracle文件大小要稍微小于裸设备大小

查询oracle被锁对象并解锁

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:查询oracle被锁对象并解锁

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

1、查询oracle被锁对象及其语句

SELECT a_s.owner,
  a_s.object_name,
  a_s.object_type,
  VN.SID,
  VN.SERIAL#,
  VS.SPID "OS_PID",
  VN.PROCESS "CLIENT_PID",
  VN.USERNAME,
  VN.OSUSER,
  VN.MACHINE "HOSTNAME" ,
  VN.TERMINAL,
  VN.PROGRAM,
  TO_CHAR(VN.LOGON_TIME,'YYYY-MM-DD HH24:MI:SS')"LOGIN_TIME",
  'alter system kill session '''||vn.sid||','||vn.serial#||''';' "ORACKE_KILL",
  'kill -9 '|| VS.SPID "OS_KILL"
FROM ALL_OBJECTS A_S,
  V$LOCKED_OBJECT V_T,
  V$SESSION VN,
  V$PROCESS VS
WHERE A_S.OBJECT_ID=V_T.OBJECT_ID
AND V_T.SESSION_ID =VN.SID
AND VS.ADDR=VN.PADDR
AND VN.USERNAME NOT IN('SYSMAN','SYS');

2、查询该sid的sql语句

select * from v$sql vl,v$session vn
where vl.ADDRESS= decode(vn.SQL_ADDRESS,null,vn.PREV_SQL_ADDR,VN.SQL_ADDRESS)
and vn.sid=&sid;

3、解锁

alter system kill session 'sid,serial#';
--note:不能kill自身

4、查询被锁对象增强版

SELECT DDL.OWNER AS 用户,
       DDL.NAME  AS 对象,
       DDL.type  AS 类型,
       VS.OSUSER AS OS_USER,
       VS.MACHINE,
       VS.STATUS,
       VS.PROGRAM,
       VS.LOGON_TIME AS "LOGIN_TIME",
       VP.SPID,
       'kill -9 ' || VP.SPID AS OS_KILL,
       vs.sid,
       vs.SERIAL#,
       'alter system kill session ''' || vs.sid || ',' || vs.serial# ||
       ''';' "ORACKE_KILL"
  FROM DBA_DDL_LOCKS DDL, V$SESSION VS, V$PROCESS VP
 WHERE DDL.SESSION_ID = VS.SID
   AND VS.PADDR = VP.ADDR;

oracle常用hint的用法

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:oracle常用hint的用法

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

1. /*+ALL_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.
2. /*+FIRST_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.
3. /*+CHOOSE*/
表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;
表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;
4. /*+RULE*/
表明对语句块选择基于规则的优化方法.
5. /*+FULL(TABLE)*/
表明对表选择全局扫描的方法.
6. /*+ROWID(TABLE)*/
提示明确表明对指定表根据ROWID进行访问.
7. /*+CLUSTER(TABLE)*/
提示明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效.
8. /*+INDEX(TABLE INDEX_NAME)*/
表明对表选择索引的扫描方法.
9. /*+INDEX_ASC(TABLE INDEX_NAME)*/
表明对表选择索引升序的扫描方法.
10. /*+INDEX_COMBINE*/
为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的布尔组合方式.
11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/
提示明确命令优化器使用索引作为访问路径.
12. /*+INDEX_DESC(TABLE INDEX_NAME)*/
表明对表选择索引降序的扫描方法.
13. /*+INDEX_FFS(TABLE INDEX_NAME)*/
对指定的表执行快速全索引扫描,而不是全表扫描的办法.
14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,…*/
提示明确进行执行规划的选择,将几个单列索引的扫描合起来.
15. /*+USE_CONCAT*/
对查询中的WHERE后面的OR条件进行转换为UNION ALL的组合查询.
16. /*+NO_EXPAND*/
对于WHERE后面的OR 或者IN-LIST的查询语句,NO_EXPAND将阻止其基于优化器对其进行扩展.
17. /*+NOWRITE*/
禁止对查询块的查询重写操作.
18. /*+REWRITE*/
可以将视图作为参数.
19. /*+MERGE(TABLE)*/
能够对视图的各个查询进行相应的合并.
20. /*+NO_MERGE(TABLE)*/
对于有可合并的视图不再合并.
21. /*+ORDERED*/
根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接.
22. /*+USE_NL(TABLE)*/
将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.
23. /*+USE_MERGE(TABLE)*/
将指定的表与其他行源通过合并排序连接方式连接起来.
24. /*+USE_HASH(TABLE)*/
将指定的表与其他行源通过哈希连接方式连接起来.
25. /*+DRIVING_SITE(TABLE)*/
强制与ORACLE所选择的位置不同的表进行查询执行.
26. /*+LEADING(TABLE)*/
将指定的表作为连接次序中的首表.
27. /*+CACHE(TABLE)*/
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端
28. /*+NOCACHE(TABLE)*/
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端
29. /*+APPEND*/
直接插入到表的最后,可以提高速度.
30. /*+NOAPPEND*/
通过在插入语句生存期内停止并行模式来启动常规插入.
31. /*+ NO_INDEX ( table [index [index]…] ) */
指定不使用哪些索引
32. /*+ parallel(table,num)*/
指定表访问并发度

查找oracle所有表中的特定列中的数据

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:查找oracle所有表中的特定列中的数据

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

找出数据库中所有表表中REMARK列中含有WN、wind、wlr中表名和数量

declare
i number:=0;
begin
 for c1 in
(select table_name from user_tab_columns where column_name='REMARK')
loop
 EXECUTE IMMEDIATE 'select count(*)  from  '|| c1.table_name
  ||' where UPPER(REMARK) LIKE ''%WN%'' or UPPER(remark) like ''%WIND%'' or UPPER(remark) like ''%WLR%'''
  into  i;
    if i>0 then
      dbms_output.put_line(c1.table_name||'------'||i);
      end if;
    end loop;
end;

触发器实现指定用户登录oracle

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:触发器实现指定用户登录oracle

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

1、创建允许登录用户表

CREATE TABLE "CHF"."LOG$LOGIN_OS"
  (
    "OS_USER" VARCHAR2(60 BYTE)
  )

2、创建触发器实现限制用户登录

create or replace
TRIGGER TR_LOGIN_RECORD_TEST
AFTER logon ON DATABASE
DECLARE
mtSession v$session%ROWTYPE;
CURSOR cSession(iiQuerySid IN NUMBER) IS
   SELECT * FROM v$session where USERNAME is not null
    and nvl(osuser,'x') <> 'SYSTEM'   and type <> 'BACKGROUND' and audsid = iiQuerySid;
  USER_NUM NUMBER(5);
  V_SQL VARCHAR2(100);
BEGIN
OPEN cSession(userenv('SESSIONID'));
  FETCH cSession INTO mtSession;
  IF cSession%FOUND THEN
  select count(*) into USER_NUM FROM CHF.LOG$LOGIN_OS WHERE OS_USER=mtSession.Osuser;
  IF USER_NUM!=0 THEN
  V_SQL:=' alter system kill session '||''''||mtSession.Sid||','||mtSession.Serial#||'''';
  EXECUTE IMMEDIATE V_SQL;
  END IF;
  END IF;
  CLOSE cSession;
EXCEPTION
  WHEN OTHERS THEN
   -- dbms_output.put_line('登记登录信息错误:'||SQLERRM);
    RAISE;
END;

注:使用sysdba帐号创建触发器,因为在oracle中user不能kill掉自己的session,如果是用sysdba那么就可以kill掉其他的任何非自身的session

触发器记录用户登录信息

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:触发器记录用户登录信息

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

1、先需要建立一张表,用于存放登陆信息

create table LOG$INFORMATION
(
  USERNAME VARCHAR2(30),
  TERMINAL VARCHAR2(50),
  IPADRESS VARCHAR2(20),
  OSUSER VARCHAR2(30),
  MACHINE VARCHAR2(64),
  PROGRAM VARCHAR2(64),
  SID NUMBER,
  SERIAL# NUMBER,
  AUSID NUMBER,
  LOGINTIME DATE default sysdate,
  LOGout_TIME date
)

2、创建触发器,记载登录信息

CREATE OR REPLACE TRIGGER TR_LOGIN_RECORD
AFTER logon ON DATABASE
DECLARE
mtSession v$session%ROWTYPE;
CURSOR cSession(iiQuerySid IN NUMBER) IS
   SELECT * FROM v$session
      WHERE nvl(osuser,'x') <> 'SYSTEM'   and type <> 'BACKGROUND' and audsid = iiQuerySid;
BEGIN
OPEN cSession(userenv('SESSIONID'));
  FETCH cSession INTO mtSession;
  IF cSession%FOUND THEN
INSERT INTO log$information(username,logintime,terminal,ipadress,osuser,machine,
program,sid,serial#,ausid)
       VALUES(USER,SYSDATE,mtSession.Terminal,
              SYS_CONTEXT ('USERENV','IP_ADDRESS'),mtSession.Osuser,
          mtSession.Machine,mtSession.Program,mtSession.Sid,mtSession.Serial#,userenv('SESSIONID'));
  END IF;
  CLOSE cSession;
EXCEPTION
  WHEN OTHERS THEN
    RAISE;
END;

3、用户登出触发器,记录登出时间

create or replace trigger TR_LOGOFF_RECORD
before LOGOFF ON DATABASE
DECLARE
mtSession v$session%ROWTYPE;
CURSOR cSession(iiQuerySid IN NUMBER) IS
   SELECT * FROM v$session where
       nvl(osuser,'x') <> 'SYSTEM'   and type <> 'BACKGROUND' and audsid = iiQuerySid;
BEGIN
OPEN cSession(userenv('SESSIONID'));
  FETCH cSession INTO mtSession;
  IF cSession%FOUND THEN
            UPDATE LOG$INFORMATION SET LOGOUT_TIME=SYSDATE WHERE sid=mtSession.Sid AND serial#=mtSession.Serial#;
  END IF;
  CLOSE cSession;
EXCEPTION
  WHEN OTHERS THEN
    RAISE;
END;

使用sqlplus生产批量plsql

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:使用sqlplus生产批量plsql

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

要点
chr(10)–表示换行
set heading off–不显示表格头部
set pagesize 0–不分页
set linesize 800–行宽
spool filename–写入到文件中
sql语句

select 'declare'||chr(10)||' i   integer:=0;'||chr(10)||'cursor cur is select rowid as rid from '||t1 ||' WHERE DATASOURCE=''WN'' OR MODIFYSOURCE=''WN'';'||chr(10)||'begin for c in cur loop '||chr(10)||'i:=i+1;'||chr(10)|| 'update '||t1||chr(10)||'SET DATASOURCE=F_BYF_UPDATE_WN(datasource),MODIFYSOURCE=F_BYF_UPDATE_WN(MODIFYSOURCE),REMARK=F_BYF_UPDATE_WN(REMARK) WHERE rowid=c.rid;'||chr(10)|| ' if mod(i,200)=0 then'||chr(10)|| '  commit;'||chr(10)||'end if;'||chr(10)||' if mod(i,20000)=0 then'||chr(10)||'  dbms_lock.sleep(40);'||chr(10)||' if i>30000 then'||chr(10)|| ' dbms_lock.sleep(40);'||chr(10)||' end if;'||chr(10)||' end if;'||chr(10)|| ' if i>500000 then'||chr(10)||'  exit;'||chr(10)||' end if;'||chr(10)||' end loop;'||chr(10)||'  commit;'||chr(10)||'end;'||chr(10)||'/'||chr(10)||'--------'||t1||'-------------' from t1;

效果

declare
 i      integer:=0;
cursor cur is select rowid as rid from FUND294
 WHERE DATASOURCE='WN' OR MODIFYSOURCE='WN';
begin for c in cur loop
i:=i+1;
update FUND294
SET DATASOURCE=F_BYF_UPDATE_WN(datasource),MODIFYSOURCE=F_BYF_UPDATE_WN(MODIFYSOURCE),REMARK=F_BYF_UPDATE_WN(REMARK) WHERE rowid=c.rid;
 if mod(i,200)=0 then
  commit;
end if;
 if mod(i,20000)=0 then
  dbms_lock.sleep(40);
 if i>30000 then
 dbms_lock.sleep(40);
 end if;
 end if;
 if i>500000 then
  exit;
 end if;
 end loop;
  commit;
end;
/
--------FUND294-------------

oracle 开机自动启动

联系:手机/微信(+86 17813235971) QQ(107644445)

标题:oracle 开机自动启动

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

一、使用root用户修改/etc/oratab 文件:
$ vi /etc/oratab
orcl:/u01/oracle:N (ORACLE_SID:ORACLE_HOME:N)
改为:
orcl:/u01/oracle:Y 也就是将最后的N改为Y
二、使用Oracle用户修改$ORACLE_HOME/bin/dbstart和dbstop文件:
ORACLE_HOME_LISTNER=$1
改为:
ORACLE_HOME_LISTNER=$ORACLE_HOME
三、创建服务
$su – root
# cd /etc/rc.d/init.d/
# vi oradb
在oradb中添加文本

#!/bin/bash
# chkconfig: 345 99 10
# description: Startup Script for Oracle Databases
export ORACLE_BASE=/u01
export ORACLE_HOME=/u01/oracle
export ORACLE_SID=orcl
export PATH=$PATH:$ORACLE_HOME/bin
ORA_OWNR="oracle"
# if the executables do not exist -- display error
if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
then
echo "Oracle startup: cannot start"
exit 1
fi
# depending on parameter -- startup, shutdown, restart
# of the instance and listener or usage display
case "$1" in
start)
# Oracle listener and instance startup and oem
echo -n "Starting Oracle: "
# 启动listener and instance
su - $ORA_OWNR -c "$ORACLE_HOME/bin/dbstart"
touch /var/lock/Oracle
# 启动oem
su - $ORA_OWNR -c "$ORACLE_HOME/bin/emctl start dbconsole"
echo "OK"
;;
stop)
# Oracle listener and instance shutdown and oem
echo -n "Shutdown Oracle: "
# 关闭oem
su - $ORA_OWNR -c "$ORACLE_HOME/bin/emctl stop dbconsole"
# 关闭数据库和listener
su - $ORA_OWNR -c "$ORACLE_HOME/bin/dbshut"
rm -f /var/lock/Oracle
echo "OK"
;;
reload|restart)
$0 stop
$0 start
;;
*)
echo "Usage: `basename $0` start|stop|restart|reload"
exit 1
esac
exit 0

修改所属组和用户
#chown oracle.oinstall /etc/rc.d/init.d/oradb
修改访问权限
#chmod 775 /etc/rc.d/init.d/oradb
添加服务到自动启动中
#chkconfig –add oradb
查看数据库服务开机启动状态
#chkconfig –list oradb
四、# chkconfig: 345 99 10说明
指出3,4,5级别启动这个服务,99是在相应的/etc/rc.d/rcN.d(N为前面指定的级别,这里是345)目录下生成的链接文件的序号(启动优先级别)S99oradbstart,10为在除前面指出的级别对应的/etc/rc.d/rcN.d(N为除345之外的级别)目录生成的链接文件的序号(服务停止的优先级别)