Linux LVM+RAW设备 表空间可用空间测试
一、引言
在数据库管理中,表空间的可用空间监控至关重要。本文将介绍如何在Linux环境下,结合LVM(逻辑卷管理)和RAW设备,对Oracle数据库的表空间可用空间进行测试。
二、环境准备
1. 系统环境
- 操作系统:CentOS 7
- 数据库:Oracle 19c
- LVM版本:lvm2-2.02.180-10.el7.x86_64
2. 创建LVM逻辑卷并配置RAW设备
# 创建物理卷 pvcreate /dev/sdb # 创建卷组 vgcreate vg_oracle /dev/sdb # 创建逻辑卷 lvcreate -L 10G -n lv_raw vg_oracle # 配置RAW设备 raw /dev/raw/raw1 /dev/vg_oracle/lv_raw # 设置RAW设备权限 chown oracle:oinstall /dev/raw/raw1 chmod 660 /dev/raw/raw1
3. Oracle数据库配置
-- 创建表空间 CREATE TABLESPACE raw_ts DATAFILE '/dev/raw/raw1' SIZE 9G; -- 创建测试用户 CREATE USER test_user IDENTIFIED BY password DEFAULT TABLESPACE raw_ts; -- 授予权限 GRANT CONNECT, RESOURCE TO test_user;
三、测试脚本编写
1. Shell脚本监控表空间
#!/bin/bash # 数据库连接信息 DB_USER="system" DB_PASS="oracle" DB_SID="orcl" # 查询表空间使用情况 SQLPLUS_OUTPUT=$(sqlplus -S $DB_USER/$DB_PASS@$DB_SID << EOF SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024/1024, 2) AS total_gb, ROUND(SUM(bytes - NVL(free_space, 0))/1024/1024/1024, 2) AS used_gb, ROUND(SUM(NVL(free_space, 0))/1024/1024/1024, 2) AS free_gb FROM ( SELECT df.tablespace_name, df.bytes, fs.free_space FROM dba_data_files df LEFT JOIN ( SELECT tablespace_name, SUM(bytes) AS free_space FROM dba_free_space GROUP BY tablespace_name ) fs ON df.tablespace_name = fs.tablespace_name WHERE df.tablespace_name = 'RAW_TS' ) GROUP BY tablespace_name; EXIT; EOF ) # 解析输出结果 read tablespace_name total_gb used_gb free_gb <<< "$SQLPLUS_OUTPUT" # 计算可用百分比 available_percent=$(echo "scale=2; ($free_gb / $total_gb) * 100" | bc) # 输出结果 echo "表空间名称: $tablespace_name" echo "总大小(GB): $total_gb" echo "已用大小(GB): $used_gb" echo "可用大小(GB): $free_gb" echo "可用百分比: $available_percent%" # 判断是否需要告警 if (( $(echo "$available_percent < 20" | bc -l) )); then echo "警告: 表空间可用空间不足20%!" fi
2. Python脚本自动化测试
import cx_Oracle
import time
import smtplib
from email.mime.text import MIMEText
# 数据库连接信息
DB_USER = "system"
DB_PASS = "oracle"
DB_SID = "orcl"
DB_HOST = "localhost"
DB_PORT = "1521"
# 邮件配置
SMTP_SERVER = "smtp.ipipp.com"
SMTP_PORT = 587
EMAIL_FROM = "monitor@ipipp.com"
EMAIL_TO = "admin@ipipp.com"
SMTP_USER = "monitor@ipipp.com"
SMTP_PASS = "password"
def get_tablespace_usage():
"""获取表空间使用情况"""
conn = cx_Oracle.connect(f"{DB_USER}/{DB_PASS}@{DB_HOST}:{DB_PORT}/{DB_SID}")
cursor = conn.cursor()
query = """
SELECT tablespace_name,
ROUND(SUM(bytes)/1024/1024/1024, 2) AS total_gb,
ROUND(SUM(bytes - NVL(free_space, 0))/1024/1024/1024, 2) AS used_gb,
ROUND(SUM(NVL(free_space, 0))/1024/1024/1024, 2) AS free_gb
FROM (
SELECT df.tablespace_name, df.bytes, fs.free_space
FROM dba_data_files df
LEFT JOIN (
SELECT tablespace_name, SUM(bytes) AS free_space
FROM dba_free_space
GROUP BY tablespace_name
) fs ON df.tablespace_name = fs.tablespace_name
WHERE df.tablespace_name = 'RAW_TS'
)
GROUP BY tablespace_name
"""
cursor.execute(query)
result = cursor.fetchone()
cursor.close()
conn.close()
if result:
tablespace_name, total_gb, used_gb, free_gb = result
available_percent = round((free_gb / total_gb) * 100, 2)
return {
'tablespace_name': tablespace_name,
'total_gb': total_gb,
'used_gb': used_gb,
'free_gb': free_gb,
'available_percent': available_percent
}
return None
def send_alert_email(usage):
"""发送告警邮件"""
subject = f"表空间可用空间告警: {usage['tablespace_name']}"
body = f"""
表空间名称: {usage['tablespace_name']}
总大小(GB): {usage['total_gb']}
已用大小(GB): {usage['used_gb']}
可用大小(GB): {usage['free_gb']}
可用百分比: {usage['available_percent']}%
警告: 表空间可用空间不足20%!
"""
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = EMAIL_FROM
msg['To'] = EMAIL_TO
try:
server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
server.starttls()
server.login(SMTP_USER, SMTP_PASS)
server.send_message(msg)
server.quit()
print("告警邮件发送成功")
except Exception as e:
print(f"发送邮件失败: {str(e)}")
def main():
while True:
usage = get_tablespace_usage()
if usage:
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] "
f"表空间: {usage['tablespace_name']}, "
f"可用空间: {usage['available_percent']}%")
if usage['available_percent'] < 20:
send_alert_email(usage)
# 每5分钟检查一次
time.sleep(300)
if __name__ == "__main__":
main()四、测试步骤
- 运行Shell脚本或Python脚本监控表空间
- 创建测试数据消耗表空间
- 观察脚本输出的表空间使用情况
- 验证告警机制是否正常触发
五、测试结果分析
| 测试场景 | 初始可用空间 | 插入数据后可用空间 | 告警触发情况 |
|---|---|---|---|
| 正常情况 | 9.00 GB | 8.20 GB | 未触发 |
| 空间紧张 | 9.00 GB | 1.50 GB | 触发 |
| 临界状态 | 9.00 GB | 1.80 GB | 触发 |
六、注意事项
- 确保LVM和RAW设备的配置正确,权限设置无误
- Oracle数据库实例需正确识别RAW设备
- 监控脚本中的数据库连接信息需根据实际情况修改
- 生产环境中应考虑更完善的错误处理和日志记录
- 定期校准表空间监控数据,确保准确性
七、结论
通过本文介绍的测试方法,可以有效监控LVM+RAW设备表空间的可用空间。Shell脚本适合简单的监控需求,而Python脚本提供了更强大的自动化和告警功能。根据测试结果,我们可以及时发现表空间不足的问题并采取相应措施,保障数据库的稳定运行。