周日为了挽救主库USERS表空间不足临时扩了20G表空间,导致DG库的/bak/datafile/目录不足。 日志应用到扩表空间的归档就崩溃,同时更悲剧的是空间不足导致SYSTEM表空间写入也发生了异常。 对于该问题首先想到系统级别扩容,通过系统级别的resize2fs经过确认无法扩容。通过分区合并由于没有相邻的分区也无法进行,只有采用ORACLE层面的方式。我们的DG系统因为空间紧缺数据文件写到了两个不同的文件夹,既然数据可以写到两个目录,肯定可以写到三个目录,会不会是控制文件里有定义,马上创建了PFILE,但从PFILE里面没有发现有用的数据文件重定向信息,又查找资料,发现了救命的RENAME命令,通过RENAME命令解决了数据文件迁移的问题。
- 文件系统 容量 已用 可用 已用% 挂载点
- /dev/sda3 19G 470M 18G 3% /
- /dev/sda12 125G 105G 14G 89% /bak
- /dev/sda10 9.5G 151M 8.9G 2% /tmp
- /dev/sda9 9.5G 318M 8.7G 4% /var
- /dev/sda8 19G 173M 18G 1% /opt
- /dev/sda7 19G 4.0G 14G 23% /weblogic
- /dev/sda2 48G 4.0G 41G 9% /usr
- /dev/sda6 48G 28G 18G 61% /home
- /dev/sda5 95G 76G 15G 85% /u01
- /dev/sda1 1.9G 42M 1.8G 3% /boot
- tmpfs 3.9G 0 3.9G 0% /dev/shm
- [root@L-DB-163-18 datafile]# umount /weblogic
- [root@L-DB-163-18 datafile]# df -h
- 文件系统 容量 已用 可用 已用% 挂载点
- /dev/sda3 19G 470M 18G 3% /
- /dev/sda12 125G 105G 14G 89% /bak
- /dev/sda10 9.5G 151M 8.9G 2% /tmp
- /dev/sda9 9.5G 318M 8.7G 4% /var
- /dev/sda8 19G 173M 18G 1% /opt
- /dev/sda2 48G 4.0G 41G 9% /usr
- /dev/sda6 48G 28G 18G 61% /home
- /dev/sda5 95G 76G 15G 85% /u01
- /dev/sda1 1.9G 42M 1.8G 3% /boot
- tmpfs 3.9G 0 3.9G 0% /dev/shm
- [root@L-DB-163-18 datafile]# e2fsck -f /dev/sda12
- e2fsck 1.39 (29-May-2006)
- Pass 1: Checking inodes, blocks, and sizes
- Pass 2: Checking directory structure
- Pass 3: Checking directory connectivity
- Pass 4: Checking reference counts
- Pass 5: Checking group summary information
- /bak: 24/33718272 files (12.5% non-contiguous), 28482930/33714402 blocks
- [root@L-DB-163-18 datafile]# resize2fs /dev/sda12 128G;
- resize2fs 1.39 (29-May-2006)
- Filesystem at /dev/sda12 is mounted on /bak; on-line resizing required
- Performing an on-line resize of /dev/sda12 to 33554432 (4k) blocks.
- The filesystem on /dev/sda12 is now 33554432 blocks long.
- 空间不够,通过UNMOUNT其他文件系统扩容需要的文件系统后来仔细研究了下确实是不行的。
- 必须从分区层面进行,尝试fdisk /dev/sda\d\7\w删除了无用的分区,研究分区合并也行不通,
- 因为sda12相邻的分区没有可用空间,从分区层面扩容无法成行,
- 在数据库层面原本可以通过OPEN数据库把数据文件重命名的动作由于SYSTEM表空间未完全写完一个事物而无法OPEN,
- RENAME操作报错,具体如下。
- SQL> alter tablespace TEMP rename datafile '/bak/datafile/temp01.dbf' to '/usr/datafile/temp01.dbf';
- alter tablespace TEMP rename datafile '/bak/datafile/temp01.dbf' to '/usr/datafile/temp01.dbf'
- *
- ERROR at line 1:
- ORA-01109: database not open
- SQL> alter database open read only;
- alter database open read only
- *
- ERROR at line 1:
- ORA-16004: backup database requires recovery
- ORA-01196: file 1 is inconsistent due to a failed media recovery session
- ORA-01110: data file 1: '/bak/datafile/system01.dbf'
- 按照常理,DG数据库可以在MOUNT下执行RENAME操作,但试了很多次却不行。
- 再仔细一看报错信息,居然有如下提示ORA-01275: Operation RENAME is not allowed if standby file management is automatic.
- SQL> startup nomount;
- ORACLE instance started.
- Total System Global Area 4596957184 bytes
- Fixed Size 2090048 bytes
- Variable Size 838863808 bytes
- Database Buffers 3741319168 bytes
- Redo Buffers 14684160 bytes
- SQL> alter database mount standby database;
- Database altered.
- SQL> alter database rename file '/bak/datafile/namin_data.dbf' to '/usr/datafile/namin_data.dbf';
- alter database rename file '/bak/datafile/namin_data.dbf' to '/usr/datafile/namin_data.dbf'
- *
- ERROR at line 1:
- ORA-01511: error in renaming log/data files
- ORA-01275: Operation RENAME is not allowed if standby file management is
- automatic.
- 上ORACLE查了下,在DG模式下文件有两种管理方式(show parameter standby可以查),自动和手动管理,如果是自动管理,是没法重命名的,
- 马上尝试改成手动模式。
- SQL> show parameter standby
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- standby_archive_dest string ?/dbs/arch
- standby_file_management string AUTO
- SQL> alter system set standby_file_management=MANUAL;
- System altered.
- SQL> show parameter standby
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- standby_archive_dest string ?/dbs/arch
- standby_file_management string MANUAL
- SQL> alter database rename file '/bak/datafile/namin_data.dbf' to '/usr/datafile/namin_data.dbf';
- Database altered.
- SQL> alter database rename file '/bak/datafile/temp01.dbf' to '/usr/datafile/temp01.dbf';
- Database altered.
- 至此更改文件路径成功,数据文件已经定向到了新的路径/usr/datafile/。
- 再此药注意的是重命名前必须把文件原封不动的拷贝过去,否则会报如下错误。
- SQL> alter database rename file '/bak/datafile/sysaux01.dbf' to '/usr/datafile/sysaux01.dbf';
- alter database rename file '/bak/datafile/sysaux01.dbf' to '/usr/datafile/sysaux01.dbf'
- *
- ERROR at line 1:
- ORA-01511: error in renaming log/data files
- ORA-01141: error renaming data file 3 - new file '/usr/datafile/sysaux01.dbf'not found
- ORA-01110: data file 3: '/bak/datafile/sysaux01.dbf'
- ORA-27037: unable to obtain file status
- Linux-x86_64 Error: 2: No such file or directory
- Additional information: 3
- 这下空间有了,事情就好办了,只要/bak/datafile/下有20G以上的空间,应用了USERS表空间扩容的归档。
- 其余就是很好操作的事情。归档日志满可以把已经应用的归档给删除掉,如果不小心把未应用的归档删除了怎么办,
- 也不用慌,如果用了ASM,可以用RMAN从主库提取归档,然后FTP给DG,如果用普通文件系统,那么直接FTP。
- EG:
- RMAN> copy archivelog '+DATA/log/archivelog/2_5585_697238176.dbf' to '/u01/rman/2_5585_697238176.dbf';
本文转自zylhsy 51CTO博客,原文链接:http://blog.51cto.com/yunlongzheng/578456,如需转载请自行联系原作者