俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

Oracle中手动删除数据库教程_oracle_脚本之家

在很多情况下,或无法使用dbca工具的时候,我们需要手动来删除数据库。对此,可以借助drop database命令来实现,下面的描述中给出手动删除数据库。的具体步骤,包含文件系统数据库以及ASM数据库。环境:Oracle Enterprise Linux 5.4 + Oracle 10g R2 .一、手动删除文件系统数据库 1.停止监听与OEM

很多人习惯用ORACLE的DBCA工具创建、删除数据库,这里总结一下手工删除数据库实验的步骤,文中大量参考了乐沙弥的手动删除ORACLE数据库这篇博客的内容,当然还有Oracle官方相关文档。此处实验环境为Oracle Linux Server release 5.7,数据库版本为10.2.0.5.0

复制代码 代码如下: $ lsnrctl stop listener_name $ emctl stop dbconsole

 

2.获得数据文件,日志文件及控制文件的相关信息,包含归档

Step 1: .获得控制文件、数据文件,日志文件等相关信息

复制代码 代码如下: $ sqlplus / as sysdba SQL> select status,name from v$controlfile; --获取控制文件的位置信息 SQL> select * from v$dbfile; --获取数据文件的位置信息 SQL> select * from v$logfile; --获取日志文件的位置信息 SQL> archive log list; --查看归档的sequence及位置信息 SQL> shutdown abort; --因数据不再需要,直接shutdown abort

获取这些信息,一方面是为了后面的建库做参考,另外一个是为了验证后面一些操作,如果这些都没有必要,其实是可以可以跳过这一步的。

3.启动到 mount 状态

SQL> select status ,name from v$controlfile;

 

SQL> select * from v$dbfile; 

 

SQL> select * from v$logfile;

 

SQL>archive log list;  

复制代码 代码如下: SQL> startup mount exclusive restrict;

 

4.修改参数为允许受限的会话模式

Step 2: 停止监听服务和OEM

复制代码 代码如下: SQL> alter system enable restricted session;

$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. 

5.使用drop database命令来清除数据库

 

复制代码 代码如下: SQL> drop database; SQL> exit

Step 3: 关闭数据库实例

6.手动清除相关文件

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

复制代码 代码如下: $ echo $ORACLE_SID --确认当前的ORACLE_SID $ rm -rf $ORACLE_BASE/admin/$ORACLE_SID --删除oracle base目录下的$ORACLE_SID的所有内容 $ rm -rf $ORACLE_BASE/oradata/$ORACLE_SID --oradata下的数据文件,根据前面的查询,注意要删除不同路径下的数据文件 $ rm -rf $ORACLE_BASE/arch/$ORACLE_SID --清除归档日志,注意归档路径的正确性 $ rm -rf $ORACLE_BASE/flash_recovery_area/$ORACLE_SID --清除闪回区的内容 $ rm -rf $ORACLE_HOME/dbs/*$ORACLE_SID* --清除参数文件 */

 

7.清除监听相关文件

 

复制代码 代码如下: $ rm $TNS_ADMIN/*.ora --如果设定了$TNS_ADMIN变量,否则删除默认路径下的监听文件 */ $ rm $ORACLE_HOME/network/admin/*.ora */ 8.修改oratab文件以及.bash_profile 复制代码 代码如下: $ vi /etc/oratab --去掉实例相关的设置 $ vi ~/.bash_profile --去掉实例相关的设置

Step 4:启动到数据库实例到mount状态

二、清除ASM数据库

使用exclusive restart或普通模式都可以

对于ASM数据库的删除与文件系统数据库的不同之处在于数据文件,控制文件,日志文件,参数文件等都是存放在ASM系统中,因此需要在ASM实例中做相应 的动作来彻底清除数据库。 1.执行文件系统数据库清除步骤3-4步 2.使用drop database命令来清除数据库(该命令将清除数据文件,日志文件,temp文件) 复制代码 代码如下: SQL> drop database; SQL> exit 3.连接到ASM实例复制代码 代码如下: $ export ORACLE_SID=+ASM $ sqlplus / as sysdba

SQL> startup mount exclusive restrict;

或

SQL> startup mount;

复制代码 代码如下: SQL> select name,file_number,group_number,file_incarnation from v$asm_alias; --查看文件,注意group_number表示位于不同的磁盘组 SQL> alter diskgroup DG1 drop directory '+DG1/asmdb/file_name'; --可以使用方式来删除需要删除的文件 SQL> alter diskgroup REV drop directory '+REV/asmdb/file_name'; SQL> select name,file_number,group_number,file_incarnation from v$asm_alias; --验证删除后的结果 也可以使用下面的方式来删除残余文件 复制代码 代码如下: $ export ORACLE_SID=+ASM $ asmcmd ASMCMD> ls -l State Type Rebal Unbal Name MOUNTED EXTERN N N DG1/ MOUNTED EXTERN N N REV/ 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 DG1/ 512 4096 1048576 2047 1996 0 1996 0 REV/ ASMCMD> cd +DG1 ASMCMD> ls ASMDB/ ASMCMD> rm -rf ASMDB ASMCMD> ls ASMCMD> cd +REV ASMCMD> pwd +REV 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 DG1/ 512 4096 1048576 2047 1996 0 1996 0 REV/ 对于直接位于磁盘组下的文件则同样可以使用rm命令来直接删除文件

 

尽管数据文件,归档日志,联机日志,临时文件,参数文件都存放在ASM磁盘中,但dump文件,告警日志依然位于磁盘,需要手动清除 复制代码 代码如下:$ echo $ORACLE_SID --确认当前的ORACLE_SID $ rm -rf $ORACLE_BASE/admin/$ORACLE_SID --删除oracle base目录下的$ORACLE_SID的所有内容 $ rm -rf $ORACLE_HOME/dbs/*$ORACLE_SID* --清除参数文件 */ 6.执行文件系统数据库清除步骤7-8步

 

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

本文由俄罗斯贵宾会发布于数据库,转载请注明出处:Oracle中手动删除数据库教程_oracle_脚本之家

您可能还会对下面的文章感兴趣: