Wiki source code of Oracle Installation

Last modified by Simon Urli on 2025/08/11 16:01

Show last authors
1 {{box cssClass="floatinginfobox" title="**Contents**"}}
2 {{toc/}}
3 {{/box}}
4
5 = Installation steps =
6
7 == Local install ==
8
9 * Download and install a version of Oracle Database. For example [[Oracle Express or Oracle Standard Edition>>https://www.oracle.com/database/technologies/]].
10 * Download the corresponding [[Oracle JDBC Drivers>>https://www.oracle.com/technetwork/database/application-development/jdbc/downloads/index.html]] and copy the JAR (e.g. ##ojdbc8.jar## in ##WEB-INF/lib/##)
11 * Start Oracle and connect to it with a DBA or system user. For example use the Oracle SQL*Plus command-line tool: {{code}}connect system;{{/code}}
12 * Create the user for the main wiki:(((
13 {{code language="sql"}}
14 create user xwiki
15 identified by xwiki;
16 {{/code}}
17 )))
18 * (Optional) Create a tablespace (files to hold database data). This is optional as Oracle provides a default ##USERS## tablespace which is used when you create a user as above without specifying a tablespace:(((
19 * List existing tablespaces:(((
20 {{code language="sql"}}
21 select * from dba_data_files;
22 {{/code}}
23 )))
24 * Create an ##xwiki## tablespace (adjust the `datafile` path by checking from the listed existing tablespaces), giving it enough space, and then make sure that the ##XWIKI## user uses it:(((
25 * Create the custom tablespace:(((
26 {{code language="sql"}}
27 create tablespace xwiki
28 datafile '/opt/<SOMETHING>/oracle/oradata/<SID>/<PDB>/xwiki01.dbf'
29 size 1m
30 autoextend on
31 maxsize 1g
32 ;
33 {{/code}}
34 )))
35 * Modify the ##XWIKI## user to use it, and make sure it has quotas on it (by default it doesn't):(((
36 {{code language="sql"}}
37 alter user xwiki
38 default tablespace xwiki
39 temporary tablespace temp
40 ;
41 alter user xwiki quota unlimited on xwiki
42 ;
43 {{/code}}
44 )))
45 )))
46 * If you use the default ##USERS## tablespace you may still want to make it large enough. For example:(((
47 {{code language="sql"}}
48 alter database datafile '/opt/<SOMETHING>/oradata/<SID>/<PDB>/users01.dbf' resize 100M;
49 {{/code}}
50 )))
51 )))
52 * Give sufficient privileges to the ##xwiki## user:(((
53 {{code language="sql"}}
54 grant create session to xwiki;
55 grant resource to xwiki;
56 grant dba to xwiki;
57 {{/code}}
58 )))
59 * Tell XWiki to use Oracle. To do this, edit the ##WEB-INF/hibernate.cfg.xml## file where you have expanded the XWiki WAR file and uncommented the Oracle part. Make sure to review the ##connection.url## property. For example a typical Oracle Express would be:{{code}}<property name="connection.url">jdbc:oracle:thin:@localhost:1521:<SID></property>{{/code}}(((
60 {{info}}
61 **XE** is the default name of the ORACLE SID created by default by the installation for Oracle Express. If it is another you should change it. You can find the correct SID in ##app/oracle/product/10.2.0/server/NETWORK/ADMIN/tnsnames.ora## in the Oracle installation directory (for Windows).
62 {{/info}}
63 )))
64
65 * To clean Oracle Database (remove the user, contents and data files):(((
66 {{code language="sql"}}
67 drop tablespace xwiki including contents and datafiles;
68 drop user xwiki cascade;
69 {{/code}}
70 )))
71
72 {{info}}
73 Please note that in Oracle any subwiki created represents an user, so if there are any subwikis created, they also should be deleted when cleaning the database.
74
75 For example, by using:
76
77 {{code}}
78 drop user subwikiname cascade;
79 {{/code}}
80
81 where {{code}}subwikiname{{/code}} is the subwiki's **identifier**.
82 {{/info}}
83
84 == From a VM ==
85
86 An easy to test Oracle is to use a VM. Here are some easy steps:
87
88 * [[Download the VM from the Oracle web site>>http://www.oracle.com/technetwork/database/enterprise-edition/databaseappdev-vm-161299.html]]
89 * Install [[VirtualBox>>https://www.virtualbox.org/]] and import the VM in it
90 * Note: I had to configure the VM network settings to use the "Bridged Adapter" instead of "NAT" in order to be able see it from my host machine
91 * Start the VM and log in as ##oracle##/##oracle##
92 * Note that IP address printed in the shell that opens up, for example: 192.168.0.49
93 * In the shell, starts the manager: ##emctl start dbconsole##
94 * Execute all the instructions above in the shell to create the ##xwiki## database (don't forget to download the JDBC driver and put it in ##WEB-INF/lib##). Tip: Put the following in a file (for example ##xwiki.sql## located on the Desktop) and execute {{code}}echo @Desktop/xwiki.sql | sqlplus system/oracle@orcl{{/code}}:(((
95 {{code language="sql"}}
96 drop user xwiki cascade;
97 create user xwiki identified by xwiki;
98 select * from dba_data_files;
99 create tablespace xwiki datafile '/home/oracle/app/oracle/oradata/orcl/xwiki01.dbf' size 1m autoextend on maxsize 1g;
100 alter user xwiki default tablespace xwiki temporary tablespace temp;
101 alter user xwiki quota unlimited on xwiki;
102 grant create session to xwiki;
103 grant resource to xwiki;
104 grant dba to xwiki;
105 {{/code}}
106 )))
107 * From your host machine, point your browser on http:~/~/192.168.0.49:1158/em and connect as ##system/oracle##
108 * In your XWiki's ##hibernate.cfg.xml##, use:(((
109 {{code language="xml"}}
110 <property name="connection.url">jdbc:oracle:thin:@192.168.0.49:1521:orcl</property>
111 {{/code}}
112 )))
113 * Don't forget to drop the Oracle JDBC driver in your ##WEB-INF/lib## directory!
114 * Enjoy ;)
115
116 == Using Docker ==
117
118 Follow these steps:
119
120 * Start Oracle: {{code language="none"}}docker run --name oracle-xwiki -d -p 1521:1521 -v [<host mount point>:]/opt/oracle/oradata xwiki/oracle-database:19.3.0-se2{{/code}}
121 * Download the corresponding [[JDBC driver>>https://repo1.maven.org/maven2/com/oracle/ojdbc/ojdbc8/]] and put it in XWiki's ##WEB-INF/lib## directory
122 * Edit XWiki's ##hibernate.cfg.xml## file, comment out the Oracle section and make sure you use the following settings:(((
123 {{code language="xml"}}
124 <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521/xwiki</property>
125 <property name="hibernate.connection.username">xwiki</property>
126 <property name="hibernate.connection.password">xwiki</property>
127 {{/code}}
128 )))
129
130 {{info}}
131 If you don't manage to use the docker image and see errors such as "Erreur d'E/S: The Network Adapter could not establish the connection" in tomcat logs, or such as ORA-609 in Docker container logs, it's possible that the container and your tomcat application cannot communicate because of the docker configuration. In such case you can at least debug the problem by trying to create or reuse an host docker network:
132
133 {{code language="none"}}
134 docker network create -d host oracle-network
135 docker run --network=oracle-network ...
136 {{/code}}
137 {{/info}}
138
139 And if you need to execute some SQL command you can do the following:
140
141 * Connect inside the docker container with: {{code language="shell"}}docker -it exec <container id> bash -l{{/code}}
142 * Run ##sqplplus## with one of:
143 ** {{code language="sql"}}sqlplus system/xwiki@//localhost:1521/XWIKI{{/code}} to execute commands in the XWiki PDB
144 ** {{code language="sql"}}sqlplus sys/xwiki@//localhost:1521/XWIKICDB as sysdba{{/code}} if you need to execute commands in the CDB
145
146 {{info}}
147 You can check [[how the XWiki Oracle docker image is built>>https://github.com/xwiki/xwiki-docker-build/tree/master/build-oracle]].
148 {{/info}}
149
150 = Multi wiki support =
151
152 {{version since="12.8RC1"}}
153 When creating a (sub)wiki, XWiki will create a new Oracle user using the equivalent of:
154
155 {{code language="sql"}}
156 CREATE USER <wikiId> IDENTIFIED BY <wikiId> QUOTA UNLIMITED ON USERS;
157 GRANT RESOURCE TO <wikiId>;
158 {{/code}}
159
160 Notes:
161
162 * The default ##USERS## tablespace is used. Thus make sure that this tablespace is large enough. You may need to execute:(((
163 {{code language="sql"}}
164 alter database datafile '/opt/<SOMETHING>/oradata/<SID>/<PDB>/users01.dbf' resize 100M;
165 {{/code}}
166 )))
167 {{/version}}
168
169 = Indexes =
170
171 See [[Database Administration>>Documentation.AdminGuide.Performances.Database Administration.WebHome]].
172
173 {{code}}
174 CREATE INDEX XWLS_VALUE ON XWIKILARGESTRINGS (XWL_VALUE) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('SYNC (ON COMMIT)');
175 create index xwd_parent on xwikidoc (xwd_parent) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('SYNC (ON COMMIT)');
176 create index xwd_class_xml on xwikidoc (xwd_class_xml) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('SYNC (ON COMMIT)');
177 create index xda_docid1 on xwikiattrecyclebin (xda_docid);
178 create index ase_page_date on activitystream_events (ase_page, ase_date);
179 create index ase_param1 on activitystream_events (ase_param1) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('SYNC (ON COMMIT)');
180 create index ase_param2 on activitystream_events (ase_param2) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('SYNC (ON COMMIT)');
181 create index ase_param3 on activitystream_events (ase_param3) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('SYNC (ON COMMIT)');
182 create index ase_param4 on activitystream_events (ase_param4) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('SYNC (ON COMMIT)');
183 create index ase_param5 on activitystream_events (ase_param5) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('SYNC (ON COMMIT)');
184 create index solr_iterate_all_documents on xwikidoc (XWD_WEB, XWD_NAME, XWD_LANGUAGE, XWD_VERSION);
185 {{/code}}
186
187 = Permissions =
188
189 In the instructions above, the DBA role is given to the xwiki user for simplicity. However, that could be a security risk in your environment and you might want to reduce the permissions given to the xwiki user. Here's a minimal list of rights needed by the xwiki user:
190
191 {{code language="sql"}}
192 -- Common operations
193 grant create session to xwiki -- Login to DB;
194 grant resource to xwiki -- Create tables, sequences, etc;
195 grant select any table to xwiki;
196 grant select any sequence to xwiki;
197 grant insert any table to xwiki;
198 grant update any table to xwiki;
199 grant delete any table to xwiki;
200
201 -- Subwiki creation
202 -- Note: creating a subwiki executes the migration step, see below
203 grant create user to xwiki -- Creation of a schema (ie user);
204
205 -- Subwiki deletion
206 grant drop user to xwiki -- Remove user;
207
208 -- Hibernate migrations (at startup and when creating new subwikis only)
209 -- Executed by the "xwiki" user which needs to be able to create tables, sequences, indexes in other user's namespace
210 grant create any table to xwiki;
211 grant drop any table to xwiki;
212 grant alter any table to xwiki;
213 grant create any index to xwiki;
214 grant alter any index to xwiki;
215 grant create any sequence to xwiki;
216 {{/code}}
217
218 {{version before="14.8RC1"}}
219 You also needed to give permissions to the new subwiki user to create objects (tables, indexes, etc).
220
221 {{code language="sql"}}
222 grant resource to xwiki with admin option;
223 {{/code}}
224 {{/version}}
225
226 == Using scripts ==
227
228 You may want to only give the more permissive rights ony when creating or deleting a subwiki or when upgrading an XWiki instance. If this is the case here are some scripts you could use.
229
230 * Script to run to set the rights to normal operations(((
231 {{code language="sql"}}
232 -- Remove rights for subwiki creation/deletion or upgrades
233 revoke create user from xwiki;
234 revoke drop user from xwiki;
235 revoke create any table from xwiki;
236 revoke drop any table from xwiki;
237 revoke alter any table from xwiki;
238 revoke create any index from xwiki;
239 revoke alter any index from xwiki;
240 revoke create any sequence from xwiki;
241
242 -- Common operations
243 grant create session to xwiki -- Login to DB;
244 grant resource to xwiki -- Create tables, sequences, etc;
245 grant select any table to xwiki;
246 grant select any sequence to xwiki;
247 grant insert any table to xwiki;
248 grant update any table to xwiki;
249 grant delete any table to xwiki;
250 {{/code}}
251 )))
252 * Script to run prior to creating a new wiki. Once the wiki has been created, run the "Script to run to set the rights to normal operations" above(((
253 {{code language="sql"}}
254 -- Subwiki creation
255 -- Note: creating a subwiki executes the migration step, see below
256 grant create user to xwiki -- Creation of a schema (ie user);
257
258 -- Hibernate migrations (at startup and when creating new subwikis only)
259 -- Executed by the "xwiki" user which needs to be able to create tables, sequences, indexes in other user's namespace
260 grant create any table to xwiki;
261 grant drop any table to xwiki;
262 grant alter any table to xwiki;
263 grant create any index to xwiki;
264 grant alter any index to xwiki;
265 grant create any sequence to xwiki;
266 {{/code}}
267 )))
268 * Script to run prior to deleting a wiki. Once the wiki has been deleted, run the "Script to run to set the rights to normal operations" above(((
269 {{code language="sql"}}
270 -- Subwiki deletion
271 grant drop user to xwiki -- Remove user;
272 {{/code}}
273 )))
274 * Script to run prior to upgrading to new XWiki version (in case there are schema changes that require executing some SQL commands by XWiki). Once the wiki has been upgraded, run the "Script to run to set the rights to normal operations" above(((
275 {{code language="sql"}}
276 -- Hibernate migrations (at startup and when creating new subwikis only)
277 -- Executed by the "xwiki" user which needs to be able to create tables, sequences, indexes in other user's namespace
278 grant create any table to xwiki;
279 grant drop any table to xwiki;
280 grant alter any table to xwiki;
281 grant create any index to xwiki;
282 grant alter any index to xwiki;
283 grant create any sequence to xwiki;
284 {{/code}}
285 )))
286
287 = Oracle Wallet =
288
289 If you consider that the ##hibernate.cfg.xml## file is not secure and you wish to not have credentials stored in plain text, you can use [[Oracle Wallet>>https://docs.oracle.com/middleware/1213/wls/JDBCA/oraclewallet.htm#JDBCA598]].
290
291 Follow these steps:
292
293 * On the machine having the Oracle DB installed, create a Wallet using {{code language="shell"}}mkstore -wrl <wallet_location> -create{{/code}}
294 * Then add the database credentials to the Wallet: {{code language="shell"}}mkstore -wrl <wallet_location> -createCredential <db_connect_string> <username> <password>{{/code}} (for example: ##mkstore -wrl <wallet_location> -createCredential "localhost:1521/xwiki" xwiki xwiki##. Of course you should use a better password for the xwiki user)
295 * Copy the ##cwallet.sso## and ##ewallet.p12## files to the machine where XWiki is started. Make sure you place them in a secure directory. Let's call it ##WALLETLOCALDIR##.
296 * Download the [[full Oracle JDBC zip>>https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html]], unzip and copy ##oraclepki.jar##, ##osdt_cert.jar## and ##osdt_core.jar## files to XWiki's ##WEB-INF/lib/## directory.
297 * Edit the XWiki ##hibernate.cfg.xml## file and:
298 ** Modify the connection URL for Oracle (notice the ##/## before the ##@## symbol): {{code language="xml"}}<property name="hibernate.connection.url">jdbc:oracle:thin:/@localhost:1521/xwiki</property>{{/code}}
299 ** Remove the following 2 properties or set the username and password to empty values:(((
300 {{code language="xml"}}
301 <property name="hibernate.connection.username">xwiki</property>
302 <property name="hibernate.connection.password">xwiki</property>
303 {{/code}}
304 )))
305 * Modify the way you start XWiki to pass the following system property: {{code language="non"}}-Doracle.net.wallet_location=<WALLETLOCALDIR>{{/code}}
306
307 = Delegate user creation =
308
309 When creating a wiki, XWiki will automatically create a new user (and thus a new schema). However, you could want to [[delegate that to a DBA or infra admin>>extensions:Extension.Wiki Application#HDelegatedatabasecreation]] in order to control the user password used or to use a specific tablespace (just to give 2 examples, there are more).
310
311 == Changing DB passwords for wikis ==
312
313 If you have not been [[delegating creation of the DB users for wikis>>extensions:Extension.Wiki Application#HDelegatedatabasecreation]], the XWiki will have created one user per wiki with the password being the same as the wiki id. Since XWiki users the DB user for the main wiki for all its DB operations, there's no problem changing the passwords for the DB users created for the various wikis (they are not used anyway).
314
315 = Troubleshooting =
316
317 == ORA-01400: cannot insert NULL into ("XWIKI"."XWIKILARGESTRINGS"."XWL_ID") ==
318
319 This error can appear if you're using Oracle JDBC driver 10.2.0.1.0. The solution is to use version 10.2.0.2 or greater of the driver.
320
321 == SetString can only process strings of less than 32766 chararacters ==
322
323 If you see an error that says something like this:
324
325 {{code}}
326 Error number 3201 in 3: Exception while saving document XWiki.XWikiPreferences
327 Wrapped Exception: could not update: [com.xpn.xwiki.doc.XWikiDocumentArchive#104408758]
328 com.xpn.xwiki.XWikiException: Error number 3201 in 3: Exception while saving document XWiki.XWikiPreferences
329 Wrapped Exception: could not update: [com.xpn.xwiki.doc.XWikiDocumentArchive#104408758]
330 ...
331 Wrapped Exception:
332
333 java.sql.SQLException: setString can only process strings of less than 32766 chararacters
334 ...
335 {{/code}}
336
337 Then that's because Oracle has a limitation of 32K for CLOBs. To overcome it you need to add the following 2 properties in the ##hibernate.cfg.xml## file, as specified in the installation steps section above:
338
339 {{code}}
340 <property name="hibernate.connection.SetBigStringTryClob">true</property>
341 <property name="hibernate.jdbc.batch_size">0</property>
342 {{/code}}
343
344 == NullPointerException at HqlSqlWalker ==
345
346 This is actually caused by a wrong Oracle ##ojdbc## JAR being used. There are different JARs for every different minor version of Oracle. For example if you use the JDBC connector for Oracle 11g version 11.2.0.4.0 and your Oracle db version is 11.2.0.1.0 then you'll have the problem.
347
348 == Errors due to missing RAM ==
349
350 If you see one of the following errors in the XWiki logs, it may simply be that you don't allocate enough RAM to Oracle. This is especially true if you're running it in a VM or in a Docker Container. For example we know that 2GB is not enough for Oracle and 2.5GB+ is ok.
351
352 {{code language="none"}}
353 SQL Error: 0, SQLState: null
354 Cannot get a connection, pool error Timeout waiting for idle object
355 ORA-12519, TNS:no appropriate service handler found
356 ORA-01435: user does not exist
357 {{/code}}
358
359 Note that it's possible to have these errors for other reasons too but you should at least check that the RAM is enough.

Get Connected