工作中遇到的很多问题,记录下来以后再次遇到不至于再耗费很多事件在百度上面,也可以大家一起分享,这也是我写下来的原因之一。虽然他人遇到的问题可能与我遇到的问题并不完全相同,但是有一部分相同并能解决这一部分问题就也足够了。
最近项目都用到了ArcGIS,而ArcGIS只能使用Oracle数据库,数据库最开始选用的是MySQL,为了部署统一数据库,所以需要从MySQL迁移到Oracle上面,过程中遇到了一些问题,记录如下:
1. Oracle数据库表空间 用户创建授权
- 创建表空间:create tablespace farmland_test datafile ‘/oracle_data/farmland_test.dbf’ size 200m autoextend on next 100m maxsize unlimited;
- 创建用户并指定表空间:create user farmland_test identified by farmland_test default tablespace farmland_test;用户密码表明均为farmland_test。
- 如果用户已经有了数据,要绑定使用的表空间,使用这种方法最好:alter user username quota unlimtied on tablespacename;
- 如果用户还没有数据,要绑定使用的表空间,可以使用这种方法:alter user username default tablespace tablespacename;
- 删除用户:drop user xxx,如果用户下面有对象,就得用drop user xxx cascade来删除这个用户以及这个用户下的所有对象了;
至此Oracle准备完成。
2. 通过Navicat进行数据传输
选择“工具”——>“数据传输”,选择配置数据传输的源及目标库,如图:
点击下一步,选择数据库对象,如图:
点击下一步,开始传输数据,我传输的时候用了十几分钟,看数据大小而定。传输完成后,就会在Oracle数据库看到传输的数据表。
3. 传输完后遇到的问题
- 数据库表名、字段名均为小写
Oracle表和字段是有大小写的区别。Oracle默认是大写,如果我们用双引号括起来的就区分大小写,如果没有,系统会自动转成大写。
Navicat传输数据时按照MySQL中的表名大小写状态进行传输,导致在Oracle中必须通过加双引号的方式进行操作。
解决方案:navicat数据传输工具的选项卡中提供了“转换对象名为小写/大写”的选项,勾选为大写再次进行数据传输即可。或者也可以登录用户空间后执行语句将表名及字段名统一改为大写(我使用的该方式,亲测可行):
begin
for t in (select table_name tn from user_tables where table_name <> upper(table_name)) loop
begin
for c in (select column_name cn from user_tab_columns where table_name=t.tn) loop
begin
execute immediate 'alter table "'||t.tn||'" rename column "'||c.cn||'" to '||c.cn;
exception
when others then
dbms_output.put_line(t.tn||'.'||c.cn||'已经存在');
end;
end loop;
execute immediate 'alter table "'||t.tn||'" rename to '||t.tn;
exception
when others then
dbms_output.put_line(t.tn||'已存在');
end;
end loop;
end;
- Oracle方言问题
我使用的jpa改了yml文件配置datasource由MySQL改为了Oracle后项目启动报错:
解决方案: yml文件配置Oracle方言:
- 数据类型导致的“无法转为内部表示”错误
这个问题是由于数据类型导致的错误,因为Boolean类型在MySQL中为bit类型,转到Oracle后为varchar2类型了,且数据内容异常乱码,导致与Java实体类型无法对应导致报错。
解决方案: 我没找到比较好的解决方案,是在Oracle中将数据类型改为number后又将相关字段内容从MySQL复制了一遍。因为Boolean类型字段相对较少,所以操作起来倒没有耗用太多时间。
以上为过程整理信息,欢迎有相关操作经历的小伙伴评论。