数据库迁移方案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 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