一次教训,引以为鉴

本文记述了一次因分区不足导致的RAC数据库故障及恢复过程。作者在新增数据文件时遇到存储空间即将用尽的问题,并尝试通过新增分区解决,但误用已分配的裸设备导致数据库文件损坏。经过一系列排查与恢复操作,最终解决了问题。
部署运行你感兴趣的模型镜像
一次教训,引以为鉴
数据库环境9.2.0.4 RAC两个节点
EMC存储

由于mail报警MIRRORRAC1 SPACE WILL BE USED UP SOON ..
要在裸设备新增数据文件
当时发现我记录的分区表,结合rawdevices表,发现由于在建立数据库初期给数据库预留的分区太少,到这次新增数据文件时
已经没有分区可以用了,必须用fdisk新增一个区,但是由于新增的区不会被OS认出(除非整个lun全部重新划分),
fdisk /dev/sdc 新建立sdc11(1026m),但是用dmesg|grep sdc11查不到,所以要想重新让OS能认,必须重新MOUNT这个区(没有试过),
但是由于sdc下面有很多区被使用了(除非数据库允许down机)。所以只能找其他捷径,因为我建立emc存储时划分了sdi,sdh,sdg没有被
划分(其实sdg已经划分了一个sdg5,问题就出在这),我看到这个sdg5已经在dmesg中可以看到,我看了一下相关的配置(当时建库时
的文档)没有发现使用了sdg5,当时好象也查了/etc/sysconfig/rawdevices也没有发现,在数据库中查了controlfile,redolog,datafile
等均未发现使用了sdg5,所以认为这个sdg5是可以被新增数据文件利用的,但是后来发现问题恰恰出现在这个sdg5,我后来恢复数据库后居然
在/etc/sysconfig/rawdevices中看到这个sdg5。
数据库是在alert中发现 600错误,发现monitor_kp无法访问,但是我在数据库中select count(*) from monitor_kp(其实是走索引的)
可以查到数据,认为数据库不存在问题。后来查看alert日志发现/opt/oracle/admin/oint/udump/oint1_ora_1842.trc文件中有
select * from monitor_kp order by id desc
该数据库读表数据错误。
先以为网站被攻击了,后来我发现可能跟我这次操作有关(这里也是一大过错,对自己过于相信是对的,没有及时去重起数据库,这里大概延时了15分钟)
于是准备重起数据库,shutdown abort时发生错误,ipcrm删除共享段,然后重起过程中就发现只能mount数据库,不能打开数据库,提示
/dbvol1/oradata/oint/appdata1m12.dbf数据文件坏了,然后我将数据库完全恢复起来,做了备份,网站数据库恢复正常。


添加数据文件的过程如下
raw /dev/raw/raw43 /dev/sdg5
/bin/ln -s /dev/raw/raw43 /dbvol1/oradata/oint/offerts03.dbf
chown oracle:oinstall /dbvol1/oradata/oint/offerts03.dbf
alter tablespace OFFERTS add datafile '/dbvol1/oradata/oint/offerts03.dbf' size 1025M;
数据文件添加成功



检查原因过程
1.cat /etc/sysconfig/rawdevices
...
/dev/raw/raw42 /dev/sdg5 --这这里发现了sdg5
...

2.于是我查一下由于被绑定的设备
[root@mirrorrac2 root]# raw -qa
...
/dev/raw/raw42: bound to major 8, minor 101 --原因找出来了,是由于原来就有文件/dbvol1/oradata/oint/appdata1m12.dbf使用了sdg5
/dev/raw/raw43: bound to major 8, minor 101 --我们看到绑定的设备都是101
...

就此可以确认是由于数据文件被覆盖的原因。
当前数据库的状态是数据完全恢复正常,但是两个数据文件公用同一个设备,当前设备的数据是raw42相关联的/dbvol1/oradata/oint/appdata1m12.dbf
而offerts的数据基本没用,过了一会offerts自动从online转换成recover状态,此时,数据库正常可以运行。

第2次恢复过程:
1.于是只能通过将offerts03.dbf从sdg5中分离出来。
利用sdi来保存offerts03.dbf
先在mirror2上建立fdisk /dev/sdi将所有的区建立起来

[root@mirrorrac1 root]# dmesg|grep sdi
Attached scsi disk sdi at scsi3, channel 0, id 0, lun 8
SCSI device sdi: 31457280 512-byte hdwr sectors (16106 MB)
sdi: unknown partition table
此时mirror1还是看不到sdi区
2.
[root@mirrorrac1 root]# blockdev --rereadpt /dev/sdi --同步mirror2的分区
[root@mirrorrac1 root]# dmesg|grep sdi
Attached scsi disk sdi at scsi3, channel 0, id 0, lun 8
SCSI device sdi: 31457280 512-byte hdwr sectors (16106 MB)
sdi: unknown partition table
SCSI device sdi: 31457280 512-byte hdwr sectors (16106 MB)
sdi: sdi1 < sdi5 sdi6 sdi7 sdi8 sdi9 sdi10 sdi11 sdi12 sdi13 sdi14 sdi15 >

--此时可以看到新的分区

3.
在两个节点同时运行绑定裸设备
[root@mirrorrac2 root]# raw /dev/raw/raw43 /dev/sdi5
/dev/raw/raw43: bound to major 8, minor 133
[root@mirrorrac1 root]# raw /dev/raw/raw43 /dev/sdi5
/dev/raw/raw43: bound to major 8, minor 133

4.检查raw绑定正确性,是否有重复绑定
[root@mirrorrac2 root]# raw -qa|awk '{print $7}'|wc -l
63
[root@mirrorrac2 root]# raw -qa|awk '{print $7}'| sort -u | wc -l
63

5.做备份
bash-2.05$ dd if=/dbvol1/oradata/oint/offerts03.dbf of=/mirror_backup/back_datafile/offerts03.dbf.0727 bs=10
49608k count=1
1+0 records in
1+0 records out

6.
SQL> alter database datafile '/dbvol1/oradata/oint/offerts03.dbf' offline;
Database altered.

7.
SQL> recover datafile '/dbvol1/oradata/oint/offerts03.dbf';
ORA-00283: recovery session canceled due to errors
ORA-01110: data file 38: '/dbvol1/oradata/oint/offerts03.dbf'
ORA-01122: database file 38 failed verification check
ORA-01110: data file 38: '/dbvol1/oradata/oint/offerts03.dbf'
ORA-01251: Unknown File Header Version read for file number 38
直接恢复不行

8.
alter database create datafile '/dbvol1/oradata/oint/offerts03.dbf'

9.
SQL> recover datafile '/dbvol1/oradata/oint/offerts03.dbf';
Media recovery complete.
SQL>
SQL>

10.
SQL> alter database datafile '/dbvol1/oradata/oint/offerts03.dbf' online;

Database altered.

11.检查文件状态
select name,status from v$datafile where file# in (37,38)
NAME STATUS
-------------------------------------- -------

/dbvol1/oradata/oint/appdata1m12.dbf ONLINE


/dbvol1/oradata/oint/offerts03.dbf ONLINE


12.检查OFFERTS03数据文件是否正常
SQL> select file#,name from v$datafile where name like '%offerts03.dbf%';
FILE# NAME
---------- --------------------------------------------------
38 /dbvol1/oradata/oint/offerts03.dbf

SQL> select * from dba_extents where file_id = 38;

no rows selected
--现在新增的数据文件没有对象

查看OFFERTS表空间的区大小
SQL> select NEXT_EXTENT/1024 from dba_tablespaces where TABLESPACE_NAME = 'OFFERTS';

NEXT_EXTENT/1024
----------------
32768

--由于OFFERTS有3个文件,那么要建立32M*3以上的表进行测试
SQL> select * from (select segment_name,bytes/1024/1024||'M' from user_segments order by bytes desc) where rownum < 10;

SEGMENT_NAME bytes/1024/1024||'M'
----------------------------------------- --------------------
......
COMPANY 188M
......

SQL> create table fanglf_test nologging tablespace offerts as select * from company;

Table created.

SQL> select segment_name from dba_extents where file_id = 38;

SEGMENT_NAME
--------------------------------------------------------------------------------
FANGLF_TEST
FANGLF_TEST
FANGLF_TEST
--表明该新增的数据文件是好的


13.检查appdata1m12.dbf数据文件是否正常
select file#,name from v$datafile where name like '%appdata1m12.dbf%';
FILE# NAME
---------- --------------------------------------------------
37 /dbvol1/oradata/oint/appdata1m12.dbf


SQL> select rowid from alibaba.COMPANY where DBMS_ROWID.rowid_relative_fno(rowid) = 37 and rownum < 10;

ROWID
------------------
AAACBSAAlAAAIgmAAC
AAACBSAAlAAAIiBAAB
AAACBSAAlAAAIihAAB
AAACBSAAlAAAIihAAC
AAACBSAAlAAAIihAAD
AAACBSAAlAAAIkEAAB
AAACBSAAlAAAIkEAAE
AAACBSAAlAAAIkEAAF
AAACBSAAlAAAIkXAAB

SQL> update alibaba.COMPANY
SET SITE = 'test'
where rowid = 'AAACBSAAlAAAIgmAAC';
2 3
1 row updated.

SQL> commit;

Commit complete.

SQL> update alibaba.COMPANY
SET SITE = '???'
where rowid = 'AAACBSAAlAAAIgmAAC';
2 3
1 row updated. --说明appdata1m12.dbf也没有问题

SQL> commit;
Commit complete.

修改vi /etc/sysconfig/rawdevices(在两个节点)
增加/dev/raw/raw43 /dev/sdi5[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/257699/viewspace-815208/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/257699/viewspace-815208/

您可能感兴趣的与本文相关的镜像

Wan2.2-T2V-A5B

Wan2.2-T2V-A5B

文生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

鉴相器(也称为同步检测器)是一种用于检测 modulated 信号的相位的电路或算法。在 Python 中实现鉴相器,可以按照以下步骤进行: 1. 定义输入信号,通常是一个 modulated 信号(例如,调幅信号或调频信号)。 2. 生成一个参考信号,通常是一个高频正弦波信号。 3. 将输入信号和参考信号分别进行乘法运算,得到两个正交分量的信号。 4. 对两个正交分量的信号进行低通滤波,以去除高频分量。 5. 对两个正交分量的信号进行幅度检测,得到原始信号的基带表示。 6. 计算基带信号的相位或相位差,即为输入信号的相位。 下面是一个简单的 Python 代码示例,演示如何实现鉴相器: ``` python import numpy as np from scipy.signal import butter, filtfilt # 定义输入信号 fs = 1000 t = np.linspace(0, 1, fs) sig_mod = np.sin(2 * np.pi * 10 * t) * np.sin(2 * np.pi * 100 * t) # 生成参考信号 f_ref = 200 sig_ref = np.sin(2 * np.pi * f_ref * t) # 乘法运算,得到正交分量信号 sig_I = sig_mod * sig_ref sig_Q = sig_mod * np.cos(2 * np.pi * f_ref * t) # 低通滤波 fc = 50 b, a = butter(4, fc / (fs / 2), 'low') sig_I_filt = filtfilt(b, a, sig_I) sig_Q_filt = filtfilt(b, a, sig_Q) # 幅度检测 sig_amp = np.sqrt(sig_I_filt**2 + sig_Q_filt**2) # 计算相位 sig_phase = np.arctan2(sig_Q_filt, sig_I_filt) ``` 在上面的代码中,输入信号 `sig_mod` 是一个调幅信号,其载波频率为 10 Hz,调制信号频率为 100 Hz。我们生成一个参考信号 `sig_ref`,其频率为 200 Hz。然后,我们对 `sig_mod` 和 `sig_ref` 进行乘法运算,得到正交分量信号 `sig_I` 和 `sig_Q`。接下来,我们对 `sig_I` 和 `sig_Q` 进行低通滤波,使用 `butter` 函数设计一个 4 阶低通滤波器,截止频率为 50 Hz。最后,我们对 `sig_I_filt` 和 `sig_Q_filt` 进行幅度检测,得到基带表示 `sig_amp`,并计算相位 `sig_phase`。 需要注意的是,上面的代码示例仅用于演示如何实现鉴相器,并不考虑各种实际应用中的复杂情况,例如噪声、多径干扰等。在实际应用中,可能需要使用更复杂的算法和技术来优化鉴相器的性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值