好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

数据库迁移方案01

环境描述 : 源数据库 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

环境描述 :

源数据库

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_name 是 oracle 数据库参数 . 而 oracle_sid 是操作系统的环境变量 . Oracle_sid 用于于操作系统交互 , 也就是说 , 从操作系统角度访问实例名 , 必须通过 oracle_sid.

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

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

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

为了解决这种情况 , 引入了 db_domain 参数 , 这样在数据库的标识是由 db_name 和 db_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_name 和 sid

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

在本例中,假设原来的数据库名为 orcl , 要改成 oradb , 原实例名( service_name, instance_name ) orcl 要改成 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 。 这个名称需要使用 oracle 的 oradim 工具进行修改。

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)
// 如果此处不修改路径中的 zs 到 zstest 则后面应无需重建控制文件
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.ora 和 tnsnames.ora 并重启 listener

直接编辑这两个文件将里面的 sid_name 、 dbname 和 service_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 的错误

Oracle 的 spfile 是一个二进制文件 , 这个文件不能采用手工修改的方式进行维护 . 可以选择的维护方式有两种 , 一是在登录到服务器后使用 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

查看更多关于数据库迁移方案01的详细内容...

  阅读:49次