前炎
数据迁移,由oracle数据库导入到mysql数据库,只提供了oracle导出的dmp文件,因为数据的迁移还需要程序处理后才能放入mysql,所以下面是从oracle安装到导入dmp文件以及遇到的问题的全过程。
一.oracle数据库的安装
Oracle Database Express Edition | Oracle 中国 导入使用的是oracle的快速版,免费下载使用,进入官网界面如下:
点击下载选择对应版本,我是在本地window上跑的所以下载windowsx64
以管理员身份运行安装包,安装时不用多余选择默认下一步即可,一定要记住sys和system账号密码
如果遇到需要重装,去控制面板里面卸载后重启电脑可能会出现删除不干净从而导致下一次安装报错,下面是需要删除的,挨个寻找如果存在就删除,删除后重启再次尝试安装
1.删除注册表:
- HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE;
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,滚动这个列表,删除所有以Oracle或OraWeb开头的;
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application,将Oracle删除;
- HKEY_CLASSES_ROOT,将所有以Ora、Oracle、Orcl或EnumOra为前缀的都删除;
- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu\Programs,将所有以Oracle开头的键都删除;
- HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI,将除Microsoft ODBC for Oracle以外的所有含有Oracle的键都删除;
其中有些注册表项可能在卸载Oracle产品的时候已经被删除;
2.查看环境变量:
删除CLASSPATH和PATH中有关Oracle的设置;
二.文件导入
写在开头,因为是在windows系统上进行的oracle操作,所以所有在打开命令行或者sqlplus的程序都是需要使用管理员权限去运行的。不然可能会出现权限不足导致命令执行失败的问题。
1.登录默认账户
首先打开SQL plus 以管理员身份运行
打开后登录默认用户 SYS 密码为上面安装时设置的密码 执行命令:SYS AS SYSDBA
2.创建目录
创建目录,用来存放dmp文件用于导入
命令:
create directory DIR as 'D:\dir'; 命令解释: 用来创建目录的命令,路径可以自己指定,这里我再d盘新建了一个dir文件夹,目录的名称也可以自己指定,注意后面执行命令时需要自己替换。
select * from dba_directories; 命令解释:查询所有已经存在的目录
将dmp文件放入上面指定的目录
3.创建表空间
创建表空间以及临时表空间
命令:create tablespace DEPT_DATA datafile 'D:\dir\DEPT_DATA.ORA' size 800M autoextend on next 5M maxsize unlimited;
创建临时表空间
命令:create smallfile temporary tablespace DEPT_TEMP tempfile 'D:\dir\DEPT_TEMP.dbf' size 800M autoextend on next 5M maxsize unlimited;
4.创建用户并指定表空间(包括遇到的问题及解决方式)
创建用户并且指定表空间为刚刚创建的表空间
命令解释:
create user 账号 identified by 密码 default tablespace 表空间名称 temporary tablespace 临时表空间名称;
创建账号在cdb模式下需要加上C##
执行命令:create user depttest01 identified by depttest01 default tablespace DEPT_DATA temporary tablespace DEPT_TEMP;
第一次执行后报错,查询后发现需要在户名前面加上C##,上图中我执行的命令里连密码也加了C##,密码不加也没事。更改后的命令为
create user C##depttest01 identified by C##depttest01 default tablespace DEPT_DATA temporary tablespace DEPT_TEMP;
执行后又开始报错,提示刚刚创建的表空间不存在,查询后发现在CDB下给用户分配表空间时,此表空间必须在没有pdb的情况或者pdb下有相同表空间名称的时候才能成功。所以接下来就是查看是否有pdb,如果有pdb就也去新建一下表空间
查看当前处于cdb还是pdb
命令解释:
show con_name --显示cdb还是pdb
show pdbs; -- 展示所有pdb
执行命令后看到存在一个pdb名称叫XEPDB1,上面的PDB$SEED不需要管,直接去XEPDB1里去创建表空间,切换到pdb,创建表空间
命令:
alter session set container=XEPDB1 -- 切换到pdb
create tablespace DEPT_DATA datafile 'D:\dir\DEPT_DATA_01.ORA' size 2m; -- 创建表空间
create smallfile temporary tablespace DEPT_TEMP tempfile 'D:\dir\DEPT_TEMP_01.dbf' size 2M ; -- 创建临时表空间
ps:除了PDB$SEED以外的每一个pdb都需要创建表空间,因为我只有一个,所以我就只执行一次下面的,如果存在多个,重复下发操作即可
切换回CDB 容器,再次执行创建用户的命令
命令:alter session set container=cdb$root; --回到CDB容器
create user C##depttest01 identified by C##depttest01 default tablespace DEPT_DATA temporary tablespace DEPT_TEMP; --创建用户
5.用户授权及测试
创建完成后,给用户授权,可以切换到创建的用户查看
命令:
grant connect,resource,dba to C##depttest01; -- 授权
conn C##depttest01/C##depttest01 --连接用户
show user -- 查看当前用户
6.导入dmp文件(包括遇到的问题和解决方式)
导入dmp文件有两个命令分别是impdp 和imp,区别是:如果使用的是较新的 Oracle 版本,并且希望更高效、更灵活地控制导入过程,那么 impdp 是更推荐的导入工具。但是,如果正在使用较旧的 Oracle 版本或需要进行简单的导入操作,那么只能使用 imp。
因为我使用过impdp后报错:ORA-39143: 转储文件 “/dir/BackUp2023.dmp” 可能是原始的导出转储文件,所以最终使用了imp,命令如下:
imp C##depttest01/C##depttest01@127.0.0.1:1521 file='D:\dir\Backup2024.dmp' full=y;
命令解释:imp 账号/密码@地址加端口 file=‘dmp文件所在的路径’ full=y;
执行后命令 后可以能出现报错,ORA-12899: 列 "JACKEYJ"."JK_REGISTER"."OPNAME" 的值太大 (实际值: 21, 最大值: 20),这个可以打开SQL plus登录后执行下列操作
查看服务器端字符集SQL > select * from V$NLS_PARAMETERS
修改:$sqlplus /nolog
SQL>conn / as sysdba (ps: 在cmd中可以直接粘贴)
若此时数据库服务器已启动,则先执行 SHUTDOWN IMMEDIATE 命令关闭数据库服务器,
然后执行以下命令:
SQL>shutdown immediate;
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
接下来可能出现两种情况:
ERROR at line 1 RA-12721: operation cannot execute when other sessions are active
1、若出现上面的错误,使用下面的办法进行修改,使用INTERNAL_USE可以跳过超集的检查:
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
ORA-12712: new character set must be a superset of old character set
RROR at line 1:
2、结果报错,提示新字符集必须是老字符集的超集。
于是强制转换
>ALTER DATABASE character set INTERNAL_USE ZHS16GBK;最后步骤:
>shutdown immediate;
>STARTUP;
导入时还有可能会提示表空间不存在这个问题,同样打开SQL plus 登录后执行下面命令
select username, default_tablespace from dba_users where username='C##DEPTTEST01'
需要注意虽然创建用户的时候用户名称是小写,但是上面查询的时候需要所有英文字母大写,也就是由C##depttest01变为C##DEPTTEST01
修改以前先记住查询出的表空间名称,导入完以后还要改回去。
修改表空间名称命令:
alter tablespace 原空间名称 rename to 新空间名称;
假如导入后提示DATA_WEB表空间不存在 我们就执行
alter tablespace DEPT_DATA rename to DATA_WEB;
修改完成后,以管理员身份运行cmd再次执行导入语句
imp C##depttest01/C##depttest01@127.0.0.1:1521 file='D:\dir\Backup2024.dmp' full=y;
导入完成后记得再把表空间名字改回去,还是使用这个命令
alter tablespace 新空间名称 rename to 原空间名称;
提示,如果存在多个空间不存就重复修改和导入这两个过程,直到所有的表空间不存在问题都不见了以后再改回原来的表空间名称,重复执行导入语句不会重复导入已存在的数据,只会有提醒,是正常的,放心执行即可。提醒如下ORA-39151: Table "SOP2"."SYS_EXPORT_SCHEMA_01" exists. All dependent metadata and data will be skipped due to table_exists_action of skip;属于正常
三.navicat连接及查看
1.查看服务名及端口号
开始->所有应用 找到 Net Manager 打开,如下图
打开后 找到 本地->服务命名如下图,记住服务名和端口号,下面连接的时候需要用。
2.连接到oracle
打开navicat新建连接,如下图
然后填写连接名称,还有第一步查看的服务名和端口号,oracle默认端口号是1521,如下图
都填写完成后点击测试连接,连接成功
说一个我遇到的问题,我第二次链接的时候提示我监听什么的,我就去任务管理器把所有的oracle开头的服务重启了一遍,然后链接就可以了
测试成功后确定打开刚刚创建的链接,就可以看到刚刚导入的数据库和数据了
四.数据传输
使用navicat的数据传输工具,可以实现不同的数据库之间的数据传输,下面是oracle导入到mysql导入过程。
首先要把需要导入的数据库也使用navicat连接上,就像上面新建oracle数据库连接一样,在新建链接的时候选择好自己对应的数据库类型就可以了。
搞定好这些以后在navicat里找到工具->数据传输如下图
打开后选择好源和目标链接
然后选择好具体的数据库以后,下一步
然后选择需要传输的表然后下一步,可以全选
点击开始,完成数据的传输,然后就可以去目标库的链接里面查看有没有传输过去了
五.总结
在windows上装oracle还是挺麻烦的,如果条件的允许,服务器或者别人电脑上已经装好了,直接在他人的电脑上或服务器上导入数据,然后用navicat去链接可以省去很多麻烦的问题,还有上面可能写的比较乱,有错误欢迎评论区指出。