ORACLE手工删除数据库
很多人习惯用ORACLE的DBCA工具创建、删除数据库,这里总结一下手工删除数据库实验的步骤,文中大量参考了乐沙弥的手动删除ORACLE数据库这篇博客的内容,当然还有Oracle官方相关文档。此处实验环境为Oracle Linux Server release 5.7,数据库版本为10.2.0.5.0
Step 1: .获得控制文件、数据文件,日志文件等相关信息
获取这些信息,一方面是为了后面的建库做参考,另外一个是为了验证后面一些操作,如果这些都没有必要,其实是可以可以跳过这一步的。
SQL> select status ,name from v$controlfile;
SQL> select * from v$dbfile;
SQL> select * from v$logfile;
SQL>archive log list;
Step 2: 停止监听服务和OEM
$lsnrctl stop 或 lsnrctl stop listener_name
[oracle@DB-Server ~]$ emctl stop dbconsole
TZ set to Hongkong
Oracle Enterprise Manager 10g Database Control Release 10.2.0.5.0
Copyright (c) 1996, 2010 Oracle Corporation. All rights reserved.
http://EGMLNX02.eel1.esquel.com:1158/em/console/aboutApplication
Stopping Oracle Enterprise Manager 10g Database Control ...
Cannot determine Oracle Enterprise Manager 10g Database Control process. /u01/app/oracle/product/10.2.0/db_1/xxxxx_xxx/emctl.pid does not exist.
Step 3: 关闭数据库实例
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
Step 4:启动到数据库实例到mount状态
使用exclusive restart或普通模式都可以
SQL> startup mount exclusive restrict;
或
SQL> startup mount;
Step 5: 修改参数为允许受限的会话模式
这一步骤是必须的,否则在drop database时会报ORA-01586: database must be mounted EXCLUSIVE and not open for this operation
SQL> alter system enable restricted session;
Step 6:使用drop database命令来清除数据库
SQL> drop database;
drop database 命令会删除控制文件和在控制文件中所列的数据文件,如果数据库正在使用spfile文件,则一并删除。
备份文件和归档日志文件不会被删除,我们可以之后通过RMAN进行删除。
如果数据库是建立在裸设备上,那么这个命令不会删除指定裸设备上的文件。
# deletes all database files, both ASM and non-ASM
When you issue this statement, Oracle Database drops the database and deletes all control files and datafiles listed in the control file. If the database used a server parameter file (spfile), it is also deleted.
Archived logs and backups are not removed, but you can use Recovery Manager (RMAN) to remove them. If the database is on raw disks, this statement does not delete the actual raw disk special files.
DROP DATABASE
The DROP DATABASE command deletes these files from operating system.
* Datafiles
* Online Redo Log Files
* Controlfiles
* SPFILE (if it exists)
The DROP DATABASE command does not delete the following files:
* init.ora (text version of the Oracle initialization file)
* password file
* entries in listener files
* entries in oratab file
其实最好是在执行drop database命令时,查看alert_$ORACLE_SID的输出内容,即可有个大概的了解。在metlink上看到一个手工删除数据文件、联机重做日志、控制文件的脚本,如下所示,这个也可以作为一个参考。
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
TYPE string_arr IS TABLE OF VARCHAR2(1024);
file_list string_arr;
BEGIN
SELECT t.file_path BULK COLLECT
INTO file_list
FROM (SELECT NAME file_path
FROM V$DATAFILE
UNION
SELECT MEMBER file_path
FROM V$LOGFILE
UNION
SELECT NAME file_path
FROM v$controlfile
UNION
SELECT VALUE file_path
FROM v$parameter
WHERE NAME LIKE '%dest'
UNION
SELECT VALUE file_path
FROM v$parameter2
WHERE NAME = 'utl_file_dir'
UNION
SELECT '$ORACLE_BASE/admin/$ORACLE_SID' file_path
FROM dual
) t;
FOR i IN file_list.FIRST .. file_list.LAST LOOP
DBMS_OUTPUT.PUT_LINE('rm -f ' || file_list(i));
END LOOP;
END;
/
执行上面脚本就能得到类似下面输出的内容。当然,这个脚本必须在前面步骤之前执行。
rm -f $ORACLE_BASE/admin/$ORACLE_SID
rm -f /ORATEST/oracle/admin/bdump
rm -f /ORATEST/oracle/admin/cdump
rm -f /ORATEST/oracle/admin/udump
rm -f /ORATEST/oracle/product/10.1/rdbms/audit
rm -f /ORATEST/oradata/control01.ctl
rm -f /ORATEST/oradata/control02.ctl
rm -f /ORATEST/oradata/control03.ctl
rm -f /ORATEST/oradata/data01.dbf
rm -f /ORATEST/oradata/data02.dbf
rm -f /ORATEST/oradata/redo01.log
rm -f /ORATEST/oradata/redo02.log
rm -f /ORATEST/oradata/redo03.log
rm -f /ORATEST/oradata/sysaux01.dbf
rm -f /ORATEST/oradata/system01.dbf
rm -f /ORATEST/oradata/undotbs01.dbf
rm -f /ORATEST/oradata/users01.dbf
rm -f ?/dbs/arch
Step 7:手动清理相关文件
$echo $ORACLE_SID --确认当前的ORACLE_SID
$ls $ORACLE_BASE/admin/$ORACLE_SID --删除Oracle Base目录下$ORACLE_SID时,先检查、确认一下
$ rm -rf $ORACLE_BASE/admin/$ORACLE_SID --删除oracle base目录下的$ORACLE_SID的所有内容
注意,任何删除前最好先检查、确认,例如下面删除归档日志,我测试的环境,没有开启归档模式,所以下面命令根本没有必要
$ ls -lrt $ORACLE_BASE/arch/$ORACLE_SID
$ rm -rf $ORACLE_BASE/arch/$ORACLE_SID --清除归档日志,注意归档路径的正确性
$ rm -rf $ORACLE_BASE/flash_recovery_area/$ORACLE_SID --清除闪回区的内容
删除前,最好将所有的参数文件保存到另外一个目录,以免需要参考时需要
$ cp $ORACLE_HOME/dbs/* /tmp/
$ rm -rf $ORACLE_HOME/dbs/*$ORACLE_SID* --清除参数文件
Step 8.清理监听相关文件
$ rm $TNS_ADMIN/*.ora --如果设定了$TNS_ADMIN变量,否则删除默认路径下的监听文件
$ rm $ORACLE_HOME/network/admin/*.ora --注意,如果动态监听可能不存在这些文件。如果不删除,重新创建同样名字数据库
--时,监听可能会有一些异常情况。
Step 9.修改oratab文件以及.bash_profile
这个步骤不是必须的,是情况和需要而定。
$ vi /etc/oratab --去掉实例相关的设置
$ vi ~/.bash_profile --去掉实例相关的设置
参考资料:
http://blog.csdn.net/leshami/article/details/6454479
http://www.cnblogs.com/kerrycode/
有时候,无法使用图形界面时,我们需要手动删除数据库,具体操作步骤如下:
一、手动删除文件系统数据库
1.停止监听,防止有新的连接产生,同时,在数据库配置了em的,也需要停止
$ lsnrctl stop listener_name
$ emctl stop dbconsole
2.获得数据文件,日志文件及控制文件的相关信息,包含归档
$ sqlplus /as sysdba
SQL>show parameter control
获取控制文件的路径
SQL>select file_name from dba_data_files;
获取数据文件的位置
SQL>select * from v$logfile;
获取日志文件的位置
SQL>archive log list;
获取归档日志的路径
SQL>shutdown immediate(abort);
关闭数据库,反正都要删除了,可以考虑用abort
3.启动到mount状态(使用exclusive restart)
SQL> startup mount exclusive restrict;
mount数据库到独占模式
SQL> show parameter instance;
查看是否是要删除的实例,这一步非常重要,。
4.修改参数为允许受限的会话模式
SQL>alter system enable restricted session;
5.使用drop database命令来清除数据库
SQL>drop database;
SQL>exit
6.手动清除相关文件
根据第2步查询的结果,删除相应的文件。
windows可以打开窗口,进入目录删除。linux可以使用rm删除
7.清除监听相关文件
11G以后,很多是动态注册的,所以不用考虑这一步。如果配置了静态监听的,需要删除listener.ora文件里的配置
8.修改oratab文件以及.bash_profile
二、清除ASM数据库
对于ASM数据库的删除与文件系统数据库的不同之处在于数据文件,控制文件,日志文件,参数文件等都是存放在ASM系统中,因此需要在ASM实例中做相应的动作来彻底清除数据库。
1.执行文件系统数据库清除步骤3-4步(先要shutdown)
2.使用drop database命令来清除数据库(该命令将清除数据文件,日志文件,temp文件)
SQL>drop database;
SQL>exit
3.连接到ASM实例
$ export ORACLE_SID=+ASM
$ sqlplus /as sysdba
4.清除残余文件
SQL>select name,file_number,group_number,file_incarnation from v$asm_alias;--查看文件,注意group_number表示位于不同的磁盘组
SQL>alter diskgroup ARCHDG1 drop directory '+ARCHDG1/asmdb/file_name'; --可以使用方式来删除需要删除的文件
SQL>alter diskgroup DATADG drop directory'+DATADG/asmdb/file_name';
SQL>select name,file_number,group_number,file_incarnation from v$asm_alias; --验证删除后的结果
也可以使用下面的方式(asmcmd命令)来删除残余文件
$ export ORACLE_SID=+ASM1
$ asmcmd
ASMCMD> ls -l
State Type Rebal Unbal Name
MOUNTED EXTERN N N ARCHDG1/
MOUNTED EXTERN N N DATADG/
ASMCMD> ls -s
Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Name
512 4096 1048576 3067 2974 0 2974 0 ARCHDG1/
512 4096 1048576 2047 1996 0 1996 0 DATADG/
ASMCMD> cd +ARCHDG1
ASMCMD> ls
ASMDB/
ASMCMD> rm -rf ASMDB
ASMCMD> ls
ASMCMD> cd +DATADG
ASMCMD> pwd
+DATADG
ASMCMD> ls
ASMCMD> cd +
ASMCMD> ls -s
Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Name
512 4096 1048576 3067 3016 0 3016 0 ARCHDG1/
512 4096 1048576 2047 1996 0 1996 0 DATADG/
对于直接位于磁盘组下的文件则同样可以使用rm命令来直接删除文件
5.清除其它文件
--$ORACLE_HOME/dbs/与该实例相关的文件;
--trace文件,这个根据版本不同,路径也不相同。11g为$ORACLE_BASE/diag/rdbms/sid_name 相关的实例目录
6.执行文件系统数据库清除步骤7-8步
转:http://blog.itpub.net/29371470/viewspace-2124984/
删除oracle软件和实例步骤:
1、oracle用户登陆sqlplus停止数据库:shutdown
2、oracle用户停止监听服务:lsnrctl stop
3、root用户
删除/tmp下ora*文件
删除/opt下OR*文件
删除/etc下oraInst.loc和oratab文件
(这两个文件是安装oracle时执行$ORACLE_HOME/root.sh脚本产生的)
删除/usr/local/bin下coraenv、dbhome、oraenv
(这三个文件是安装oracle时执行$ORACLE_BASE/oraInventory/orainstRoot.sh脚本产生的)
删除$ORACLE_BASE下admin、flash_recovery_area、oradata、oraInventory
(记住这里不要删除oracle用户默认目录,下次重新安装oracle软件时还要使用oracle用户呢)
特别注意的是不要删除$ORACLE_BASE下oracle用户默认目录,下次重新安装oracle软件时还要使用oracle用户。
B
删除oracle实例,不删除oracle软件
1、dbca,删除实例
DBCA之后 ¥ORACLE_HOME 下剩下
admin flash_recovery_area oradata oraInventory product
admin flash_recovery_area oradata 这个三个文件分别 cd进去 rm -rf
oraInventory product 不要管(脚本目录) 其中product等会要用的
[oracle@mult3 oracle]$ dbca
-bash: /u01/app/oracle/product/10.2.0.1/db/bin/dbca: No such file or directory
删除上面的2个文件 admin oradata可以 但是删除了 product 文件就不可以了 DBCA命令就不能够用了!
Oracle提供了删除数据库的指令:drop database。
需要数据库处于mount状态,然后alter system enable restricted session;,网上有帖子说还需要exclusive,由于我是VM装的,用户只有我一个,所以不用可以。由于当前处于open状态,需要改为mount,执行:
SQL> alter database close;
alter database close
*
ERROR at line 1:
ORA-01093: ALTER DATABASE CLOSE only permitted with no sessions connected
原因是有个session仍连接,退出后再次执行,
SQL> alter database close;
Database altered.
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> alter system enable restricted session;
System altered.
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> drop database;
Database dropped.
此时alert.log记录信息:
Create Relation ADR_CONTROL
Create Relation ADR_INVALIDATION
Create Relation INC_METER_IMPT_DEF
Create Relation INC_METER_PK_IMPTS
USER (ospid: 8748): terminating the instance
Instance terminated by USER, pid = 8748
Deleted Oracle managed file /opt/app/ora11g/oradata/BISAL/controlfile/o1_mf_9x4fgq77_.ctl
Deleted Oracle managed file /opt/app/ora11g/flash_recovery_area/BISAL/controlfile/o1_mf_9x4fgypb_.ctl
Completed: drop database
Shutting down instance (abort)
License high water mark = 2
Fri Jul 25 19:09:26 2014
Instance shutdown complete
到oradata路径下看已经没有任何文件了,那么认为这个数据库已经被删除。
但再次执行dbca,企图创建相同实例的库时报错:
虽然和bisal实例关联的数据文件、日志文件等已经物理删除了,但和这实例相关的配置文件没有删除,因此不能再次创建相同实例的库。
此时需要手工删除实例相关的配置:
1、删除$ORACLE_BASE/admin/$ORACLE_SID所有目录。
2、删除$ORACLE_HOME/dbs下和SID相关的文件和参数文件,包括hc_bisal.dat,init.ora,lkBISAL,orapwbisal。
3、删除/etc/oratab中和实例相关的部分。
4、可以在$ORACLE_HOME中执行find . -name bisal,删除所有和实例相关的文件。
再次执行dbca,就可以创建相同实例名称的数据库了
查看oracle中数据库服务器字符编码
原因:你的oracle服务器的字符集和你客户端的字符集不一致
服务器查看字符集:
select * from v$nls_parameters
客户端(win7)就是查看注册表了
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_ORADB10G_HOME1
双击NLS_LANG修改成和服务器一样的字符集
如果是在服务端产生的,
export NLS_LANG="Simplified Chinese_china".ZHS16GBK
或者
vi .bash_profile NLS_LANG="Simplified Chinese_china".ZHS16GBK export NLS_LANG
source .bash_profile
就可以了
————————————————
版权声明:本文为CSDN博主「此去经年.COM」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangqing_12345/java/article/details/52636745
浙公网安备 33010602011771号