Oracle数据库复制

前言

最近接触到一个项目,类似于搭建一个全新的环境吧。
因为是SpringBoot工程(是一个文件夹拷贝过去修改配置就能启动),所以就只涉及到Oracle和Redis环境的搭建和复制了。
搭建环境遇到的坑比较少,主要的时间大部分花在了数据库的复制粘贴上面。

正文

需求分析

要求:把A库数据以及数据结构用户名、表空间、索引空间原封不动转到B库。

一般来说DBA不完全了解业务,不能判断每一张表的作用,应该没有遗漏地无区分拷贝结构和数据。

这个行为的专业术语叫做:数据库的备份与恢复

几种数据库恢复

其实查找资料我们不难发现Oracle已经给我们提供了好几套解决方案:
1.依赖sql-developer(开发者工具)的数据库复制功能。
2.物理备份
3.逻辑备份

在此期间我们会接触到一些基础知识:
1.数据库文件分为:重做日志文件 、归档日志文件---开启影响性能
2.表空间和用户的关系
3.数据库权限(DBA、RESOURCE、CONNECT)是什么以及他们如何被分配

物理备份

物理备份说人话就是复制粘贴,因此这是需要操作系统账号的。其又分为:
1.热备份(归档模式、联机备份)
备份:把数据库置为归档模式(需要关闭数据库服务)
备份表空间
恢复:对当前日志进行归档
切换日志
关闭数据
删除数据文件并重启..............(太多了不说了自己看吧)
2.冷备份(不用归档模式、脱机备份)
备份:关闭数据库服务
复制需要的文件到其他磁盘。(操作系统层面的复制)
恢复:直接粘贴备份文件到磁盘内。

基础语法

查询日志模式:archive log list ; 
修改日志模式:alter database achivelog;

alter system set log_archive_start=true scope=spfile;
立即关闭服务:shutdown immediate;
开启服务:startup mount;

总之记住一个单词:Archivelog---mode归档模式

这两种方法都涉及一件我们非常忌讳的事情:停止服务或者影响服务性能
因此不采纳

逻辑备份(导入导出)

逻辑备份也很好理解就是基于工具的导入导出方式,甲骨文提供了两种工具:
1.EXP/IMP工具
既可以在可以客户端使用,也可以在服务端使用。
2.EXPDP/IMPDP工具
oracle10g以后采用的数据泵技术的导入导出工具。
网上说只能在服务端使用,其实不全对,但是要有操作系统账号是肯定的。

这种方式很符合我们的需求,因此我们采用以上两种方法,加上sql-developer,一共是三种方法。

工欲善其事、必先利其器

这里就出现一件令人困惑、苦恼的事情了,这些工具去哪里下载?
1.SqlDeveloper在Oracle中文网的开发者工具里下载。
2.EXP/IMP工具、EXPDP/IMPDP工具在对应版本的客户端(Client)工具里面。通过
https://www.oracle.com/database/technologies/112010-win64soft.html点击Client的那一项就可以进行下载。
具体的安装教程网上都有,不赘述。但是WIN10的用户需要注意一点,安装包
client\stage\cvu下面有两个xml文件要修改,为了好看我放到文章最后。

之后就可以在其安装目录\product\11.2.0\client_1\BIN里面找到这四个exe文件(exp.exe/expdp.exe/imp.exe/impdp.exe)。

这时我们就可以开始进行工作了。

操作流程

首先,找数据库托管方,或者自己创建表空间、表索引、以及表空间管理员用户(最好与原库一致,我接下来要说的也是一致的情况)

模拟原库,我们在A库里创建几张表(一张正常表、一张带主键表、两张父子表、一张空表)。

CREATE TABLE T_DEMO_NORMAL  (
   ID                   NUMBER                          NOT NULL,
   NAME            VARCHAR2(40)                   NOT NULL,
   VALID_FLAG      VARCHAR2(1) 
)
TABLESPACE SPACE_DAT;

CREATE TABLE T_DEMO_NORMAL_PRIMARYKEY  (
   ID                   NUMBER                          NOT NULL,
   NAME            VARCHAR2(40)                    NOT NULL,
   VALID_FLAG      VARCHAR2(1) ,
   primary key(ID)
)
TABLESPACE SPACE_DAT;

CREATE TABLE T_DEMO_FATHER  (
   ID                   NUMBER                          NOT NULL,
   NAME            VARCHAR2(40)                   NOT NULL,
   VALID_FLAG      VARCHAR2(1) ,
primary key(ID)
)
TABLESPACE SPACE_DAT;

ALTER TABLE T_DEMO_FATHER ADD CONSTRAINT uk_001 UNIQUE (ID);
CREATE TABLE T_DEMO_SON  (
   ID                   NUMBER                          NOT NULL,
   FATHER_ID       NUMBER,
   NAME            VARCHAR2(40)                   ,
   VALID_FLAG      VARCHAR2(1) ,
   CONSTRAINT fk_pro FOREIGN KEY(FATHER_ID)
   REFERENCES   T_DEMO_FATHER (ID)
   ON DELETE CASCADE
)
TABLESPACE SPACE_DAT;

CREATE TABLE T_DEMO_EMPTY  (
   ID                   NUMBER                          NOT NULL,
   NAME            VARCHAR2(40)                   NOT NULL,
   VALID_FLAG      VARCHAR2(1) ,
)

开始表演

第一次尝试

首先我们使用SqlDeveloper的数据库复制工具。


点击这个位置
出现这个怎么选.png

根据这个大哥https://www.cnblogs.com/sucretan2010/p/11406568.html的原话是:先复制表和数据(选择性复制表数据),再复制视图,触发器序列等。以免触发器序列等对复制数据时造成干扰,导致复制失败。
当然我试过很多次尝试但是在实际生产库里总会产生一些莫名其妙的索引,有人说他是无害的,可是我不相信。

奇奇怪怪的索引

因此我决定删库跑路使用其他的方法再试试看。

删库跑路

想要删库跑路还真不容易下面是语法,小朋友学会了别乱玩。

1.得到删除全部表的语句:
select 'drop table '||table_name||';' from user_tables;
2.复制粘贴执行语句
3.看看索引删干净了没all_indexes全部索引。
4.清空回收站:
purge recyclebin;

第二次尝试

这次我们使用EXP/IMP进行试验

先执行
EXP 用户名/密码@IP:端口(一般是1523)/表空间名 file=c:\EXP.dmp
等执行完了,再执行
IMP  用户名/密码@IP:端口(一般是1523)/表空间名 file=c:\EXP.dmp full=y;

如果是生产库,可能会花上一天时间。
发现一个问题,


EXP-0003

这导致一些空表无法被导出,也就无从导入。
你也可以插入一条垃圾数据再导出就是了,不过个人觉得太麻烦了。

第三次尝试

最后,我直接要了一下A库的操作系统账号。决心使用数据泵技术来重振朝纲(改变局面)。
1.直接以软件拥有者身份进行最高身份登陆:sqlplus / as sysdba;
2.建一个文件夹/home/ora11g/IMPDIR ,诸如此类的。mkdir
3.把文件夹路径纳入数据库的管理中:CREATE DIRECTORY DMP_DIR AS '/home/ora11g/IMPDIR ';
4.把这个文件夹权限交给你自己GRANT READ,WRITE ON DIRECTORY DMP_DIR TO AUTOBEAR;
5.执行(你可以选择在本地操作或者远程操作,都无所谓,最后生产的dmp反正在操作系统里)

再三确认一下路径:SELECT * FROM DBA_DIRECTORIES
WINDOWS下执行的:
expdp 用户名/密码@IP:端口/服务名 directory=DMP_DIR  dumpfile=exp.dmp logfile=expdp.log
impdp 用户名/密码@IP:端口/服务名 DIRECTORY=DMP_DIR  DUMPFILE=exp.dmp 

LINUX下执行的:
expdp  用户名/密码 directory=DMP_DIR  dumpfile=exp.dmp logfile=expdp.log
impdp  用户名/密码 directory=DMP_DIR  dumpfile=exp.dmp

这里的目录DMP_DIR只能绑定数据库操作系统端的。

结论

通过三次试验,推荐使用第三种,数据泵技术天下无敌。

资料区

cvu_prereq.xml

<?xml version="1.0"?>
<HOST PLATID="912">
    <SYSTEM>
        <MEMORY>
            <PHYSICAL_MEMORY VALUE="128" UNIT="MB" SEVERITY="IGNORABLE"/>
            <!--<AVAILABLE_MEMORY VALUE="20" UNIT="MB"/> -->
        </MEMORY>
        <SPACE>
            <LOC VAR="TEMP_AREA" TEMP="true" SIZE="130" UNIT="MB" SEVERITY="IGNORABLE"/>
        </SPACE>
    </SYSTEM>
    <CERTIFIED_SYSTEMS>
        <OPERATING_SYSTEM RELEASE="5.0">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="32-bit"/>
            <NAME VALUE="Windows2000"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="5.1">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="32-bit"/>
            <NAME VALUE="WindowsXP"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="5.2">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="32-bit"/>
            <NAME VALUE="Windows Server 2003"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="6.0">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="32-bit"/>
            <NAME VALUE="WindowsServer2008"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="6.0">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="32-bit"/>
            <NAME VALUE="WindowsVista"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="6.1">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="32-bit"/>
            <NAME VALUE="Windows 7"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="6.2">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="64-bit"/>
            <NAME VALUE="Windows 8"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="6.2">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="32-bit"/>
            <NAME VALUE="Windows 8"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="6.2">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="64-bit"/>
            <NAME VALUE="Windows 10"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="5119" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
    </CERTIFIED_SYSTEMS>
    <ORACLE_HOME>
        <COMPATIBILITY_MATRIX>
            <ALLOW>
                <NEW_HOME/>
                <COMP NAME="oracle.server" ATLEAST="11.2.0.0.0" ATMOST="11.2.9.9.9"/>
                <COMP NAME="oracle.client" ATLEAST="11.2.0.0.0" ATMOST="11.2.9.9.9"/>
            </ALLOW>
            <DISALLOW>
                <COMP NAME="oracle.server" ATLEAST="8.1.0.0.0" ATMOST="10.2.9.9.9"/>
                <COMP NAME="oracle.client" ATLEAST="8.1.0.0.0" ATMOST="9.2.0.9.0"/>
                <COMP NAME="oracle.iappserver.iapptop" ATLEAST="9.0.2.0.0" ATMOST="9.0.9.0.0"/>
                <COMP NAME="oracle.iappserver.infrastructure" ATLEAST="9.0.2.0.0" ATMOST="9.0.9.0.0"/>
                <COMP NAME="oracle.iappserver.devcorner " ATLEAST="9.0.2.0.0" ATMOST="9.0.9.0.0"/>
                <COMP NAME="oracle.ids.toplevel.development" ATLEAST="9.0.0.0.0" ATMOST="9.0.9.0.0"/>
                <COMP NAME="oracle.install.instcommon" ATLEAST="8.1.3.0.0" ATMOST="9.2.9.9.9"/>
                <COMP NAME="oracle.networking.netclt" ATLEAST="8.1.3.0.0" ATMOST="9.2.0.9.0"/>
                <ORCA_HOME/>
            </DISALLOW>
        </COMPATIBILITY_MATRIX>
    </ORACLE_HOME>
</HOST>

oracle.client_InstantClient.xml

<?xml version="1.0"?>
<HOST PLATID="233">
    <SYSTEM>
        <MEMORY>
            <PHYSICAL_MEMORY VALUE="128" UNIT="MB" SEVERITY="IGNORABLE"/>
            <!--<AVAILABLE_MEMORY VALUE="20" UNIT="MB"/> -->
        </MEMORY>
    </SYSTEM>
    <CERTIFIED_SYSTEMS>
        <OPERATING_SYSTEM RELEASE="5.0">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="64-bit"/>
            <NAME VALUE="Windows2000"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="5.1">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="64-bit"/>
            <NAME VALUE="WindowsXP"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="5.2">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="64-bit"/>
            <NAME VALUE="Windows Server 2003"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="6.0">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="64-bit"/>
            <NAME VALUE="WindowsServer2008"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="6.0">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="64-bit"/>
            <NAME VALUE="WindowsVista"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="6.1">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="64-bit"/>
            <NAME VALUE="Windows 7"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="6.1">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="64-bit"/>
            <NAME VALUE="WindowsServer2008R2"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="1023" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
        <OPERATING_SYSTEM RELEASE="6.2">
            <VERSION VALUE="3"/>
            <ARCHITECTURE VALUE="64-bit"/>
            <NAME VALUE="Windows 10"/>
            <ENV_VAR_LIST>
                <ENV_VAR NAME="PATH" MAX_LENGTH="5119" />
            </ENV_VAR_LIST>
        </OPERATING_SYSTEM>
    </CERTIFIED_SYSTEMS>
    <ORACLE_HOME>
        <COMPATIBILITY_MATRIX>
            <ALLOW>
                <NEW_HOME/>
            </ALLOW>
            <DISALLOW>
                <COMP NAME="oracle.server" ATLEAST="8.1.0.0.0" ATMOST="11.2.9.9.9"/>
                <COMP NAME="oracle.client" ATLEAST="8.1.0.0.0" ATMOST="11.2.9.9.9"/>
                <COMP NAME="oracle.iappserver.iapptop" ATLEAST="9.0.2.0.0" ATMOST="9.0.9.0.0"/>
                <COMP NAME="oracle.iappserver.infrastructure" ATLEAST="9.0.2.0.0" ATMOST="9.0.9.0.0"/>
                <COMP NAME="oracle.iappserver.devcorner " ATLEAST="9.0.2.0.0" ATMOST="9.0.9.0.0"/>
                <COMP NAME="oracle.ids.toplevel.development" ATLEAST="9.0.0.0.0" ATMOST="9.0.9.0.0"/>
                <COMP NAME="oracle.install.instcommon" ATLEAST="8.1.3.0.0" ATMOST="9.2.9.9.9"/>
                <COMP NAME="oracle.networking.netclt" ATLEAST="8.1.3.0.0" ATMOST="9.2.0.9.0"/>
                <COMP NAME="ocommon" ATLEAST="7.3.2" ATMOST="8.0.7"/>
            </DISALLOW>
        </COMPATIBILITY_MATRIX>
    </ORACLE_HOME>
</HOST>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341