前言
最近接觸到一個(gè)項(xiàng)目,類似于搭建一個(gè)全新的環(huán)境吧。
因?yàn)槭荢pringBoot工程(是一個(gè)文件夾拷貝過去修改配置就能啟動(dòng)),所以就只涉及到Oracle和Redis環(huán)境的搭建和復(fù)制了。
搭建環(huán)境遇到的坑比較少,主要的時(shí)間大部分花在了數(shù)據(jù)庫的復(fù)制粘貼上面。
正文
需求分析
要求:把A庫數(shù)據(jù)以及數(shù)據(jù)結(jié)構(gòu)用戶名、表空間、索引空間原封不動(dòng)轉(zhuǎn)到B庫。
一般來說DBA不完全了解業(yè)務(wù),不能判斷每一張表的作用,應(yīng)該沒有遺漏地?zé)o區(qū)分拷貝結(jié)構(gòu)和數(shù)據(jù)。
這個(gè)行為的專業(yè)術(shù)語叫做:數(shù)據(jù)庫的備份與恢復(fù)
幾種數(shù)據(jù)庫恢復(fù)
其實(shí)查找資料我們不難發(fā)現(xiàn)Oracle已經(jīng)給我們提供了好幾套解決方案:
1.依賴sql-developer(開發(fā)者工具)的數(shù)據(jù)庫復(fù)制功能。
2.物理備份
3.邏輯備份
在此期間我們會(huì)接觸到一些基礎(chǔ)知識(shí):
1.數(shù)據(jù)庫文件分為:重做日志文件 、歸檔日志文件---開啟影響性能
2.表空間和用戶的關(guān)系
3.數(shù)據(jù)庫權(quán)限(DBA、RESOURCE、CONNECT)是什么以及他們?nèi)绾伪环峙?/p>
物理備份
物理備份說人話就是復(fù)制粘貼,因此這是需要操作系統(tǒng)賬號(hào)的。其又分為:
1.熱備份(歸檔模式、聯(lián)機(jī)備份)
備份:把數(shù)據(jù)庫置為歸檔模式(需要關(guān)閉數(shù)據(jù)庫服務(wù))
備份表空間
恢復(fù):對當(dāng)前日志進(jìn)行歸檔
切換日志
關(guān)閉數(shù)據(jù)
刪除數(shù)據(jù)文件并重啟..............(太多了不說了自己看吧)
2.冷備份(不用歸檔模式、脫機(jī)備份)
備份:關(guān)閉數(shù)據(jù)庫服務(wù)
復(fù)制需要的文件到其他磁盤。(操作系統(tǒng)層面的復(fù)制)
恢復(fù):直接粘貼備份文件到磁盤內(nèi)。
基礎(chǔ)語法
查詢?nèi)罩灸J剑篴rchive log list ;
修改日志模式:alter database achivelog;
alter system set log_archive_start=true scope=spfile;
立即關(guān)閉服務(wù):shutdown immediate;
開啟服務(wù):startup mount;
總之記住一個(gè)單詞:Archivelog---mode歸檔模式
這兩種方法都涉及一件我們非常忌諱的事情:停止服務(wù)或者影響服務(wù)性能
因此不采納
邏輯備份(導(dǎo)入導(dǎo)出)
邏輯備份也很好理解就是基于工具的導(dǎo)入導(dǎo)出方式,甲骨文提供了兩種工具:
1.EXP/IMP工具
既可以在可以客戶端使用,也可以在服務(wù)端使用。
2.EXPDP/IMPDP工具
oracle10g以后采用的數(shù)據(jù)泵技術(shù)的導(dǎo)入導(dǎo)出工具。
網(wǎng)上說只能在服務(wù)端使用,其實(shí)不全對,但是要有操作系統(tǒng)賬號(hào)是肯定的。
這種方式很符合我們的需求,因此我們采用以上兩種方法,加上sql-developer,一共是三種方法。
工欲善其事、必先利其器
這里就出現(xiàn)一件令人困惑、苦惱的事情了,這些工具去哪里下載?
1.SqlDeveloper在Oracle中文網(wǎng)的開發(fā)者工具里下載。
2.EXP/IMP工具、EXPDP/IMPDP工具在對應(yīng)版本的客戶端(Client)工具里面。通過
https://www.oracle.com/database/technologies/112010-win64soft.html點(diǎn)擊Client的那一項(xiàng)就可以進(jìn)行下載。
具體的安裝教程網(wǎng)上都有,不贅述。但是WIN10的用戶需要注意一點(diǎn),安裝包
client\stage\cvu下面有兩個(gè)xml文件要修改,為了好看我放到文章最后。
之后就可以在其安裝目錄\product\11.2.0\client_1\BIN里面找到這四個(gè)exe文件(exp.exe/expdp.exe/imp.exe/impdp.exe)。
這時(shí)我們就可以開始進(jìn)行工作了。
操作流程
首先,找數(shù)據(jù)庫托管方,或者自己創(chuàng)建表空間、表索引、以及表空間管理員用戶(最好與原庫一致,我接下來要說的也是一致的情況)
模擬原庫,我們在A庫里創(chuàng)建幾張表(一張正常表、一張帶主鍵表、兩張父子表、一張空表)。
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的數(shù)據(jù)庫復(fù)制工具。


根據(jù)這個(gè)大哥https://www.cnblogs.com/sucretan2010/p/11406568.html的原話是:先復(fù)制表和數(shù)據(jù)(選擇性復(fù)制表數(shù)據(jù)),再復(fù)制視圖,觸發(fā)器序列等。以免觸發(fā)器序列等對復(fù)制數(shù)據(jù)時(shí)造成干擾,導(dǎo)致復(fù)制失敗。
當(dāng)然我試過很多次嘗試但是在實(shí)際生產(chǎn)庫里總會(huì)產(chǎn)生一些莫名其妙的索引,有人說他是無害的,可是我不相信。

因此我決定刪庫跑路使用其他的方法再試試看。
刪庫跑路
想要?jiǎng)h庫跑路還真不容易下面是語法,小朋友學(xué)會(huì)了別亂玩。
1.得到刪除全部表的語句:
select 'drop table '||table_name||';' from user_tables;
2.復(fù)制粘貼執(zhí)行語句
3.看看索引刪干凈了沒all_indexes全部索引。
4.清空回收站:
purge recyclebin;
第二次嘗試
這次我們使用EXP/IMP進(jìn)行試驗(yàn)
先執(zhí)行
EXP 用戶名/密碼@IP:端口(一般是1523)/表空間名 file=c:\EXP.dmp
等執(zhí)行完了,再執(zhí)行
IMP 用戶名/密碼@IP:端口(一般是1523)/表空間名 file=c:\EXP.dmp full=y;
如果是生產(chǎn)庫,可能會(huì)花上一天時(shí)間。
發(fā)現(xiàn)一個(gè)問題,

這導(dǎo)致一些空表無法被導(dǎo)出,也就無從導(dǎo)入。
你也可以插入一條垃圾數(shù)據(jù)再導(dǎo)出就是了,不過個(gè)人覺得太麻煩了。
第三次嘗試
最后,我直接要了一下A庫的操作系統(tǒng)賬號(hào)。決心使用數(shù)據(jù)泵技術(shù)來重振朝綱(改變局面)。
1.直接以軟件擁有者身份進(jìn)行最高身份登陸:sqlplus / as sysdba;
2.建一個(gè)文件夾/home/ora11g/IMPDIR ,諸如此類的。mkdir
3.把文件夾路徑納入數(shù)據(jù)庫的管理中:CREATE DIRECTORY DMP_DIR AS '/home/ora11g/IMPDIR ';
4.把這個(gè)文件夾權(quán)限交給你自己GRANT READ,WRITE ON DIRECTORY DMP_DIR TO AUTOBEAR;
5.執(zhí)行(你可以選擇在本地操作或者遠(yuǎn)程操作,都無所謂,最后生產(chǎn)的dmp反正在操作系統(tǒng)里)
再三確認(rèn)一下路徑:SELECT * FROM DBA_DIRECTORIES
WINDOWS下執(zhí)行的:
expdp 用戶名/密碼@IP:端口/服務(wù)名 directory=DMP_DIR dumpfile=exp.dmp logfile=expdp.log
impdp 用戶名/密碼@IP:端口/服務(wù)名 DIRECTORY=DMP_DIR DUMPFILE=exp.dmp
LINUX下執(zhí)行的:
expdp 用戶名/密碼 directory=DMP_DIR dumpfile=exp.dmp logfile=expdp.log
impdp 用戶名/密碼 directory=DMP_DIR dumpfile=exp.dmp
這里的目錄DMP_DIR只能綁定數(shù)據(jù)庫操作系統(tǒng)端的。
結(jié)論
通過三次試驗(yàn),推薦使用第三種,數(shù)據(jù)泵技術(shù)天下無敵。
資料區(qū)
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>