前言
最近接触到一个项目,类似于搭建一个全新的环境吧。
因为是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的数据库复制工具。
根据这个大哥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;
如果是生产库,可能会花上一天时间。
发现一个问题,
这导致一些空表无法被导出,也就无从导入。
你也可以插入一条垃圾数据再导出就是了,不过个人觉得太麻烦了。
第三次尝试
最后,我直接要了一下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>