我希望运行Oracle来在静默模式下创建数据库。我想通过Python脚本运行的命令如下:
dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbName testdb -sid testdb -createAsContainerDatabase false -emConfiguration NONE -datafileDestination /u01/data/oracle/testdb/db_files -storageType FS -characterSet AL32UTF8 -totalMemory 2048 -recoveryAreaDestination /u01/app/oracle/fast_recovery_area
如果我直接从bash控制台运行该命令,它将完美地运行。现在,我想将它修改为从python脚本中运行,因此我做了以下操作:
subprocess.check_call(['dbca', '-silent', '-createDatabase', '-templateName', 'General_Purpose.dbc', '-gdbName', gdbName, '-sid', sid, '-createAsContainerDatabase', 'false', '-emConfiguration', 'NONE', '-datafileDestination', dfDest, '-storageType', storageType, '-characterSet', 'AL32UTF8', '-totalMemory', totalMemory, '-recoveryAreaDestination', recoAreaDest])
并不是所有的参数都有单引号,这是因为我将一些变量作为参数传递。我的变量如下:
#### VARIABLES ####
gdbName = ""
sid = ""
#dfDest = ""
storageType = "FS"
totalMemory = "2048"
recoAreaDest = oracle_base + "/fast_recovery_area"
#### USER INPUTS ####
while gdbName == "":
gdbName = input("\n" + "Global DB name: ")
while sid == "":
sid = input("SID: ")
dfDest = "/u01/data/oracle/" + sid + "/db_files"
dfDest = input("Datafile destination [" + dfDest + "]: ")
storageType = input("Storage type [" + storageType + "]: ")
totalMemory = input("Total Memory (in MB) [" + totalMemory + "]: ")
recoAreaDest = input("Fast recover area [" + recoAreaDest + "]: ")
因此,当我运行我的脚本时,会发生以下错误:
[oracle@dataguard-test-primary ~]$ ./oracle_silent_install.py
1. Install Software
2. Create Database
Option: 2
Oracle Database Creation script
Please enter the required info...
Global DB name: d
SID: d
Datafile destination [/u01/data/oracle/d/db_files]:
Storage type [FS]:
Total Memory (in MB) [2048]:
Fast recover area [/u01/app/oracle/fast_recovery_area]:
java.lang.NullPointerException
at oracle.install.commons.swing.StandardDialog$ErrorDialogShowTask.call(StandardDialog.java:567)
at oracle.install.commons.swing.StandardDialog$ErrorDialogShowTask.call(StandardDialog.java:516)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
[oracle@dataguard-test-primary ~]$
发布于 2020-08-13 14:06:49
解决了。
在用户输入部分,当尝试单击' Enter‘来选择默认值时,变量将被替换为null值,因为它没有读取任何内容,因此我在每个用户输入后添加了一个if,以验证用户是否刚刚按Enter,然后再次使用默认值填充变量。
https://stackoverflow.com/questions/63379911
复制相似问题