问题现象:
技术交流群里有位朋友反馈在对Oracle数据库执行添加数据文件(30G大小)操作时,报错如下,数据库版本19C:
ORA-19502: write error on file "/xxx/xxx.dbf", block number xxxxx (block size=8192)
问题分析:
创建表空间和添加数据文件属于基础操作,本以为分分钟搞定的问题,却一时间难住了众多大佬。
首先排查磁盘空间剩余容量,df -h,df -i检查空间、inode非常充足,远远大于30GB。
这时有位大佬提出一个非常有价值的建议,他怀疑df -h看到的磁盘空间并不准确,比如虚拟机上看到的剩余磁盘空间还有100GB,但实际虚拟机所在宿主机物理磁盘只有2GB可用空间,这时超过2GB的数据肯定是无法写入的,建议使用cp命令拷贝一个大文件到数据文件目录,经测试文件确实无法写入,提示:No space left on device ,显然df -h看到可用空间,远远小于实际可用空间。
但这位朋友反馈,并没有使用虚拟机,使用的是物理机,那么还有什么原因会导致df -h数据不准确呢,之前遇到过nas存储查看空间使用率不准确。还有带有特殊压缩功能的存储不准确,但这种情况大多数实际可用空间大于df -h显示的可用空间。
这时另一个大佬提出了一个非常重要的概念:“精简卷”,最终也定位到确实是这个精简卷导致的问题,很显然,又触到我的知识盲区了。
到底什么是“精简卷呢”?
redhat官网有详细介绍,相关链接如下:
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/configuring_and_managing_logical_volumes/creating-and-managing-thin-provisioned-volumes_configuring-and-managing-logical-volumes
第 11 章 创建和管理精简配置的卷(精简卷)
Red Hat Enterprise Linux 支持精简配置的快照卷和逻辑卷。
逻辑卷和快照卷可以是精简配置的:
使用精简配置的逻辑卷,您可以创建大于可用物理存储的逻辑卷。
使用精简配置的快照卷,您可以在同一数据卷中存储更多虚拟设备。
###看上去很不错的功能,是不是要谢谢你呢?###
11.1. 精简配置概述
很多现代存储堆栈现在提供在密集配置和精简配置之间进行选择的能力:
密集配置提供了块存储的传统行为,其中块的分配与其实际用途无关。
精简配置允许置备更大的块存储池,其大小可能大于存储数据的物理设备,从而导致过度配置。
过度置备可能是因为单个块在实际使用之前没有被分配。
如果您有多个共享同一池的精简置备设备,那么这些设备可以是过度配置的。
通过使用精简配置,您可以超额使用物理存储,且可以管理称为精简池的可用空间池。
当应用程序需要时,您可以将这个精简池分配给任意数量的设备。
当需要有效分配存储空间时,您可以动态扩展精简池。
例如,如果 10 个用户的每个用户都为他们的应用程序请求一个 100GB 的文件系统,那么您可以为每个用户创建一个 100GB 的文件系统,但其由较少的实际存储支持,仅在需要时使用。
注意
在使用精简配置时,监控存储池,并在可用物理空间耗尽时添加更多容量是非常重要的。
以下是使用精简配置的设备的一些优点:
1.您可以创建大于可用物理存储的逻辑卷。
以下是使用精简配置的设备的潜在缺陷:
1.精简配置的卷存在耗尽可用物理存储的固有风险。
例如,如果您创建了 10T 的精简配置的存储,而只有 1T 的物理存储来支持,则卷将在 1T 耗尽后不可用或不可写。
2.如果卷在精简配置的设备后没有向层发送丢弃,那么对使用情况的统计将不准确。
例如,在不使用 -o discard mount 选项的情况下放置文件系统,且不在精简配置的设备之上定期运行 fstrim,则永远不会不分配之前使用的存储。
精简卷测试过程:
测试数据库:Oracle 11.2.0.4.0
新增加一个2GB大小的磁盘
[root@cjc-db-01 ~]# lsblk
[root@cjc-db-01 ~]# fdisk -l
创建PV
pvcreate dev/sdb
创建VG
vgcreate vg_chenjch /dev/sdb
创建精简池
[root@cjc-db-01 ~]# lvcreate -L 1G -T vg_chenjch/mythinpool
创建精简卷
[root@cjc-db-01 ~]# lvcreate -V 100G -T vg_chenjch/mythinpool -n thinvolume
可以看到,总磁盘大小2GB,分配1GB给精简池,从精简池中又分配100GB的空间给精简卷,远大于磁盘、VG、精简池的大小,从而导致了df -h数据不准确。
查看创建的精简池和精简卷
[root@cjc-db-01 soft]# lvs -a -o +devices
[root@cjc-db-01 soft]# lsblk
可以看到,sdb磁盘总大小2GB,下面的卷100GB。
sdb 8:16 0 2G 0 disk
格式化
[root@cjc-db-01 ~]# mkfs -t xfs /dev/mapper/vg_chenjch-thinvolume
挂载
[root@cjc-db-01 ~]# mkdir /oradata
查看可用空间,显示100G。
[root@cjc-db-01 ~]# df -h /oradata/
授权
[root@cjc-db-01 ~]# chown oracle:oinstall /oradata
创建表空间,数据文件大小800MB
SQL> create tablespace cjc datafile '/oradata/cjc_tbs01.dbf' size 800M;
添加数据文件,在添加一个800MB数据文件
由于1600MB大于1GB,所以添加失败。
SQL> alter tablespace cjc add datafile '/oradata/cjc_tbs02.dbf' size 800M;
错误号和那位朋友遇到的不同,他的错误号是ORA-19502、ORA-27072,我模拟出的错误号是ORA-01119,ORA-27052,不清楚是因为数据库版本还是其他什么原因导致错误号不一样,简单看下相关错误号说明。
[oracle@cjc-db-01 oradata]$ oerr ora 01119
[oracle@cjc-db-01 oradata]$ oerr ora 19502
虽然df -h显示还有大量可用空间,由于精简卷的原因,可用空间并不准确。
[root@cjc-db-01 soft]# df -h /oradata/
为了少踩坑,请远离“精简卷”。
###chenjuchao 20240120###
欢迎关注我的公众号《IT小Chen》