某市数据库非零偏移量裸设备问题及表空间问题处理总结

教程发布:风哥 教程分类:ITPUX技术网 更新日期:2022-02-12 浏览学习:1088

作者:

1 问题描述
1.1 问题一
数据库报警日志里发现创建业务数据表空间时有报警信息WARNING: Oracle recommends creating new datafiles on devices with zero offset. The command "/usr/sbin/mklv -y LVname -T O -w n -s n -r n VGname NumPPs" can be used. Please contact Oracle customer support for more details.
经分析,导致该报警信息的原因是在创建裸设备的时候没有使用零偏移lv,即mklv命令没有加-T O参数。这种lv不会影响日常的数据库操作,但存在一个非常严重的隐患:当系统崩溃的时候,很有可能造成大量的IO不完整,启动oracle的时候会看到 ORA-1578(ORACLE data block corrupted)错误,导致oracle数据库启动失败、数据丢失。
1.2 问题二
业务表空间没有使用段空间自动管理(ASSM),没有使用段空间自动管理会容易引起段头的争用与空间的浪费。
1.3 问题三
数据库分配了1.4TB的数据文件空间,但目前实际仅使用约10GB,空间严重浪费,需要把已分配的部分空间回收到磁盘阵列上。
1.4 处理目标
1. 重新创建裸设备(零偏移lv),把数据库中有问题的裸设备上的数据迁移到新的裸设备上
2. 把所有的业务空间修改成使用段空间自动管理(ASSM)
3. 回收数据库暂时没有被使用的空间,避免空间浪费
4. 删除不正确的裸设备,重新创建新的裸设备
[@more@]2 问题处理过程
2.1 数据库数据迁移(使用rman copy方法)
2.1.1 概述
裸设备没有使用零偏移lv,需要把数据库文件迁移到新的裸设备上。
2.1.2 创建新裸设备
1. 创建裸设备
mklv -y 'ly_vg01_20g_01t' -T O -S 8k -t 'jfs2' -w'n' -r'n' lydatavg01 80 hdisk39 hdisk40 hdisk41 hdisk42 hdisk43
……
2. 更改新建裸设备属主
#ls –l /dev/rly_vg01_*t /查看新建的lv信息
#chown –R 10gly:dba /dev/rly_vg01_*t /将新建裸设备的属主改为10gly用户
#ls –l /dev/rly_vg01_*t /查看新建lv的属主是否修改成功
2.1.3 备份数据库
1. RMAN物理备份
2. exp逻辑备份
2.1.4 尝试使用lv copy方法迁移数据(不成功)
1. 复制裸设备
chlv –t copy ly_vg01_20g_01t (必须将目的lv改为copy模式)
cplv -e ly_vg01_20g_01t(目的)–f ly_vg01_20g_01(源)
chlv –t jfs2 ly_vg01_20g_01t (改回正常模式)
2. 用副本替换原文件
chlv -n ly_vg01_20g_01o(新名) ly_vg01_20g_01(旧名)
chlv -n ly_vg01_20g_01 ly_vg01_20g_01t
chown –R 10gly:dba /dev/rly_vg01_20g_01
3. 尝试用新的lv启动数据库,数据库报错
/dev/rdata_5g_01lv :Header block magic number is bad; trying raw file format ……
/dev/rdata_5g_01lv :Header block magic number is bad
4. 怀疑cplv实现的是物理拷贝,将/dev/rdata_5g_01lv前4k闲置,出现上述错误。cplv不成功,将该原数据文件改回原名,启动数据库成功。
chlv -n ly_vg01_20g_01t ly_vg01_20g_01
chlv -n ly_vg01_20g_01 ly_vg01_20g_01o
chown –R 10gly:dba /dev/rly_vg01_20g_01
2.1.5 使用rman copy方法迁移数据(成功)
1. 把数据库修改成归档模式
sqlplus / as sysdba
shutdown immediate
startup mount
alter database archivelog;
2. 使用rman copy迁移数据文件
$rman target /
RMAN>copy datafile '/dev/rly_vg01_512m_01' to '/dev/rly_vg01_512_01t'
……
3. 裸设备改名
chlv -n ly_vg01_20g_01o ly_vg01_20g_01
chlv -n ly_vg01_20g_01 ly_vg01_20g_01t
chown -R 10gly:dba /dev/rly_vg01_20g_01
4. 启动数据库
启动数据库,报需要做recovery datafile
recover datafile file_id
alter database open
2.1.6 测试应用
1. 启动应用,测试数据库功能及数据完整性
2. 迁移成功
2.1.7 删除有问题的裸设备,并重新创建裸设备(零偏移lv)
1. 删除有问题的裸设备
2. 重新创建裸设备(零偏移lv)
2.2 数据库迁移(使用move tablespace方法)
2.2.1 概述
有多个业务表空间没有使用段空间自动管理(ASSM),要解决表空间的问题,只能采用删除表空间并重新创建的方法,rman copy方法不适用于该数据库,经综合考虑后决定使用move tablespace方法。
2.2.2 创建新裸设备
1. 创建裸设备
2. 更改新建裸设备属主
2.2.3 备份数据库
3. RMAN物理备份
4. exp逻辑备份
2.2.4 创建新的表空间(共14个表空间)
新表空间命名方法是:在原表空间名字后加_NEW
create tablespace TBS1 datafile '/dev/rzy_vg03_5g_01' size 5120M autoextend off;
……
2.2.5 move table(共864个表)
把表的数据迁移到新的表空间上
alter table USER1.T3 move tablespace T3;
……
2.2.6 move lob(共27个lob)
把lob对象数据迁移到新的表空间上
alter table USER2.T4 move lob(CONTENT) store as (tablespace TBS4);
……
2.2.7 rebuild index(共601个索引)
把索引迁移到新的表空间上
alter index USER1.IDX1 rebuild tablespace T3;
……
2.2.8 检查原表空间是否还有对象
select tablespace_name,segment_name,segment_type from dba_segments where tablespace_name in ('TBS2','TBS5','TBS6','TBS7','TBS8');
2.2.9 表空间重命名
原表空间名修改为原名加_OLD,并把新表空间名(原名_NEW)修改成原表空间名
alter tablespace TBS2 rename to TBS2_OLD;
……
alter tablespace TBS1 rename to TBS2;
……
2.2.10 修改用户的default tablespace
把原表空间名修改为原名加_OLD时,会自动修改用户的default tablespace为原名_OLD,所以要手工再修改为原来的default tablespace
alter user USER4 default tablespace TBS5;
……
2.2.11 测试应用
1. 启动应用,测试数据库功能及数据完整性
2. 迁移成功
2.2.12 删除旧的表空间
drop tablespace TBS8_OLD including contents and datafiles;
……
2.2.13 删除旧裸设备,创建新裸设备(零偏移lv)
1. 删除有问题的裸设备
2. 重新创建裸设备(零偏移lv)
2.3 数据库迁移(使用move tablespace方法)
2.3.1 概述
除了有裸设备问题外,还有多个业务表空间没有使用段空间自动管理(ASSM),要解决表空间的问题,只能采用删除表空间并重新创建的方法,rman copy方法不适用于该数据库,经综合考虑后决定使用move tablespace方法。
数据库分配了1.4TB的数据文件空间,但目前实际仅使用约10GB,空间严重浪费,做完数据迁移后,还需要把已分配的部分空间回收到磁盘阵列上。
2.3.2 创建新裸设备
1. 创建裸设备
2. 更改新建裸设备属主
2.3.3 备份数据库
1. RMAN物理备份
2. exp逻辑备份
2.3.4 创建新的表空间(共38个表空间)
新表空间命名方法是:在原表空间名字后加_NEW
create tablespace TBS15 datafile '/dev/rjxkh_d04_512m06' size 510M autoextend off;
……
2.3.5 move table(共673个表)
把表的数据迁移到新的表空间上
alter table USER3.B_SQJW_ZAXX_THXX move tablespace TBS9;
……
2.3.6 move partition(共324个partition)
把表分区的数据迁移到新的表空间上
alter table USER5.T_KHTJ_XJ_XLQW_09 move partition PART_2009_MAX tablespace TBS10;
……
2.3.7 move lob(共8个lob)
把lob对象数据迁移到新的表空间上
alter table APP_YYK_DATA.YB_ASJ_BL move lob(BODY) store as (tablespace TBS11);
……
2.3.8 rebuild index(共1825个索引)
把索引迁移到新的表空间上
alter index BL110JXKH.SYS_C0011015 rebuild tablespace TBS15;
……
2.3.9 检查原表空间是否还有对象
select tablespace_name,segment_name,segment_type from dba_segments
where tablespace_name in ('TBS16','TBS_BADATA','TBS_DWCOMMON','TBS_IMAGEDATA','TBS_INDEX','TBS_PARAMETER','TBS_RYCOMMON','TBS_WGDATA','TBS_ZDDXDATA','TBS_WS','TBS_ZADATA','TBS_LOG','TBS_JGDATA','TBS_JXKH','TBS_MLP','TBS_PCSJSDATA','TBS_XJTJDATA','TBS_XSJS','TBS_ZZRKCZWDATA','TBS_JZDATA','TBS_JZINDEX','TBS_SQJWDATA','TBS_REPORT','TBS_JXKH_ASJ','TBS_JXKH_WS','TBS_JXKH_RY','TBS_JXKH_ZA','TBS_JXKH_XJTJ','TBS_JXKH_INDEX','TBS_JXKH_DATA','TBS_JXKH_LOG','BL110JXKH','HD110JXKH','HY110JXKH','DYW110JXKH','LM110JXKH','APP_YYPT_DATA','APP_YYPT_INDEX');
2.3.10 表空间重命名
原表空间名修改为原名加_OLD,并把新表空间名(原名_NEW)修改成原表空间名
alter tablespace TBS16 rename to TBS16_OLD;
……
alter tablespace TBS11 rename to TBS16;
……
2.3.11 修改用户的default tablespace
把原表空间名修改为原名加_OLD时,会自动修改用户的default tablespace为原名_OLD,所以要手工再修改为原来的default tablespace
alter user USER4 default tablespace TBS5;
……
2.3.12 处理临时表空间
临时表空间TBS_JXKH_TEMP、APP_YYPT_TEMP、TBS_TEMP中的数据库文件也是采用了非零偏移量lv,所以也需要重建。
alter user APP_YYPT temporary tablespace temp;
……
drop tablespace TBS_JXKH_TEMP including contents and datafiles;
……
create temporary tablespace TBS_JXKH_TEMP tempfile '/dev/ryy_data01_8g_01' size 8190M autoextend off;
……
alter user APP_YYPT temporary tablespace APP_YYPT_TEMP;
……
2.3.13 测试应用
1. 启动应用,测试数据库功能及数据完整性
2. 迁移成功
2.3.14 删除旧的表空间
drop tablespace TBS16_OLD including contents and datafiles;
……
2.3.15 删除旧裸设备,创建新裸设备(零偏移lv)
1. 删除有问题的裸设备
2. 根据实际需要重新创建裸设备(零偏移lv)
2.3.16 回收空间
1. 把暂时不需要的vg删除 (exportvg)
2. 把lun回收到磁盘阵列上
3 总结
3.1 问题原因总结
1. 卷组类型使用了Big VG(应该要用Scalable VG),为日后创建lv时留下隐患
2. 在Big VG上创建裸设备时,使用了smitty hacmp方法在线创建,没有注意要加-T O参数,导致创建的裸设备是带4K偏移量的lv
3. 创建表空间时没有使用段空间自动管理(ASSM)
4. 创建表空间时,没有考虑到目前空间的实际使用需求,一开始就按5年的需求做一次性分配
3.2 处理方法总结
1. 零偏移LV的识别方法
# lslv -L lv_test_2g_001
DEVICESUBTYPE :DS_LVZ
或者,Oracle的dbfsize也可以检查
$ dbfsize /dev/rlv_test_2g_001
Database file: /dev/rlv_test_2g_001
Database file type: raw device without 4K starting offset
Database file size: 261248 8192 byte blocks
如果查看结果显示如上,则说明这个LV是没有4k头部的“Z”类型的LV(零偏移LV)
2. 如果只做数据文件的迁移,且磁盘剩余空间充足,可以使用rman copy方法
3. 如果表空间的属性也需要修改,可以使用move tablespace方法

本文标签:
网站声明:本文由风哥整理发布,转载请保留此段声明,本站所有内容将不对其使用后果做任何承诺,请读者谨慎使用!
【上一篇】
【下一篇】