ASM 翻译系列第三十八弹:ASM数据清理

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

根据维基百科, 数据清理(data scrubbing)的定义是“一种数据纠错技术,利用后台任务周期性的扫描内存或存储的错误,在检测到错误后利用数据的多余副本来对数据进行纠正,数据清理可以减少数据错误不断累计的可能性,进而降低由数据错误带来的风险”。

数据清理(disk scrubbing)是Oracle 12C ASM出现的新功能, Oracle ASM 12C官方文档中写道,“ASM的磁盘清理通过校验不经常被读取的数据,提高了可用性和可靠性,对于磁盘组是normal 和 high redundancy冗余模式的,磁盘清理会检查数据的逻辑错误,在发现后利用镜像磁盘进行错误的自动修复,同时磁盘清理利用了磁盘组的冲平衡功能来降低IO资源的消耗。”

Setup

首先我们来构造一个实验,我的环境中有一个normal冗余的磁盘组DATA,有一点需要在这里指出来,本环境中的磁盘管理是通过12.1.0.2的ASM filter driver (AFD)来做的。

译者注:AFD,这是一个可以取代 ASMLIB 和 udev 设置的新功能,并且还增加了 I/O Filter 功能,该功能可以拒绝所有无效的 I/O 请求,最主要的作用是防止意外覆写 ASM 磁盘的底层盘。


[grid@dbserver]$ sqlplus / as sysasm

SQL*Plus: Release 12.1.0.2.0 Production on Tue Dec 8 14:08:22 2015

...

SQL> select NAME, TYPE, STATE from v$asm_diskgroup_stat;

NAME         TYPE   STATE

------------ ------ -----------

DATA         NORMAL MOUNTED

SQL> select DISK_NUMBER, PATH from v$asm_disk_stat;

DISK_NUMBER PATH

----------- ----------------

0 AFD:ASMDISK01

2 AFD:ASMDISK03

4 AFD:ASMDISK05

1 AFD:ASMDISK02

6 AFD:ASMDISK07

5 AFD:ASMDISK06

3 AFD:ASMDISK04

7 rows selected.

SQL>


我在这个磁盘组中创建了一些数据文件:


[grid@dbserver]$ asmcmd ls +DATA/BR/DATAFILE

SYSTEM.261.887497785

USERS.262.8874978313

UNDOTBS1.269.887497831

SYSAUX.270.887497739

T1.305.897911209

T2.306.897911479

T3.307.897911659

Scrubbing a file

我们可以通过ASM的清理功能去对一个磁盘组、一个盘、一个文件做清理,下面的例子里,我们演示对一个ASM文件做清理。

为了清理一个文件,我们需要连接到ASM实例,然后运行ALTER DISKGROUP SCRUB FILE 命令:


SQL> alter diskgroup DATA scrub file '+DATA/BR/DATAFILE/t3.307.897911659' repair power high wait;

...


上面命令中repair关键字是可选的,如果没有输入repair关键字,那么检测到数据的错误信息后只会在相关日志文件中被报告,而不会被自动修复。

在ASM的alert日志中,我们可以看到磁盘清理过程中的输出信息,一旦清理清理完成,ASM日志中也会有相关信息输出:


Tue Dec 08 11:55:56 2015

SQL> alter diskgroup DATA scrub file '+DATA/BR/DATAFILE/t3.307.897911659' repair power high wait

Tue Dec 08 11:55:56 2015

NOTE: Waiting for scrubbing to finish

Tue Dec 08 11:56:43 2015

NOTE: Scrubbing finished

Tue Dec 08 11:56:43 2015

SUCCESS: alter diskgroup DATA scrub file '+DATA/BR/DATAFILE/t3.307.897911659' repair power high wait


因为在我的环境中没有数据毁坏,因此在ASM的alert文件中,没有任何错误被检测到。

当ASM数据清理在运行过程中,可以看到有2个ASM进程在做实际的工作。

[grid@dbserver]$ ps -ef | grep asm_sc

grid     17902     1  0 11:27 ?        00:00:00 asm_scrb_+ASM

grid     24365     1  0 11:49 ?        00:00:01 asm_scc0_+ASM

...


  • SCRB-ASM做磁盘清理的master进程,主要负责协调磁盘的清理操作

  • SCCn-ASM做磁盘清理的slave进程,用来执行检查操作,可能的进程有SCC0-SCC9。

  • SCRn-ASM做磁盘清理的slave进程,主要用来对有错误的数据进行修复,可能的进程有SCR0-SCR9。

  • SCVn-ASM做磁盘清理的slave进程,主要用来执行确认操作,可能的进程有SCV0-SCV9。

Corrupted block found

我们下面来举一个具体的例子来,通过毁坏数据文件的一个数据块-假如是block 200,然后通过磁盘清理操作来观察ASM数据清理的检测、修复效果。首先通过脚本find_block.pl来定位到block 200在ASM磁盘上的2个copy。

译者注:find_block.pl脚本的相关内容请参照ASM系列的Find block in ASM篇获取详细信息

[grid@dbserver ]$ $ORACLE_HOME/perl/bin/perl find_block.pl +DATA/BR/DATAFILE/t3.307.897911659 200

dd if=/dev/sdo1 bs=8192 count=1 skip=1460552 of=block_200.dd

dd if=/dev/sdd1 bs=8192 count=1 skip=1462088 of=block_200.dd


然后我使用dd命令抽取这两个block。


[root@dbserver]# dd if=/dev/sdo1 bs=8192 count=1 skip=1460552 of=block_200_primary.dd

[root@dbserver]# dd if=/dev/sdd1 bs=8192 count=1 skip=1462088 of=block_200_mirror.dd


将这两个块写入到文本文件后,使用操作系统的diff命令来校验一下这两个copy是否是一样的。

[root@dbserver]# diff block_200_primary.dd block_200_mirror.dd

[root@dbserver]#


如预期,由于没有数据毁坏,目前两个块的内容是完全一样的。

现在我们把块的一个副本毁坏,由于使用了ASM filter driver,在做毁坏操作的时候会有些麻烦,需要关闭ASM,卸载ASM filter driver,才能使用操作系统dd命令往ASM磁盘中写入命令:

首先创建一个文本文件,作为毁坏源:


[root@dbserver]# od -c block_200_mirror.dd > block_200_corrupt.txt

接着关闭数据库和ASM实例,卸载掉ASM filter driver,否则dd操作将不能执行。

[root@dbserver]# modprobe -r oracleafd

[root@dbserver]# lsmod | grep oracle

oracleacfs           3308260  0

oracleadvm            508030  0

oracleoks             506741  2 oracleacfs,oracleadvm

然后毁坏掉block 200的镜像copy。


[root@dbserver]# dd if=block_200_corrupt.txt of=/dev/sdd1 bs=8192 count=1 seek=1462088

1+0 records in

1+0 records out

8192 bytes (8.2 kB) copied, 0.00160027 s, 5.1 MB/s

读取上面步骤中写回的内容,通过操作系统diff命令确认两个块的内容是否有差异:

[root@dbserver]# dd if=/dev/sdd1 bs=8192 count=1 skip=1462088 of=block_200_corr.dd

1+0 records in

1+0 records out

8192 bytes (8.2 kB) copied, 0.00152298 s, 5.4 MB/s


[root@dbserver]# diff block_200_primary.dd  block_200_corr.dd

Binary files block_200_primary.dd and block_200_corr.dd differ

[root@dbserver]#

如上面的输出,现在两个块的内容出现了不一样。

Scrub a file

下面到了本节的重点内容,我们重新加载ASM filter driver模块。

重启ASM实例,开始对上面测试用到的数据文件进行清理:

SQL> alter diskgroup DATA scrub file '+DATA/BR/DATAFILE/t3.307.897911659' wait;

...

观察ASM的alert 日志,数据清理过程中发现了毁坏的数据块:

Tue Dec 08 13:25:48 2015

SQL> alter diskgroup DATA scrub file '+DATA/BR/DATAFILE/t3.307.897911659' wait

Starting background process SCRB

Tue Dec 08 13:25:48 2015

SCRB started with pid=25, OS id=4585

Tue Dec 08 13:25:48 2015

NOTE: Waiting for scrubbing to finish

Tue Dec 08 13:25:49 2015

NOTE: Corrupted block 200 found in file +DATA/BR/DATAFILE/t3.307.897911659

Tue Dec 08 13:25:50 2015

NOTE: Corrupted block 200 found in file +DATA/BR/DATAFILE/t3.307.897911659

Tue Dec 08 13:26:39 2015

NOTE: Scrubbing finished

Tue Dec 08 13:26:39 2015

SUCCESS: alter diskgroup DATA scrub file '+DATA/BR/DATAFILE/t3.307.897911659' wait

后台进程的dump文件目录中也发现新产生了一些trace文件:


[grid@dbserver]$ ls -lrt | tail

-rw-r-----. 1 grid oinstall  36887 Dec  8 13:25 +ASM_scc0_4587.trc

-rw-r-----. 1 grid oinstall  36967 Dec  8 13:25 +ASM_scv0_4592.trc

-rw-r-----. 1 grid oinstall   5088 Dec  8 13:25 +ASM_gmon_16705.trc

-rw-r-----. 1 grid oinstall  36965 Dec  8 13:25 +ASM_scv1_4599.trc

-rw-r-----. 1 grid oinstall 551218 Dec  8 13:26 alert_+ASM.log

如果我们更进一步查看SCC0进程的trace文件,会看到清理操作输出的详细报告:


[grid@dbserver]$ more ./+ASM_scc0_4587.trc

Trace file /u01/app/grid/diag/asm/+asm/+ASM/trace/+ASM_scc0_4587.trc

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

...

HARD VIOLATION(S) DETECTED!

CORRUPTED BLOCK INFORMATION:

memory address: 0x7f13531fb000

block size: 8192

block number: 200 [0xc8]

block offset in this write request of 1 block(s): 0

file type: datafile (type value: 2)

...

HARD check failed at block 200

还可以通过grep相关关键字快速的获取报告中重要关注的内容:

[grid@dbserver]$ egrep -i "corrupted|block number|failed" *sc*trc

+ASM_scc0_4587.trc:CORRUPTED BLOCK INFORMATION:

+ASM_scc0_4587.trc:  block number: 200 [0xc8]

+ASM_scc0_4587.trc:  Magic number  Block size  Block number  Checksum  Head-tail match

+ASM_scc0_4587.trc:FAILED CHECK(S):

+ASM_scc0_4587.trc:  MAGIC NUMBER CHECK FAILED

+ASM_scc0_4587.trc:  BLOCK SIZE CHECK FAILED

+ASM_scc0_4587.trc:  BLOCK NUMBER CHECK FAILED

+ASM_scc0_4587.trc:  HEAD-TAIL MATCH CHECK FAILED

+ASM_scc0_4587.trc:HARD check failed at block 200

+ASM_scv0_4592.trc:CORRUPTED BLOCK INFORMATION:

+ASM_scv0_4592.trc:  block number: 200 [0xc8]

+ASM_scv0_4592.trc:  Magic number  Block size  Block number  Checksum  Head-tail match

+ASM_scv0_4592.trc:FAILED CHECK(S):

+ASM_scv0_4592.trc:  MAGIC NUMBER CHECK FAILED

+ASM_scv0_4592.trc:  BLOCK SIZE CHECK FAILED

+ASM_scv0_4592.trc:  BLOCK NUMBER CHECK FAILED

+ASM_scv0_4592.trc:  HEAD-TAIL MATCH CHECK FAILED

+ASM_scv0_4592.trc:HARD check failed at block 200

+ASM_scv0_4592.trc:NOTE: Corrupted block 200 found in file +DATA/BR/DATAFILE/t3.307.897911659

+ASM_scv1_4599.trc:CORRUPTED BLOCK INFORMATION:

+ASM_scv1_4599.trc:  block number: 200 [0xc8]

+ASM_scv1_4599.trc:  Magic number  Block size  Block number  Checksum  Head-tail match

+ASM_scv1_4599.trc:FAILED CHECK(S):

+ASM_scv1_4599.trc:  MAGIC NUMBER CHECK FAILED

+ASM_scv1_4599.trc:  BLOCK SIZE CHECK FAILED

+ASM_scv1_4599.trc:  BLOCK NUMBER CHECK FAILED

+ASM_scv1_4599.trc:  HEAD-TAIL MATCH CHECK FAILED

+ASM_scv1_4599.trc:HARD check failed at block 200

+ASM_scv1_4599.trc:NOTE: Corrupted block 200 found in file +DATA/BR/DATAFILE/t3.307.897911659

[grid@dbserver]$

Fix the corruption

上面的操作没有添加repair关键字,因此毁坏并没有被自动修复,只是在相关跟踪日志中输出了清理操作发现到的坏块,这次我们在命令中增加repaire关键字,利用数据清理对文件进行自动修复:

SQL> alter diskgroup DATA scrub file '+DATA/BR/DATAFILE/t3.307.897911659' repair wait;

...

Tue Dec 08 13:35:02 2015

SQL> alter diskgroup DATA scrub file '+DATA/BR/DATAFILE/t3.307.897911659' repair wait

Tue Dec 08 13:35:02 2015

NOTE: Waiting for scrubbing to finish

Tue Dec 08 13:35:03 2015

NOTE: Corrupted block 200 found in file +DATA/BR/DATAFILE/t3.307.897911659

Tue Dec 08 13:35:04 2015

NOTE: Scrubbing block 200 in file 307.897911659 in slave

NOTE: Successfully scrubbed block 200 in file 307.897911659

Tue Dec 08 13:35:53 2015

NOTE: Scrubbing finished

Tue Dec 08 13:35:53 2015

SUCCESS: alter diskgroup DATA scrub file '+DATA/BR/DATAFILE/t3.307.897911659' repair wait

根据日志输出,清理操作顺利的完成了,同样我们再次通过对比两个块的内容来校验是否数据得到了修复。


[root@dbserver ~]# dd if=/dev/sdd1 bs=8192 count=1 skip=1462088 of=block_200_after_scrub_repair.dd

1+0 records in

1+0 records out

8192 bytes (8.2 kB) copied, 0.000856456 s, 9.6 MB/s

[root@dbserver]# diff block_200_primary.dd block_200_after_scrub_repair.dd

[root@dbserver]#


完美!数据块被成功的修复了。

Conclusion

ASM数据清理可以检测和自动修复有介质或逻辑损坏的数据块,它也可以纠正由于外部因素导致的坏块,比如我们上面例子里的,由非Oracle进程写入导致的损坏。

本文来自云栖社区合作伙伴“DBGEEK”

目录
相关文章
|
Rust Kubernetes 负载均衡
【服务网格】eBPF 和 Wasm:探索服务网格数据平面的未来
【服务网格】eBPF 和 Wasm:探索服务网格数据平面的未来
|
Web App开发 弹性计算 Kubernetes
全景剖析阿里云容器网络数据链路(六):ASM Istio
本篇文章主要聚焦在ASM Istio服务网格模式下,被注入pod的数据面流量转发链路情况。istio灵活注入实现了在Pod维度对流量的定制化配置和观测性,带来了业务链路角度实现的更多种的可能。
全景剖析阿里云容器网络数据链路(六):ASM Istio
|
Web App开发 弹性计算 Kubernetes
全景剖析阿里云容器网络数据链路(六)—— ASM Istio
近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的IaaS化到现在的微服务化,客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度,也一直在高速的发展和演进中,这必然对客户对云原生网络的可观测性带来了极高的门槛和挑战。为了提高云原生网络的可观测性,同时便于客户和前后线同学增加对业务链路的可读性,ACK产研和AES联合共建,合作开发ack net-exporter和云原生网络数据面可观测性系列,帮助客户和前后线同学了解云原生网络架构体系,简化对云原生网络的可观测性的门槛,优化客户运维和售后同学处理疑难问题的体验 ,提高云原生网络的链路的稳定性。
605 0
全景剖析阿里云容器网络数据链路(六)—— ASM Istio
|
Prometheus 监控 Kubernetes
Flagger on ASM·基于Mixerless Telemetry实现渐进式灰度发布系列 1 遥测数据
服务网格ASM的Mixerless Telemetry技术,为业务容器提供了无侵入式的遥测数据。遥测数据一方面作为监控指标被ARMPS/prometheus采集,用于服务网格可观测性;另一方面被HPA和flaggers使用,成为应用级扩缩容和渐进式灰度发布的基石。 本系列聚焦于遥测数据在应用级扩缩容和渐进式灰度发布上的实践,将分三篇介绍遥测数据(监控指标)、应用级扩缩容,和渐进式灰度发布。
711 0
Flagger on ASM·基于Mixerless Telemetry实现渐进式灰度发布系列 1 遥测数据
|
Kubernetes 微服务 容器
阿里云服务网格ASM公测来袭系列之五:部署应用到ASM的数据面集群中
本文介绍如何将一个应用示例部署到服务网格ASM 实例中的数据面集群中。
743 0
阿里云服务网格ASM公测来袭系列之五:部署应用到ASM的数据面集群中
|
Oracle 关系型数据库 数据库
|
SQL Web App开发 数据库
|
SQL 测试技术 数据库
|
Oracle 关系型数据库 数据库
下一篇
无影云桌面