Menu Close

Oracle数据库迁移数据文件、日志文件以及控制文件

环境

操作系统:CentOS Linux release 7.9.2009 (Core)
数据库:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0(非容器数据库,非ASM文件管理)
旧文件目录:/oradata/
新文件目录:/home/oradata/

步骤1. 先查看各类文件所在的磁盘位置

1.1. 数据文件

  • 查看磁盘位置

    SELECT *
    FROM dba_data_files;

    file

  • 生成数据文件名更换的SQL语句

    SELECT 'ALTER DATABASE RENAME FILE ''' ||
       a.FILE_NAME || ''' TO ''' ||
       '/home' || a.FILE_NAME || ''';'
    FROM dba_data_files a;
  • 迁移语句示例

    ALTER DATABASE RENAME FILE '/oradata/xxxx/system01.dbf' TO '/home/oradata/xxxx/system01.dbf';
    ALTER DATABASE RENAME FILE '/oradata/xxxx/sysaux01.dbf' TO '/home/oradata/xxxx/sysaux01.dbf';
    ALTER DATABASE RENAME FILE '/oradata/xxxx/undotbs01.dbf' TO '/home/oradata/xxxx/undotbs01.dbf';
    ALTER DATABASE RENAME FILE '/oradata/xxxx/users01.dbf' TO '/home/oradata/xxxx/users01.dbf';

1.2. 联机重做日志文件

  • 查看磁盘位置

    SELECT *
    FROM v$logfile;

    file

  • 生成数据文件名更换的SQL语句

    SELECT 'ALTER DATABASE RENAME FILE ''' ||
       a.MEMBER || ''' TO ''' ||
       '/home' || a.MEMBER || ''';'
    FROM v$logfile a;
  • 迁移语句示例

    ALTER DATABASE RENAME FILE '/oradata/xxxx/redo03.log' TO '/home/oradata/xxxx/redo03.log';
    ALTER DATABASE RENAME FILE '/oradata/xxxx/redo02.log' TO '/home/oradata/xxxx/redo02.log';
    ALTER DATABASE RENAME FILE '/oradata/xxxx/redo01.log' TO '/home/oradata/xxxx/redo01.log';

1.3. 临时文件

  • 查看磁盘位置

    SELECT *
    FROM dba_temp_files;

    file

  • 生成临时文件名更换的SQL语句

    SELECT 'ALTER DATABASE RENAME FILE ''' ||
       a.file_name || ''' TO ''' ||
       '/home' || a.file_name || ''';'
    FROM dba_temp_files a;
  • 示例

    ALTER DATABASE RENAME FILE '/oradata/xxxx/mypdb/ET_TEMP.dbf' TO '/home/oradata/xxxx/mypdb/ET_TEMP.dbf';
    ALTER DATABASE RENAME FILE '/oradata/xxxx/temp01.dbf' TO '/home/oradata/xxxx/temp01.dbf';

1.4. 控制文件

  • 查看磁盘位置
    SELECT *
    FROM v$controlfile;

    file

步骤2. 创建一个pfile

SQL> create pfile from spfile;

在目录 $ORACLE_HOME/dbs中查看 init+实例名的文件。
file

步骤3. 正常关闭数据库

SQL> shu immediate;

file

步骤4. 将数据文件、日志文件、临时文件、控制文件都拷贝到新的目录中

注意:是拷贝文件,不是mv,防止移动文件时出错!

4.1. 将旧文件目录拷贝到新的目录

~]# cp -r /oradata /home/
~]# chown -R oracle:oinstall /home/oradata

file

4.2. 将旧文件目录重命名

~]# mv /oradata /oradataBak

步骤5. 修改控制文件位置并启动数据库到mount状态

5.1. 修改步骤2生成的pfile文件中控制文件的位置

file

5.2. 通过pfile启动到mount状态

SQL> startup pfile='/u01/app/oracle/product/19.3.0/dbhome_1/dbs/initxxxx.ora' mount;

file

步骤6. 修改数据库中各个文件的位置

6.1. 数据文件

示例:
file

6.2. 日志文件

示例:
file

6.3. 临时文件

示例:
file

7. 创建新的spfile,并重新启动数据库

SQL> create spfile from pfile;
SQL> shu immediate;
SQL> startup;

file

8. 日志切换无法完成

  • 新建了一组日志

    SQL> alter database add logfile member '/home/oradata/xxxx/redo01_1.log' to group 1;
    SQL> alter database add logfile member '/home/oradata/xxxx/redo02_1.log' to group 2;
    SQL> alter database add logfile member '/home/oradata/xxxx/redo03_1.log' to group 3;
  • 删除了旧的日志

    SQL> alter database drop logfile member '/home/oradata/xxxx/redo01.log';
    SQL> alter database drop logfile member '/home/oradata/xxxx/redo02.log';
    SQL> alter database drop logfile member '/home/oradata/xxxx/redo03.log';
  • 查看日志文件

    SQL> select group#,member from v$logfile;

附录

附录A:参考文档

潇湘隐者 - ORACLE 移动数据文件 控制文件 重做日志文件