現(xiàn)在有個(gè)需求,想把MySQL數(shù)據(jù)庫中的數(shù)據(jù)轉(zhuǎn)移到oracle數(shù)據(jù)庫中,網(wǎng)上找了好幾種方法,最后決定使用oracel sql developer這種工具來實(shí)現(xiàn)。
鄒平網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
Mysql和oracle屬于兩種不同的數(shù)據(jù)庫,具體使用差異也有很多,不能簡單使用sql文件進(jìn)行導(dǎo)出導(dǎo)入。以下幾個(gè)示例比較一下Mysql與oracle數(shù)據(jù)庫的差異
MySQL的SQL語句中,要求表名、表的別名必須區(qū)分大小寫(可通過修改mysql配置文件my.cnf,增加lower_case_table_names=1來忽略大小寫,從而與Oracle盡量保持一致),尤其是表的別名。建議通過組內(nèi)開發(fā)規(guī)范統(tǒng)一起來,以消除差異性。
MySQL的Insert語句,支持ignore語法忽略主鍵沖突報(bào)錯(cuò),如:insert ignore into table_name...;支持insert into ... on duplicate key update...的用法,此時(shí)要求表必須有主鍵或唯一性約束字段。
與insert語句類似,MySQL還支持replace into語句,若插入表中已存在數(shù)據(jù)時(shí),則用新數(shù)據(jù)記錄替換舊的記錄。
創(chuàng)建表時(shí),MySQL不支持 create or replace,但可以通過drop table if exists tbl_name來重新創(chuàng)建表。
另外,在建表語句、建索引語句中,MySQL不支持tablespace后綴。此時(shí),可以將Oracle導(dǎo)出的DDL語句中,tablespace部分注釋掉;同時(shí),在導(dǎo)入MySQL數(shù)據(jù)庫時(shí),先執(zhí)行set @@sql_mode='oracle'以盡量保持與Oracle語法一致。具體sql_mode,可參考MySQL官方手冊等文檔。
具體參考https://www.cnblogs.com/HondaHsu/p/3641190.html
MySQL不支持Sequence,在表中可設(shè)置自增主鍵。如與Oracle兼容,可考慮統(tǒng)一采用function來封裝主鍵取值差異。
對于存儲過程而言,Oracle 的PLSQL與MySQL也是有較大不同的,比如,MySQL不支持包、不支持常量定義、不支持dbms_output調(diào)試……具體細(xì)節(jié)以后另外整理。
MySQL的視圖from語句中不允許存在子查詢,可以通過將子查詢創(chuàng)建為新的視圖的方式解決。Oracle的物化視圖相關(guān)概念,在MySQL中也不存在。
mysql創(chuàng)建測試數(shù)據(jù),建立一個(gè)庫,再建立一個(gè)表,隨便插入兩條數(shù)據(jù)
[root@DB mysqldb]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema | |
| mysql |
| test |
+--------------------+
3rows in set (0.12 sec)
mysql> create database test1;
Query OK, 1 row affected (0.03 sec)
mysql> use test1
Database changed
mysql> create table tb1(name varchar(20),age int);
Query OK, 0 rows affected (0.06 sec)
mysql> insert into tb1 values("tom",18);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tb1 values("jerry",20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from tb1;
+-------+------+
| name | age |
+-------+------+
| tom | 18 |
| jerry | 20 |
+-------+------+
2 rows in set (0.03 sec)
mysql> exit
Bye
在Mysql中,數(shù)據(jù)庫和用戶之間的關(guān)系不是特別明顯,只要我們鏈接到Mysql服務(wù)器,可以看到所有的數(shù)據(jù)庫和表,而Oracle新建一個(gè)用戶是沒有任何資源和權(quán)限的,需要我們?yōu)槠浞峙滟Y源權(quán)限,也可以在這個(gè)用戶下面建立表,但不能向Oracle那樣建數(shù)據(jù)庫,因?yàn)閷racle來說,一個(gè)用戶就對應(yīng)Mysql的一個(gè)數(shù)據(jù)庫。所以遷移數(shù)據(jù)庫,需要在Oracle中創(chuàng)建一個(gè)與相應(yīng)mysql數(shù)據(jù)庫同名的用戶(我這里要遷移的mysql數(shù)據(jù)庫是test1,創(chuàng)建的oracle用戶名是test1).
這種情況要注意oracle數(shù)據(jù)庫的用戶名。因?yàn)閟ql developer把mysql轉(zhuǎn)換到oracle數(shù)據(jù)庫中時(shí),會把mysql的數(shù)據(jù)存放到一個(gè)用戶下,這個(gè)用戶名一定會和mysql的數(shù)據(jù)庫名相同。如果oracle中已有這個(gè)用戶,則數(shù)據(jù)直接導(dǎo)入到該用戶下;如果沒有這個(gè)用戶,則sql developer會直接創(chuàng)建這樣的用戶,并把數(shù)據(jù)導(dǎo)入到該用戶下。需要注意的是,sql developer默認(rèn)創(chuàng)建的oracle數(shù)據(jù)庫用戶的默認(rèn)表空間是user,如果不注意,很有可能會導(dǎo)致user表空間爆滿!所以這種情況最好先建一個(gè)和mysql數(shù)據(jù)庫名一樣的oracle用戶,以防止user表空間爆滿影響數(shù)據(jù)導(dǎo)入。
--創(chuàng)建表空間
CREATE TABLESPACE MY_TEST DATAFILE '/opt/oracle/oradata/test/MY_TEST.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
--創(chuàng)建用戶
CREATE USER test1 IDENTIFIED BY test1 DEFAULT TABLESPACE MY_TEST TEMPORARY TABLESPACE TEMP; GRANT CONNECT TO test1; GRANT RESOURCE TO test1; GRANT DBA TO test1; GRANT UNLIMITED TABLESPACE TO test1;
oracel sql developer 獲取地址:
http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html
mysql-connector-java-5.1.44-bin.jar獲取地址
http://download.softagency.net/mysql/Downloads/Connector-J/

1是集成jdk的安裝程序,支持windows64位的操作系統(tǒng),不用自己額外安裝jdk環(huán)境;
2是不包含jdk的安裝程序,可以支持windows64位和windows32位的操作;
3可以選擇之前的幾個(gè)版本。
我這里下載的是sqldeveloper-4.1.3.20.78-x64.zip
注:
1如果安裝過程中出現(xiàn)一下錯(cuò)誤,需要用360掃一下注冊表,重新安裝一些補(bǔ)丁包就行了:

2移植過程最后可能出現(xiàn)下面提示:捕獲期間出錯(cuò),調(diào)用中的無效參數(shù)

移植報(bào)告內(nèi)容如下:

我這里查了網(wǎng)上資料也沒找到具體原因,只是換了一個(gè)低版本的oracle sql developer再次移植操作就OK了。所以勸大家最好不要使用最新版的oracle sql developer。不知道是不是涉及了兼容性的問題
依次選擇“工具”-->“首選項(xiàng)”,在彈出的界面選擇“數(shù)據(jù)庫”-->“第三方JDBC驅(qū)動程序”

創(chuàng)建oracle的連接

創(chuàng)建mysql的連接

可以看到已經(jīng)連接上兩個(gè)數(shù)據(jù)庫了
為充分能完成移植,不知數(shù)據(jù)庫之前有沒有移植過,所以先把原來的移植資料庫







選擇要轉(zhuǎn)換的mysql數(shù)據(jù)庫,添加到列表中:

指定轉(zhuǎn)換規(guī)則,可以根據(jù)自己的情況設(shè)定字段屬性的轉(zhuǎn)換,也可以新添加規(guī)則。不過一般選擇默認(rèn)的就能滿足需求



如果只導(dǎo)表結(jié)構(gòu)不導(dǎo)數(shù)據(jù),要勾選截?cái)鄶?shù)據(jù)




可以看到在輸出目錄下面生成了幾個(gè)文件,打開前兩個(gè)看一下:



Oracle sql developer中HSDB下可以看到在數(shù)據(jù)庫中能多了一個(gè)test1用戶,執(zhí)行查詢語句也能查到數(shù)據(jù),和上面在mysql中查到的結(jié)果一致

我嘗試移植過另一個(gè)數(shù)據(jù)量比較大的庫。如果是導(dǎo)入的mysql庫中的數(shù)據(jù)量比較大,并不會立即就能查到數(shù)據(jù),這是由于oracle有個(gè)統(tǒng)計(jì)分析的機(jī)制。
統(tǒng)計(jì)信息主要是描述數(shù)據(jù)庫中表,索引的大小,規(guī)模,數(shù)據(jù)分布狀況等的一類信息。例如,表的行數(shù),塊數(shù),平均每行的大小,索引的leaf blocks,索引字段的行數(shù),不同值的大小等,都屬于統(tǒng)計(jì)信息。CBO正是根據(jù)這些統(tǒng)計(jì)信息數(shù)據(jù),計(jì)算出不同訪問路徑下,不同join 方式下,各種計(jì)劃的成本,最后選擇出成本最小的計(jì)劃。
可以使用oracle自帶的dbms_stats 程序包進(jìn)行手動收集系統(tǒng)統(tǒng)計(jì)信息。DBMS_STATS包,主要提供了搜集(gather),刪除(delete),導(dǎo)出(export),導(dǎo)入(import),修改(set)統(tǒng)計(jì)信息的方法。我在這里使用的語句如下:
exec dbms_stats.delete_schema_stats('TEST1');
exec dbms_stats.gather_schema_stats(ownname =>'TEST1',degree => 4,cascade => true);
本文名稱:MYSQL數(shù)據(jù)庫遷移到ORACLE數(shù)據(jù)庫
當(dāng)前地址:http://www.chinadenli.net/article36/iiippg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站營銷、網(wǎng)站策劃、微信小程序、外貿(mào)建站、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)