因工作需要,需要将部署在两台虚拟机且数据库名相同的oracle数据库迁移到一台物理机上。一个数据库500G,一个100G,若不考虑数据库名相同的情况下,最简便的办法是停数据库,然后将数据文件、联机日志文件、控制文件、口令文件、spfile、tnsname等文件一并拷贝到新服务器上即可直接使用,但是数据库名、实例名相同则无法这样实现。
本计划通过冷备份的方式将500G的数据库拷贝到新服务器上,然后再通过expdp或exp方式将100G的数据库导入到新服务器上实现迁移的目的,但是在使用exp的过程中出现特殊字符类型无法导出,该方式便无法实现,便有了本次数据库名及实例名修改的试验。
从网上大致看了下修改方法,结合我的环境情况做些修改,更简单即可实现:
一、在新服务器上新建一个数据库实例powersi,原库的实例名为orcl。
1、创建完成后,关闭数据库,并删除新建实例的数据文件、联机日志文件、控制文件。
2、将orcl库使用nohup scp方式远程拷贝到新库中对应的datafile、online file、controlfile文件位置;
(另外说明后台scp方法:nohup scp *.dbf oracle@192.168.168.220:/oradata/ 回车后按照提示输入密码,再按CTRL+Z将任务挂住,之后再输入命令bg放在后台继续执行。)
二、手工创建控制文件,修改数据库名
在新库上以nomount 方式启动数据库,手工创建控制文件,命令如下:
CREATE CONTROLFILE SET DATABASE "powersi" RESETLOGS NOARCHIVELOG
MAXLOGFILES 5
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 '/oradata/POWERSI/datafile/redo01.log' SIZE 50M,
GROUP 2 '/oradata/POWERSI/datafile/redo02.log' SIZE 50M,
GROUP 3 '/oradata/POWERSI/datafile/redo03.log' SIZE 50M
DATAFILE
'/oradata/POWERSI/datafile/system01.dbf',
'/oradata/POWERSI/datafile/sysaux01.dbf',
'/oradata/POWERSI/datafile/undotbs01.dbf',
'/oradata/POWERSI/datafile/users01.dbf',
'/oradata/POWERSI/datafile/hygeia01.dbf',
'/oradata/POWERSI/datafile/hygeia02.dbf',
'/oradata/POWERSI/datafile/hygeia03.dbf',
'/oradata/POWERSI/datafile/hygeia04.dbf',
'/oradata/POWERSI/datafile/hygeia05.dbf',
'/oradata/POWERSI/datafile/hygeia06.dbf',
'/oradata/POWERSI/datafile/hygeia07.dbf',
'/oradata/POWERSI/datafile/hygeia08.dbf',
'/oradata/POWERSI/datafile/hygeia09.dbf',
'/oradata/POWERSI/datafile/hygeia10.dbf'
CHARACTER SET ZHS16GBK;
提示“Control file created.”即完成创建,创建的文件为spfile文件中controlfile中指定的位置。
ALTER DATABASE OPEN RESETLOGS; --resetlogs方式打开数据库;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata/POWERSI/datafile/temp01.dbf' size 10g AUTOEXTEND ON NEXT 512m; --添加临时文件;
三、重启数据库实例,验证是否有问题
SQL> show parameter name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_name_convert string
db_name string powersi
db_unique_name string powersi
global_names boolean FALSE
instance_name string powersi
lock_name_space string
log_file_name_convert string
processor_group_name string
service_names string powersi
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
powersi
采用该种方式通过新建数据库实例从而修改了数据库instance name,通过重建控制文件修改了database name。重建控制文件将导致丢失rman的备份记录,所以建议迁移后立即进行rman备份。