历史版本38 :配置外接数据库 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 版本编辑

报表服务器版本
JAR 包
10.0
2019-05-20

2. 描述编辑

HSQL 是报表内置的数据库,但由于 HSQL 不能多线程访问、数据量大后不稳定等原因,导致碰到集群或者数据量比较大时,必须要配置外接数据库才能保证系统的稳定性。

而迁移是建立在已有旧数据的基础上,旧数据的迁移过程存在不可预知的问题,因此客户可自行选择迁移数据或直接启用新数据库。

注:JAR 包版本低于 2019-05-20 时,用户配置外接数据库时只能迁移数据,不可直接启用新数据库。

注:请勿在迁移过程中刷新页面

3. 支持的数据库编辑

数据迁移支持的数据库类型及版本如下:

 JAR 包
数据库类型  支持数据库版本
不限
MySQL  5.1.73、5.5.31、5.5.46、5.5.56、5.6.22、5.6.31、5.7.16
不限
SqlServer  2000、2005、2008、2012、2014、2016
不限
Oracle  10g、11g、12c、9i
2018-12-27DB2

  9.7、8.2、11.1,其他版本暂未测试

  使用db2数据库时需要先放置驱动,[平台] IBM DB2数据连接

2019-05-20RDS MySQL  -

4. 初始化时配置外接数据库编辑

4.1 外接数据库设置

1)首次访问 决策系统 时,首先进入初始化设置,「账号设置」完毕后,进入「数据库设置」,如下图所示:

222

注:在已完成外接数据库设置的情况下进行 管理员重置 时,只需要进行账号设置。

2)账号设置完成后,进入「数据库设置」,分为:内置数据库和外接数据库,这里选择「配置外接数据库」,如下图所示:

222

注:内置数据库适用于本地试用产品功能,而外接数据库适用于平台的正式使用。

3)进入到配置界面,输入数据库相应的信息,如下图所示:

1.jpg

注:MySQL 数据库需要设置默认字符集为 utf8,默认排序规则为 utf8_bin,如下图所示:

222

注:其他数据库的注意事项请查看 本文第6节

4.2 外接数据库连接及导入

1)点击「启用新数据库」按钮,系统将连接外接数据库。连接成功,提示「连接成功,正在导入数据」;连接失败,请查看「详细信息」并修改重新连接。

2)初始化时配置外接数据库,数据默认迁移。

如外接数据库已有平台数据,系统跳出提示弹窗,点击确认将清空平台原有数据,然后开始导入数据;如外接数据库无平台数据,则直接开始导入。

如下图所示:

2.jpg

3)成功启用新数据库后,直接点击“登录”按钮,跳转到登录页面,外接数据库配置完成。如下图所示:

222

注:若想迁移后再改回原来的内置数据库,只需要将db.properties 文件删除,然后重启工程即可。

       文件路径:%FR_HOME%\webapps\webroot\WEB-INF\config\db.properties

5. 在平台中配置外接数据库编辑

5.1 系统管理

根据上面的步骤,完成了外接数据库配置,则进入平台系统,选择管理系统>系统管理-常规,可看到外接数据库为「已配置」状态,如下图:

图片.png

注:若未在初始化时配置外接数据库,则此处显示「待配置」状态,点击可进行配置。

2)点击「已配置」按钮,查看连接配置详细信息,也可以修改配置,再启用新数据库,如下:

3.jpg

5.2 外接数据库配置

在平台中配置外接数据库,可以选择是否「迁移数据至要启用的数据库」,默认迁移。

如迁移数据,配置方式与初始化配置逻辑相同;如不迁移数据,将直接切换数据库,自动备份历史数据。

如下图所示:

5.jpg

注:数据迁移成功后无需重启。

5.3 还原数据库

配置外接数据库后,原数据库文件db.properties 将备份到 %FR_HOME%\webapps\webroot\WEB-INF\config\db.properties.bak,若该文件已存在,则覆盖。

如在使用外置数据库时发生意外或其他情况,可通过备份文件恢复原数据库。如下图所示:

4.jpg

5.4 智能检测

若未配置外接数据库进行迁移,在管理系统>智能检测-服务器配置检测中,会有相应的问题建议,点击「外接数据库配置」进行设置。如下图所示:

222

5.5 系统消息

若未配置外接数据库,在正式注册后,管理员将收到系统消息,提醒配置。如下图所示:

222
查看系统消息详情
,点击“处理”,即可进入「外接数据库配置」,如下图所示:

222

6. 注意事项编辑

6.1 外接 MySQL 数据库

平台外接 MySQL数据库时,需要设置字符集排序规则(大小写敏感)。

MySQL 中存在多种格式的 utf8 编码的排序规则,其中最常见的两种如下表所示:

字符集排序规则  含义示例  
utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写Alex和alex被认为是两个不同的值  
utf8_general_ci ci 为 case insensitive 的缩写,即大小写不敏感,为 utf8 默认编码Alex和alex被认为是相同的值

推荐在配置外接 MySQL 数据库前,先设置数据库默认字符集为 utf8 ,默认排序规则为 utf8_bin。如下图所示:

222

如果一开始数据库没有设置 utf8_bin ,但已经迁移过去了,那么有两张表 fine_conf_entity、 fine_conf_classname 需要修改为 utf8_bin,下面以 fine_conf_entity 为例:

1)查询当前的字符集排序规则 

show full columns from fine_conf_entity

2)设置字符集排序规则为utf8_bin 

  • 设置列的默认校验规则 

ALTER TABLE fine_conf_entity MODIFY id VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;
  • 设置表的校验规则 

ALTER TABLE fine_conf_entity DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

3)查看是否修改成功 

 show full columns from fine_conf_entity

4)用上面1)2)3)相同的步骤将 fine_conf_entity 替换为 fine_conf_classname 表,设置如下图所示:

222

6.2 外接 Oracle 数据库

1)新建账户

对于 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;


注:在迁移 finedb 数据库时要求使用的表空间最好是空的。

2)模式选择

配置到 Oracle 的时候,会有一个模式的选项。模式的名字和数据库用户的名字相同(Oracle 的用户名和模式推荐大写)
222

当 Oracle 集群的时候,我们需要使用 jdbc:oracle:thin:@//<host>:<port>/<service_name> 格式,注意是/而不是 :拼写URL,如下图所示:

222

6.3 外接 SQL Server 数据库

1)2018-12-27 之后的jar:

外接 SQL Server 数据库的时候,会有一个模式(schema)的选项。默认选择dbo即可

也可以用SELECT * FROM sys.database_principals查找一下已有的模式,或者使用 Navicat 连接查看各数据库的模式较直观。

2)2018-12-27 之前的jar:

外接 SQL Server 数据库的时候,没有模式(schema)的选项。当升级2018-12-27之后的jar时,需要手动添加模式(schema)。

添加方法:修改%FR_HOME%\webapps\webroot\WEB-INF\config\db.properties文件,手动添加模式(schema)。

若为dbo模式,hibernate.default_schema=dbo,如下图所示:

222

6.4 外接 DB2 数据库

外接到 Db2 数据库的时候,会有一个模式的选项。模式一般和用户名一样。

注:Db2 迁移的时候用户名是高权限的,会有和用户名同名的模式,也可以另外新建模式。
222
因为外接定时任务需要用到临时表,所以需要确保数据库有临时表空间,同时由于 DB2 的 PAGESIZE 大小限定了可放到表空间的表的行长度和列数。所以在迁移之前需要确保数据库 PAGESIZE 足够大,基于以上原因,需要一些数据库操作来保证外接顺利完成。

1)查询当前 database 的表空间及其 PAGESIZE,9.7 以下版本 PAGESIZE 需要大于等于 8K(8192) ,其余版本默认 4K(4096) 即可

select TBSPACE, OWNER, PAGESIZE from syscat.tablespaces

2)如果没有符合条件的数据库,需要创建指定 PAGESIZE 大小的数据库

CREATE DB TESTDB PAGESIZE 8192

3)创建临时表空间(自定义路径)

CREATE USER TEMPORARY TABLESPACE usr_tbsp

MANAGED BY DATABASE

USING (FILE 'D:\tblspaces\user_tbsp' 5000 );

4)DB2 日志空间配置 

如果 finedb 数据量过大,而日志空间又不足,很可能在配置过程中出错(SQLCODE=-964, SQLSTATE=57011),所以需要确保日志空间足够

get db cfg for DATABASENAME

查看日志配置, 参考配置如下 

  • 修改日志文件大小:

db2 update db cfg for <DATABASENAME> using LOGFILSIZ 8192
  • 修改主日志文件个数:

db2 update db cfg for <DATABASENAME> using LOGPRIMARY 50
  • 修改辅助日志文件个数:

db2 update db cfg for <DATABASENAME> using LOGSECOND 20

参考文档: https://www-01.ibm.com/support/docview.wss?uid=swg21295503

6.5 外接 RDS MySQL 数据库

和 MySQL 数据库相同,RDS MySQL 数据库也需要设置字符集排序规则(大小写敏感),设置方法和 MySQL 相同,详细参见本文 6.1 节。

其他配置内容和 MySQL 相同,如下图所示:

222

6.6 配置失败报错

6.6.1 案例一

配置外接数据库 MySQL 报错 could not execute batch

1)日志:

16:59:48 Thread-45 ERROR [standard] could not execute batch
com.fr.third.org.hibernate.exception.GenericJDBCException: could not execute batch

......

Caused by: java.sql.SQLException: Incorrect string value: '\xE6\xA8\xA1\xE6\x9D\xBF...' for column 'id' at row 1

2)分析:

检查确保是有权限的

Incorrect string value: '\xE6\xA8\xA1\xE6\x9D\xBF...' for column 'id' at row 1 应当是数据库编码的原因。

3)解决方案:

查看客户建finedb数据库的语句:create database finedb

发现没有加约束条件,将语句改为:create database finedb DEFAULT CHARSET utf8 COLLATE utf8_bin

导入成功。

6.6.2 案例二

配置外接数据库 Oracle 报错 Oracle could not execute batch

1)出错日志:

Oracle could not execute batch

2)解决方案:

模式填thin就会报错,改成用户名。

6.6.3 案例三

配置外接数据库 MySQL 报错 doesn't exist

1)出错日志:

ERROR SqlExceptionHelper: Table 'shaxiang.ht_fine_output_platform_msg' doesn't exist

2)分析:

ht_fine_output_platform_msg不存在,但是我们导入完成的表并没有 ht 开头的表。考虑是否可能是临时表之类的,看到下一个报错

WARN Helper: unable to drop temporary id table after use [Statement violates GTID consistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context.
These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions.]

使用后无法删除临时 id 表(语句违反 GTID 一致性):创建临时表和删除临时表只能在事务上下文之外执行。

在函数或触发器中也不允许使用这些语句,因为函数和触发器也被认为是多语句事务。

GTID 开启后限制了 CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE 这些系统认为不安全的事务

3)解决方案:

去 MySQL 配置文件关闭 GTID 配置参数: enforce-gtid-consistency=OFF

如果有最高数据权限可以关闭 GTID,但是如果使用了云数据库 RDS Mysql,该参数不可以修改

可以通过先配置到本地的 MySQL 数据库,然后通过备份和导入功能,将数据库 finedb 导入 RDS Mysql

然后修改数据库配置文件%webapp%/webroot/WEB-INF/config/db.properties

hibernate.connection.url=」这项的数据库连接 URL

注意:数据库用户名的密码本地和云数据库保持一致