Oracle集群Real Application Cluster的数据文件存储在ASM(自动存储管理)中,而不是集群中某个节点的磁盘上,所以在新建表空间时,若将数据文件保存在某个节点的磁盘,就会引起问题,如:重启数据库实例时无法正常启动,只能offline数据文件存储在本地磁盘上的表空间才可以启动数据库实例,或数据库可以启动,但启动后访问该表空间时报错[ORA-01157](后面的实战案例中的所描述的情况)
区分数据文件是否是位于ASM中:用sys账户登录,执行SQL语句:
SQL>select name from v$datafile;
可以查看所有数据文件的存储位置,其中以“+XXX”开头的即为存储在ASM中的数据文件,而存储在本地磁盘上的文件则大多以”/”(linux下)或“[盘符]:/”(windows下)开头
而将本地存储的数据文件转移到ASM上可以使用dbms_file_transfer.copy_file存储过程,也可以使用rman管理工具,这里以第一种方法为例来讲解其详细步骤(其实是第二种方法不会玩>_<|||)
实战案例
环境说明:
沈阳图形数据库,
节点1:192.168.5.12 RadHatLinux5 Oracle 10.2.0.4
节点2:192.168.5.13 RedHatLinux5 Oracle 10.2.0.4
在执行查询语句时报错:
ORA-01157: cannot identify/lock data file 153 - see DBWR trace file
ORA-01110: data file 153: '/home/oracle/base/product/10.2.0/db_1/dbs/SYK.dbf'
ORA-01157:无法标识/锁定数据文件
由上述的报错信息可以看出来,表空间SYK的数据文件SYK.dbf放在某个linux节点的服务器上,虽然之前新建之后一直可用,但在重启之后就报出了这个错误,应该就是数据文件没有放置到正确的位置所导致的问题,经查找,发现数据文件被放置在了节点2(192.168.5.13)的本地磁盘上,故,现将数据文件由本地磁盘移动至ASM
1. 创建两个directory,一个指向本地磁盘的数据文件目录,一个指向ASM数据文件目录,ASM的数据文件目录可以由其他表空间的数据文件位置获得,沈阳这里是“+DG/orcl”,这两个目录后面在调用存储过程的时候会用到
SQL>create directory localdb as ‘/home/oracle/base/product/10.2.0/db_1/dbs’
SQL>create directory asmdb as ‘+DG/orcl’
2. 卸载表空间,将表空间的状态置为offline
SQL>alter tablespace SYK offline
3. 拷贝数据文件到ASM
SQL>exec dbms_file_transfer.copy_file(‘localdb’, ’asmdb’, ‘SYK.dbf’);
4. 修改数据库中的数据文件路径
SQL>alter database rename file ‘/home/oracle/base/product/10.2.0/db_1/
dbs/SYK.dbf’ to ‘+DG/orcl/SYK.dbf’
5. 重新挂载表空间
SQL>alter tablespace SYK online;
这样就可以解决RAC中数据文件误保存在本地而导致的问题了。