oracle中怎么复制一个同样的用户

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中怎么复制一个同样的用户相关的知识,希望对你有一定的参考价值。

现在我的数据库中有两用户,用户拥有的资源完全一样且互相独立,开发与测试分别用一个,现在我想再复制一个,给需求用,请问,我该怎么办?

请问用户与数据库是什么关系,为什么我将机器A上的数据库导出成DMP文件后到机器B上再导入时要建个同样的同户。比较熟悉SQLSERVER,所以老是拿微软的那套来理解ORACLE,发现有很多不同。现备份还原就是。

1、再建一个用户jack,从原有的用户中把数据及表结构导出,导入到jack用户里。
备注:Oracle里的数据存储方式跟SQLServer不一样,SQLServer是一个服务可以有多个数据库,Oracle是一个服务对应一个数据库(安装好Oracle数据库后,服务名就是数据库);Oracle里的表是对应用户的,比如用jack用户建表的话,表空间默认是跟随jack的。其他的用户是看不到这个jack用户的表的。
参考技术A 如果你用数据泵你可以用REMAP_SCHEMA选项,impdp user/passwd directory=.. remap_schema=a:b
如果是老的imp/exp工具有fromuser touser选项,可以复制不通用户的数据

Oracle数据库冷备份与恢复(救命稻草)

说明,只要是同样系统,同样数据库版本,是可以做冷备恢复。冷备份数据必须是数据库不在open状态下。以oracle11gR2为例。

一、冷备份与冷恢复

具体步骤如下。

1. 复制旧的数据库文件

(1) 用SQLPlus连接数据库:
sqlplus 用户名/密码 as sysdba
(2) 关闭DB :
shutdown immediate; 
(3) 复制文件到其他地方存储实现备份
1)复制三个文件夹
admin;
oradata(datafile, controlfile,redo【注:数据文件, 控制文件,redo】);
flash_recovery_area三个文件夹。
2)dbhome_1下的内容
database(PWDfile、pfile);
dbs(spfile);
NETWORK/ADMIN(listener.ora、tnsnames.ora)。
 

2. Oracle重新建库恢复

(1)创建一个和原来一样的数据库。(安装路径和数据库名必须和原来一致)
(2)停止数据库shutdown immediate;
(3)复制安装目录下的admin、oradata、flash_recovery_area覆盖,复制database(PWDfile、pfile) 覆盖
(4)启动数据库 startup;

 

备注:

无归档模式:将备份文件拷贝回原来的目录即可,然后启动数据库。
归档模式:
①将数据文件、控制文件拷贝回原来目录
②SQL>startup mount;
SQL>recover database using backup controlfile;
③将相应的归档日志和联机日志拖到CMD命令窗口进行跑日志。
④SQL>alter database open resetlogs;

 

3. 软件重装恢复

此时,操作系统重装,如果做冷备恢复,要保证相同操作系统,相同的数据库版本。形势如同异机恢复。

A、不创建实例:(源机上的数据库名字为orcl)

(1) 恢复oradata/orcl目录

在目标机上的oradata目录下建立orcl文件夹,然后进行数据覆盖。

包括数据文件、参数文件、控制文件、日志文件、pwd文件,放在与原系统相同的目录。如果目录有所改变,则需要另外建立控制文件,修改pfile。
 
(2) 恢复admin/orcl目录
在目标机上的admin目录下建立orcl文件夹,然后在orcl里面再建立adump、bdump、cdump、udump、dpdump、pfile六个文件夹

(3) 建立服务
把源机的密码文件拷贝到目标机的database目录下。
使用oradim命令在cmd下oradim -new -sid orcl 表示建立一个服务,sid为orcl(最好名字和源机备份的数据库名字一致,就不需要重建密码文件)。如果是在linux下,不需要此步。
 
(4) 重建创建参数文件、控制文件
拷贝源机的pfile到目标机的一个目录下,修改pfile里面相关文件的路径。
然后通过SQL>create spfile from pfile=‘文件路径\'来创建参数文件。
重建控制文件命令:SQL>alter database backup controlfile to trace;
 
然后会在udump文件夹下产生一个追踪文件,打开文件找到如下一段,复制到文本中,修改相应路径然后保存为:createctl.sql文件(sql脚本文件),复制到目标机上。
注意:SQL>alter database backup controlfile to trace as \'F:/DB_RECOVERY/CONTROL_FILE_TRACE.TXT\';
复制的原始导出txt中的,相应代码片段如下:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO01.LOG\'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO02.LOG\'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG\'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE

DATAFILE
  \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\SYSTEM01.DBF\',
  \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\SYSAUX01.DBF\',
  \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\UNDOTBS01.DBF\',
  \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF\',
  \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\EXAMPLE01.DBF\',
  \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\YTQ.DBF\',
  \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\ZJHH\',
  \'E:\\APP\\ADMINISTRATOR\\PRODUCT\\11.2.0\\DBHOME_1\\DATABASE\\SDE_TBS\',
  \'I:\\ZJECMS\\DB\\DB_BK_DATA\\RMAN_LOCAL_1805\\RMAN_BKUP_1805.DBF\'
CHARACTER SET ZHS16GBK
;

(5)  数据库设置SID和启动服务

c:\\>set ORACLE_SID=orcl
c:\\>sqlplus "/as sysdba"
 
SQL>create spfile from pfile=\'c:\\pfile.txt\';
SQL>@c:\\createctl.sql;
SQL>shutdown immediate;
SQL>startup;
SQL>alter database open resetlogs;

备注:

如果(4)、(5)不好用,可以用下面的方法修改这些路径不一致的问题(反正笔者电脑上冷备份恢复时,上面的两个步骤就不好用):

1)SQL>下执行如下语句,恢复控制文件

STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292

2)修改日志、DBF的路径

alter database rename file \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO01.LOG\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\REDO01.LOG\';
  alter database rename file \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO02.LOG\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\REDO02.LOG\';
  alter database rename file \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\REDO03.LOG\';

 alter database rename file \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\SYSTEM01.DBF\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\SYSTEM01.DBF\';
 alter database rename file \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\SYSAUX01.DBF\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\SYSAUX01.DBF\';
 alter database rename file \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\UNDOTBS01.DBF\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\UNDOTBS01.DBF\';
 alter database rename file \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\USERS01.DBF\';
 alter database rename file \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\EXAMPLE01.DBF\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\EXAMPLE01.DBF\';
 alter database rename file \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\YTQ.DBF\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\YTQ.DBF\';
 alter database rename file \'E:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\ZJHH\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\ZJHH\';
 alter database rename file \'E:\\APP\\ADMINISTRATOR\\PRODUCT\\11.2.0\\DBHOME_1\\DATABASE\\SDE_TBS\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\SDE_TBS\';
 alter database rename file \'I:\\ZJECMS\\DB\\DB_BK_DATA\\RMAN_LOCAL_1805\\RMAN_BKUP_1805.DBF\' to  \'E:\\IDEPROS\\oracle_home\\oradata\\orcl\\RMAN_BKUP_1805.DBF\';
 

修改oracle_home\\oradata\\orcl下及相关文件的路径
(6) TNSNAMES设置
在network\\admin下的tnsnames.ora中添加如下片段
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
(7) 建立监听
用net configuration为orcl实例新建监听
 
至此,冷备份恢复成功。即使你现在用oem打开数据库时发现提示找不到sid ,但实际上你已经成功了,此时只需要重启一下的你的服务器就可以。
 
 

B、创建实例方式(实例SID与源机数据库SID一致)

(1) 替换和覆盖oradata\\orcl目录
删除目标机的oradata\\orcl底下的所有文件,把源机的所有data文件、redo文件拷贝到此目录下

(2) 密码文件覆盖
删除目标机的密码文件,拷贝源机密码文件到目标机下。

(3) 控制文件恢复
在源机上重建目标机的控制文件:SQL>alter database backup controlfile to trace;然后会在udump文件夹下产生一个追踪文件,打开文件找到上面那段,复制到文本中,修改相应路径然后保存为:createctl.sql文件(sql脚本文件),复制到目标机上。
复制代码代码如下:
c:\\>sqlplus "/as sysdba"
SQL>@c:\\createctl.sql;
SQL>shutdown immediate;
SQL>startup;
SQL>alter database open resetlogs;

(4)  在network\\admin下的tnsnames.ora中添加如下片段
复制代码代码如下:

ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
(5) 用net configuration为orcl实例新建监听
 

二、问题与解决

1. ORA-03113: 通信通道的文件结尾

在从mount状态下,启动时出现;或者从startup命令启动时出现。

 

 

 

详情请参考文章

Oracle错误——ORA-03113:通信通道的文件结尾 解决办法

如何釋放 DB_RECOVERY_FILE_DEST_SIZE

解决方法:

(1) 查看diag\\rdbms\\oracle\\oracle\\trace\\下的oracle_ora_xxxx.trc错误日志

Oracle出现错误,于是去错误日志里去找问题根源:在 e:\\app\\kang\\diag\\rdbms\\oracle\\oracle\\trace\\文件夹下找到oracle_ora_6320.trc文件,打开显示错误日志:

ORA-19815: WARNING: db_recovery_file_dest_size of 4102029312 bytes is 100.00% used, and has 0 remaining bytes available.
************************************************************************
You have following choices to free up space from recovery area:
1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,
   then consider changing RMAN ARCHIVELOG DELETION POLICY.
2. Back up files to tertiary device such as tape using RMAN
   BACKUP RECOVERY AREA command.
3. Add disk space and increase db_recovery_file_dest_size parameter to
   reflect the new space.
4. Delete unnecessary files using RMAN DELETE command. If an operating
   system command was used to delete files, then use RMAN CROSSCHECK and
   DELETE EXPIRED commands.
************************************************************************
ORA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 38451712 bytes disk space from 4102029312 limit
*** 2018-08-09 17:47:48.882 4132 krsh.c
ARC1: Error 19809 Creating archive log file to \'E:\\IDEPROS\\ORACLE_HOME\\FLASH_RECOVERY_AREA\\ORCL\\ARCHIVELOG\\2018_08_09\\O1_MF_1_5330_%U_.ARC\'
*** 2018-08-09 17:47:48.882 2747 krsi.c
krsi_dst_fail: dest:1 err:19809 force:0 blast:1
DDE rules only execution for: ORA 312
----- START Event Driven Actions Dump ----
---- END Event Driven Actions Dump ----
----- START DDE Actions Dump -----
Executing SYNC actions
----- START DDE Action: \'DB_STRUCTURE_INTEGRITY_CHECK\' (Async) -----
DDE Action \'DB_STRUCTURE_INTEGRITY_CHECK\' was flood controlled
----- END DDE Action: \'DB_STRUCTURE_INTEGRITY_CHECK\' (FLOOD CONTROLLED, 0 csec) -----
Executing ASYNC actions
----- END DDE Actions Dump (total 0 csec) -----
*** 2018-08-09 17:47:48.882 4529 kcrr.c
ORA-16038: log 2 sequence# 5330 cannot be archived
ORA-19809: limit exceeded for recovery files
ORA-00312: online log 2 thread 1: \'E:\\IDEPROS\\ORACLE_HOME\\ORADATA\\ORCL\\REDO02.LOG\'

(2) 找出问题根源

从这里我们发现了问题的根源:

ORA-19815: WARNING: db_recovery_file_dest_size of 4102029312 bytes is 100.00% used, and has 0 remaining bytes available.
是db_recovery_file_dest_size也叫归档日志空间不足导致的,既然找到问题的根源,那解决起来也就容易了。

 (3) 确定解决方法 ---设置归档日志空间的大小

空间小,那摆在我们面前办法就是,一个是将空间设置大点,另一个就是将多余的文件删除掉即可,那么我们就将这两个办法都使用一下。

CMD命令窗口启动:

方法1:设置归档日志空间的大小
-- at cmd
sqlplus / as sysdba
-- at sql
shutdown abort     ----关闭进程
startup mount       ---- 装载数据库
select * from v$recovery_file_dest; ---查询归档日志
exit
-- at cmd
rman target /
-- at rman
db_recovery_file_dest_size = 6442450944; --设置归档日志空间为6G (6*1024*1024*1024)
Exit ---到这里空间大小已经设置完成

方法2: 删除归档日志

rman target /   -----进入rman工具窗口
RMAN>crosscheck archivelog all;  --运行这个命令可以把无效的expired的archivelog标出来。
RMAN>delete noprompt archivelog until time "sysdate -3";  -- -即删除3天前的归档日志

 2. ORA-39700: database must be opened with UPGRADE option

具体请参考

ORA-00704: bootstrap process failure ORA-39700: database must be opened with UPGRADE option

 

Oracle案例04——ORA-39700: database must be opened with UPGRADE option

 

错误出现的过程

SQL> startup
ORA-01081: 无法启动已在运行的 ORACLE - 请首先关闭它
SQL> shutdown immediate
ORA-01109: 数据库未打开


已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 3340451840 bytes
Fixed Size                  2180344 bytes
Variable Size            1828719368 bytes
Database Buffers         1493172224 bytes
Redo Buffers               16379904 bytes
数据库装载完毕。
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-39700: database must be opened with UPGRADE option
进程 ID: 7660
会话 ID: 191 序列号: 3


SQL>

解决方法

通过数据字典升级解决

 
(1)使用 startup upgrade 打开数据库
C:\\Windows\\System32>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 8月 9 19:09:30 2018

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

已连接到空闲例程。

SQL> startup upgrade;
ORACLE 例程已经启动。

Total System Global Area 3340451840 bytes
Fixed Size                  2180344 bytes
Variable Size            1828719368 bytes
Database Buffers         1493172224 bytes
Redo Buffers               16379904 bytes
数据库装载完毕。
数据库已经打开。
SQL>

(2)查看预升级信息

SQL> @$ORACLE_HOME/rdbms/admin/utlu112i.sql

 

(3)执行升级脚本

SQL> @$ORACLE_HOME/rdbms/admin/catupgrd.sql

//这个过程时间比较长, 执行完上面操作执行,也可重新正常打开数据库即可。

 

SQL> @$ORACLE_HOME/rdbms/admin/utlu112s.sql

SQL> @$ORACLE_HOME/rdbms/admin/catuppst.sql

SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql

 

(4)重启数据库

SQL> shutdown immediate;

ORA-01109: database not open

Database dismounted.

ORACLE instance shut down.

SQL> startup;

 

3. ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

参考 ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NOR

冷备份1.1中的内容后,在原地回复这些dbf文件,及参数、日志、控制重新覆盖在目标位置后,重新在sqlplus下执行1.2的步骤后,可能会出现如上的错误。解决办法如下:

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: \'E:\\ORACLE\\ORADATA\\EYGLE\\SYSTEM01.DBF\'

SQL> recover database using backup controlfile;
ORA-00279: 更改 1670743 (在 04/17/2008 14:13:16 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\\ORACLE\\ORA92\\RDBMS\\ARC00030.001
ORA-00280: 更改 1670743 对于线程 1 是按序列 # 30 进行的

指定日志: {=suggested | filename | AUTO | CANCEL}
E:\\oracle\\oradata\\EYGLE\\REDO01.LOG
ORA-00310: 存档日志包含序列 29;要求序列 30
ORA-00334: 归档日志: \'E:\\ORACLE\\ORADATA\\EYGLE\\REDO01.LOG\'

SQL> recover database using backup controlfile;
ORA-00279: 更改 1670743 (在 04/17/2008 14:13:16 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\\ORACLE\\ORA92\\RDBMS\\ARC00030.001
ORA-00280: 更改 1670743 对于线程 1 是按序列 # 30 进行的

指定日志: {=suggested | filename | AUTO | CANCEL}
E:\\oracle\\oradata\\EYGLE\\REDO02.LOG
已应用的日志。
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。
冷备份1.1中的内容后,在原地回复这些dbf文件,及参数、日志、控制重新覆盖在目标位置后,重新在sqlplus下执行1.2的步骤后,可能会出现如上的错误。解决办法如下:
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

 

 
 
 
 
 
参考

以上是关于oracle中怎么复制一个同样的用户的主要内容,如果未能解决你的问题,请参考以下文章

请问oracle怎么从dmp文件只恢复一张表的数据,恢复到另一个用户中

ORACLE11g将数据库内容全部复制,并将其加为本数据库的一个新实例

在PLSQL里面复制一个用户的所有数据库和各种表 my object下面然后选USER先DROP一个用户.然后怎么做?

oracle数据库的数据从一个用户复制到另一个用户

如何在 Oracle 中将一个用户复制或克隆到另一个用户

oracle怎么把数据库的表复制到另外一个数据库