Oracle數(shù)據(jù)庫復(fù)制

前言

最近接觸到一個(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ù)制工具。


點(diǎn)擊這個(gè)位置
出現(xiàn)這個(gè)怎么選.png

根據(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è)問題,


EXP-0003

這導(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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容