12、如何在Windows 2000下将Oracle完全卸载?
12、如何在Windows 2000下将Oracle完全卸载?
一、系统环境:
(1)、操作系统:Windows 2000 Server,机器内存128M
(2)、数据库: Oracle 8i R2 (8.1.6) for NT 企业版
(3)、安装路径:D:\ORACLE
二、卸载步骤:
(1)、开始->设置->控制面板->管理工具->服务
停止所有Oracle服务。
(2)、开始->程序->Oracle - OraHome81->Oracle Installation Products->Universal Installer
卸装所有Oracle产品
(3)、运行regedit,选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,按del键删除这个入口。
(4)、运行regedit,选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,滚动这个列表,删除所有Oracle入口
(5)、从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标
(6)、重新启动计算机,重起后才能完全删除Oracle所在目录
(7)、删除与Oracle有关的文件,选择Oracle所在的缺省目录C:\Oracle,删除这个入口目录及所有子目录,
并从Windows 2000目录(一般为C:\WINNT)下删除以下文件
ORACLE.INI、oradim80.INI
(8)、WIN.INI文件中若有[ORACLE]的标记段,删除该段
--------------------------------------------------------------------
13、如何使用SQLPLUS和SVRMGRL运行脚本
(1)、用sqlplus调用:
c:\script.txt的内容
startup;
命令行:sqlplus internal/oracle @c:\script.txt
(2)、用svrmgrl调用:
c:\script.txt的内容
connect internal/oracle;
startup;
命令行:svrmgrl @c:\script.txt
--------------------------------------------------------------------
14、ORACLE的临时表
CREATE GLOBAL TEMPORARY TABLE TABLENAME (
COL1 VARCHAR2(10),
COL2 NUMBER
) ON COMMIT PRESERVE(DELETE) ROWS ;
这种临时表不占用表空间,而且不同的SESSION之间互相看不到对方的数据
在会话结束后表中的数据自动清空,如果选了DELETE ROWS,则在提交的时候即清空数据,PRESERVE则一直到会话结束
----------------
在Oracle8i中,可以创建以下两种临时表:
(1)会话特有的临时表
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
ON COMMIT PRESERVE ROWS;
(2)事务特有的临时表
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的临时表虽然是存在的,但是你试一下insert 一条记录然后用别的连接登上去select,记录是空的,明白了吧,我把下面两句话再贴一下:
--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
冲突的问题更本不用考虑.
临时表只是保存当前会话(session)用到的数据,数据只在事务或会话期间存在。
通过CREATE GLOBAL TEMPORARY TABLE命令创建一个临时表,对于事务类型的临时表,
数据只是在事务期间存在,对于会话类型的临时表,数据在会话期间存在。
会话的数据对于当前会话私有。每个会话只能看到并修改自己的数据。DML锁不会加到
临时表的数据上。下面的语句控制行的存在性。
● ON COMMIT DELETE ROWS 表名行只是在事务期间可见
● ON COMMIT PRESERVE ROWS 表名行在整个会话期间可见
可以对临时表创建索引,视图,出发器,可以用export和import工具导入导出表的
定义,但是不能导出数据。表的定义对所有的会话可见。
例如:
CREATE GLOBAL TEMPORARY TABLE TEMP_TAB1(
table_name VARCHAR2(20),
primary_key VARCHAR2(100),
field VARCHAR2(1000))
ON COMMIT PRESERVE ROWS;
CREATE GLOBAL TEMPORARY TABLE TEMP_TAB2(
table_name VARCHAR2(20),
primary_key VARCHAR2(100),
field VARCHAR2(1000))
ON COMMIT DELETE ROWS;
15、如何使用OEM
先启数据库服务,再启oracle manager服务。
否则重建档案资料库
如果还不行就把ORACLEHOME\NETWORK\sqlnet.ora文件的内容
sqlnet.authentication_services=(NTS)
改成sqlnet.authentication_services=(NONE)
登录 sysman/oem_temp
16、TNS:没有监听器的问题。
(1)查一下监听服务是否启动,
如果没有启动,则运行lsnrctrl start。
(2)查看一下 LISTENER.ORA内监听的服务器名、服务器IP、数据库名是否正确。
(3)查看一下 TNSNAMES.ORA内服务器名、服务器IP、数据库名是否正确。
17、LINUX、UNIX下自动启动ORACLE服务
(1)
!/bin/sh
# chkconfig: 345 51 49
# description: starts the oracle dabase deamons
#
ORA_HOME=/u01/app/oracle/product/8.1.7
ORA_OWNER=oracle
case "$1" in
'start')
echo -n "Starting Oracle8i: "
su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
touch /var/lock/subsys/oracle8i
echo
;;
'stop')
echo -n "Shutting down Oracle8i: "
su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
rm -f /var/lock/subsys/oracle8i
echo
;;
'restart')
echo -n "Restarting Oracle8i: "
$0 stop
$0 start
echo
;;
*)
echo "Usage: oracle8i { start | stop | restart }"
exit 1
esac
exit 0
我仿照su - $ORA_OWNER -c $ORA_HOME/bin/dbshut 的形式
添加su - $ORA_OWNER -c $ORA_HOME/bin/lsnrctl start
但是在系统启动的时候listener启动不了
(2)
/etc/rc.local
改成如下就可以了
touch /var/lock/subsys/local
#echo 2147483648 > /proc/sys/kernel/shmmax
echo -n "Starting Oracle Database:"
date +"%D %T %a"
su - oracle -c "lsnrctl start"
#su - oracle -c "sqlplus /nolog @startmaster.sql"
echo -n "Oracle Database Started:"
date +"%D %T %a"
-------------
第一个#是改共享内存大小的
第二个#是启动数据库的。
(3)
ftp://ftp.rpmfind.net/linux/rhcontrib/7.1/i386/oraclerun9i-1.0-1.i386.rpm
下载这个软件包并安装。
里面每个文件都有一些要修改的地方。配置完成之后,就可以在系统服务配置中找到它,选中它就可能以自启动了。
18、回滚段不够的处理方法
(1)、先使回滚段脱机一个,
如果不好用,则再脱机一个。直至好用。
ALTER rollback segment rollbackname offline;
(2)、增加回滚段数据文件的大小
alter database datafile 'datafile' resize 200M;
19、WINNT向WIN2000移植
不用EXP和IMP的
停掉数据库的服务后,可以做一个数据库的全备份。
在WIN2000上建一个同名的数据库,随便建,越小越好,可以缩短时间。
把WINNT下的数据库备份恢复到WIN2000的数据库上就可以了。但建库的目录
必须一样。(也可以不一样,但需要更改数据文件的连接)
我曾多次为用户这样移植数据,万无一失的。
注意:因为数据很重要,所以建议你先EXP备份一下。这是我们的习惯。
20、ORACLE SQL PLUS Worksheet乱码问题。
dbappscfg.properties,修改该文件即可解决上述问题。$ORACLE_HOME\sysman\config目录下,修改
# SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
为SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。
对于Windows操作系统,还需要修改一项
#SQLPLUS_SYSTEMROOT=c:\\WINNT40
为SQLPLUS_SYSTEMROOT=C:\\WINNT
如操作系统的主目录在C盘的Winnt下
对于后面一项的修改只对Windows操作系统进行,对UNIX操作系统则不需要。如果在Windows操作系统中不修改该项,在Oracle Enterprise Manager中,连接系统时,会提示如下的错误:
ORA-12560 TNS:protocol adapter error
或者
ORA-12545 Connect failed because target host or object does not exist
重新连接SQL PLUS Worksheet
21、DROP掉名字是小写的表(用双引号括起来)。
drop table "tablename"
select * from "tablename"
22、日期的显示格式
注意:SIMPLIFIED CHINESE(简体中文需要" "括起来)
别的国家不用" " 例如:ENGLISH
select to_char(sysdate,'DAY','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''') from dual;
------------
星期四
------------
23、一个从ORACLE中读表信息的存储过程
可以在vc下调用存储过程来实现
例子:
先修改init.ora
例如:
utl_file_dir=/usr //路径为 oracle所在的盘:/usr
此过程将用户TEMP的P1过程的代码保存到ORACLE安装盘下/USR/TEXT.TXT中
create or replace procedure TEST
is
file_handle utl_file.file_type;
STOR_TEXT VARCHAR2(4000);
N NUMBER;
I NUMBER;
begin
I:=1;
SELECT MAX(LINE) INTO N FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1';
file_handle:=utl_file.fopen('/usr','test.txt','a');
WHILE I<=N LOOP
SELECT TEXT INTO STOR_TEXT FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1' AND LINE= I;
I:=I+1;
utl_file.put_line(file_handle,stor_text);
END LOOP;
utl_file.fclose(file_handle);
commit;
end TEST;
/
24、关于修改ORACLE的列宽
(1)、不论如何都要备份数据。
(2)、如果没有数据,则可以修改宽度。比如NUMBER,CHAR,VARCHAR2
(3)、如果有数据,则可以增加宽度。比如NUMBER,CHAR,VARCHAR2
注意:不可以减小宽度。
(4)、语法:alter talbe tablename modify columnname columntype not null;
25、如何查看用户的存储过程和函数
select name,text from user_source where name= Procedurename and type = 'PROCEDURE' order by line;
26、在批处理中自动启动ORACLE服务(win2000)
编一个批处理文件
net start OracleServiceSID
OracleServiceSID是ORACLE的实例名称
27、对行加锁时,只对tb1加锁
select tb1.r1 from tb1, tb2 where tb1.r2 = tb2.r2 and tb2.r1 = xxx for update of tb1.r1 nowait
28、得到列的信息
desc tablename
select cname from col where tname='TABLENAME';
select column_name from user_tab_columns where table_name='TABLENAME';
select column_name from ALL_tab_columns where table_name='TABLENAME';
select column_name from dba_tab_columns where table_name='TABLENAME';
select column_name from user_col_comments where table_name='TABLENAME';
select column_name from all_col_comments where table_name='TABLENAME';
select column_name from dba_col_comments where table_name='TABLENAME';
29、使触发器无效(login_on)
svrmgrl
connect internal/oracle
alter trigger login_on disable;
使触发器为无效alter trigger yourtriggername disable
如果是对于某一个表的所有的触发器:
alter table yourtablename disable all triggers
30、如在SQLPLUS中何调用存储过程和函数。
call只能调用存储过程后面加上括号就可以了
call 存储过程名();
exec procedurename;(可以不加())
调用函数用sql语句
select 函数名(参数) from dual;
31、函数中如果调用DML语句就不可以调用SELECT语句
32、REDO LOG BUFFER 什么时候写到REDO LOGFILE中
(1)、在COMMIT的时候
(2)、重做日志缓冲区1/3满的时候
(3)、重做日志缓冲区大于1M的时候
(4)、它写信息必须是在数据写进程前调用
(5)、一般CHECKPOINT在日志组切换的时候进行或者由初始化参数设定
在CHECKPOINT的时候需要调用数据写进程
33、ORACLE的http server 把原有的WEB server冲掉,如何解决?
(1).如果你原来的http server是用IIS等其他发布工具做的,那么可以在服务中停掉 oracle http server服务,并且改为手动启动。
(2).如果原来的http server是用apache发布,则可以改变http.conf中的参数
34、关于创建重建查看索引
创建索引:
CREATE INDEX IND_NAME ON TABLE_NAME(COL1,COL2,...);
重建索引:
ALTER INDEX IND_NAME REBUILD;
查看索引:
SELECT * FROM USER_INDEXES WHERE INDEX_NAME='IND_NAME';
35、ORACLE如何查杀用户的进程
一|根据用户的应用程序和SQL语句,在DBA STUDIO找到用户的SESSION并断开其连接
二、
(1)、要杀掉一个session应先应知道其sid和serial#,假设你已经知道。
(2)、select paddr from v$session where sid=v_sid and serial#=v_serial#
select spid from v$process where addr=paddr(以上语句所查出的);
(3)、使用ALTER SYSTEM KILL SESSION 'v_sid,v_serial#' immediate; 试一试如不行转
三、LINUX和UNIX下
转到操作系统下执行:kill -9 spid (以上语句所查出的)
36、ORACLE中检查表是否被锁的语句
SELECT A.OWNER,
A.OBJECT_NAME,
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID,
B.ORACLE_USERNAME,
B.OS_USER_NAME,
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE,
C.STATUS,
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM
FROM ALL_OBJECTS A,
V$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE ( A.OBJECT_ID = B.OBJECT_ID )
AND (B.PROCESS = C.PROCESS )
ORDER BY 1,2
杀掉:alter system kill session 'sid, serial#'
37、ORACLE的登录问题,用户名和密码。
可以直接输入:
internal/oracle@serivce_name
sys/change_on_install@serivce_name
system/manager@serivce_name
scott/tiger@serivce_name
注意:
9i中没有internal/oracle
如果选择典型安装则有 scott用户
如果自定义可以不安装 scott用户
如果是本机则可以省略@serivce_name
oem:(ORACLE ENTERPRISE MANAGER)
sysman/oem_temp
38、修改表的列名
Oracle9i:
alter table xxx rename column xx to yy;
Oracle8i & lower version
connect sys/passed;
update col$ set name=xx where obj#=对象id and name = 字段
(一般不要这样用,会造成意想不到的结果)
注:最好是删除再建立新的列
39、把用户模式对象所在的表空间移到新的表空间
(1). create the new tablesapce
(2). alter user test default tablespace test_data;
(3). alter user test quota unlimited on test_data;
(4). alter table the_table_name move tablespace test_data;
生成脚本:
select 'alter table'||tname||' move tablespace test_date;'
from tab
where tabtype='TABLE'
(5). rebuild the indexes;
40、使用OEM备份或者EXP的步骤
WIN2000下:
(1). 控制面板――>管理工具―― >计算机管理――>本地用户和组――>用户――>新建用户sys和sysman(sys和sysman 的帐号要和登陆数据库的帐号相同);
(2).控制面板――>管理工具―― >本地安全策略――>本地策略――>用户权利指派――>
作为批处理作业登陆――>添加sys和sysman两个帐号。
(3).使用Enterprise Manager配置辅助工具
开始→程序→Oracle - OraHome81→Enterprise Manager→Configuration Assistant
a、使用Configuration Assistant工具来创建一个新的资料档案库。
(4).控制面板――>管理工具―― > 服务,查看OracleOraHome81ManagementServer是否启动,如果没有启动,则手动启动该服务。
(5).以sysman/oem_temp(default)登陆DBA Studio
(第二个选项:登陆到Oracle Management Server),立即修改密码为你刚才在NT下建的用户sysman的密码。
(6). 以sysman/ *** (bluesky) 从开始→程序→Oracle - OraHome81→Console 登陆到 控制台。
在 系统→首选项→首选身份证明(我的首选身份设置如下:)
DEFAULT节点:name:sysman
DEFAULT数据库:name:sys
(7). 在搜索/添加结点后,以sysman/ *** 登陆到该结点,以sys/ *** as sysdba登陆数据库(也就是在首选身份设置的结果)。
(8). 在工具→备份管理→向导→预定义备份策略(自定义备份策略)→提交备份计划
(9).从开始→程序→Oracle - OraHome81→Console 登陆到 控制台,查看活动(历史记录)可以看到你的备份是否成功,如果不成功,可以点击备份看明细。(我第一次也没成功,后来我修改系统的临时目录C:\WINNT\Temp→c:\temp\systmp,重新启动机器就ok了)
41、如何修改INTERNAL的口令
以下是oracle8的8i你可以仿照来做
(1)、进入DOS下
(2)、默认internal密码文件在c:\orant\database下,是隐藏属性,文件名称与数据库实例名有关
如默认ORACLE实例名为ORCL,则internal密码文件名为pwdorcl.ora
(3)、建立新的internal密码文件,起个新名字为pwdora8.ora
orapwd80 file=pwdora8.ora password=B entries=5 --注:password项一定要用大写,并且不要用单引号
(4)、拷贝pwdora8.ora文件到c:\orant\database目录下
(5)、运行regedit,修改口令文件指向
(6)、找到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE项
定位ORA_ORCL_PWFILE子项,改变其值为c:\orant\database\pwdora8.ora
(7)、关闭ORACLE数据库,重新启动
(8)、进入svrmgr30服务程序,测试internal密码是否更改成功
42、凭证检索失败的决绝方法。
原因: 由于Oracle不能应用OS认证而导致凭证检索失败
解决办法:
(1).打开network/admin下的sqlnet.ora
修改SQLNET.AUTHENTICATION _SERVICES=(NONE)。
(2).启动Net8 configuration assistant-->选第三项本地网络服务名配置
-->删除...(删除原来的本地网络服务名)
(3).重复第二步
-->添加.. (新建本地网络服务名)
(4).restart oracle
注意:NTS是WinNT的认证方式
43、命令行编译存储过程
ALTER PROCEDURE procedure_name COMPILE;
44、关于如何建立数据库链接(DBlink)
可以通过建立客户机数据库网络服务名的办法,将服务器的名字或是IP地址设置为你需要连接的那个机器就行
如果你要在一个应用中连接它,现在做好上步工作,然后按如下处理
建立数据库连接
CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';
DBaseLinkName 是建立的数据连接名称
UserName 是可以连接到的用户名
Password 是可以连接到的用户的密码
NetServiceName 是可以连接的数据库网络服务名或是数据库名
查询建立数据连接的表实例
Select * From TableName@ DBaseLinkName;
注意:如果在CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';中NetServiceName 是数据库名修改init.ora中:global_names = true
否则global_names = false
init.ora中:global_names = false
45、Object Browser7.0中文版的破解方法
到OBJECT BROWSER的目录里,找到DeIsL1.isu文件,用记事本打开,看到的是乱码吧?没关系,将Stirling Technologies ,Inc 这个字符串前面的乱码去掉(如果有的话),让后在Stirling之前加一个空格(一定要加的),保存,退出,重新运行一下看看,虽然还有提示输入验证信息,但是不用管他,直接确定就行。是不是可以用了呢?保证好使。
46、错误号ORA-01536:space quota exceeded for table space 'ALCATEL'的解决办法
三个解决办法,任你选择:
(1) alter user USERNAME quota 100M on TABLESPACENAME;
(2) alter user USERNAME quota unlimited on TABLESPACENAME;
(3) grant unlimited tablespace to USERNAME;
47、如何在Oracle中捕获到SQL语句的全部操作内容
SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address order by address, piece;
48、ORACLE中如何实现自增字段:
(1)第一种方法
ORACLE一般的做法是同时使用序列和触发器来生成一个自增字段.
CREATE SEQUENCE SEQname
INCREMENT BY 1
START WITH 1
MAXVALUE 99999999
/
CREATE TRIGGER TRGname
BEFORE INSERT ON table_name
REFERENCING
NEW AS :NEW
FOR EACH ROW
Begin
SELECT SEQname.NEXTVAL
INTO :NEW.FIELDname
FROM DUAL;
End;
(2)第二种方法:
CREATE OR REPLACE TRIGGER TR1
BEFORE INSERT ON temp_table
FOR EACH ROW
declare
com_num NUMBER;
BEGIN
SELECT MAX(ID) INTO COM_NUM FROM TEMP_TABLE;
:NEW.ID:=COM_NUM+1;
END TR1;
49、job的使用:
修改initsid.ora参数
job_queue_processes = 4 8i,9i (允许同时执行的JOB数)
job_queue_interval = 10 8i
job_queue_keep_connections=true 8i
DBMS_JOB.SUBMIT(:jobno,//job号
'your_procedure;',//要执行的过程
trunc(sysdate)+1/24,//下次执行时间
'trunc(sysdate)+1/24+1'//每次间隔时间
);
删除job:dbms_job.remove(jobno);
修改要执行的操作:dbms_job.what(jobno,what);
修改下次执行时间:dbms_job.next_date(job,next_date);
修改间隔时间:dbms_job.interval(job,interval);
停止job:dbms.broken(job,broken,nextdate);
启动job:dbms_job.run(jobno);
注意:修改后一定要COMMIT;
例子:
VARIABLE jobno number;
begin
DBMS_JOB.SUBMIT(:jobno,
'Procdemo;',//Procdemo为过程名称
SYSDATE, 'SYSDATE + 1/720');
commit;
end;
50、如何配置mts
修改初始化参数文件
增加以下内容:
mts_dispatchers = "(protocol=TCP)(disp=2)(con=1000)"
mts_max_dispatchers = 50
mts_servers = 20
mts_max_servers = 50
51、取出一个表的最后一条记录
select * from (select rownum id,tname.* from tname) a where a.id=(select count(*) from a);
52、重做日志(Redolog)被删掉,通过什么方法才能恢复!
先mount数据库,然后再目录下建同名文件redo01.log、redo02.log、redo03.log
然后执行alter databse clear logfile group n
对于current的group,执行alter databse clear unarchived logfile group n
然后,再open,就ok了
53、Oracle常见服务
几个主要的:
OracleOraHome81TNSListener 监听服务
OracleServiceSID ORACLE服务
OracleOraHome81Agent 智能代理服务
OracleOraHome81CMan 连接管理服务
OracleOraHome81HTTPServer APACHE WEB 服务
OracleOraHome81ManagementServer ORACLE 企业管理器服务
OracleOraHome81Names ORACLE命名服务
剩下的也不常用。
54、ORACLE的热备份
在不关闭数据库的时候进行ORACLE的备份。
原理停复杂的,你去找本书看看吧。
举个简单的例子:备份表空间USERS
ALTER TABLESPACE USERS BEGIN BACKUP
COPY USERS TABLESPACE 的数据文件到备份目录
ALTER TABLESPACE USERS END BACKUP
55、导致索引不起作用的解决办法
你的问题我刚处理过,是由optimizer_mode参数引起的,该参数的默认值为choose,即为如表有statis则查询走基于cost的方式,否则走基于rule的方式,因些你可以有以下几个解决方法。
(1)、简单的在init<sid>.ora中设optimizer_mode=rule,重起数据库。
(2)、使用analyze table table_name(索引基表) delete statistics;
(3)、最后一个万能办法,将表和索引drop掉,重建。
56、关于数据库进程的问题。
(1).查看相关进程在数据库中的会话
Select a.sid,a.serial#,a.program, a.status ,
substr(a.machine,1,20), a.terminal,b.spid
from v$session a, v$process b
where a.paddr=b.addr
and b.spid = &spid;
(2).查看数据库中被锁住的对象和相关会话
select a.sid,a.serial#,a.username,a.program,
c.owner, c.object_name
from v$session a, v$locked_object b, all_objects c
where a.sid=b.session_id and
c.object_id = b.object_id;
(3).查看相关会话正在执行的SQL
select sql_text from v$sqlarea where address =
( select sql_address from v$session where sid = &sid );
57、查看IP地址
select SYS_CONTEXT('USERENV','IP_ADDRESS') from dual;
58、运行SQLPLUS时不用输入用户名和密码,进入之后使用CONNECT
SQLPLUS /NOLOG
SQL>CONNECT SCOTT/TIGER
59、查看当前会话
userenv() 函数
select userenv('language') from dual 字符集
select userenv('isdba') from dual 是否DBA
select userenv('sessionid') from dual sessionid
select userenv('TERMINAL') from dual 客户端名字
select userenv('INSTANCE') from dual 实例数
SYS_CONTEXT() 函数
select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') from dual; 当前模式
select SYS_CONTEXT('USERENV','CURRENT_SCHEMAID') from dual; 当前模式ID
select SYS_CONTEXT('USERENV','CURRENT_USER') from dual; 当前用户
select SYS_CONTEXT('USERENV','DB_NAME') from dual; 数据库
select SYS_CONTEXT('USERENV','HOST') from dual; 主机
..........
60、删除重复列的方法
(1) DELETE FROM table_name A WHERE ROWID > (
SELECT min(rowid) FROM table_name B
WHERE A.key_values = B.key_values);
(2) create table table2 as select distinct * from table1;
drop table1;
rename table2 to table1;
(3) Delete from mytable where rowid not in(
select max(rowid) from mytable
group by column_name );
(4) delete from mytable t1
where exists (select 'x' from my_table t2
where t2.key_value1 = t1.key_value1
and t2.key_value2 = t1.key_value2
...
and t2.rowid > t1.rowid);
61、ORA-12571: TNS:packet writer failure(包写入程序失败)
(1) 这个错误在客户端遇到过,通常重新连接一下服务器就好了。
服务器重新启动的时候,在client也会遇到该错误。
这个错误你是在server还是client上遇到的?最常用的办法就是加上跟踪,查看一下 跟踪记录,分析分析错误的原因。
网络问题也会出现该错误,比如网络路由没有配置好。
(2) 安装的杀毒软件导致的
(3) 服务器端的IP是否被改动
(4) 最后不行的话,重新创建监听器
62、ORACLE服务不能自动启动的解决办法
把ORACLEHOME\network\ADMIN\sqlnet.ora
文件中的 sqlnet.authentication_service=(nts)
注释掉就可以了
63、不完全的时间点恢复
shutdown immediate
copy 备份文件到需要恢复的目录下
startup mount
recover database until time '2002-12-26 09:00:00'
alter database open resetlogs
自己仔细检查一下,不会发生这样的问题的。
64、oracle如何设置查询超时
select /*+ timeout 30*/ * from veryLargeTable
65、修改字符集
(1)、ALTER DATABAE CHARACTER SET SIMPLIFIED CHINESE_CHINA.ZHS16GBK ;
(2)、update props$ set value$='ZHS16CGB231280'
where name='NLS_CHARACTERSET';
update props$ set value$='ZHS16CGB231280'
where name='NLS_NCHAR_CHARACTERSET';
建议不使用(2)
注意:
(1)、执行ALTER DATABASE CHARACTER SET必须有SYSDBA权限,并且在STARTUP RESTRICT模式下执行
(2)、原字符集必须是目标字符集的一个真子集(就是浪子所说的只能从WE8ISO8859P1转到ZHS16GBK的原因)
(3)、CLOB字段装换可能有问题,建议在转换以前把有CLOB字段的表导出后DROP,转换以后再导回
(4)、该转换不可逆,所以在做这个操作以前建议做数据库全备份
66、修改数据库名字
(1)、启动svrmgrl,以文本方式备份控制文件
oracle>svrmgrl
svrmgrl>connect internal
svrmgrl>alter system backup controlfile to trace
(2)、编辑产生的跟踪文件,在udump目录下
改CREATE CONTROLFILE REUSE DATABASE "CTC" NORESETLOGS ARCHIVELOG
中的REUSE为SET
然后把create controlfile这段语句拷出
(3)、正常宕库,后启动到nomount下
svrmgrl>shutdown immediate
svrmgrl>startup nomount
(4)、执行create controlfile那段语句
(5)、打开数据库
svrmgrl>alter database open
如提示用resetlogs选项则使用
svrmgrl>alter database open resetlogs
(8)、相应修改初始化参数
67、rownum的用法
select * from (select t.*,rownum id from dept t)
where id between 1 and 20
68、oracle的内部参数
SELECT a.ksppinm NAME,
b.ksppstdf default_val,
a.ksppdesc DESCRIPTION
FROM x$ksppi a,
x$ksppcv b
WHERE a.indx=b.indx
AND substr(a.ksppinm,1,1)='_'
ORDER BY a.ksppinm
69、9i安装时报areasqueries错误的解决办法
包括IAS 和 IDS
把安装源文件目录全部改为英文字母或数字
注意:不能是中文的路径
70、我如何知道一个表空间还有多少可以用
(1)、
SELECT upper(f.tablespace_name) 表空间名,
d.Tot_grootte_Mb "表空间大小(M)",
d.Tot_grootte_Mb - f.total_bytes "已使用空间(M)",
round((d.Tot_grootte_Mb - f.total_bytes) / d.Tot_grootte_Mb * 100,2) "使用比",
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 4 DESC
(2)、select tablespace_name,round(sum(bytes)/1024/1024,2) "M" from dba_free_space
group by tablespace_name
71、creck pl/sql developer 的方法
(1)、安装pl/sql developer
(2)、用UltraEdit将程序PLSQLDev.exe打开
(3)、将UltraEdit设置为16进制模式
(4)、查找串:BA 1E 00 00 00 2B D0
修改:2B D0 为:4A 90
(5)、存盘退出
(6)、运行PLSQLDev.exe,如果提示你还有29天的时间可用,那就恭喜你了!
72、使索引无效
ALTER INDEX idx UNUSABLE;
ALTER INDEX idx_acctno DISABLE;(only to a function based index)
73、在SQLPLUS中给指定用户进行 set autotrace on/off
以SCOTT用户为例:
SQL>CONNECT scott/tiger
connected.
SQL>@$ORACLE_HOME/RDBMS/ADMIN/UTLXPLAN.SQL
Table created.
SQL>CONNECT / AS SYSDBA
connected.
SQL>@$ORACLE_HOME/SQLPLUS/ADMIN/PLUSTRCE.SQL
drop role plustrace;
Role dropped.
create role plustrace;
Role created.
.
grant plustrace to dba with admin option;
Grant succeeded.
SQL>GRANT PLUSTRACE TO SCOTT;
Grant succeeded.
SQL>CONNECT SCOTT/TIGER
connected.
SQL>set autotrace on
SQL>
74、关于约束的四种状态
Disabled novalidate:当约束使不能时,约束的规则不能强制在列
(包含在约束中)的数据之上。但约束的定义保存在数据字典中。
在执行数据仓库卷起(rollup)或装载且要加快装载过程时该方式
是有用的。
Enabled novalidate:是能无效,该状态的表可以包含非法
的数据,但不可能加入新的非法数据。
Enabled validate:使能有效,一个使能的约束是强制的,表的数据检查
有效
75、在SQLPLUS中调用存储过程
SET SERVEROUTPUT ON
declare
out_param varchar2(100);
begin
your_proc(1,out_param);
dbms_output.put_line(out_param);
end;
/
SET SERVEROUTPUT OFF
75、生成系统表和存储过程的三个文件。
cat*.sql
dbms*.sql
utl*.sql
76、JOB中日期的使用
每个月1号:
last_day(sysdate)+1
每个季度的第一天:
to_date(decode(to_char(sysdate,'q'),'1',to_char(sysdate,'yyyy')||'0101',
'2',to_char(sysdate,'yyyy')||'0401','3',to_char(sysdate,'yyyy')||'0701',
'4',to_char(sysdate,'yyyy')||'1001'),'yyyymmdd')
每天:
sysdate+1
每个星期几:
decode(to_char(sysdate,'w'),'1',sysdate+7,
to_char(sysdate,'w'),'2',sysdate+6,to_char(sysdate,'w'),'3',sysdate+5,
to_char(sysdate,'w'),'4',sysdate+4,to_char(sysdate,'w'),'5',sysdate+3,
to_char(sysdate,'w'),'6',sysdate+2,to_char(sysdate,'w'),'7',sysdate+1)
每个星期x下午三点:interval(21, 'next_day(trunc(sysdate),x+1)+15/24');
每个季度的第一个星期x:
interval(21, 'next_day(trunc(sysdate,''Q''),3),5)');
77、使用execute immediate 的问题
8i以上才支持execute immediate
8.05只能用dbms_sql
最好使用execute immediate
78、ORACLE9i中删除表空间中数据文件的方法
drop tablespace tbsname including contents
79、找出串中的数字
SELECT TRANSLATE('2KRW229',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789')
"Translate example"
FROM DUAL
/
2229
--全是数字的:
select * from 你的表 where translate(你的列,'0123456789',' ')='';
select * from 你的表 where trim(ltrim(rtrim(replace(col_name,'0123456789',' ')))) is null
80、分析表
analyze table mzbs.db_code ESTIMATE STATISTICS SAMPLE 20 PERCENT;
81、表空间管理和用户管理
--查看表空间和数据文件
select file_name,tablespace_name,autoextensible from dba_data_files;
--数据表空间
CREATE TABLESPACE USER_DATA
LOGGING
DATAFILE 'D:\ORACLE\ORADATA\ORCL\test.DBF' SIZE 50m REUSE ,
'c:\USERS01112.DBF' SIZE 50m REUSE
AUTOEXTEND
ON NEXT 1280K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL
--临时表空间
CREATE TEMPORARY
TABLESPACE USER_DATA_TEMP TEMPFILE 'D:\TEMP0111.DBF'
SIZE 50M REUSE AUTOEXTEND
ON NEXT 1024K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL UNIFORM
SIZE 1024K
--增加数据文件
ALTER TABLESPACE USER_DATA
ADD DATAFILE 'c:\USERS01113.DBF' SIZE 50M;
ALTER TABLESPACE USER_DATA
ADD DATAFILE 'c:\USERS01114.DBF' SIZE 50M
AUTOEXTEND ON
;
--删除表空间
DROP TABLESPACE USER_DATA INCLUDING CONTENTS;
--修改数据文件大小
ALTER DATABASE
DATAFILE 'c:\USERS01113.DBF' RESIZE 40M;
--创建用户、赋予权限
CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY USER_DATA
DEFAULT
TABLESPACE USER_DATA TEMPORARY
TABLESPACE USER_DATA ACCOUNT UNLOCK;
GRANT CONNECT TO USER_DATA;
GRANT RESOURCE TO USER_DATA;
--把表移到另一个表空间
ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME;
--创建索引
CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME);
CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME;
--重新建立索引
ALTER INDEX INDEXNAME REBUILD TABLESPACE TABLESPACE;
--创建表
CREAE TABLE TABLENAME
(COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)
(COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL);
--建表的索引存储分配
CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX STORAGE(INITIAL 100K NEXT 100K)
TABLESPACE indx,
last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,
dept_id NUMBER(7))
TABLESPACE data;
--建立主键
ALTER TABLE TABLENAME
ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2)
--使约束无效
ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT CONSTRANAME;
ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT CONSTRANAME;
--删除约束
ALTER TABLE TABLENAME DROP CONSTRAINT constraintname;
DROP TABLE TABLENAEM CASCADE CONSTRAINTS;(删除表后将所用的外键删除)
--给表增加列
ALTER TABLE TABLENAME
ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL;
--给列增加缺省值
ALTER TABLE TABLENAME
MODIFY COLUMNNAME DEFAULT(VALUE) NOT NULL;
--给表增加外键
ALTER TABLE TABLENAME
ADD CONSTRAINT CONSTRAINTNAME
FOREIGN KEY(COLUMN) REFERENCES TABLE1NAME(COLUMN1);
常用SQL查询脚本
本文假定读者已经对数据库连接技术有所了解,因此只讨论有关SQL查询命令的语法。
表结构如下(MS Access 2000):
表名:userTable
----------------------
字段名 字段类型
----------------------
userID 自动计数(长整型)
userName 文本
userSex 文本
CreateDate 日期/时间(默认值为Now())
----------------------
一、用Select命令提取记录
1、取得表中所有记录
Select命令,语句如下:
"Select *From userTable"
2、取得表中userID字段记录
"Select userID From userTable"
3、取得表中userID、userSex字段记录
"Select userID, userSex From userTable"
4、取得表中userSex值为“男”的记录
"Select From userTable Where userSex = '男'"
5、取得表中userName值中包含“张”字的记录
"Select From userTable Where userName Like '%男%'"
6、取得表中所有记录,按CreateDate字段值降序排列
"Select From userTable Order By CreateDate DESC"
说明:
1)、以上命令可以组合使用,如,取得表中userName中包含“浩”字的,userID的值,并按CreateDate值的时间降序排列,那么命令如下:
"Select userID From userTable Where userName Like '%浩%' Order By CreateDate DESC"
2)、使用中应注意,如果字段类型为文本,则在条件判别时,应在条件字外加上单引号,此规则适用于任何一个SQL查询命令。
3)、条件字中的“%”为通配符。
4)、当判别条件多于一条时,应以“And”或“Or”连接。
二、用Insert Into命令插入新记录
1、插入一条新记录
"Insert Into userTable (userName, userSex) Values ('张浩南', '男')"
说明:
这里需要注意的是,插入的记录的值的类型应符合表中的字段类型,否则会出错。其实使用单引号只是个便捷的方法,但并不规范,因为如果要插入的记录中本身含有单引号,则会出现错误(虽然这种情况并不经常发生,但有可能存在)。所以我们最好使用一个自定义的函数来实现单引号的替换。方法如下
Function SqlStr(data)
SqlStr="'" & Replace(data, "'", "''") & "'"
End Function
在命令中则为:
Dim Name, Sex
Name="张浩南"
Sex="男"
"Insert Into userTable (userName, userSex) Values (" & SqlStr(Name) & ", " & SqlStr(Sex) & ")"
这样则无论值中是否含有单引号或双引号均不会出错。
但请注意,这个规则只适用于类型为文本的字段,如果为其它类型,则一般无需考虑,即不必加任何符号。
三、用Update更新记录
1、更新全部记录的全部字段
"Update userTable Set userID=1, userSex='男', userName='徐勇', CreateDate=" & CDate(CreateDate)
说明:
式中的值可以用运算表达式,如:userID=userID+1等。
2、更新userName字段值为“徐勇”的记录值
"Update userTable Set userID=1, userName='徐詠' Where userName='徐勇'"
说明:
需要组合条件查询时,方法同Select。另外此处也要注意单引号问题。
四、用Delete删除记录
1、删除全部记录
"Delete From userTable"
2、删除特定条件的记录,如删除userID为“20”的记录
"Delete From userTable Where userID=20"
3、删除组合条件记录,如删除userSex为“女”,userName中包含“张”的记录
"Delete From userTable Where userSex='女' And userName Like '%张%'"
说明:
注意单引号问题。
SqlServer数据库的备份和恢复措施
一、备份数据库
1、打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server
2、SQL Server组-->双击打开你的服务器-->双击打开数据库目录
3、选择你的数据库名称(如论坛数据库Forum)-->然后点上面菜单中的工具-->选择备份数据库
4、备份选项选择完全备份,目的中的备份到如果原来有路径和名称则选中名称点删除,然后点添加,如果原来没有路径和名称则直接选择添加,接着指定路径和文件名,指定后点确定返回备份窗口,接着点确定进行备份
二、还原数据库
1、打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server
2、SQL Server组-->双击打开你的服务器-->点图标栏的新建数据库图标,新建数据库的名字自行取
3、点击新建好的数据库名称(如论坛数据库Forum)-->然后点上面菜单中的工具-->选择恢复数据库
4、在弹出来的窗口中的还原选项中选择从设备-->点选择设备-->点添加-->然后选择你的备份文件名-->添加后点确定返回,这时候设备栏应该出现您刚才选择的数据库备份文件名,备份号默认为1(如果您对同一个文件做过多次备份,可以点击备份号旁边的查看内容,在复选框中选择最新的一次备份后点确定)-->然后点击上方常规旁边的选项按钮
5、在出现的窗口中选择在现有数据库上强制还原,以及在恢复完成状态中选择使数据库可以继续运行但无法还原其它事务日志的选项。在窗口的中间部位的将数据库文件还原为这里要按照你SQL的安装进行设置(也可以指定自己的目录),逻辑文件名不需要改动,移至物理文件名要根据你所恢复的机器情况做改动,如您的SQL数据库装在D:\Program Files\Microsoft SQL Server\MSSQL\Data,那么就按照您恢复机器的目录进行相关改动改动,并且最后的文件名最好改成您当前的数据库名(如原来是bbs_data.mdf,现在的数据库是forum,就改成forum_data.mdf),日志和数据文件都要按照这样的方式做相关的改动(日志的文件名是*_log.ldf结尾的),这里的恢复目录您可以自由设置,前提是该目录必须存在(如您可以指定d:\sqldata\bbs_data.mdf或者d:\sqldata\bbs_log.ldf),否则恢复将报错
6、修改完成后,点击下面的确定进行恢复,这时会出现一个进度条,提示恢复的进度,恢复完成后系统会自动提示成功,如中间提示报错,请记录下相关的错误内容并询问对SQL操作比较熟悉的人员,一般的错误无非是目录错误或者文件名重复或者文件名错误或者空间不够或者数据库正在使用中的错误,数据库正在使用的错误您可以尝试关闭所有关于SQL窗口然后重新打开进行恢复操作,如果还提示正在使用的错误可以将SQL服务停止然后重起看看,至于上述其它的错误一般都能按照错误内容做相应改动后即可恢复
三、收缩数据库
一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大
1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存
2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定
3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据
四、设定每日自动备份数据库
强烈建议有条件的用户进行此操作!
1、打开企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器
2、然后点上面菜单中的工具-->选择数据库维护计划器
3、下一步选择要进行自动备份的数据-->下一步更新数据优化信息,这里一般不用做选择-->下一步检查数据完整性,也一般不选择
4、下一步指定数据库维护计划,默认的是1周备份一次,点击更改选择每天备份后点确定
5、下一步指定备份的磁盘目录,选择指定目录,如您可以在D盘新建一个目录如:d:\databak,然后在这里选择使用此目录,如果您的数据库比较多最好选择为每个数据库建立子目录,然后选择删除早于多少天前的备份,一般设定4-7天,这看您的具体备份要求,备份文件扩展名一般都是bak就用默认的
6、下一步指定事务日志备份计划,看您的需要做选择-->下一步要生成的报表,一般不做选择-->下一步维护计划历史记录,最好用默认的选项-->下一步完成
7、完成后系统很可能会提示Sql Server Agent服务未启动,先点确定完成计划设定,然后找到桌面最右边状态栏中的SQL绿色图标,双击点开,在服务中选择Sql Server Agent,然后点击运行箭头,选上下方的当启动OS时自动启动服务
8、这个时候数据库计划已经成功的运行了,他将按照您上面的设置进行自动备份
修改计划:
1、打开企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->管理-->数据库维护计划-->打开后可看到你设定的计划,可以进行修改或者删除操作