??xml version="1.0" encoding="utf-8" standalone="yes"?>
如果是删除某个表的所有数据,q且不需要回滚,使用 TRUNCATE ok了。关于Trancate 参见q里http://blog.csdn.net/gnolhh168/archive/2011/05/24/6442561.aspx
SQL> truncate table table_name;
条g删除
如果删除数据有条Ӟ?delete from tablename where col1 = 'lucy';q时除了加烦引外, 你可以删除时加NO LOGGING选项,不写日志加快删除速度
引用某h的一句话“几千万条记录的表都不分区Q明显有问题嘛。Oracle的技术支持工E师Q?,000,000条以上记录的表,应该考虑分区Q你完全可以按照旉为维度来Q每个月的数据存攑֜一个分中,以后要删除一个月的数据,直接truncate table卛_Q不记录日志Q速度很快?#8221;
删除大量重复记录
《{》做目的时候,一位同事导数据的时候,不小心把一个表中的数据全都搞重了,也就是说Q这个表里所有的记录都有一条重复的。这个表的数据是千万U的Q而且是生产系l。也是_(d)不能把所有的记录都删除,而且必须快速的把重复记录删掉?/p>
Ҏ(gu)Qȝ了一下删除重复记录的Ҏ(gu)Q以?qing)每U方法的优缺炏V?/p>
Z陈诉方便Q假设表名ؓ(f)TblQ表中有三列col1Qcol2Qcol3Q其中col1Qcol2是主键,q且Qcol1Qcol2上加了烦引?/p>
1、通过创徏临时?/p>
可以把数据先导入C个(f)时表中,然后删除原表的数据,再把数据导回原表QSQL语句如下Q?/p>
creat table tbl_tmp (select distinct* from tbl);
truncate table tbl; //清空表记录i
nsert into tbl select * from tbl_tmp;//(f)时表中的数据插回来?/p>
q种Ҏ(gu)可以实现需求,但是很明显,对于一个千万记录的表Q这U方法很慢,在生产系l中Q这?x)给pȝ带来很大的开销Q不可行?/p>
2、利用rowid
在oracle中,每一条记录都有一个rowidQrowid在整个数据库中是唯一的,rowid定了每条记录是oracle中的哪一个数据文件、块、行上。在重复的记录中Q可能所有列的内定w相同Q但rowid不会(x)相同。SQL语句如下Q?/p>
delete from tbl where rowid in (select a.rowid
from tbl a, tbl b
where a.rowid>b.rowid and a.col1=b.col1 and a.col2 = b.col2)
如果已经知道每条记录只有一条重复的Q这个sql语句适用。但是如果每条记录的重复记录有N条,q个N是未知的Q就要考虑适用下面q种Ҏ(gu)了?/p>
3、利用max或min函数
q里也要使用rowidQ与上面不同的是l合max或min函数来实现。SQL语句如下
delete from tbl a
where rowid not in (
select max(b.rowid)
from tbl b
where a.col1=b.col1 and a.col2 = b.col2); //q里max使用min也可?nbsp;
或者用下面的语?/p>
delete from tbl awhere rowid<(
select max(b.rowid)
from tbl b
where a.col1=b.col1 and a.col2 = b.col2); //q里如果把max换成min的话Q前面的where子句中需要把"<"改ؓ(f)">"
跟上面的Ҏ(gu)思\基本是一L(fng)Q不q用了group byQ减了显性的比较条gQ提高效率。SQL语句如下Q?/p>
deletefrom tbl where rowid not in (
select max(rowid)
from tbl tgroup by t.col1, t.col2);
delete from tbl where (col1, col2) in (
select col1,col2
from tblgroup bycol1,col2havingcount(*) >1) and rowidnotin(selectnin(rowid)fromtblgroup bycol1, col2havingcount(*) >1) ----Q?Q?/span>
q有一U方法,对于表中有重复记录的记录比较?yu)的Qƈ且有索引的情况,比较适用。假定col1Qcol2上有索引Qƈ且tbl表中有重复记录的记录比较?yu),SQL语句如下4、利用group byQ提高效?/p>
一?nbsp; 语法QNUMTOYMINTERVAL ( n , 'char_expr' )
char_exprQ日期描qͼ可以是YEAR和MONTHQ?br />
作用Q可以将数字转换成相应的日期单位旉
比如QNUMTOYMINTERVAL ( 1, 'MONTH' ) 表示一个月Q注意:(x)此时跟add_months有点区别Q后l有例子?x)讲到?br /> NUMTOYMINTERVAL ( 1, 'YEAR' ) 表示一q?/p>
对于day、hour、minute、second使用的是numtodsinterval函数Q方法和numtoyminterval一栗后面可以跟变量
二、interval后面只能用数?/p>
下面是D例:(x)
SQL> select add_months (to_date('20110228','yyyymmdd'),1) from dual;
ADD_MONTH
---------
31-MAR-11
SQL>
SQL> select add_months(to_date('20110228','yyyymmdd'),-1) from dual;
ADD_MONTH
---------
31-JAN-11
SQL>
SQL>
SQL> select to_date('2007-02-28','yyyy-mm-dd')+numtoyminterval (1,'month') from dual;
TO_DATE('
---------
28-MAR-07
SQL> select to_date('2007-02-28','yyyy-mm-dd')-numtoyminterval (1,'month') from dual;
TO_DATE('
---------
28-JAN-07
此时Q注意跟add_monthsq回l果的区别?/strong>
SQL> select to_date('2007-02-28','yyyy-mm-dd')+numtodsinterval(1,'day') from dual;
TO_DATE('
---------
01-MAR-07
SQL>
SQL> select to_date('2007-02-28','yyyy-mm-dd')+interval '+3' hour from dual;
TO_DATE('
---------
28-FEB-07
SQL> select to_date('2007-02-28','yyyy-mm-dd')+interval '+1' month from dual;
TO_DATE('
---------
28-MAR-07
Microsoft Windows [版本 5.2.3790]
(C) 版权所?1985-2003 Microsoft Corp.
E:\Documents and Settings\Administrator>sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on 星期一 4?8 14:20:05 2
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> connect sys/sys as sysdba;
已连接?br />SQL> shutdown normal
ORA-01109: 数据库未打开
已经卸蝲数据库?br />ORACLE 例程已经关闭?br />SQL> startup mount
ORACLE 例程已经启动?/p>
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕?br />
SQL> alter database open;
出现以下错误Q?br />ORA-00600: 内部错误代码Q参? [kcratr1_lostwrt]
出现该错误是因ؓ(f)pȝ强制x造成?
症状为数据库无法打开!
解决q个错误Q?br />SQL> shutdown normal
ORA-01109: 数据库未打开
已经卸蝲数据库?br />ORACLE 例程已经关闭?br />SQL> startup mount
ORACLE 例程已经启动?/p>
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕?br />
SQL>recover database;
完成介质恢复
SQL> alter database open;
数据库已更改
SQL>exit;
oracle数据库是重量U的Q其理非常复杂Q将其在linuxq_上的启动和关闭步骤整理一下?/p>
安装完毕oracle以后Q需要创建oraclepȝ用户Qƈ?home/oracle下面?bash_profiled几个环境变量QORACLE_SID,ORACLE_BASE,ORACLE_HOME。比如:(x)
export ORACLE_SID=test export ORACLE_BASE=oracle_install_dir export ORACLE_HOME=xxx
启动步骤Q注?代表shell命o(h)提示W,q里的oracle?.0以上版本?br />
切换到oracle用户下面Q?br />$ su - oracle
$ sqlplus / nolog
sql> conn / as sysdba
sql> startup (启动数据库,一般不需要加参数Q只要设|好环境变量Q?/p>
sql>shutdown Q关闭数据库其参?Qshutdown有四个参敎ͼ四个参数的含义如下:(x)
Normal 需要等待所有的用户断开q接
Immediate {待用户完成当前的语?br />Transactional {待用户完成当前的事?br />Abort 不做M{待Q直接关闭数据库
normal需要在所有连接用h开后才执行关闭数据库Q务,所以有的时候看h好象命o(h)没有q行一P在执行这个命令后不允许新的连?br />immediate在用h行完正在执行的语句后断开用户q接Qƈ不允许新用户q接?br />transactional 在拥护执行完当前事物后断开q接Qƈ不允许新的用戯接数据库?br />abort 执行断开q接q直接关闭数据库?br />
sql> quit (退出sql模式)
启动监听器:(x)
$ su - oracle
然后切换?oracle_home/bin下面Q执行下面命?/p>
$lsnrctl start (启动监听器)
$lsnrctl status (查看监听器启动状?
$lsnrctl stop(关闭监听?
l常遇到的问题:(x)
1Q权限问题,解决Ҏ(gu)Q切换到oracle用户Q?/p>
2Q没有关闭监听器 Q解x法:(x)关闭监听?/p>
3Q有oracle实例没有关闭Q解军_法:(x)关闭oracle实例
4Q环境变量设|不全,解决办法Q修改环境变?/p>
数据的导?br style="line-height: normal" />1 D:\daochu.dmp 中的数据导入 TEST数据库中?br style="line-height: normal" /> imp system/manager@TEST file=d:\daochu.dmp
imp aichannel/aichannel@HUST full=y file=file= d:\data\newsmgnt.dmp ignore=y
上面可能有点问题Q因为有的表已经存在Q然后它?yu)报错,对该表就不进行导入?br style="line-height: normal" /> 在后面加?ignore=y 可以了?br style="line-height: normal" />2 d:\daochu.dmp中的表table1 导入
imp system/manager@TEST file=d:\daochu.dmp tables=(table1)
基本上上面的导入导出够用了。不情况要先是表d删除Q然后导入?br style="line-height: normal" />
注意Q?br style="line-height: normal" />操作者要有够的权限Q权限不够它?x)提C?br style="line-height: normal" />数据库时可以q上的。可以用tnsping TEST 来获得数据库TEST能否q上?/p>
附录一Q?br style="line-height: normal" />l用户增加导入数据权限的操作
W一,启动sql*puls
W二Q以system/manager登陆
W三Qcreate user 用户?IDENTIFIED BY 密码 Q如果已l创用户Q这步可以省略)
W四QGRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATE SESSION TO 用户名字
W五, q行-cmd-q入dmp文g所在的目录,
imp userid=system/manager full=y file=*.dmp
或?imp userid=system/manager full=y file=filename.dmp
执行CZ:
F:\Work\Oracle_Data\backup>imp userid=test/test full=y file=inner_notify.dmp
屏幕昄
Import: Release 8.1.7.0.0 - Production on 星期?2?16 16:50:05 2006
(c) Copyright 2000 Oracle Corporation. All rights reserved.
q接? Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production
l由常规路径导出由EXPORT:V08.01.07创徏的文?br style="line-height: normal" />已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导?br style="line-height: normal" />导出服务器用UTF8 NCHAR 字符?(可能的ncharset转换)
. 正在AICHANNEL的对象导入到 AICHANNEL
. . 正在导入?nbsp; "INNER_NOTIFY" 4行被导入
准备启用U束条g...
成功l止导入Q但出现警告?/p>
附录二:(x)
Oracle 不允许直接改变表的拥有? 利用Export/Import可以辑ֈq一目的.
先徏立import9.par,
然后Q用时命o(h)如下Qimp parfile=/filepath/import9.par
?import9.par 内容如下Q?br style="line-height: normal" /> FROMUSER=TGPMS
TOUSER=TGPMS2 Q注Q把表的拥有者由FROMUSER改ؓ(f)TOUSERQFROMUSER和TOUSER的用户可以不同)
ROWS=Y
INDEXES=Y
GRANTS=Y
CONSTRAINTS=Y
BUFFER=409600
file==/backup/ctgpc_20030623.dmp
log==/backup/import_20030623.log