数据库服务器也不堪连续的意外关闭,出现启动异常了。错误代码ORA-01033。
操作步骤如下,因为数据库服务器有多个实例,所以一开始先设置的当前数据库实例名。
数据库实例关闭后的第一次启动目的是查看是什么原因引起不能正常启动,提示出那个数据文件有问题。
明确那个文件后,使用startup mount启动,进行处理。
使用recover datafile进行处理时,一般都可以恢复成功。
若不成功,则比较复杂,如果有数据备份则可通过备份恢复,否则无法进行恢复,可使用alter database datafile 文件名 offline drop语句,将文件设置为离线。此文件中的数据则不能被加载。
通过alter database open语句启动数据库,若无错误数据库恢复正常,若还存在不能加载的文件则继续按照上述方式进行处理,直至完成。
C:\>set ORACLE_SID=ORCL1
C:\>sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on 星期五 7月 9 09:17:36 2010
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> shutdown immediate
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 1258291200 bytes
Fixed Size 2065408 bytes
Variable Size 385879040 bytes
Database Buffers 855638016 bytes
Redo Buffers 14708736 bytes
数据库装载完毕。
ORA-01115: 从文件 10 读取块时出现 IO 错误 (块 # 2338895)
ORA-01110: 数据文件 10:
'G:\ORACLE\ORACLE_TABLESPACE\HBCENTADM\HBCENTADM_DATA.DBS'
ORA-27070: 异步读取/写入失败
OSD-04016: 异步 I/O 请求排队时出错。
O/S-Error: (OS 23) 数据错误(循环冗余检查)。
SQL> shutdown immediate
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 1258291200 bytes
Fixed Size 2065408 bytes
Variable Size 385879040 bytes
Database Buffers 855638016 bytes
Redo Buffers 14708736 bytes
数据库装载完毕。
SQL> recover datafile 10
ORA-00283: 恢复会话因错误而取消
ORA-12801: 并行查询服务器 P000 中发出错误信号
ORA-01115: 从文件 10 读取块时出现 IO 错误 (块 # 2338895)
ORA-01110: 数据文件 10:
'G:\ORACLE\ORACLE_TABLESPACE\HBCENTADM\HBCENTADM_DATA.DBS'
ORA-27
SQL> select name, log_mode from v$database;
NAME LOG_MODE
--------- ------------
ORCL1 NOARCHIVELOG
SQL> alter database datafile 'G:\ORACLE\ORACLE_TABLESPACE\HBCENTADM\HBCENTADM_DATA.DBS' offline drop;
数据库已更改。
SQL> alter database open;
数据库已更改。
Create directory让我们可以在Oracle数据库中灵活的对文件进行读写操作,极大的提高了Oracle的易用性和可扩展性。
其语法为:
CREATE [OR REPLACE] DIRECTORY directory AS 'pathname';
本案例具体创建如下:
目录创建以后,就可以把读写权限授予特定用户,具体语法如下:
GRANT READ[,WRITE] ON DIRECTORY directory TO username;
例如:
此时用户eygle就拥有了对该目录的读写权限。
其语法为:
CREATE [OR REPLACE] DIRECTORY directory AS 'pathname';
本案例具体创建如下:
create or replace directory exp_dir as '/tmp'; |
目录创建以后,就可以把读写权限授予特定用户,具体语法如下:
GRANT READ[,WRITE] ON DIRECTORY directory TO username;
例如:
grant read, write on directory exp_dir to eygle; |
此时用户eygle就拥有了对该目录的读写权限。
让我们看一个简单的测试:
类似的我们可以通过utl_file来读取文件:
可以查询dba_directories查看所有directory.
可以使用drop directory删除这些路径.
SQL> create or replace directory UTL_FILE_DIR as '/opt/oracle/utl_file'; Directory created. SQL> declare 2 fhandle utl_file.file_type; 3 begin 4 fhandle := utl_file.fopen('UTL_FILE_DIR', 'example.txt', 'w'); 5 utl_file.put_line(fhandle , 'eygle test write one'); 6 utl_file.put_line(fhandle , 'eygle test write two'); 7 utl_file.fclose(fhandle); 8 end; 9 / PL/SQL procedure successfully completed. SQL> ! [oracle@jumper 9.2.0]$ more /opt/oracle/utl_file/example.txt eygle test write one eygle test write two [oracle@jumper 9.2.0]$ |
类似的我们可以通过utl_file来读取文件:
SQL> declare 2 fhandle utl_file.file_type; 3 fp_buffer varchar2(4000); 4 begin 5 fhandle := utl_file.fopen ('UTL_FILE_DIR','example.txt', 'R'); 6 7 utl_file.get_line (fhandle , fp_buffer ); 8 dbms_output.put_line(fp_buffer ); 9 utl_file.get_line (fhandle , fp_buffer ); 10 dbms_output.put_line(fp_buffer ); 11 utl_file.fclose(fhandle); 12 end; 13 / eygle test write one eygle test write two PL/SQL procedure successfully completed. |
可以查询dba_directories查看所有directory.
SQL> select * from dba_directories; OWNER DIRECTORY_NAME DIRECTORY_PATH ------------------------------ ------------------------------ ------------------------------ SYS UTL_FILE_DIR /opt/oracle/utl_file SYS BDUMP_DIR /opt/oracle/admin/conner/bdump SYS EXP_DIR /opt/oracle/utl_file |
可以使用drop directory删除这些路径.
SQL> drop directory exp_dir; Directory dropped SQL> select * from dba_directories; OWNER DIRECTORY_NAME DIRECTORY_PATH ------------------------------ ------------------------------ ------------------------------ SYS UTL_FILE_DIR /opt/oracle/utl_file SYS BDUMP_DIR /opt/oracle/admin/conner/bdump |