rac数据文件误添加到本地文件系统问题处理
数据库查询数据报错,定位原因是rac库把datafile加在本地磁盘,另一个节点无法访问。
2.1 影响情况
由于该操作将影响该数据文件的使用,所以需与业务进行确认。
2.2 备份数据库
为了数据的安全性,做任何变更之前都需要对数据库进行一个全备,以防遇到不可逆转问题,也能保证数据的完整。
rman> backup database plus archivelog format '/home/oracle/backup/%u';
2.3 数据库重启操作
为了保证数据库的可用性。在变更操作之前,对数据库进行进行逐台的重启操作。若启动正常,则进行后续变更操作。
针对数据库db逐台重启:
sql> shutdown immediate sql> startup
由于数据库处理未开启归档状态,所以需要先开启归档模式进行后续操作。
归档开启需要对整个数据库进行关闭,然后启动到mount状态,再开启数据库,所以需要停止业务。
如后续归档需要关闭,步骤与开启归档一致,在步骤2.5中,命令更改为:alter database noarchivelog;即可。
3.1 关闭监听
查看数据库存在哪些监听,都停掉。
两个节点同时操作
[oracle@rac1 ~]$ ps -ef |grep tns root 15 2 0 08:30 ? 00:00:00 [netns] grid 44993 1 0 16:52 ? 00:00:00 /u01/app/grid/product/11.2.0/grid/bin/tnslsnr listener_scan1 -inherit grid 45009 1 0 16:52 ? 00:00:00 /u01/app/grid/product/11.2.0/grid/bin/tnslsnr listener -inherit oracle 54254 54199 0 19:13 pts/2 00:00:00 grep tns [oracle@rac1 ~]$ su - grid password: [grid@rac1 ~]$ [grid@rac1 ~]$ lsnrctl stop lsnrctl for linux: version 11.2.0.4.0 - production on 04-jun-2019 19:14:21 米乐app官网下载 copyright (c) 1991, 2013, oracle. all rights reserved. connecting to (description=(address=(protocol=ipc)(key=listener))) the command completed successfully [grid@rac1 ~]$ lsnrctl stop listener_scan1 lsnrctl for linux: version 11.2.0.4.0 - production on 04-jun-2019 19:14:27 米乐app官网下载 copyright (c) 1991, 2013, oracle. all rights reserved. connecting to (description=(address=(protocol=ipc)(key=listener_scan1))) the command completed successfully [grid@rac1 ~]$
3.2 设置检查点
两个节点同时操作
sql> alter system checkpoint;
system altered.
sql>
3.3 关闭数据库
两个节点同时操作
sql> shutdown immediate database closed. database dismounted. oracle instance shut down. sql>
3.4 启动数据库mount
两个节点同时操作
sql> shutdown immediate database closed. database dismounted. oracle instance shut down. sql>
3.5 开启归档
两个节点同事操作
sql> alter database archivelog;
database altered.
sql>
3.6 启动数据库
sql> alter database open;
database altered.
sql>
3.7 设置归档路径大小
sql> archive log list
database log mode archive mode
automatic archival enabled
archive destination use_db_recovery_file_dest
oldest online log sequence 106
next log sequence to archive 107
current log sequence 107
sql> show parameter db_recovery_file_dest
name type value
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string fra
db_recovery_file_dest_size big integer 1g
sql>
sql> alter system set db_recovery_file_dest='xxxx';
sql> alter system set db_recovery_file_dest_size=2g;
恢复过程中,保留归档不被删除。如有归档备份删除软件,需暂停此类软件。
4.1 数据文件offline
将存在错误路径的文件offline;
offline之后,存在该数据文件上的数据将无法读取,该表空间存在其他正常数据文件中的数据无影响。
alter database datafile 'xxxxxx' offline;
4.2 copy数据文件
将错误路径的数据文件用过rman进行copy到正确的路径。
backup as copy datafile 'xxxxxx' format ' dg_index';
4.3 rename数据文件
alter database rename file 'xxxxx' to 'xxxxx';
4.4 恢复数据文件
这里就需要用到归档日志,所以前面要求保留归档日志。
recover datafile xxx;
4.5 数据文件online
alter database datafile 8 online;
4.6 检查数据文件
查看数据文件路径是否正常,rac各个节点访问情况是否正常。
5.1 模拟故障现象
将把环境模拟成故障现象报错的情况。
5.1.1 创建表空间、用户、表
节点一:创建表空间,创建用户,创建表,查询表数据。——正常
sql> create tablespace lyp datafile ' newdata1' size 20m;
tablespace created.
sql> create user lyp identified by lyp default tablespace lyp;
user created.
sql> grant dba to lyp;
grant succeeded.
sql> conn lyp/lyp
connected.
sql> create table lyp as select owner,table_name,tablespace_name from dba_tables;
table created.
sql>
sql> select count(*) from lyp;
count(*)
----------
1993
sql>
节点二:查询表数据。——正常
sql> conn lyp/lyp
connected.
sql> select count(*) from lyp;
count(*)
----------
1993
sql>
5.1.2 添加错误路径数据文件
sql> alter tablespace lyp add datafile 'newdata1' size 20m;
tablespace altered.
sql> select file_id, file_name from dba_data_files where tablespace_name='lyp';
file_id file_name
---------- ------------------------------------------------------------
6 newdata1/rac/datafile/lyp.276.1010080027
7 /u01/app/oracle/product/11.2.0/db_1/dbs/newdata1
sql>
这里可以看到7号数据文件路径错了。
5.1.3 插入数据
sql> create table test as select * from lyp;
table created.
sql> insert into test select * from test;
1993 rows created.
sql> insert into test select * from test;
3986 rows created.
sql> insert into test select * from test;
7972 rows created.
sql> insert into test select * from test;
15944 rows created.
sql> insert into test select * from test;
31888 rows created.
sql> insert into test select * from test;
63776 rows created.
sql> insert into test select * from test;
127552 rows created.
sql> insert into test select * from test;
255104 rows created.
sql> insert into test select * from test;
insert into test select * from test
*
error at line 1:
ora-01653: unable to extend table lyp.test by 128 in tablespace lyp
sql> commit;
commit complete.
sql>
5.1.4 重新报错
节点一:查询正常
sql> select count(*) from lyp;
count(*)
----------
1993
sql> select count(*) from test;
count(*)
----------
510208
sql>
节点二:查询报错。
sql> select count(*) from lyp;
count(*)
----------
1993
sql> select count(*) from test;
select count(*) from test *
error at line 1:
ora-01157: cannot identify/lock data file 7 - see dbwr trace file
ora-01110: data file 7: '/u01/app/oracle/product/11.2.0/db_1/dbs/newdata1'
sql>
5.2 恢复故障
5.2.1 数据文件offline
sql> select file_id,file_name,status from dba_data_files where tablespace_name='lyp';
file_id file_name status
---------- ------------------------------------------------------------ ---------
6 newdata1/rac/datafile/lyp.276.1010080027 available
7 /u01/app/oracle/product/11.2.0/db_1/dbs/newdata1 available
sql> select file#,name,status from v$datafile where file#=7;
file# name status
---------- ------------------------------------------------------------ -------
7 /u01/app/oracle/product/11.2.0/db_1/dbs/newdata1 online
sql> alter database datafile 7 offline;
database altered.
sql> select file#,name,status from v$datafile where file#=7;
file# name status
---------- ------------------------------------------------------------ -------
7 /u01/app/oracle/product/11.2.0/db_1/dbs/newdata1 recover
sql>
sql> select count(*) from lyp;
count(*)
----------
1993
sql> select count(*) from test;
select count(*) from test
*
error at line 1:
ora-00376: file 7 cannot be read at this time
ora-01110: data file 7: '/u01/app/oracle/product/11.2.0/db_1/dbs/newdata1'
sql>
offline之后,存在该数据文件上的数据将无法读取,该表空间存在其他正常数据文件中的数据无影响。
5.2.2 copy数据文件
rman> backup as copy datafile '/u01/app/oracle/product/11.2.0/db_1/dbs/newdata1' format ' newdata1';
starting backup at 04-jun-19
using target database control file instead of recovery catalog
allocated channel: ora_disk_1
channel ora_disk_1: sid=24 instance=rac1 device type=disk
channel ora_disk_1: starting datafile copy
input datafile file number=00007 name=/u01/app/oracle/product/11.2.0/db_1/dbs/newdata1
output file name= newdata1/rac/datafile/lyp.277.1010081595 tag=tag20190604t181315 recid=25 stamp=1010081595
channel ora_disk_1: datafile copy complete, elapsed time: 00:00:01
finished backup at 04-jun-19
rman>
以上标红的就是copy生成出来的数据文件。
5.2.3 rename数据文件
sql> alter database rename file '/u01/app/oracle/product/11.2.0/db_1/dbs/newdata1' to ' newdata1/rac/datafile/lyp.277.1010081595';
database altered.
sql> select file_id,file_name,status from dba_data_files where tablespace_name='lyp';
file_id file_name status
---------- ------------------------------------------------------------ ---------
6 newdata1/rac/datafile/lyp.276.1010080027 available
7 newdata1/rac/datafile/lyp.277.1010081595 available
sql>
数据文件修改成功
5.2.4 恢复数据文件
sql> select file#,name,status from v$datafile where file#=7;
file# name status
---------- ------------------------------------------------------------ -------
7 newdata1/rac/datafile/lyp.277.1010081595 recover
sql> recover datafile 7;
media recovery complete.
sql> select file#,name,status from v$datafile where file#=7;
file# name status
---------- ------------------------------------------------------------ -------
7 newdata1/rac/datafile/lyp.277.1010081595 offline
sql>
5.2.5 数据文件online
sql> alter database datafile 7 online;
database altered.
sql> select file#,name,status from v$datafile where file#=7;
file# name status
---------- ------------------------------------------------------------ -------
7 newdata1/rac/datafile/lyp.277.1010081595 online
sql>
5.2.6 检查数据文件
检查数据文件路径、状态,以及数据是否可查。
一节点:查询正常。
sql> select file_id,file_name,status from dba_data_files where tablespace_name='lyp';
file_id file_name status
---------- ------------------------------------------------------------ ---------
6 newdata1/rac/datafile/lyp.276.1010080027 available
7 newdata1/rac/datafile/lyp.277.1010081595 available
sql> select file#,name,status from v$datafile where file#=7;
file# name status
---------- ------------------------------------------------------------ -------
7 newdata1/rac/datafile/lyp.277.1010081595 online
sql> select count(*) from lyp;
count(*)
----------
1993
sql> select count(*) from test;
count(*)
----------
510208
sql>
二节点:查询正常。
sql> select count(*) from lyp;
count(*)
----------
1993
sql> select count(*) from test;
count(*)
----------
510208
sql>
6.1 回退步骤
按照恢复步骤相反的步骤进行回退。
6.2 异常恢复
对一些非正常因素导致是不可逆转的问题,从而使数据丢失的情况,就需要使用步骤二、中备份的数据进行恢复。