1. 概述
实施目的:将 Oracle 11g (11.2.0.4) 单实例物理备库的指定数据文件迁移至新的磁盘目录,以解决原目录空间不足或存储规划调整的问题。
适用环境:Oracle 11.2.0.4 (Linux / 单实例 / 物理备库 Physical Standby)。
核心原则:在保障 Data Guard 主备同步链路不被破坏的前提下,通过 MOUNT 状态离线完成操作系统级的文件迁移与控制文件指针更新。
2. 风险评估与回退计划
风险评估:操作期间需短暂停用日志应用进程(MRP),主备库将产生短暂的同步延迟。由于是备库操作,不影响主库业务,整体风险较低。
回退计划:实施过程中若发生异常(如新存储不可写、系统报错),只需在数据库中执行反向重命名(将控制文件指针改回原目录),并重新启动 MRP 进程即可恢复原有同步状态。旧数据文件在彻底验证成功前严格保留,不做删除。
3. 实施前准备工作
3.1 操作系统资源确认
登录备库所在的 Linux 服务器,检查目标目录的空间是否充裕,并创建新目录:
Bash
# 1. 检查目标磁盘可用空间
df -h
# 2. 创建新目录(假设目标目录为 /u02/oradata/newdir/)
mkdir -p /u02/oradata/newdir/
# 3. 授权 Oracle 用户及属组
chown -R oracle:oinstall /u02/oradata/newdir/
chmod -R 755 /u02/oradata/newdir/
3.2 数据库当前状态信息收集
以 oracle 用户登录数据库,记录当前数据文件路径和备库同步状态:
SQL
sqlplus / as sysdba
-- 1. 记录需要迁移的旧数据文件绝对路径
SELECT file#, name, status FROM v$datafile;
-- 2. 确认当前 MRP 进程状态(正常应为 APPLYING_LOG 等状态)
SELECT process, status, thread#, sequence# FROM v$managed_standby WHERE process LIKE 'MRP%';
4. 详细实施步骤
步骤 4.1:停止备库日志应用
为防止在迁移期间主库发生文件变更影响备库,需停止 Data Guard 的 MRP 同步进程。
SQL
-- 取消日志应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
步骤 4.2:修改备库文件管理参数
将文件管理模式修改为手动,避免主库的 DDL 操作在此时同步过来产生冲突。
SQL
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=MANUAL;
步骤 4.3:重启备库至 MOUNT 状态
确保数据文件在 OS 层面未被任何会话锁定(特别针对开启了 ADG / Read Only 状态的备库)。
SQL
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
步骤 4.4:在操作系统层迁移文件
保持 SQL*Plus 窗口不关,新开一个终端窗口(或使用系统层命令),将数据文件拷贝到新目录。
(注:推荐使用 cp 保留原文件以作备份,若存储空间极度紧张方可使用 mv。)
Bash
# 以 oracle 用户执行拷贝操作
cp /u01/oradata/olddir/users01.dbf /u02/oradata/newdir/users01.dbf
# 验证新文件的权限和属组是否为 oracle:oinstall
ls -lh /u02/oradata/newdir/users01.dbf
步骤 4.5:更新数据库控制文件
回到 SQL*Plus 界面,更新控制文件中的数据文件位置。
SQL
-- 将文件指针更新为新目录
ALTER DATABASE RENAME FILE '/u01/oradata/olddir/users01.dbf' TO '/u02/oradata/newdir/users01.dbf';
-- (如有多个文件,请逐一执行 RENAME 操作)
步骤 4.6:恢复自动管理并重启同步
文件指针修改完毕后,恢复自动管理参数,并重新拉起 MRP 进程。
SQL
-- 1. 恢复文件自动管理
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
-- 2. 重新开启实时日志应用 (ADG 实时应用推荐使用 USING CURRENT LOGFILE)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
注意: 如果您的备库需要提供 Active Data Guard (ADG) 的只读查询服务,请在启动 MRP 前,先将数据库 OPEN,再开启同步:
SQL
ALTER DATABASE OPEN;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
5. 实施后验证
实施完成后,进行以下三项验证以确保系统恢复正常:
SQL
-- 1. 验证数据文件路径是否已指向新目录
SELECT file#, name FROM v$datafile;
-- 2. 验证 MRP 进程是否正常运行且不处于 ERROR 状态
SELECT process, status, thread#, sequence# FROM v$managed_standby WHERE process LIKE 'MRP%';
-- 3. 检查主备延迟情况 (检查 applied 归档序号是否与主库一致)
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED='YES';
同时,建议通过操作系统命令实时查看一次告警日志,确认无 ORA- 报错:
Bash
tail -200f $ORACLE_BASE/diag/rdbms/<db_unique_name>/<instance_name>/trace/alert_<instance_name>.log
6. 清理工作与后续配置
确认主备库完全同步,且业务运行至少 1-2 天无异常后,执行以下清理工作:
清理旧文件:在操作系统层删除原路径下的旧数据文件以释放空间。
Bash
rm /u01/oradata/olddir/users01.dbf
检查参数映射 (视未来规划而定):如果主库后续还会在对应的旧目录创建新文件,请修改备库的初始化参数 db_file_name_convert,建立主库旧目录到备库新目录的映射规则,防止未来同步报错。
|