常见问题

为啥我的数据里自动生成的表里,只有block_detail_info、block_raw_data、block_task_pool、contract_info表有数据?

  1. 区块链刚完成初始化,块高为0;
  2. 数据导出合约Java文件的binary与上链文件的binary不一致,导致数据导出程序无法识别上链的合约数据。解决办法是,找到上链的代码,保证和数据导出里的bianry一致。例如,如果是通过java sdk来发送上链的,则将sdk中的合约java文件复制到数据导出工程中;如果是通过WeBASE-Front来发送的,则从WeBASE-Front中导出Java文件,并复制到数据导出工程中。然后,重新使用脚本重启即可。

我已成功启动和部署服务,也看到Mysql里生成了各个函数的表,但是只有event表里有数据,函数表里没有?

A:同上一个问题。数据导出合约binary与上链文件的binary不一致,导致数据导出程序无法识别上链的合约数据。解决办法是,找到上链的代码,保证和数据导出里的bianry一致。例如,如果是通过java sdk来发送上链的,则将sdk中的合约java文件复制到数据导出工程中;如果是通过WeBASE-Front来发送的,则从WeBASE-Front中获取对应binary信息,并复制到数据导出工程中。然后,重新使用脚本重启即可。

数据导出按文档配置好后,本机运行报错,报错信息如下图,请问怎么办?

../../_images/web3sdk_error.png报错信息

A:如果报错信息中含有web3sdk字样,这是因为使用了web3sdk编译Java代码。请更新控制台,使用2.6+控制台进行代码编译

数据导出的时候报错,”Could not find xxx.jar”,无法正常运行,错误信息参考如下:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':WeBankBlockchain-Data-Export-common:compileJava'.
> Could not resolve all files for configuration ':WeBankBlockchain-Data-Export-common:compileClasspath'.
   > Could not find java-sdk-2.6.1.jar (org.fisco-bcos.java-sdk:java-sdk:2.6.1).
     Searched in the following locations:
         http://maven.aliyun.com/nexus/content/repositories/jcenter/org/fisco-bcos/java-sdk/java-sdk/2.6.1/java-sdk-2.6.1.jar

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org
A:下载jar包失败。请首先检查报错的链接能否正常打开下载。如果正常,在项目根目录下执行下 bash gradlew clean bootJar --refresh-dependencies 强制重新刷新依赖。

数据导出的时候报错,”Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. “,无法创建表,错误信息参考如下:

2021-12-21 12:00:19.779 [pool-2-thread-1] ERROR c.w.b.d.export.tools.DataSourceUtils - export data table create failed, reason is : 
java.sql.SQLSyntaxErrorException: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092)
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040)
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeLarge
A:这通常是因为创建表的时候,单行的容量超过了mysql限制,例如在一个函数具有很大string类型参数,而数据导出中string类型默认对应varchar(2048),因此一行数据总体上便超出了mysql对单行容量的限制。 解决方法是在配置文件中指定每个字段对应的类型,可参考数据库配置中的system.paramSQLType配置项。例如下面示例中,HelloWorld有set和set2两个函数,它们的参数都是string,希望均按text类型存入mysql:
system.paramSQLType=HelloWorld.set.n.text|HelloWorld.set2.n.text

假如我的合约升级了怎么办,能否导出历史和更新后的合约数据?

A:可以。但是会被作为两个数据库表来进行存储,因为合约的数据结构等可能会改变。 操作方法:你也猜到了,我们建议建立版本号,将升级的合约与旧版本的合约Java文件,使用不同的命名,保存到配置文件下面。

是否支持合约函数和事件的重载?

A:暂不支持,建议修改命名。

是否支持多群组的数据导出?

A:支持 操作方法: 多群组数据导出

脚本没权限,执行shell脚本报错误”permission denied”或格式错误?

## 赋权限
chmod + *.sh
## 转格式
dos2unix *.sh

docker与数据库或链在一台机器上,docker无法访问宿主机

如果链或者数据库为本地安装,需查询本机ip,替换上述配置中的localhost 或者 127.0.0.1 地址。

启动脚本中已对本地ip进行了查询并替换,如果失败,可以按照下列命令查询并手动替换。

查询ip命令为:

   ifconfig | grep "inet " | grep -v 127.0.0.1

其中inet后的ip地址,即为本机ip

docker默认采用docker0桥接模式,需开启对应宿主机端口访问权限。

centos启动脚本报yum更新失败

错误如:

yum更新失败:rpmdb: BDB0113 Thread/process 2673/140126198814528 failed: BDB1507 Thread died...

解决方式如下:

cd /var/lib/rpm
rm -rf __db*
rpm --rebuilddb