数据库迁移方案01

来源:互联网 发布:4636设置手机网络类型 编辑:程序博客网 时间:2024/05/01 17:42

环境描述:

源数据库

Oracle服务器版本:  Oracle9.2.0.8

数据库名称 db_name = oradb  instance_name=oradb

操作系统版本: windows 2003

实例安装位置: $oracle_base = e:/oracle

 

目标数据库

Oracle服务器版本:  Oracle9.2.0.8

数据库名称 db_name = orcl  instance_name=orcl

操作系统版本: windows xp

实例安装位置: $oracle_base = d:/oracle

 

执行步骤.

, 数据库名称和sid要求相同

1.1 数据库名称的相关概念

, 数据库名

数据库名是数据库的身份证号码, 用于表示一个数据库. 在参数文件(?/database/initSID.ora)中用DB_NAME表示.

*.db_domain=''

*.db_file_multiblock_read_count=16

*.db_name='oradb'

*.instance_name='oradb'

数据库名是在安装数据库, 创建新的数据库, 创建数据控制文件, 修改数据库结构, 备份与恢复数据库时都需要使用到的.

查询数据库名称:

n         Select name, dbid from v$database;

u       Show parameter db_name;

u       查看参数文件initsid.ora

, 数据库实例名

数据库实例名是用户和操作系统进行联系的标识, 也就是说数据库和操作系统之间的交互使用的是数据库实例名.

实例名在参数文件中也存在, 该参数为instance_name.

数据库名和实例名可以相同也可以不同, 在一般情况下, 数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(oracle实时应用集群), 数据库名和实例名是一对多的关系.

查询当前数据库实例名.

Ø         使用sql语句. Select instance_name from v$instance;

Ø         使用show命令. Show parameter instance_name;

Ø         查看参数文件initsid.ora.

数据库实例名和oracle_sid两者都表示oracle实例, 但是有区别的. Instance_nameoracle数据库参数. oracle_sid是操作系统的环境变量. Oracle_sid用于于操作系统交互, 也就是说, 从操作系统角度访问实例名, 必须通过oracle_sid.

Oracle_sidinstance_name必须是一致的, 否则用户将会受到一个错误. unix平台, oracle not available, winnt平台, tns, 协议适配器错误.

, 数据库域名与全局数据库名

随着由多个数据库构成的分布式数据库的普及, 单一的db_name表示的数据库命名方式给数据库的管理造成了一定的负担. 因为分布式环境下的数据库名字可能一样, 造成管理上的混乱.

为了解决这种情况, 引入了db_domain参数, 这样在数据库的标识是由db_namedb_domain两个参数共同决定的. 避免了因为数据库重名而造成管理上的混乱.

查询数据库域名.

Ø         使用sql命令 select value from v$parameter where name = ‘db_domain’;

Ø         使用show命令 show parameter domain

Ø         查看参数文件initsid.ora

, 数据库服务名

该参数是oracle8i新引入的. 8i之前, 我们用sid来表示数据库的一个实例, 但是在oracle的并行环境中, 一个数据库对应多个实例, 这样就需要多个网络服务名, 设置繁琐. 为了方便并行环境中的设置, 引进了service_name参数. 该参数对应一个数据库, 而不是一个实例. 该参数的初始值为db_name.db_domain, 即等于global_name. 如果数据库有域名, 则数据库服务器名就是全局数据库名; 否则, 数据库服务名与数据库名相同.

查询数据库服务名的方法.

使用sql语句: select value from v$parameter where name = ‘service_name’;

使用show命令: show parameter service_name;

查看参数文件: 在参数文件initsid.ora中查询.

, 网络服务名

网络服务名, 又称为数据库别名, 是客户端程序访问数据库时需要的配置. 屏蔽客户端如何连接到服务器端的细节, 实现了数据库的位置透明的特性. 网络服务名被记录在tnsnames.ora文件中.

, 总结

Oracle中各种命名的比较.

名称

查询方式

Db_name

Select name from v$database

Instance_name

Select instance_name from v$instance

Oracle_sid

值和instance_name相同

Db_domain

Select value from v$parameter where name = ‘db_domain’;

Global_name

Db_name.db_dommain

Service_name

Select value from v$parameter where name=’service_name’;

Net_service_name

检查tnsnames.ora文件

 

1.2 修改oracle数据库的db_namesid

一,用oracle自带的工具nid改数据库名

在本例中,假设原来的数据库名为orcl 要改成oradb 原实例名(service_name, instance_nameorcl要改成oradb

Nid是自带的工具, oracle_home/bin目录下, 以下方法假设登陆到需要修改db_name的数据库服务器本地处理。

1 mount状态下使用nid修改sid

C:/Documents and Settings/Administrator>sqlplus /nolog

SQL> conn / as sysdba

SQL> shutdown immediate

SQL> startup mount  -- nid需要在mount状态下处理。

SQL> host nid target=/ dbname=oradb

处理过程中需要与用户执行一次交互。

Change database ID and database name ORCL to ORADB? (Y/[N]) => Y

2 mount状态下修改db_name

完成上述操作后需要再次启动到mount状态修改参数文件。

SQL> shutdown immediate

SQL> startup mount

SQL> alter system set db_name=oradb scope=spfile;

SQL> shutdown immediate

3, 重建pwdsid.ora文件

Passwd文件通常放在oracle_home/database下, 文件命名形式为pwdsid.ora sid为实例名(instance_name

SQL> host orapwd file=D:/oracle/ora92/database/pwdorcl.ora password=sys_47522341 entries=5;

4 开启数据库(要open resetlogs

SQL> startup mount

SQL> alter database open resetlogs;

5, 检查修改后的结果

SQL> select name from v$database;

二, 使用oradim工具修改instance_name

执行完步骤一中的操作后, 数据库db_name变为oradb instance_name依然还是orcl 这个名称需要使用oracleoradim工具进行修改。

1 如果是windows系统, 先要将所有的oracle服务关闭, 否则会出错。

2 将之前的instance_name删除

C:/Documents and Settings/Administrator>oradim -delete -sid orcl

3 创建密码文件

SQL> host orapwd file=D:/oracle/ora92/database/pwdoradb.ora password=sys_47522341 entries=5;

4 创建一个新的sid

C:/Documents and Settings/Administrator>oradim -new -sid oradb

C:/Documents and Settings/Administrator>oradim -new -sid oradb

5 进入oracle并创建spfile

设置环境变量oracle_sid=oradb

C:/Documents and Settings/Administrator>set oracle_sid = oradb

修改spfile里实例信息(包含路径里的zs改为zstest,OS目录zs改为zstest)
//
如果此处不修改路径中的zszstest则后面应无需重建控制文件

C:/Documents and Settings/Administrator>sqlplus sys/admin as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 7 3 16:23:16 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

已连接到空闲例程。

//先从spfile创建pfile

SQL> create pfile='D:/oracle/product/10.2.0/admin/zs/pfile/init080703.ora' from
spfile='D:/oracle/product/10.2.0/db_1/database/SPFILEZS.ORA';

文件已创建。

//调整pfile里的参数后再创建spfile
SQL> create spfile='D:/oracle/product/10.2.0/db_1/database/SPFILEZSTEST.ORA' fro
m pfile='D:/oracle/product/10.2.0/admin/zstest/pfile/init080703.ora';

文件已创建。

5)更改listener.oratnsnames.ora并重启listener

直接编辑这两个文件将里面的sid_namedbnameservice_name都改为zstest

6)因为更改了OS数据库目录路径(zs改为zstest)所以需要重建controlfiles
//
创建控制文件的脚本可以再旧数据库的时候使用如下语句获得:

alter database backup controlfile to trace as 'd:/controlfile.txt';
再做修改即可使用。
SQL> CREATE CONTROLFILE REUSE DATABASE "ZSTEST" RESETLOGS  ARCHIVELOG
  2      MAXLOGFILES 16
  3      MAXLOGMEMBERS 3
  4      MAXDATAFILES 100
  5      MAXINSTANCES 8
  6      MAXLOGHISTORY 292
  7  LOGFILE
  8    GROUP 1 (
  9      'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/REDO01A.LOG',
 10      'E:/ORADATA/ZSTEST/REDO01B.LOG'
 11    ) SIZE 250M,
 12    GROUP 2 (
 13      'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/REDO02A.LOG',
 14      'E:/ORADATA/ZSTEST/REDO02B.LOG'
 15    ) SIZE 250M,
 16    GROUP 3 (
 17      'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/REDO03A.LOG',
 18      'E:/ORADATA/ZSTEST/REDO03B.LOG'
 19    ) SIZE 250M
 20  DATAFILE
 21    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/SYSTEM01.DBF',
 22    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/UNDOTBS01.DBF',
 23    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/SYSAUX01.DBF',
 24    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/USERS01.DBF',
 25    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/EXAMPLE01.DBF',
 26    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/ZSKJ_DATA01.DBF',
 27    'E:/ORADATA/ZSTEST/ZSKJ_DATA02.DBF',
 28    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/ZS_DATA01.DBF',
 29    'E:/ORADATA/ZSTEST/ZS_DATA02.DBF',
 30    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/ZS_IDXDATA01.DBF',
 31    'E:/ORADATA/ZSTEST/ZS_IDXDATA02.DBF',
 32    'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST/ZSKJ_IDXDATA01.DBF',
 33    'E:/ORADATA/ZSTEST/ZSKJ_IDXDATA02.DBF'
 34  CHARACTER SET ZHS16GBK;

控制文件已创建。

SQL> alter database open resetlogs;

数据库已更改。

//重建完控制文件记得要重新启用temp表空间,再trace的控制文件脚本里有提示
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ZSTEST
/TEMP01.DBF'
  2       SIZE 20971520  REUSE AUTOEXTEND ON NEXT 524288000  MAXSIZE 32767M;

表空间已更改。

, 镜像迁移数据文件,控制文件以及归档日志文件

2.1 数据文件存储位置

视图 v$datafile;

Select file#, name from v$datafile;

2.2 控制文件存储位置

视图 v$controlfile

Select name from v$controlfile;

2.3 联机重做日志文件存储位置

视图 v$logfile;

Select * from v$logfile;

, 镜像跟踪文件和警告文件到目标数据库

如果源数据库的安装路径和目标数据库不一致, 则需要在源数据库中先使用spfilesid.ora创建一个initsid.ora, 然后到目标数据库中修改initsid.ora对应文件的配置. 然后再创建一个spfile.ora.

3.1 在源数据库中创建pfile.

SQL> create pfile='E:/oracle/admin/oradb/pfile/initoradb20090922.ora' from spfile='E:/oracle/ora92/database/spfileoradb.ora';

3.2 将跟踪文件和警告文件镜像到目标数据库

源数据库路径.

$oracle_base/admin

3.3 在目标数据库中修改pfile

修改在3.1中生成的pfile文件initoradb20090922.ora, 将其中与目标数据库配置路径不同的地方替换为目标数据库中对应的路径

3.4 常见的手工修改spfile的错误

Oraclespfile是一个二进制文件, 这个文件不能采用手工修改的方式进行维护. 可以选择的维护方式有两种, 一是在登录到服务器后使用alter system set … scope=both/spfile来实现. 或者是先通过create pfile from spfile.. 然后修改pfile的内容. 之后使用startup pfile=’’启动数据库后,再执行create create spfile from pfile来完成对spfile的修改.

在数据库的迁移中, 只能采用第二种方式.

, 重新生成控制文件

4.1 在目标数据库中备份控制文件到跟踪文件中

首先,我们使用下述命令备份源数据库的控制文件;

SQL> alter database backup controlfile to trace as 'd:/zhanglei.txt';

4.2 修改控制文件中的内容

将上面步骤产生的控制文件中与目标数据库不匹配的内容使用目标数据库的路径替换.

CREATE CONTROLFILE REUSE DATABASE "ORADB" NORESETLOGS  ARCHIVELOG

--  SET STANDBY TO MAXIMIZE PERFORMANCE

    MAXLOGFILES 50

    MAXLOGMEMBERS 5

    MAXDATAFILES 100

    MAXINSTANCES 1

    MAXLOGHISTORY 226

LOGFILE

  GROUP 1 'E:/ORACLE/ORADATA/ORADB/REDO01.LOG'  SIZE 100M,

  GROUP 2 'E:/ORACLE/ORADATA/ORADB/REDO02.LOG'  SIZE 100M,

  GROUP 3 'E:/ORACLE/ORADATA/ORADB/REDO03.LOG'  SIZE 100M

-- STANDBY LOGFILE

 

DATAFILE

  'E:/ORACLE/ORADATA/ORADB/SYSTEM01.DBF',

  'E:/ORACLE/ORADATA/ORADB/UNDOTBS01.DBF',

  'E:/ORACLE/ORADATA/ORADB/CWMLITE01.DBF',

  'E:/ORACLE/ORADATA/ORADB/DRSYS01.DBF',

  'E:/ORACLE/ORADATA/ORADB/EXAMPLE01.DBF',

  'E:/ORACLE/ORADATA/ORADB/INDX01.DBF',

  'E:/ORACLE/ORADATA/ORADB/ODM01.DBF',

  'E:/ORACLE/ORADATA/ORADB/TOOLS01.DBF',

  'E:/ORACLE/ORADATA/ORADB/USERS01.DBF',

  'E:/ORACLE/ORADATA/ORADB/XDB01.DBF',

  'E:/ORACLE/ORADATA/ORADB/ASSM.DBF',

  'E:/ORACLE/ORADATA/ORADB/PERFSTAT01.DBF',

  'E:/ORACLE/ORADATA/ZHANGLEI.DBF',

  'E:/ORACLE/ORADATA/ORADB/CTL01.DBF'

CHARACTER SET ZHS16GBK

;

4.3 在目标数据库中执行替换后的控制文件

将上面替换后的sql语句拿到目标数据库中进行执行

完成后, 可以使用下面的语句打开数据库.

Sql> alter database open resetlogs;

4.4 生成spfile文件

SQL> create spfile='D:/oracle/ora92/database/spfileoradb.ora' from pfile='D:/oracle/admin/oradb/pfile/initoradb20090922.ora';

4.5 重启数据库完成数据库迁移

到这一步完成, 数据库已经迁移成功.

重新启动数据库, 使用spfile登录.

SQL> shutdown immediate;

SQL> startup

 

原创粉丝点击