derby db升级文件权限问题

时间:2019-06-11 03:41:20

标签: derby

我当前正在运行从版本10.13.1.1创建的derby数据库实例 我通过在Redhat服务器上运行的网络模式(startNetworkServer)进行连接。

我现在想升级到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\13\database;create=false';

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

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

我收到filePermission错误:

  

错误XJ001:DERBY SQL错误:错误代码:0,SQLSTATE:XJ001,SQLERRMC:java.security.AccessControlException   访问被拒绝(“ java.io.FilePermission”“ C:\ Temp \ updating_derby \ threatadvisor”“读取”)   XJ001.U

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

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

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

该应用在类路径上具有版本14 jar,因此应使用它并进行升级。在执行此操作时,该应用程序正常启动,我看到了所有数据。我怎么知道它升级了?因为我试图使用13个网络服务器和ij连接到这14个数据库,但是它失败了(由于版本原因,这是预期的)。

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

我进入并确保对“数据库”文件夹内的文件夹和文件的实际操作系统权限不只是只读的。没有。仍然会出错。

我什至尝试在Redhat盒上(在另一个端口上)运行14个网络服务器,并尝试通过ij连接到该数据库,甚至出现文件许可问题。

我真的不知所措。请帮忙!

仅供参考,derby.log文件中的完整内容:

  

2019年6月11日星期二12:04:15:Apache Derby网络服务器-10.14.2.0-(1828579)已启动并准备接受端口1527上的连接   Tue Jun 11 12:04:28 AEST 2019 Thread [DRDAConnThread_2,5,main]清理操作开始   java.security.AccessControlException:访问被拒绝(“ java.io.FilePermission”“ C:\ Temp \ 14 \ database”“读取”)       在java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)       在java.security.AccessController.checkPermission(AccessController.java:884)       在java.lang.SecurityManager.checkPermission(SecurityManager.java:549)       在java.lang.SecurityManager.checkRead(SecurityManager.java:888)       在java.io.File.exists(File.java:814)       在java.io.WinNTFileSystem.canonicalize(WinNTFileSystem.java:434)       在java.io.File.getCanonicalPath(File.java:618)       在org.apache.derby.impl.io.DirStorageFactory.doInit(未知来源)       在org.apache.derby.impl.io.BaseStorageFactory.init中(未知源)       在org.apache.derby.impl.io.DirStorageFactory.init中(未知源)       在org.apache.derby.impl.services.monitor.StorageFactoryService.privGetStorageFactoryInstance(未知来源)       at org.apache.derby.impl.services.monitor.StorageFactoryService.access $ 400(来源不明)       在org.apache.derby.impl.services.monitor.StorageFactoryService $ 12.run(未知源)       在org.apache.derby.impl.services.monitor.StorageFactoryService $ 12.run(未知源)       在java.security.AccessController.doPrivileged(本机方法)       在org.apache.derby.impl.services.monitor.StorageFactoryService.getCanonicalServiceName(未知来源)       在org.apache.derby.impl.services.monitor.BaseMonitor.findProviderAndStartService(未知来源)       在org.apache.derby.impl.services.monitor.BaseMonitor.startPersistentService(未知来源)       在org.apache.derby.iapi.services.monitor.Monitor.startPersistentService(未知来源)       在org.apache.derby.impl.jdbc.EmbedConnection $ 4.run(未知源)       在org.apache.derby.impl.jdbc.EmbedConnection $ 4.run(未知源)       在java.security.AccessController.doPrivileged(本机方法)       在org.apache.derby.impl.jdbc.EmbedConnection.startPersistentService(未知来源)       在org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(未知来源)       在org.apache.derby.impl.jdbc.EmbedConnection(未知来源)       在org.apache.derby.jdbc.InternalDriver $ 1.run(未知源)       在org.apache.derby.jdbc.InternalDriver $ 1.run(未知源)       在java.security.AccessController.doPrivileged(本机方法)       在org.apache.derby.jdbc.InternalDriver.getNewEmbedConnection(未知源)       在org.apache.derby.jdbc.InternalDriver.connect(未知来源)       在org.apache.derby.jdbc.InternalDriver.connect(未知来源)       在org.apache.derby.jdbc.EmbeddedDriver.connect(未知来源)       在org.apache.derby.impl.drda.Database.makeConnection(未知来源)       在org.apache.derby.impl.drda.DRDAConnThread.getConnFromDatabaseName(未知来源)       在org.apache.derby.impl.drda.DRDAConnThread.verifyUserIdPassword(未知来源)       在org.apache.derby.impl.drda.DRDAConnThread.parseSECCHK(未知来源)       在org.apache.derby.impl.drda.DRDAConnThread.parseDRDAConnection(未知来源)       在org.apache.derby.impl.drda.DRDAConnThread.processCommands(未知来源)       在org.apache.derby.impl.drda.DRDAConnThread.run(未知来源)   清理操作已完成

编辑1 现在尝试按照此guide设置security.policy文件。但是,在基于demo目录中的模板创建了一个新的策略文件之后,我们甚至无法获得derby来拾取我们的文件。 当我们尝试运行时:

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

我们收到以下错误:

  

java.security.AccessControlException:拒绝访问org.apache.derby.security.SystemPermission(“ engine”,“ usederbyinternals”)           在java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)           在java.security.AccessController.checkPermission(AccessController.java:884)           在org.apache.derby.iapi.security.SecurityUtil.checkDerbyInternalsPrivilege(未知来源)           在org.apache.derby.iapi.services.monitor.Monitor.getMonitorLite(未知来源)           在org.apache.derby.iapi.services.property.PropertyUtil $ 2.run(未知源)           在org.apache.derby.iapi.services.property.PropertyUtil $ 2.run(未知源)           在java.security.AccessController.doPrivileged(本机方法)           在org.apache.derby.iapi.services.property.PropertyUtil.getMonitorLite(未知来源)           在org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(未知来源)           在org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(未知来源)           在org.apache.derby.impl.drda.NetworkServerControlImpl.init(未知来源)           在org.apache.derby.impl.drda.NetworkServerControlImpl。处(未知来源)           在org.apache.derby.drda.NetworkServerControl.main(未知来源)

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

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

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

2 个答案:

答案 0 :(得分:1)

对于此问题,还有另一种解决方法:

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

并使用此:         Policy.setPolicy(new DerbyPolicy());

要以编程方式获取策略集。

答案 1 :(得分:0)

感谢@BryanPendleton为我指出了正确的方向。对于最初的问题,确实是因为我们需要server.policy文件。他的链接很有帮助: 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:// C:....”