平台数据迁移

目录:

1. 前言

在FineReport中,决策平台的数据(用户、角色、组织机构、权限等信息)是存储在finedb数据库中的,默认情况下finedb是一个内置的HSQL数据库。HSQL数据库存在一些缺陷:性能一般、出现问题难以查出真正的错误信息、无法支持分布式部署,为了解决HSQL数据库的局限性,我们推出一款插件-平台数据迁移,可以帮助用户将之前存储的HSQL中的数据迁移到MySQL,Oracle以及SQL SERVER中

(1)支持将finedb的旧数据从内置hsql迁移到MySQL,Oracle以及SQL SERVER中;
(2)支持将logdb的数据结构(不包括旧数据)从内置hsql迁移到MySQL,Oracle以及SQL SERVER中。
(3)同步数据集原来是存在xml中的,可以迁移到平台数据库中,详细请查阅同步数据集迁移至平台数据库

2. 注意事项

2.1 测试过的数据库

msql版本:  mysql5.7.13-log ;mysql5.6.31-log ;mysql5.5.31-log;mysql5.1.40-community;10.0.16-MariaDB;mysql5.7.4 ;mysql5.7.9;mysql5.7.12;mysql5.7.16

oracle版本:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
            Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
            Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
SQL SERVER版本:SQL SERVER 2005,SQL SERVER 2008,SQL SERVER 2012 
注:2017.03.17之后的jar和V1.9版的平台数据迁移插件支持SQL SERVER,暂时不支持SQL SERVER 2016。

2.2 迁移中注意事项

(1)只能迁移一次,第二次需要把目标数据库里面的表删除掉才能再次进行迁移的
(2)迁移过程,由于oracle的特殊性,会临时关闭触发器,待数据迁移完成后会重新启用触发器,这种问题是因为迁移过程出错导致还没到启用触发器那一步,迁移过程如果出错,请将错误日志信息发给技术支持协助解决
(3)由于原内置hsql数据库对finedb数据未能进行准确过滤,可能部分数据在原finedb是没问题的,但迁移过程会导致报错,比如出现迁移后新建的表数量和文档不符,触发器未启用,很多表没有数据等问题,所以有很大的概率会出现迁移失败的问题,这里特别指出几张表,例如FR_EXCEL_SUBMIT_TASKFR_WRITE_TEMP_DATAFR_PROCESS_REMIND_TOAST,这些表由于表结构的原因(字段超过最大长度,空字符串插入不能为空的列,不合理的联合主键等等),原有数据很可能导致迁移过程报错,用户可根据错误日志记录的情况自行判断原finedb中是否存在导致失败的数据,可修改后再进行迁移,这些表结构后续正在修改,也可联系技术支持协助解决
(4)对于oracle数据库,迁移前最好单独建一个账户(新建一个表空间,并指定为该用户默认表空间)。
例如用system用户登录Oracle,添加用户data_migration:
create user data_migration identified by data_migration;
并对该用户进行赋权限:
grant connect,resource to data_migration; 
grant create any sequence to data_migration;
grant create any table to data_migration;
grant delete any table to data_migration;
grant insert any table to data_migration;
grant select any table to data_migration;
grant unlimited tablespace to data_migration;
grant execute any procedure to data_migration;
grant update any table to data_migration;
grant create any view to data_migration;
grant create any Trigger to data_migration;
222
这样数据库就准备好了,我们将finedb的平台配置数据转移动这个数据库实例上即可。
注:在迁移finedb数据库时要求使用的表空间最好是空的。

注意:迁移到不同的数据库,需要在WEB-INF/lib下放置对应数据库的驱动。oracle还需要额外放置一个quarz.jar

(5)迁移插件不支持MyISAM引擎,因为MyISAM引擎不支持事务,也不支持外键;
        因此当mysql数据引擎为MyISAM时,需要修改mysql默认数据引擎,由MyISAM改为 InnoDB,重启mysql,再进行数据迁移即可

3. 使用步骤

3.1 插件安装

设计器插件安装方法参照插件的安装管理
服务器安装插件方法参照服务器上安装插件

3.2 迁移finedb

以管理员的身份打开决策平台,点击管理系统-平台数据迁移-平台配置,这里以mysql数据库为例,选择驱动,填写正确的地址、用户名、密码,点击开始转移,弹出提示“测试连接成功,是否开始迁移数据?”,点击确定,即开始迁移数据,如下图:

222


222


222


222

迁移成功后,可以看到mysql数据库里多了这些数据库表(注:有些表在迁移后未创建,需要在使用过程中用到该表,才会自动创建),如下图:

222

注:1.7及往后的版本支持同步数据集

另:1.7版本之前的数据迁移插件不支持同步数据集,若要进行finedb迁移,请先备份fsconfig.xml文件,然后关闭同步数据集完成迁移,迁移成功后,修改备份fsconfig.xml中的<DatabaseAdapterAttr isAdapted = "true"/>,并替换该文件即可正常使用。

3.3 迁移logdb

以管理员的身份打开决策平台,点击管理系统-平台数据迁移,点击设置,可以选择是否迁移logdb,如下图:


222

点击日志信息,这里以mysql数据库为例,选择驱动,填写正确的地址、用户名、密码,点击保存,弹出提示“保存成功,重启服务器后生效”,如下图:


222

重启服务器后,mysql里可以看到迁移过来的数据库表,如下图:

222

3.5 还原

如果用户想还原连接信息,只需要修改WebReport\WEB-INF\resources\config.xml中PlatformConnection节点(一般来说,直接去掉即可);

此外,还需要修改WebReport\WEB-INF\resources\fsconfig.xml的DatabaseAdapterAttr节点(同样的,去掉即可)


222


222


4. 迁移问题总结

finedb迁移外置Oracle和MySQL时,由于操作上的错误,原来finedb的脏数据,以及不同数据库环境间的微小差异都可能导致迁移过程中报错,导致部分数据无法迁移,这里总结一下常见的错误及对应的解决办法。

4.1 报错1 
报错:迁移过程中出现错误,错误信息为:undefined
222


原因及方案:这种错误一般是由于开启了同步数据集导致的,在平台检查是否打开了同步数据集,如果是,则参考文档中关于使用同步数据集情况下如何迁移finedb。

4.2 报错2

报错:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationExceprion:Cannot add or update a child row:a foreign key constraint fails(‘testfs’.‘fr_t_companyrole’,CONSTRAINT‘fr_fk_COMPANYROLE__p’FOREIGN KEY(‘postid’)REFERENCES‘fr_t_post’(‘id’))
222

原因及方案:出现这个错误通常是由于数据库字符编码的问题,检查数据库字符集编码并在数据连接中加入强制编码,注意格式正确。示例格式:jdbc:mysql://192.168.100.83:3306/testfs?useUnicode=true&characterEncoding=UTF-8

4.3 报错3
报错:java.lang.ClassCast Exception:java.lang.Long cannot be cast to jaca.sql.Timestamp
222

原因及方案:由于Oracle对字段格式有较严格要求,某些数据存入数据库时无法识别出正确类型,这种情况比较罕见,一种方式是查看报错信息,找到对应数据,修改或删除,再做迁移,正在修改这个bug,这个问题很快就会得到解决。

4.4 报错4
报错:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Table 'rssystem.fr_process_task_impl' doesn't exist
222

原因及方案:这种情况是由于部分MySQL小版本存在的bug导,致同一个表中无法存储超过一个timestamp类型且默认不为空的字段导致的,现在代码已经修改过,更新jar包后就不会出现。


4.5 报错5
报错:com.mysql.jdbc.exceptions.jdbc4.MySQLSynataxErrorException:Table'newdb.fr_reportletentry'doesn't exist


222

原因及方案:这种情况通常是第一次迁移后未重启直接再次进行迁移导致的,解决办法是,重启服务器,删除第一次迁移生成的表再次进行迁移。

4.6 报错6
报错:java.sql.SQLException:ORA-00904:"mobileCoverId":标识符无效
222

原因及方案:这种问题是由于目标数据库存在手动新建的数据表,并且少了对应的数据列,请清空后再迁移;出现类似标识符无效的情况,通常是由于目标数据库存在缺少数据列的数据表,也可能是由于原工程finedb表本身存在缺少相关信息的情况,这种情况下,需要对照日志,检查内置finedb对应表是否缺少列。

4.7 报错7
报错:Failure occured during job recovery


222

 原因及方案:这种错误目前只遇到一次,客户的数据库部署在阿里云上,版本号是MySQL 5.6.16,相同版本数据库在本地未能还原这个错误,错误出在quartz.jar,由于本地无法还原,目前只能暂时屏蔽掉定时任务的迁移才可以迁移成功,如果本地也遇到这个错误请提出。

4.8 报错8

报错:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_SELECT_LIMIT=DEFAULT' at line 1 

原因及方案:jdbc在连接数据库时候会发送测试语句SET OPTION SQL_SELECT_LIMIT=DEFAULT 

这在mysql5.6以下版本是可以的 ,但是5.6不再支持SET.

升级驱动到对应数据库版本即可, 比如是5.7的mysql, 用mysql-connector-java-5.1.39-bin.jar

4.9 报错9
报错:java.sql.SQLException:Incorrect string value:'\xE5\x9F\x8E\xE5\xB8\x82...'for column 'name' at row 1
222

原因及方案:这种情况是由于数据库字符集设置的问题,修改数据库字符集设置即可。
222

4.10 报错10

报错:java.sql.SQLException:ORA-01400:无法将 NULL 插入(“KYYLA”.“FR_PROCESS_REMIND_TOAST”.“message”)
222

原因及方案:这种情况是由于部分MySQL小版本存在的bug导,致同一个表中无法存储超过一个timestamp类型且默认不为空的字段导致的,现在代码已经修改过,更新jar包后就不会出现。

4.11 报错11

报错:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationExceprion:Cannot add or update a child row:a foreign key constraint fails(‘fsd’.‘FR_T_CustomRole_User’,CONSTRAINT‘fr_fk_CustomRole_User__U’FOREIGN KEY(‘Userid’)REFERENCES‘FR_T_USER’(‘id’))
222

原因及方案:这种错误通常是FR_T_USER表里有同名用户(比如USER 和user这种只有大小写区别的字符串),已经加了打印信息,从日志能够看到相应报错

注:如果遇到某某表不存在的情况,请更新jar。

5. 迁移前后表名对比

有些表由于表名比较长,迁移后简化了表名,简化的表列举如下:

  迁移前表名
迁移后表名
  FR_T_PlatformManageModule  FR_T_PFMM
  FR_ReportProcessEntry  FR_RPPE
  FR_T_CompanyRoleEntryPrivilege  FR_T_COREP
  FR_T_CustomRoleEntryPrivilege  FR_T_CUREP
  FR_T_CompanyRoleDepAndCRolePrivilege  FR_T_CORDACRP
  FR_T_CustomRoleDepAndCRolePrivilege  FR_T_CURDACRP
  FR_T_CompanyRoleModulePrivilege  FR_T_CORMP
  FR_T_CustomRoleModulePrivilege  FR_T_CURMP
  FR_T_CompanyRoleESPrivilege  FR_T_CORESP
  FR_T_CustomRoleESPrivilege  FR_T_CURESP
 FR_T_CompanyRoleTemplatePrivilege FR_T_CORTP
 FR_T_CustomRoleTemplatePrivilege FR_T_CURTP
 FR_T_CompanyRoleHomePagePrivilege FR_T_CORHPP
 FR_T_CustomRoleHomePagePrivilege FR_T_CURHPP
 FR_Schedule_Task_Link_Output FSTLO


关键字:平台迁移

附件列表


主题: 部署集成

文档内容仅供参考,如果你需要获取更多帮助,请咨询帆软技术支持
关于技术问题,您还可以通过帆软论坛获取帮助,论坛上有非常多的大神,有些水平比帆软工程师还要高哦。
若您还有其他非技术类问题,可以联系帆软传说哥(微信ID:frbiaoge)