问题是这样出现的:按照平时的要求,spfile应该写入到一个裸设备中,由于裸设备所在的路径没有控制好权限,而create spfile的时候,弄错了大小写:裸设备为spfile_128m_01,而误操作成了create spfile=’spfile_128M_01′ from pfile。将原来的pfile的内容删除,改成指向的spfile_128m_01。于是,在文件系统中就有了一个spfile:spfile_128M_01,且同时还有一个裸设备spfile_128m_01。
因此,系统正在使用的是spfile:spfile_128M_01,但是存在一个裸设备的spfile:spfile_128m_01,内容为空 。
迁移的时候,将裸设备的lv全部迁移到了b机,但是文件系统文件’spfile_128M_01′ 没有迁移,因此,在启动的时候,根据pfile的指向去找spfile:spfile_128m_01,却发现内容为空。
此时源机器数据库已经shutdown,pfile的内容也早已更改成指向spfile,从哪里去找数据库shutdown前的启动参数呢?别急,虽然spfile是个二进制文件,但是我们还是可以看到里面的启动参数的内容的,且里面的内容就是shutdown之前的数据库参数配置:
[oracle@standby1 dbs]$ cat spfileoradg.ora
¡¤¡¤(&*.aq_tm_processes=1
*.background_dump_dest='/oracle/admin/oradg/bdump'
*.compatible='9.2.0.0.0'
*.control_files='/oracle/oradata/oradg/control01.ctl','/oracle/oradata/oradg/control02.ctl','/oracle/oradata/oradg/control03.ctl'
*.core_dump_dest='/oracle/admin/oradg/cdump'
*.db_block_size=8192
*.db_cache_size=186646528
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='oradg'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=oradgXDB)'
*.fal_client='standby'
*.fal_server='primary'
*.fast_start_mttr_target=300
*.filesystemio_options='directIO'
*.hash_join_enabled=TRUE
*.instance_name='oradg'
*.java_pool_size=20971520
*.job_queue_processes=10
*.large_pool_size=36700160
*.log_archive_dest_1='location=/oracle/arch'
*.log_archive_dest_2='SERVICE=standby ARCH SYNC AFFIRM REOPEN=5'
*.log_archive_format='oradg_%T_%S.arc'
*.log_archive_start=TRUE
*.open_cursors=300
*.pga_aggregate_target=82837504
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=61865984
*.sort_area_size=524288
*.standby_archive_dest='/oracle/arch'
*.standby_file_management='auto'
*.star_transformation_enabled='FALSE'
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/oracle/admin/oradg/udump'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[oracle@standby1dbs]$catspfileoradg.ora
¡¤¡¤(&*.aq_tm_processes=1
*.background_dump_dest='/oracle/admin/oradg/bdump'
*.compatible='9.2.0.0.0'
*.control_files='/oracle/oradata/oradg/control01.ctl','/oracle/oradata/oradg/control02.ctl','/oracle/oradata/oradg/control03.ctl'
*.core_dump_dest='/oracle/admin/oradg/cdump'
*.db_block_size=8192
*.db_cache_size=186646528
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='oradg'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=oradgXDB)'
*.fal_client='standby'
*.fal_server='primary'
*.fast_start_mttr_target=300
*.filesystemio_options='directIO'
*.hash_join_enabled=TRUE
*.instance_name='oradg'
*.java_pool_size=20971520
*.job_queue_processes=10
*.large_pool_size=36700160
*.log_archive_dest_1='location=/oracle/arch'
*.log_archive_dest_2='SERVICE=standby ARCH SYNC AFFIRM REOPEN=5'
*.log_archive_format='oradg_%T_%S.arc'
*.log_archive_start=TRUE
*.open_cursors=300
*.pga_aggregate_target=82837504
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=61865984
*.sort_area_size=524288
*.standby_archive_dest='/oracle/arch'
*.standby_file_management='auto'
*.star_transformation_enabled='FALSE'
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/oracle/admin/oradg/udump'
我们看到,除了开头的一点乱码外,后面的内容还是一样的,因此,我们可以手工的把spfile的内存去掉前面的乱码部分,手工的copy出来,再放到一个pfile中,用此pfile启动数据库,将spfile建到正确的裸设备上,在改掉pfile的内容,使其指向裸设备。
其实还有一个做法的,需要主机方面的知识了,将文件系统的spfile用dd的方式复制到裸设备的spfile,将pfile的内容指向裸设备的spfile即可。
其实,说了那么多,就一句话而已:丢了pfile,spfile中还是能看到数据库的参数配置的。-_-!