derby db升级文件权限问题

derby db upgrade file permission issue

我目前 运行正在使用 10.13.1.1 版创建的 derby 数据库实例 我通过网络模式 (startNetworkServer) 运行在 redhat 服务器上连接。

我现在想升级到版本 10.14.2.0

但是,尝试连接到升级后的数据库时,我收到访问被拒绝 "java.io.FilePermission" 错误。

详情: 我去下载了版本 10.13.1.1 和 10.14.2.0 到我的 windows 桌面上。

使用以下命令创建数据库备份:SYSCS_UTIL.SYSCS_BACKUP_DATABASE

我将此备份复制到 10.13 和 10.14 文件夹。

从我目前的版本(13)开始,我启动了网络服务器,然后使用ij连接到数据库。这很好用,我可以看到表格。这证实我的备份没问题。

connect 'jdbc:derby://localhost:1527/c:\Temp\database;create=false';

然后我启动我的14版本网络服务器,然后去14的ij。当我尝试连接到备份时:

connect 'jdbc:derby://localhost:1527/c:\Temp\database;create=false';

我收到文件权限错误:

ERROR XJ001: DERBY SQL error: ERRORCODE: 0, SQLSTATE: XJ001, SQLERRMC: java.security.AccessControlException access denied ("java.io.FilePermission" "C:\Temp\updating_derby\threatadvisor" "read") XJ001.U

很公平,我认为这是因为我正在尝试连接到旧版本,而没有 运行 upgrade=true 参数。当我删除创建参数并添加升级参数时,它仍然失败并出现同样的问题。

好的,所以也许我不能通过网络服务器升级数据库,我必须直接连接到数据库。在我的应用程序中,我使用以下连接字符串:

jdbc:derby:C:/Temp/14/database;upgrade=true;

该应用在类路径中有版本 14 的 jar,所以应该使用它并升级。它确实如此,应用程序正常启动,我看到了所有数据。我怎么知道它升级了?因为我尝试使用 13 网络服务器和 ij 连接到这个 14 数据库,但它失败了(由于版本原因,正如预期的那样)。

所以我做对了吗?不,我再次尝试使用 ij 通过网络服务器连接到这个现在升级的数据库,我再次遇到 java.io.FilePermission 问题。

我进去并确保 "database" 文件夹内的文件夹和文件的实际 OS 权限不仅仅是只读的。 None 是。但是还是报错。

我什至尝试 运行在 redhat 机器上(在不同的端口上)连接 14 网络服务器,并尝试通过 ij 连接到这个数据库,甚至在那里我遇到了文件权限问题。

我真的不知道下一步该怎么做。请帮忙!

仅供参考,derby.log 文件中的完整问题:

Tue Jun 11 12:04:15 AEST 2019 : Apache Derby Network Server - 10.14.2.0 - (1828579) started and ready to accept connections on port 1527 Tue Jun 11 12:04:28 AEST 2019 Thread[DRDAConnThread_2,5,main] Cleanup action starting java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Temp\database" "read") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:884) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.SecurityManager.checkRead(SecurityManager.java:888) at java.io.File.exists(File.java:814) at java.io.WinNTFileSystem.canonicalize(WinNTFileSystem.java:434) at java.io.File.getCanonicalPath(File.java:618) at org.apache.derby.impl.io.DirStorageFactory.doInit(Unknown Source) at org.apache.derby.impl.io.BaseStorageFactory.init(Unknown Source) at org.apache.derby.impl.io.DirStorageFactory.init(Unknown Source) at org.apache.derby.impl.services.monitor.StorageFactoryService.privGetStorageFactoryInstance(Unknown Source) at org.apache.derby.impl.services.monitor.StorageFactoryService.access0(Unknown Source) at org.apache.derby.impl.services.monitor.StorageFactoryService.run(Unknown Source) at org.apache.derby.impl.services.monitor.StorageFactoryService.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.impl.services.monitor.StorageFactoryService.getCanonicalServiceName(Unknown Source) at org.apache.derby.impl.services.monitor.BaseMonitor.findProviderAndStartService(Unknown Source) at org.apache.derby.impl.services.monitor.BaseMonitor.startPersistentService(Unknown Source) at org.apache.derby.iapi.services.monitor.Monitor.startPersistentService(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.run(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.impl.jdbc.EmbedConnection.startPersistentService(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.(Unknown Source) at org.apache.derby.jdbc.InternalDriver.run(Unknown Source) at org.apache.derby.jdbc.InternalDriver.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.jdbc.InternalDriver.getNewEmbedConnection(Unknown Source) at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source) at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source) at org.apache.derby.jdbc.EmbeddedDriver.connect(Unknown Source) at org.apache.derby.impl.drda.Database.makeConnection(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.getConnFromDatabaseName(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.verifyUserIdPassword(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.parseSECCHK(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.parseDRDAConnection(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.processCommands(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source) Cleanup action completed

编辑 1 现在尝试根据此 guide 设置 security.policy 文件。然而,在基于 demo 目录中的模板创建新策略文件后,我们甚至无法让 derby 获取我们的文件。 当我们尝试 运行:

java -classpath "C:\Temp\lib\derby.jar;C:\Temp\lib\derbynet.jar;C:\Temp\lib\derbyclient.jar;C:\Temp\lib\derbytools.jar;C:\Temp\lib\derbyoptionaltools.jar" -Djava.security.manager -Djava.security.policy=C:\Temp\server.policy org.apache.derby.drda.NetworkServerControl start

我们收到以下错误:

java.security.AccessControlException: access denied org.apache.derby.security.SystemPermission( "engine", "usederbyinternals" ) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:884) at org.apache.derby.iapi.security.SecurityUtil.checkDerbyInternalsPrivilege(Unknown Source) at org.apache.derby.iapi.services.monitor.Monitor.getMonitorLite(Unknown Source) at org.apache.derby.iapi.services.property.PropertyUtil.run(Unknown Source) at org.apache.derby.iapi.services.property.PropertyUtil.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.iapi.services.property.PropertyUtil.getMonitorLite(Unknown Source) at org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(Unknown Source) at org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(Unknown Source) at org.apache.derby.impl.drda.NetworkServerControlImpl.init(Unknown Source) at org.apache.derby.impl.drda.NetworkServerControlImpl.(Unknown Source) at org.apache.derby.drda.NetworkServerControl.main(Unknown Source)

我知道这一行在策略文件中(未注释):

permission org.apache.derby.security.SystemPermission "engine", "usederbyinternals";

但是,我认为它甚至没有获取我们的策略文件,就好像我们更改了对不存在的策略文件的引用一样,我们仍然会遇到同样的错误。

感谢@BryanPendleton 为我指明了正确的方向。对于最初的问题,确实是因为我们需要 server.policy 文件。他的 link 很有帮助: db.apache.org/derby/docs/10.14/security/csecjavasecurity.html

我们遇到的第二个问题已通过使用位于此处的 server.policy 文件模板解决: https://builds.apache.org/job/Derby-docs/lastSuccessfulBuild/artifact/trunk/out/security/rsecbasicserver.html

而不是下载中提供的那个(derby 下载中的那个没有提到的那么多 jar)。更重要的是,我们必须调整引用罐子的方式。您会看到所有示例都是针对 unix 格式的,而我们是在测试 windows PC 上开发的。因此,而不是像 (unix):

grant codeBase "file:///home/someone/derby/lib/derby.jar"

我们需要做的:

grant codeBase "file:///C:/Temp/14/lib/derby.jar"

请注意 'file' 之后的附加 '/' - 我们假设它只是 "file://C:...."

问题的另一种解决方案是使用此代码:

https://github.com/apache/hive/blob/master/core/src/test/java/org/apache/hive/hcatalog/DerbyPolicy.java

并使用这个: Policy.setPolicy(新的 DerbyPolicy());

以编程方式设置策略。