面试宝典:介绍下Oracle数据库动态性能视图 V$PROXY_DATAFILE

在这里插入图片描述
好的,我们来对 Oracle 19C 中的 V$PROXY_DATAFILE 动态性能视图进行一次全面、深入的详解。这个视图是 Oracle Recovery Manager (RMAN) 备份环境中用于监控数据文件代理备份状态的核心工具。

1. 作用与概述

V$PROXY_DATAFILE 动态性能视图提供了关于使用 RMAN PROXY COPY 功能备份数据文件(Datafiles)实时状态和元数据信息

核心作用:监控和诊断通过 PROXY COPY 方式将数据文件从磁盘备份到第三方介质(如磁带库)的作业。它允许您查看哪些数据文件正在被备份、备份的进度、以及是否成功完成。

关键概念:PROXY COPY for Datafiles

  • 普通 RMAN 备份:RMAN 进程读取数据文件块,通过服务器进程内存(PGA/SGA)传递,再写入备份片。
  • PROXY COPY for Datafiles:RMAN 将整个数据文件控制权直接交给媒体管理器(Media Manager)。由媒体管理器(如 Veritas NetBackup, IBM TSM)直接负责从存储读取数据文件并写入备份设备(如磁带),绕过了数据库服务器的内存
  • 优势:极大减少了数据库服务器的 CPU 和内存开销,特别适合超大型数据文件(如数TB大小)的备份。
  • 视图焦点V$PROXY_DATAFILE 专门监控对数据文件(Datafiles)的 PROXY COPY 操作。对归档日志的 PROXY COPYV$PROXY_ARCHIVEDLOG 视图监控。

2. 使用场景

  1. 监控正在进行的数据文件 Proxy 备份:实时查看哪些数据文件正在被备份到第三方设备,以及备份的状态。
  2. 验证备份作业结果:检查数据文件的 Proxy 备份是否成功完成(STATUS = 'COMPLETED'),或是否失败(STATUS = 'FAILED')。
  3. 诊断备份问题:当备份失败或性能不佳时,查看该视图获取会话和错误信息,辅助故障排除。
  4. 审计和报告:获取已备份数据文件的列表、大小等信息,用于合规性审计或生成备份报告。

3. 字段含义详解

以下是 V$PROXY_DATAFILE 视图的主要字段及其含义的详细表格。

字段名类型含义详解
SESSION_RECIDNUMBER会话记录ID:唯一标识此备份操作的内部序列号。与 V$RMAN_BACKUP_JOB_DETAILS.RECID 相关联,可用于连接到更高级别的 RMAN 作业信息。
SESSION_STAMPNUMBER会话时间戳:与 SESSION_RECID 共同组成主键,唯一标识一次 RMAN 会话。同样与 V$RMAN_BACKUP_JOB_DETAILS.STAMP 关联。
DEVICE_TYPEVARCHAR2(17)设备类型:执行备份的设备类型。对于 PROXY COPY,此值通常为 SBT_TAPE (System Backup to Tape),表示备份目标是磁带库系统。
HANDLEVARCHAR2(513)备份句柄:媒体管理器为此次备份分配的唯一名称或句柄。用于在恢复时标识备份集。
STATUSVARCHAR2(9)备份状态核心字段。表示此数据文件的 Proxy 备份当前状态。
- RUNNING: 备份正在进行中。
- COMPLETED: 备份已成功完成。
- FAILED: 备份失败。
FILE#NUMBER数据文件编号核心字段。正在被备份的数据文件的编号。与 V$DATAFILE.FILE#DBA_DATA_FILES.FILE_ID 对应。
BYTESNUMBER字节数:要备份的数据文件的大小(字节)。
BLOCKSNUMBER块数:要备份的数据文件的块数。
BUFFERSNUMBER缓冲区数:已为此备份操作分配的缓冲区数量。
ELAPSED_SECONDSNUMBER耗时(秒):此备份操作到目前为止所花费的总时间(秒)。
SIDNUMBER会话标识符:执行此备份操作的数据库会话的 SID。可与 V$SESSION 关联。
SERIAL#NUMBER会话序列号:会话的序列号。与 SID 一起用于唯一标识会话。
CREATE_TIMEDATE创建时间:数据文件在数据库中创建的时间。
RESETLOGS_IDNUMBERResetlogs SCN 标识:标识数据库在 OPEN RESETLOGS 时的 SCN。用于区分不同 incarnations 的数据文件。
RESETLOGS_TIMEDATEResetlogs 时间:数据库执行 OPEN RESETLOGS 操作的时间。

4. 相关视图与基表

  • V$PROXY_DATAFILE_DETAILS最直接的相关视图。提供数据文件代理备份的详细异步 I/O 性能统计(如每次I/O的耗时、吞吐率)。用于深度性能诊断,是 V$PROXY_DATAFILE 的细化。
  • V$PROXY_ARCHIVEDLOG:用于监控归档日志代理备份的视图。功能与本视图类似,但对象不同。
  • V$RMAN_BACKUP_JOB_DETAILS:提供更高层次的 RMAN 作业信息(如作业开始/结束时间、状态、输入/输出字节数)。通过 SESSION_RECIDSESSION_STAMP 与本视图关联。
  • V$DATAFILE:通过 FILE# 关联,可以获取数据文件的详细信息(如名称、表空间、状态)。
  • V$SESSION:通过 SIDSERIAL# 关联,可以获取执行备份操作的服务器会话的详细信息。
  • 基表 (Underlying Table)V$PROXY_DATAFILE 的数据来源于控制文件中的 RMAN 备份元数据。其底层 X 表 ∗ ∗ 通常是 ∗ ∗ ‘ X 表** 通常是 **`X 通常是XKRCBDF` (Kernel Recovery Controller Backup DataFile) 或类似名称的内部结构,专门用于记录数据文件代理备份的元数据。

5. 底层详细原理与相关知识点

  1. PROXY COPY for Datafiles 工作流程

    1. RMAN 会话启动,分配 SBT_TAPE 通道。
    2. 发出 BACKUP AS COPY PROXY DATAFILE ...BACKUP AS COPY PROXY TABLESPACE ... 命令。
    3. RMAN 与媒体管理库(Media Management Library, MML)交互。
    4. 关键步骤:RMAN 将数据文件句柄(如 /path/to/datafile.dbf)和控制权传递给媒体管理器。
    5. 媒体管理器直接访问数据库服务器的文件系统,读取数据文件内容,并将其直接写入磁带或其他设备。
    6. RMAN 定期轮询媒体管理器以获取备份进度,并更新控制文件中的元数据,V$PROXY_DATAFILE 视图则反映了这些元数据。
    7. 备份完成后,媒体管理器将备份句柄(HANDLE)返回给 RMAN,RMAN 将其记录在控制文件中。
  2. 与普通备份的区别

    特性普通备份 (BACKUP DATAFILE)代理备份 (BACKUP PROXY DATAFILE)
    数据路径存储 -> DB Buffer -> RMAN -> 备份片存储 -> 媒体管理器 -> 备份设备
    DB服务器负载高(CPU/内存,用于读取和校验)低(主要是管理开销)
    控制文件记录V$BACKUP_FILES, V$BACKUP_ASYNC_IOV$PROXY_DATAFILE, V$PROXY_DATAFILE_DETAILS
    依赖项仅RMANRMAN + 第三方媒体管理软件
  3. 重要注意事项

    • 一致性:代理备份仍然保证一致性的读取。它通过基于时间点或SCN的机制来确保备份的数据文件块是一致的。
    • 增量备份:通常,PROXY COPY 用于完整备份。增量备份通常不使用此功能,因为增量备份需要数据库内核来识别更改的块。
    • 恢复:从代理备份中恢复时,媒体管理器负责将数据直接从备份设备写回文件系统,同样绕过了数据库内存。

6. 常用查询 SQL

1. 监控当前正在进行的数据文件 Proxy 备份
查看哪些文件正在被备份以及实时状态。

SELECT file#,
       status,
       ROUND((bytes / (1024*1024)), 2) AS size_mb,
       ROUND((elapsed_seconds / 60), 2) AS elapsed_min,
       sid,
       serial#
FROM v$proxy_datafile
WHERE status = 'RUNNING'
ORDER BY file#;

2. 查看最近的数据文件 Proxy 备份作业结果
检查过去一段时间内完成的备份作业是成功还是失败。

SELECT file#,
       status,
       ROUND((bytes / (1024*1024)), 2) AS size_mb,
       ROUND((elapsed_seconds / 60), 2) AS elapsed_min,
       handle
FROM v$proxy_datafile
WHERE status IN ('COMPLETED', 'FAILED')
AND elapsed_seconds > 0
ORDER BY elapsed_seconds DESC;

3. 关联 V$DATAFILE 获取文件详情
将备份状态与数据文件信息结合,获得更完整的视图。

SELECT d.file#,
       d.name AS datafile_name,
       t.name AS tablespace_name,
       p.status,
       ROUND(p.bytes / (1024*1024), 2) AS size_mb,
       p.elapsed_seconds
FROM v$proxy_datafile p
JOIN v$datafile d ON p.file# = d.file#
JOIN v$tablespace t ON d.ts# = t.ts#
WHERE p.status = 'RUNNING'
ORDER BY t.name, d.name;

4. 诊断失败的 Proxy 备份
查找失败的备份并获取其会话信息,以便进一步排查。

SELECT 
    p.file#,
    p.status,
    p.elapsed_seconds,
    p.sid,
    p.serial#,
    s.module,
    s.action,
    s.client_info -- 通常这里会显示 'rman'
FROM v$proxy_datafile p
LEFT JOIN v$session s ON (p.sid = s.sid AND p.serial# = s.serial#)
WHERE p.status = 'FAILED'
AND p.elapsed_seconds > 0;

5. 关联高级别的 RMAN 作业信息
将详细的代理备份记录与父RMAN作业关联。

SELECT 
    p.file#,
    p.status AS file_status,
    ROUND(p.bytes / (1024*1024), 2) AS size_mb,
    j.start_time,
    j.end_time,
    j.status AS job_status,
    j.output_device_type
FROM v$proxy_datafile p
JOIN v$rman_backup_job_details j 
  ON (p.session_recid = j.recid AND p.session_stamp = j.stamp)
WHERE j.start_time > SYSDATE - 1
ORDER BY j.start_time DESC, p.file#;

总结

V$PROXY_DATAFILE 视图是管理和监控使用 RMAN PROXY COPY 功能进行数据文件备份核心状态视图。它的核心价值在于:

  1. 提供状态透明度:使 DBA 能够洞察由第三方媒体管理器执行的数据文件备份的当前状态(运行中、完成、失败)。
  2. 辅助基本诊断:通过状态、耗时等信息,帮助初步判断备份是否正常完成。
  3. 验证和审计:确认关键数据文件是否已成功备份到离线介质。
  4. 故障排除入口:当备份失败时,提供关键的会话和文件标识符,便于进一步排查。

对于使用了第三方企业级备份软件来卸载大型数据文件备份负载的环境,熟练掌握此视图是确保备份操作可见性和可控性的基础。如需进行深度性能分析,应进一步查询 V$PROXY_DATAFILE_DETAILS 视图。

欢迎关注我的公众号《IT小Chen

user user01; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; upstream myserver { server 23.48.16.18:9125 weight=1 max_fails=2; server 23.48.16.19:9125 backup weight=2 max_fails=2; keepalive 256; } server { listen 8090; server_name 23.48.16.20; root /home/user01/data/23.48.16.20/; index index.html index.htm; client_max_body_size 20M; #charset koi8-r; #access_log logs/host.access.log main; location ^~ /api/ { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://myserver/; } location ^~ /file/ { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://23.48.16.18/; } location ^~ /api/oauth/api/ { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:9127/; } location ^~/upload/ { #return 301 http://192.168.30.41:9008$request_uri; alias /; index index.html index.htm; try_files $uri @new_images; } location @new_images { proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $remote_addr; client_body_buffer_size 10M; client_max_body_size 10G; proxy_buffers 1024 4k; proxy_read_timeout 300; proxy_next_upstream error timeout http_404; proxy_pass http://23.48.16.18:9000/; } location /upload { proxy_pass http://192.168.30.248:8077/upload; # ѡ ݿͻ ʵIP ͷ Ϣ proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } server { listen 9129; server_name 23.48.16.20; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { listen 9000; server_name 23.48.16.20; root /home/user01/data/peidian.aio/dist; index index.html index.htm; #charset koi8-r; #access_log logs/host.access.log main; location ^~ /api/ { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://myserver/; } location ^~ /file/ { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://23.48.16.18/; } location ^~ /api/oauth/api/ { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:9127/; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} } 这样对吗
11-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值