且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Unix/Linux下删除Oracle控制文件Controlfile为什么实例Instance没有立即奔溃?

更新时间:2021-11-11 06:02:07

绝大多数教科书或网络教材都告诉初学者, Oracle中丢失Controlfile控制文件会造成不可挽回的损失, Oracle Instance实例会立即崩溃crash。 但是实际很多同学在实际操作时发现,在Unix/Linux上删除所有的Controlfile控制文件 后 实例并不会在第一时间crash, 相反居然还可以顺利完成FULL checkpoint 。   这是为什么呢?   注意这个问题仅适用于Unix/Linux, 在Windows平台上不允许删除 已经被其他进程打开的文件。   究其根本原因是在Linux/Unix上Read 或 Write一个文件,进程都会打开一个与此文件相关联的 打开文件描述符 Open File Descriptors (a file descriptor (FD) is an abstract indicator for accessing a file. The term is generally used in POSIX operating systems.In POSIX, a file descriptor is an integer, specifically of the C type int.) 在C语言里 这样的一个File Descriptor以整形的形式出现, 举例来说:   进程A 在运行过程中 用 open 函数打开了一个文件/etc/hosts:  
int  open("/etc/hosts",O_RDONLY);

此时若open成功则会返回一个 文件描述符, 例如是该进程打开的第一个文件 那么 就返回1
若出错则返回 -1

之后进程A 就可以利用如 open ,write 这样的读写函数 要求对 文件描述符 1相关的实际文件进行读写

当进程不再需要读写文件或 进程退出时 一般使用close函数关闭open File Descriptor

close(1);   -- 例如上面获得的 描述符是 1  ,这里代入1就可以关闭本进程对/etc/hosts的FD

    而在Linux/Unix上当一个文件被删除时,它只是简单地被"unlink"即删除一个硬链接hard link; 实际包含



本文转自maclean_007 51CTO博客,原文链接:http://blog.51cto.com/maclean/1278294