批量迁移Oracle数据文件,日志文件及控制文件

   有些时候需要将Oracle的多个数据文件以及日志文件重定位或者迁移到新的分区或新的位置,比如磁盘空间不足,或因为特殊需求。对于这种情形可以采取批量迁移的方式将多个数据文件或者日志文件实现一次性迁移。当然备份恢复也是其中的方式之一。本文主要描述如何使用批量方式来迁移数据文件,日志文件。如需要也可以将整个数据库迁移到新的位置以及重命名数据库。

1、环境及需求
  robin@SZDB:~> cat /etc/issue
  
  Welcome to SUSE Linux Enterprise Server 10 SP3 (x86_64) - Kernel \r (\l).
  
  robin@SZDB:~> sqlplus -v
  
  SQL*Plus: Release 10.2.0.3.0 - Production

  下面的迁移主要是将数据库/u02/database/SYBO2SZ下的所有文件迁移到一个新的目录/u02/database/SY5221BK下面。
  源路径:数据库SYBO2SZ所有的数据文件,日志文件,控制文件全部位于SYBO2SZ下的相应子目录。
  新路径:数据库SYBO2SZ所有的数据文件,日志文件,控制文件全部移动到SY5221BK相应的子目录下。
  
2、当前数据库文件位置(来源于数据字典)  
  sys@SYBO2SZ> @dba_files_all_2.sql
  
  Tablespace Name / File Class  Filename                                                      File Size Auto
  ----------------------------- ------------------------------------------------------- --------------- ----
  GOEX_ACCOUNT_IDX              /u02/database/SYBO2SZ/oradata/SYBO2SZ_account_idx.dbf        16,777,216 YES
  GOEX_ACCOUNT_TBL              /u02/database/SYBO2SZ/oradata/SYBO2SZ_account_tbl.dbf        25,165,824 YES
  GOEX_ARCHIVE_IDX              /u02/database/SYBO2SZ/oradata/SYBO2SZ_archive_idx.dbf        20,971,520 YES
   --    .........                  .........................
  SOE                           /u02/database/SYBO2SZ/oradata/soe.dbf                       934,043,648 YES
  SOEINDEX                      /u02/database/SYBO2SZ/oradata/soeindex.dbf                  713,031,680 YES
  SYSAUX                        /u02/database/SYBO2SZ/oradata/sysauxSYBO2SZ.dbf             325,058,560 YES
  SYSTEM                        /u02/database/SYBO2SZ/oradata/sysSYBO2SZ.dbf                524,288,000 YES
  TBST                          /u02/database/SYBO2SZ/oradata/tbst.dbf                       10,485,760 YES
  TEMP                          /u02/database/SYBO2SZ/temp/tempSYBO2SZ.dbf                  432,013,312 YES
  UNDOTBS1                      /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ.dbf               429,916,160 YES
  UNDOTBS2                      /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ2.dbf              314,572,800 YES
  [ ONLINE REDO LOG ]           /u02/database/SYBO2SZ/redolog/log3aSYBO2SZ.log               20,971,520
  [ ONLINE REDO LOG ]           /u02/database/SYBO2SZ/redolog/log3bSYBO2SZ.log               20,971,520
  [ ONLINE REDO LOG ]           /u02/database/SYBO2SZ/redolog/log4aSYBO2SZ.log               20,971,520
  [ ONLINE REDO LOG ]           /u02/database/SYBO2SZ/redolog/log4bSYBO2SZ.log               20,971,520
                                                                                        ---------------
  sum                                                                                     5,107,376,128
  
    41 rows selected.
    
3、创建相应的目录
  oracle@SZDB:/u02/database/SYBO2SZ> more mkdir_SY5221BK.sh 
  #!/bin/sh
  rm -rf /u02/database/SY5221BK/archive
  rm -rf /u02/database/SY5221BK/backup
  rm -rf /u02/database/SY5221BK/bdump
  rm -rf /u02/database/SY5221BK/cdump
  rm -rf /u02/database/SY5221BK/udump
  rm -rf /u02/database/SY5221BK/controlf
  rm -rf /u02/database/SY5221BK/oradata
  rm -rf /u02/database/SY5221BK/redolog
  rm -rf /u02/database/SY5221BK/undo
  rm -rf /u02/database/SY5221BK/temp
  rm -rf /u02/database/SY5221BK/ref_data
  rm -rf /u02/database/SY5221BK/BNR
  rm -rf /u02/database/SY5221BK/BNR/full
  rm -rf /u02/database/SY5221BK/BNR/dump
  rm -rf /u02/database/SY5221BK/dbcreatelogs 
  
  mkdir -p /u02/database/SY5221BK/flash_recovery_area 
  mkdir -p /u02/database/SY5221BK
  mkdir -p /u02/database/SY5221BK/archive
  mkdir -p /u02/database/SY5221BK/backup
  mkdir -p /u02/database/SY5221BK/bdump
  mkdir -p /u02/database/SY5221BK/cdump
  mkdir -p /u02/database/SY5221BK/udump
  mkdir -p /u02/database/SY5221BK/controlf
  mkdir -p /u02/database/SY5221BK/oradata
  mkdir -p /u02/database/SY5221BK/redolog
  mkdir -p /u02/database/SY5221BK/undo
  mkdir -p /u02/database/SY5221BK/temp
  mkdir -p /u02/database/SY5221BK/ref_data
  mkdir -p /u02/database/SY5221BK/BNR
  mkdir -p /u02/database/SY5221BK/BNR/full
  mkdir -p /u02/database/SY5221BK/BNR/dump
  mkdir -p /u02/database/SY5221BK/dbcreatelogs 
  
  oracle@SZDB:/u02/database/SYBO2SZ> ./mkdir_SY5221BK.sh 

4、实施迁移
  sys@SYBO2SZ> startup mount force;   --->切换数据库到mount状态
  ORACLE instance started.
  
  Database mounted.
  sys@SYBO2SZ> @/users/robin/dba_scripts/custom/sql/transfer_db_files -->调用脚本进行数据及日志文件的迁移
  
  Step 1, Coping file to destination from source
  ============================================
  
  Step 2, updating files to control file
  ============================================
  
  sys@SYBO2SZ> alter database open;   -->切换数据库到open状态
  
  Database altered.
  
  sys@SYBO2SZ> @dba_files_all_2.sql   -->验证切换结果
  
  Tablespace Name / File Class  Filename                                                     File Size Auto
  ----------------------------- ---------------------------------------------------------------------- ----
  GOEX_ACCOUNT_IDX              /u02/database/SY5221BK/oradata/SY5221BK_account_idx.dbf     16,777,216 YES
    --..........                        .................
  TEMP                          /u02/database/SY5221BK/temp/tempSY5221BK.dbf               432,013,312 YES
  UNDOTBS1                      /u02/database/SY5221BK/undo/undotbsSY5221BK.dbf            429,916,160 YES
  UNDOTBS2                      /u02/database/SY5221BK/undo/undotbsSY5221BK2.dbf           314,572,800 YES
  [ ONLINE REDO LOG ]           /u02/database/SY5221BK/redolog/log3aSY5221BK.log            20,971,520
  [ ONLINE REDO LOG ]           /u02/database/SY5221BK/redolog/log3bSY5221BK.log            20,971,520
  [ ONLINE REDO LOG ]           /u02/database/SY5221BK/redolog/log4aSY5221BK.log            20,971,520
  [ ONLINE REDO LOG ]           /u02/database/SY5221BK/redolog/log4bSY5221BK.log            20,971,520
                                                                                         -------------
  sum                                                                                    5,107,376,128
  
  41 rows selected.
  
  --如果仅仅是迁移数据文件以及日志文件则上述步骤完成即可
  --如果需要修改相关的参数文件以及迁移控制文件则继续下面的步骤
  --由于控制文件的在mount状态下被校验,因此我们在nomount状态下来处理
  
  sys@SYBO2SZ> shutdown immediate;
  
  sys@SYBO2SZ> startup nomount;
    
  -->修改参数文件之前先备份spfile
  sys@SYBO2SZ> create pfile='/users/oracle/OraHome10g/dbs/initSYBO2SZ_bak.ora' from spfile;
  
  File created.
  
  -->下面对相关的参数文件的路径进行修改,如果不需要修改参数,则跳过下面的步骤
  sys@SYBO2SZ> show parameter dump
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  background_core_dump                 string      partial
  background_dump_dest                 string      /u02/database/SYBO2SZ/bdump
  core_dump_dest                       string      /u02/database/SYBO2SZ/cdump
  max_dump_file_size                   string      UNLIMITED
  shadow_core_dump                     string      partial
  user_dump_dest                       string      /u02/database/SYBO2SZ/udump
  
  sys@SYBO2SZ> alter system set background_dump_dest='/u02/database/SY5221BK/bdump' scope=both sid='*';
  
  System altered.
  
  sys@SYBO2SZ> alter system set core_dump_dest='/u02/database/SY5221BK/cdump' scope=both sid='*';
  
  System altered.
  
  sys@SYBO2SZ> alter system set user_dump_dest='/u02/database/SY5221BK/udump' scope=both sid='*';
  
  System altered.
  
  sys@SYBO2SZ> show parameter db_recovery_file_dest
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  db_recovery_file_dest                string      /u02/database/SYBO2SZ/flash_re
                                                   covery_area
  db_recovery_file_dest_size           big integer 1G
  
  sys@SYBO2SZ> alter system set db_recovery_file_dest='/u02/database/SY5221BK/flash_recovery_area' scope=both;
  
  System altered.
  
  sys@SYBO2SZ> show parameter LOG_ARCHIVE_DEST_1
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  log_archive_dest_1                   string      LOCATION=/u02/database/SYBO2SZ
                                                   /archive/
  log_archive_dest_10                  string
  sys@SYBO2SZ> alter system set log_archive_dest_1='LOCATION=/u02/database/SY5221BK/archive' scope=both;   
  
  System altered.
  
  sys@SYBO2SZ> show parameter UTL_FILE_DIR
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  utl_file_dir                         string      /u02/database/SYBO2SZ/udump
  
  sys@SYBO2SZ> alter system set UTL_FILE_DIR='/u02/database/SY5221BK/udump' scope=both;
  alter system set UTL_FILE_DIR='/u02/database/SY5221BK/udump' scope=both
                   *
  ERROR at line 1:
  ORA-02095: specified initialization parameter cannot be modified  -->该参数不能修改内存值
  
  
  sys@SYBO2SZ> alter system set UTL_FILE_DIR='/u02/database/SY5221BK/udump' scope=spfile;
  
  System altered.
  
  -->下面对控制文件位置进行修改
  sys@SYBO2SZ> show parameter control_f
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  control_file_record_keep_time        integer     7
  control_files                        string      /u02/database/SYBO2SZ/controlf
                                                   /cntl1SYBO2SZ.ctl, /u02/databa
                                                   se/SYBO2SZ/controlf/cntl2SYBO2
                                                   SZ.ctl, /u02/database/SYBO2SZ/
                                                   controlf/cntl3SYBO2SZ.ctl
  
  -->将控制文件复制到新位置
  sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/controlf/cntl1SYBO2SZ.ctl /u02/database/SY5221BK/controlf/cntl1SY5221BK.ctl
  
  sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/controlf/cntl1SYBO2SZ.ctl /u02/database/SY5221BK/controlf/cntl2SY5221BK.ctl
  
  sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/controlf/cntl1SYBO2SZ.ctl /u02/database/SY5221BK/controlf/cntl3SY5221BK.ctl
              
  -->Author : Robinson Cheng
  -->Blog   : http://blog.csdn.net/robinson_0612
              
  -->通过修改control_files参数来修改控制文件位置                                                 
  sys@SYBO2SZ> alter system set control_files='/u02/database/SY5221BK/controlf/cntl1SY5221BK.ctl',
    2  '/u02/database/SY5221BK/controlf/cntl2SY5221BK.ctl','/u02/database/SY5221BK/controlf/cntl3SY5221BK.ctl'
    3  scope=spfile;
  
  System altered.
  
  sys@SYBO2SZ> shutdown immediate;
  
  sys@SYBO2SZ> startup mount;
  
  SQL> show parameter control_f
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  control_file_record_keep_time        integer     7
  control_files                        string      /u02/database/SY5221BK/control
                                                   f/cntl1SY5221BK.ctl, /u02/data
                                                   base/SY5221BK/controlf/cntl2SY
                                                   5221BK.ctl, /u02/database/SY52
                                                   21BK/controlf/cntl3SY5221BK.ct
                                                   l
  
  sys@SYBO2SZ> show parameter dump
  background_core_dump                 string      partial
  background_dump_dest                 string      /u02/database/SY5221BK/bdump
  core_dump_dest                       string      /u02/database/SY5221BK/cdump
  max_dump_file_size                   string      UNLIMITED
  shadow_core_dump                     string      partial
  user_dump_dest                       string      /u02/database/SY5221BK/udump
  
  sys@SYBO2SZ> alter database open;
  
  Database altered.

5、迁移脚本
  sys@SYBO2SZ> ho more /users/robin/dba_scripts/custom/sql/transfer_db_files.sql
  Prompt
  Prompt Step 1, Coping file to destination from source
  Prompt ============================================
  Prompt
  set linesize 200
  set heading off verify off feedback off termout off pagesize 999
  define src_dir='SYBO2SZ'
  define tar_dir='SY5221BK'
  spool /tmp/cp_files.sql
  SELECT 'ho cp ' || name || ' ' || REPLACE (name, '&src_dir', '&tar_dir')
    FROM v$datafile
  UNION ALL
  SELECT 'ho cp ' || name || ' ' || REPLACE (name, '&src_dir', '&tar_dir')
    FROM v$tempfile
  UNION ALL
  SELECT 'ho cp ' || MEMBER || ' ' || REPLACE (MEMBER, '&src_dir', '&tar_dir') FROM v$logfile;
  spool off;
  
  @/tmp/cp_files.sql
  
  set termout on
  Prompt
  Prompt  Step 2, updating files to control file
  Prompt ============================================
  Prompt
  set termout off
  spool /tmp/update_cntl.sql
  SELECT    'alter database  rename file '''
         || name
         || '''  to '''
         || REPLACE (name, '&src_dir', '&tar_dir')
         || ''''
         || ';'
    FROM v$datafile
  UNION ALL
  SELECT    'alter database rename file '''
         || name
         || '''  to '''
         || REPLACE (name, '&src_dir', '&tar_dir')
         || ''''
         || ';'
    FROM v$tempfile
  UNION ALL
  SELECT    'alter database rename file '''
         || MEMBER
         || ''' to '''
         || REPLACE (MEMBER, '&src_dir', '&tar_dir')
         || ''''
         || ';'
    FROM v$logfile;
  spool off;
  set termout on;
  @/tmp/update_cntl.sql
  set heading on verify on feedback on termout on

6、后记
  a、数据迁移前建议先备份数据库
  b、我们在迁移中使用了复制(cp)方式,实际上可以直接使用移动方式(mv)
  c、需要理解数据库的启动的几个阶段。即nomount状态时不加载控制文件,mount状态时不加载数据文件及日志文件
  d、对于数据库启动阶段的深刻理解,有助于弄清楚什么状态下我们能做什么,不能做什么
  e、对于控制文件位置以及参数中相关dump文件位置可以直接通过编辑pfile文件来完成。上例使用的是修改spfile文件
  f、迁移脚本可以根据需要进行相应的修改,注意我们定义了src_dir与tar_dir
  g、可将数据库源文件夹重命名,重启数据库(open),open会校验所有文件,以防止迁移中的部分文件丢失,无误后可删除源文件夹
  h、如果需要修改数据库名,则可以通过使用nid命令修改 db name 及 dbid来完成,相当于生成了一个新的数据库

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据存储

十分钟包会MySQL插件开发

请看下面的MySQL UDF插件模版,通过C执行shell语句。所以只要替换shell语句的位置,保存并编译。duang的一下,你的MySQL插件就成功出炉。

4398
来自专栏芋道源码1024

数据库中间件 MyCAT源码分析:【单库单表】插入

本文主要基于 MyCAT 1.6.5 正式版 1. 概述 2. 接收请求,解析 SQL 3. 获得路由结果 4. 获得 MySQL 连接,执行 SQL 5. 响...

52612
来自专栏杨建荣的学习笔记

浅谈exp/imp(下) (r5笔记第84天)

相关链接:浅谈exp/imp(上) (r5笔记第81天) 你可能 不了解的dump文件 在工作中,dump文件对于dba而言是再平常不过的文件了。不过因为dum...

3309
来自专栏从零开始的linux

mysql基础语句

show命令 mysql> show databases; +--------------------+ | Database | +---...

3005
来自专栏数据和云

举一反三-分区裁剪作用的“新”发现

作者介绍 ? 赵勇 云和恩墨北区技术工程师 专注于SQL审核和优化相关工作。曾经服务的客户涉及金融保险、电信运营商、政府、生产制造等行业。 分区裁剪的定义 分区...

28810
来自专栏芋道源码1024

数据库中间件 MyCAT 源码分析 —— 【单库单表】查询

本文主要基于 MyCAT 1.6.5 正式版 1. 概述 2. 接收请求,解析 SQL 3. 获得路由结果 4. 获得 MySQL 连接,执行 SQL 5. 响...

6099
来自专栏乐沙弥的世界

Oracle 闪回特性(Flashback Version、Flashback Transaction)

--==========================================================

792
来自专栏安全

phpMyAdmin 4.7.x CSRF 漏洞利用

phpMyAdmin是个知名MySQL/MariaDB在线管理工具,phpMyAdmin团队在4.7.7版本中修复了一个危害严重的CSRF漏洞(PMASA-20...

3437
来自专栏逸鹏说道

在SQL Server里如何进行页级别的恢复

在今天的文章里我想谈下每个DBA应该知道的一个重要话题:在SQL Server里如何进行页级别还原操作。假设在SQL Server里你有一个损坏的页,你要从最近...

2765
来自专栏杨建荣的学习笔记

一个SQL性能问题的优化探索(一)(r11笔记第33天)

今天同事问我一个问题,看起来比较常规,但是仔细分析了一圈,发现实在是有些晕,我隐隐感觉这是一个bug,但是有感觉问题还有很多需要确认和理解的细节。 同事...

3519

扫码关注云+社区

领取腾讯云代金券