知识库

使用 neo4j-admin 命令后出现“权限被拒绝”错误

如果您使用 Debian 或 RPM 软件包在 Linux 上安装 Neo4j(或使用了其中一个公共云市场产品),则需要小心文件和文件夹的权限。安装会创建一个用户:“neo4j”,该用户拥有 Neo4j 安装的所有文件。

$ sudo ls -l /var/lib/neo4j/data/databases/
total 4
drwxr-xr-x 4 neo4j neo4j 4096 Sep 18 17:59 graph.db
-rw-r--r-- 1 neo4j neo4j    0 Sep 18 17:59 store_lock

许多操作任务都是通过neo4j-admin实用程序完成的。由于此实用程序读取和写入文件系统,因此必须特别注意确保以正确的权限运行它。

例如,请考虑如下所示的备份

$ sudo neo4j-admin backup --from=localhost --name=graph.db_backup --backup-dir=/tmp
....................  10%
....................  20%
....................  30%
....................  40%
....................  50%
....................  60%
....................  70%
....................  80%
....................  90%
Checking node and relationship counts
Backup complete.

请注意,使用了sudo,这意味着它将以 root 身份运行。我们可以在备份位置看到这一点

$ ls -l /tmp/graph.db_backup/
total 372
-rw-r--r-- 1 root root 58959 Sep 18 18:09 debug.log
-rw-r--r-- 1 root root 57805 Sep 18 18:07 debug.log.1568830062412
-rw-r--r-- 1 root root 58726 Sep 18 18:07 debug.log.1568830143398
drwxr-xr-x 2 root root  4096 Sep 18 18:07 index
drwxr-xr-x 2 root root  4096 Sep 18 18:07 metrics
-rw-r--r-- 1 root root  8192 Sep 18 18:07 neostore
-rw-r--r-- 1 root root    96 Sep 18 18:07 neostore.counts.db.a
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.id
-rw-r--r-- 1 root root 40960 Sep 18 18:09 neostore.labelscanstore.db
-rw-r--r-- 1 root root     0 Sep 18 18:07 neostore.labeltokenstore.db
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.labeltokenstore.db.id
-rw-r--r-- 1 root root  8192 Sep 18 18:07 neostore.labeltokenstore.db.names
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.labeltokenstore.db.names.id
-rw-r--r-- 1 root root     0 Sep 18 18:07 neostore.nodestore.db
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.nodestore.db.id
-rw-r--r-- 1 root root  8192 Sep 18 18:07 neostore.nodestore.db.labels
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.nodestore.db.labels.id
-rw-r--r-- 1 root root     0 Sep 18 18:07 neostore.propertystore.db
-rw-r--r-- 1 root root  8192 Sep 18 18:07 neostore.propertystore.db.arrays
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.propertystore.db.arrays.id
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.propertystore.db.id
-rw-r--r-- 1 root root     0 Sep 18 18:07 neostore.propertystore.db.index
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.propertystore.db.index.id
-rw-r--r-- 1 root root  8192 Sep 18 18:07 neostore.propertystore.db.index.keys
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.propertystore.db.index.keys.id
-rw-r--r-- 1 root root  8192 Sep 18 18:07 neostore.propertystore.db.strings
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.propertystore.db.strings.id
-rw-r--r-- 1 root root  8192 Sep 18 18:07 neostore.relationshipgroupstore.db
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.relationshipgroupstore.db.id
-rw-r--r-- 1 root root     0 Sep 18 18:07 neostore.relationshipstore.db
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.relationshipstore.db.id
-rw-r--r-- 1 root root     0 Sep 18 18:07 neostore.relationshiptypestore.db
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.relationshiptypestore.db.id
-rw-r--r-- 1 root root  8192 Sep 18 18:07 neostore.relationshiptypestore.db.names
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.relationshiptypestore.db.names.id
-rw-r--r-- 1 root root  8192 Sep 18 18:07 neostore.schemastore.db
-rw-r--r-- 1 root root     9 Sep 18 18:09 neostore.schemastore.db.id
-rw-r--r-- 1 root root   106 Sep 18 18:09 neostore.transaction.db.0
drwxr-xr-x 2 root root  4096 Sep 18 18:07 profiles

如果管理员在某个时候使用此备份进行恢复

$ sudo neo4j-admin restore --from=/tmp/graph.db_backup --database=graph.db --force=true

恢复的数据库文件夹和文件现在将由 root 拥有

$ sudo ls -l /var/lib/neo4j/data/databases/
total 4
drwxr-xr-x 5 root  root  4096 Sep 18 18:12 graph.db
-rw-r--r-- 1 neo4j neo4j    0 Sep 18 17:59 store_lock

尝试启动 Neo4j 服务现在将失败,并出现类似以下错误

Starting Neo4j.
Sep 18 18:13:55 proddb1-ubuntu neo4j[6805]: 2019-09-18 18:13:55.143+0000 INFO  ======== Neo4j 3.5.9 ========
Sep 18 18:13:55 proddb1-ubuntu neo4j[6805]: 2019-09-18 18:13:55.163+0000 INFO  Starting...
Sep 18 18:13:56 proddb1-ubuntu neo4j[6805]: 2019-09-18 18:13:56.624+0000 INFO  Initiating metrics...
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]: 2019-09-18 18:13:57.116+0000 ERROR Failed to start Neo4j: Starting Neo4j failed: Component 'org.neo4j.server.database.LifecycleManagingDatabase@2b52c0d6' was successfully initial
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]: org.neo4j.server.ServerStartupException: Starting Neo4j failed: Component 'org.neo4j.server.database.LifecycleManagingDatabase@2b52c0d6' was successfully initialized, but failed
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.server.exception.ServerStartupErrors.translateToServerStartupError(ServerStartupErrors.java:45)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.server.AbstractNeoServer.start(AbstractNeoServer.java:187)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.server.ServerBootstrapper.start(ServerBootstrapper.java:124)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.server.ServerBootstrapper.start(ServerBootstrapper.java:91)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at com.neo4j.server.enterprise.CommercialEntryPoint.main(CommercialEntryPoint.java:22)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]: Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.server.database.LifecycleManagingDatabase@2b52c0d6' was successfully initialized, but failed to sta
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:473)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:111)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.server.AbstractNeoServer.start(AbstractNeoServer.java:180)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         ... 3 more
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]: Caused by: java.lang.RuntimeException: Error starting org.neo4j.graphdb.facade.GraphDatabaseFacadeFactory, /var/lib/neo4j/data/databases
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.graphdb.facade.GraphDatabaseFacadeFactory.initFacade(GraphDatabaseFacadeFactory.java:232)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at com.neo4j.commercial.edition.CommercialGraphDatabase.<init>(CommercialGraphDatabase.java:20)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at com.neo4j.server.database.CommercialGraphFactory.newGraphDatabase(CommercialGraphFactory.java:40)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.server.database.LifecycleManagingDatabase.start(LifecycleManagingDatabase.java:90)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:452)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         ... 5 more
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]: Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.NeoStoreDataSource@4b6166aa' was successfully initialized, but failed to start. Please see t
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:473)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:111)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.kernel.impl.transaction.state.DataSourceManager.start(DataSourceManager.java:116)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:452)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:111)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         at org.neo4j.graphdb.facade.GraphDatabaseFacadeFactory.initFacade(GraphDatabaseFacadeFactory.java:227)
Sep 18 18:13:57 proddb1-ubuntu neo4j[6805]:         ... 9 more

建议对所有neo4j-admin命令(如backuprestorestore-infoimport)都使用sudo -u neo4j

$ sudo -u neo4j neo4j-admin backup --from=localhost --name=graph.db_backup_with_user --backup-dir=/tmp

$ sudo -u neo4j neo4j-admin restore --from=/tmp/graph.db_backup --database=graph.db --force=true