Wiki source code of MySQL Installation

Version 83.1 by Thomas Mortagne on 2023/10/10

Show last authors
1 {{box cssClass="floatinginfobox" title="**Contents**"}}
2 {{toc/}}
3 {{/box}}
4
5 = Compatibility Considerations =
6
7 See [[Database support strategy>>dev:Community.DatabaseSupportStrategy]] for the supported versions.
8
9 XWiki expects the database to use ##utf8## or ##utf8mb4## encoding with collation ##*_bin## and it's highly recommended to use ##utf8mb4## (and ##utf8mb4_bin##) which is the default since MySQL 8.
10
11 == MyISAM storage engine ==
12
13 MyISAM (the default storage engine for MySQL until release 5.5.5 in 2010) does not support transactions. If there is an error while data is being saved to the database, XWiki will attempt to roll back the transaction to its previous known good state. If you use MyISAM, it will do nothing, leaving the database in whatever state it was in when the error occurred.
14
15 {{warning}}
16 If you use MySQL with any engine that does not support transactions, you will most likely corrupt your database.** We highly recommend using a storage engine such as InnoDB which supports transactions.**
17 {{/warning}}
18
19 == MySQL versions older than 5.0 ==
20
21 XWiki does not fully work with MySQL versions 4.x or lower, due to several limitations of the way the SQL standards are implemented in MySQL, limited support for non-latin1 encodings, the flaky integration of Hibernate and MySQL 4, and other things. Most parts of the application work fine, but there are some parts that cannot be easily fixed, so if you must use MySQL 4.x, you're doing it on your own. MySQL 4 is pretty old and buggy, so we recommend upgrading.
22
23 == MySQL versions older than 5.7 and utf8mb4 ==
24
25 If you use utf8mb4 encoding, you won't be able to use a version of MySQL older than 5.7 out of the box because of a limitation in the default maximum size of the keys and the default row format.
26
27 == JDBC Driver Version ==
28
29 * It's recommended to use the latest version of the MySQL JDBC driver (8.x).
30 * If you're using XWiki < 13.3RC1, you should not use version 8.0.23 of the MySQL JDBC driver since it [[causes a problem with the Liquibase version used in XWiki>>https://jira.xwiki.org/browse/XWIKI-18515]].
31
32 = Installation Steps =
33
34 Follow these instructions:
35
36 * Download and install [[MySQL>>http://www.mysql.com/]] 5.7 or greater.
37 * Start the MySQL server. You can do that in several ways. For example use {{code language="shell"}}mysqld --console{{/code}}
38 * Create the wiki database. You can use the name you want for the database, but you will have to set the hibernate configuration file and ##xwiki.cfg## file accordingly.(((
39 You can create the database in several ways. For example use:
40
41 {{code language="shell"}}
42 mysql -u root -e "create database xwiki default character set utf8mb4 collate utf8mb4_bin"
43 {{/code}}
44 )))
45 * Create the ##xwiki## user with password ##xwiki##(((
46 {{code language="shell"}}
47 mysql -u root -e "CREATE USER 'xwiki'@'localhost' IDENTIFIED BY 'xwiki'";
48 {{/code}}
49 )))
50 * Give privileges to the ##xwiki## user for accessing and creating databases (for the multi wiki support). Specifically the ##xwiki## users needs permissions to be able to execute {{code language="sql"}}CREATE DATABASE{{/code}}, {{code language="sql"}}DROP SCHEMA{{/code}}, and then all CRUD operations on tables. Note that the command below should be tuned to be more restrictive as granting all permissions is not required:(((
51 {{code language="shell"}}
52 mysql -u root -e "grant all privileges on *.* to xwiki@localhost"
53 {{/code}}
54 )))
55 * If the above command fails with a password-does-not-meet-requirements error, uninstall the MySQL password_validate plugin or pick a more complex password and update the password used by default in ##hibernate.cfg.xml##:(((
56 {{code language="shell"}}
57 mysql -u root -p -e "uninstall plugin validate_password;"
58 {{/code}}
59 )))
60 * Please make sure that the DNS-name "localhost" is defined in your hosts-file (i.e. ##/etc/hosts##)
61 * You need to have the MySQL JDBC Driver JAR (named ##mysql-connector-java*.jar##) installed in XWiki's WAR file. If this file isn't present in XWiki's ##WEB-INF/lib## directory you'll need to download it and copy it there. You can download it from the [[MySQL Connector/J Driver page>>http://www.mysql.com/downloads/connector/j/]] or directly from the [[Maven Central Repository>>https://repo1.maven.org/maven2/mysql/mysql-connector-java/]].(((
62 {{warning}}
63 You need the 5.x version or higher. The 3.x version doesn't handle Boolean data correctly and will either throw errors or will make all documents hidden by default.
64 {{/warning}}
65 )))
66 * Now you need to tell XWiki to use MySQL. To do this, edit the ##WEB-INF/hibernate.cfg.xml## file where you have expanded the XWiki WAR file and replace the matching properties with the following ones:(((
67 {{code language="xml"}}
68 <property name="connection.url">jdbc:mysql://localhost/xwiki</property>
69 <property name="connection.username">xwiki</property>
70 <property name="connection.password">xwiki</property>
71 <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
72 <property name="connection.useUnicode">true</property>
73 <property name="connection.characterEncoding">UTF-8</property>
74 {{/code}}
75
76 {{info}}
77 * By default MySQL only accepts packets that are smaller than 1MB. If you get the "Packet for query is too large (max_allowed_packet)" error then see the [[Packet too large error page>>http://dev.mysql.com/doc/refman/5.0/en/packet-too-large.html]]. For example to increase the packet size to 32M you could start the MySQL server with {{code language='shell'}}mysqld --console --max_allowed_packet=32M{{/code}} or you can modify directly the ##my.cnf## configuration file to set this value permanently.
78 * If an empty XWiki starts with no errors, but you are unable to upload the default set of pages (XAR file) try to increase the ##max_allowed_packet## parameter as shown above.
79 {{/info}}
80 )))
81
82 = Indexes =
83
84 See [[Database Administration>>Documentation.AdminGuide.Performances.Database Administration.WebHome]].
85
86 {{code language="mysql"}}
87 // Required
88 create index xwl_value on xwikilargestrings (xwl_value(50));
89 create index xwd_parent on xwikidoc (xwd_parent(50));
90 create index xwd_class_xml on xwikidoc (xwd_class_xml(20));
91 create index xda_docid1 on xwikiattrecyclebin (xda_docid);
92 create index solr_iterate_all_documents on xwikidoc (XWD_WEB(500), XWD_NAME(253), XWD_LANGUAGE(5), XWD_VERSION(10));
93 // Only required if you use stats (feature is off by default)
94 create index xws_number on xwikistatsdoc (XWS_NUMBER);
95 create index xws_classname on xwikistatsdoc (XWS_CLASSNAME);
96 create index xwr_number on xwikistatsreferer (XWR_NUMBER);
97 create index xwr_classname on xwikistatsreferer (XWR_CLASSNAME);
98 create index xwr_referer on xwikistatsreferer (XWR_REFERER(50));
99 create index xwv_user_agent on xwikistatsvisit (XWV_USER_AGENT(255));
100 create index xwv_cookie on xwikistatsvisit (XWV_COOKIE(255));
101 create index xwv_classname on xwikistatsvisit (XWV_CLASSNAME);
102 create index xwv_number on xwikistatsvisit (XWV_NUMBER);
103 {{/code}}
104
105 {{info}}
106 Note to XWiki developers: The following indexes could be created automatically though since they're less than 255 characters and thus should be added in a future version of XWiki so that they don't need to be created manually:
107
108 {{code language="mysql"}}
109 create index xws_number on xwikistatsdoc (XWS_NUMBER);
110 create index xws_classname on xwikistatsdoc (XWS_CLASSNAME);
111 create index xwr_number on xwikistatsreferer (XWR_NUMBER);
112 create index xwr_classname on xwikistatsreferer (XWR_CLASSNAME);
113 create index xwv_classname on xwikistatsvisit (XWV_CLASSNAME);
114 create index xwv_number on xwikistatsvisit (XWV_NUMBER);
115 create index xda_docid1 on xwikiattrecyclebin (xda_docid);
116 {{/code}}
117 {{/info}}
118
119 = Tips =
120
121 == MySQL 8 ==
122
123 * If you're using MySQL 8+ you'll need to configure MySQL with native password: ##default-authentication-plugin=mysql_native_password##.
124 * You'll also be able to switch from ##com.mysql.jdbc.Driver## to ##com.mysql.cj.jdbc.Driver## JDBC driver (since the previous driver class is now deprecated).
125 * If you get the following error then you'll need to force the timezone to use either by setting it in:(((
126 * The MySQL conf file on the server
127 * In the XWiki ##hibernate.cfg.xml## file in the ##hibernate.connection.serverTimezone## property (e.g. ##<property name="hibernate.connection.serverTimezone">Europe/Berlin</property>##).
128 * In the XWiki ##hibernate.cfg.xml## file inside the JDBC URL string as in ##jdbc:mysql:~/~/localhost:3306/myschema?serverTimezone=UTC##
129
130 {{code language="none"}}
131 The server timezone value 'CDT' is unrecognized or represents more than one timezone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc timezone value if you want to utilize timezone support.
132 {{/code}}
133
134 For more details see [[this explanation post>>https://stackoverflow.com/a/54256150/153102]].
135 )))
136
137 == Convert a database to utf8mb4/utf8mb4_bin ==
138
139 {{code language="shell"}}
140 #!/bin/bash
141
142 db=xwiki
143 to_character_set=utf8mb4
144 to_collation=utf8mb4_bin
145
146 mysql_cmd="mysql -u root"
147
148 $mysql_cmd -e "ALTER DATABASE $db CHARACTER SET $to_character_set COLLATE $to_collation;"
149
150 TBL_LIST=$($mysql_cmd -N -s -r -e "use $db;show tables;")
151
152 echo "Temporarily disable all the foreign keys"
153
154 $MYSQL_COMMAND -e "SET FOREIGN_KEY_CHECKS=0;"
155 for tbl_name in $TBL_LIST;
156 do
157 $mysql_cmd -e "alter table $db.$tbl_name convert to character set $to_character_set collate $to_collation;"
158 done
159
160 echo "Turn foreign keys back on"
161
162 $MYSQL_COMMAND -e "SET FOREIGN_KEY_CHECKS=1;"
163
164 echo "Here the result of the operation:"
165 $mysql_cmd -e "USE $db;SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE();"
166 {{/code}}
167
168 {{info}}
169 In case the above script fails with "ERROR 1118 (42000) at line 1: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
170 xwikistatsvisit", you can use the following SQL statements to change tables column types to LONGTEXT to be able to convert the tables to utf8mb4.
171 {{/info}}
172
173 {{code}}
174 ALTER TABLE activitystream_events MODIFY ase_url LONGTEXT, MODIFY ase_title LONGTEXT, MODIFY ase_body LONGTEXT, MODIFY ase_param1 LONGTEXT, MODIFY ase_param2 LONGTEXT, MODIFY ase_param3 LONGTEXT, MODIFY ase_param4 LONGTEXT, MODIFY ase_param5 LONGTEXT;
175 ALTER TABLE xwikistatsreferer MODIFY XWR_REFERER LONGTEXT;
176 ALTER TABLE xwikistatsvisit MODIFY XWV_USER_AGENT LONGTEXT, MODIFY XWV_COOKIE LONGTEXT;
177 ALTER TABLE xwikipreferences MODIFY XWP_LEFT_PANELS LONGTEXT, MODIFY XWP_RIGHT_PANELS LONGTEXT, MODIFY XWP_DOCUMENT_BUNDLES LONGTEXT;
178 {{/code}}
179
180 You can also look at [[this snippet to perform this conversion inside XWiki>>snippets:Extension.Migrate MySQL databases to utf8mb4]].
181
182 == Convert from MyISAM to InnoDB ==
183
184 {{code language="shell"}}
185 #!/bin/bash
186
187 MYSQL_COMMAND=mysql
188 TO_ENGINE=INNODB
189
190 DATABASES=$(mysql -N -s -r -e 'show databases'|grep -v ^information_schema$|grep -v ^mysql$)
191
192 for db in $DATABASES
193 do
194
195 echo "Working on database $db..."
196 echo ""
197
198 TABLES=$(mysql -N -s -r -e "show tables from $db;")
199
200 for tb in $TABLES
201 do
202
203 $MYSQL_COMMAND -e "ALTER TABLE $db.$tb ENGINE = $TO_ENGINE;"
204
205 done
206
207 $MYSQL_COMMAND -e "SELECT table_name,Engine,table_collation FROM information_schema.tables WHERE table_schema = DATABASE();"
208
209 echo ""
210 echo ""
211
212 done
213 {{/code}}
214
215 = Troubleshooting =
216
217 == "Incorrect string value" error with MySQL connector between 8.0.29 and 8.0.32 ==
218
219 {{info}}
220 This is fixed in the connector 8.0.33.
221 {{/info}}
222
223 There seems to be a regression in MySQL connector 8.0.29 that leads to using the default encoding even when it's explicitly indicated in the hibernate.cfg.xml file (which is what you have in the MySQL configuration recommendation provided by XWiki). We are currently searching what could be the cause and find a workaround in https://jira.xwiki.org/browse/XWIKI-19853 but in the (and in general) it's recommended to make sure that you are running XWiki with the right default Java encoding. You can do that by making sure Java is run with ##-Dfile.encoding=utf8## (this is generally the default in standard Tomcat packages of various Linux distribution, but it might not always be the case).
224
225 == Unable to login to MySQL Console ==
226
227 When running {{code language="shell"}}mysql -u root -e "create database xwiki default character set utf8mb4{{/code}} you may get a {{code}}ERROR 1045 (28000): Access denied for user 'xwiki'@'localhost' (using password: YES){{/code}} error.
228 This means that you have a password set for the MySQL root user, but you are not specifying it in the console command. You must also use the //-p// parameter. Using this you will be prompted to enter the password and be allowed to login to the MySQL console and create the database.
229
230 == Can't create test file ==
231
232 When running ##mysqld ~-~-console## you may get the following (especially if you're on a Mac):
233
234 {{code language="none"}}
235 071111 17:20:53 [Warning] Can't create test file /usr/local/mysql-5.0.45-osx10.4-i686/data/Vincent.lower-test
236 071111 17:20:53 [Warning] Can't create test file /usr/local/mysql-5.0.45-osx10.4-i686/data/Vincent.lower-test
237 mysqld: Can't change dir to '/usr/local/mysql-5.0.45-osx10.4-i686/data/' (Errcode: 13)
238 071111 17:20:53 [ERROR] Aborting
239 {{/code}}
240
241 To start MySQL run the following command instead:
242
243 {{code}}
244 sudo /usr/local/mysql/bin/mysqld_safe --user=mysql
245 {{/code}}
246
247 == Data Truncation Error ==
248
249 If you receive an Exception like the following while installing/upgrading XWiki, chances are that you are using an outdated version of MySQLConnectorJ.
250
251 {{code language="none"}}
252 Caused by: java.sql.BatchUpdateException: Data truncation: Out of
253 range value adjusted for column 'XWD_HIDDEN' at row 1
254 at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:894)
255 at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
256 at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
257 at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
258 at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
259 {{/code}}
260
261 On Linux, mysql-connector-java-3.x has proven **not** to work due to a bug in the handling of UTF-8 and lack of support for Boolean types.
262
263 Upgrading to the latest version of MySQLConnectorJ should solve such an error in most of the cases.
264
265 == HTTP 500 Error ==
266
267 {{code language="none"}}
268 HTTP Status 500 -
269
270 type Exception report
271
272 message
273
274 descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
275
276 exception
277
278 javax.servlet.ServletException: com.xpn.xwiki.XWikiException: Error number 3 in 0: Could not initialize main XWiki context
279 Wrapped Exception: Error number 3001 in 3: Cannot load class com.xpn.xwiki.store.migration.hibernate.XWikiHibernateMigrationManager from param xwiki.store.migration.manager.class
280 Wrapped Exception: Error number 0 in 3: Exception while hibernate execute
281 Wrapped Exception: Could not create a DBCP pool. There is an error in the hibernate configuration file, please review it.
282
283 root cause
284
285 com.xpn.xwiki.XWikiException: Error number 3 in 0: Could not initialize main XWiki context
286 Wrapped Exception: Error number 3001 in 3: Cannot load class com.xpn.xwiki.store.migration.hibernate.XWikiHibernateMigrationManager from param xwiki.store.migration.manager.class
287 Wrapped Exception: Error number 0 in 3: Exception while hibernate execute
288 Wrapped Exception: Could not create a DBCP pool. There is an error in the hibernate configuration file, please review it.
289 {{/code}}
290
291 In this case, try to disable **skip-networking** in MySQL *.ini file. Thanks a lot //M Rawash// (see his comment below).
292
293 == Unknown database 'xwiki' ==
294
295 If you get the following error:
296
297 {{code language="none"}}
298 Caused by: class com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'xwiki'
299 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
300 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
301 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
302 at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
303 at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
304 at com.mysql.jdbc.Util.getInstance(Util.java:383)
305 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1062)
306 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4226)
307 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4158)
308 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)
309 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)
310 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2834)
311 at com.mysql.jdbc.ConnectionImpl.setCatalog(ConnectionImpl.java:5456)
312 at org.apache.commons.dbcp.DelegatingConnection.setCatalog(DelegatingConnection.java:374)
313 at org.apache.commons.dbcp.DelegatingConnection.setCatalog(DelegatingConnection.java:374)
314 at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setCatalog(PoolingDataSource.java:333)
315 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
316 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
317 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
318 at java.lang.reflect.Method.invoke(Method.java:606)
319 at org.hibernate.jdbc.BorrowedConnectionProxy.invoke(BorrowedConnectionProxy.java:74)
320 at com.sun.proxy.$Proxy47.setCatalog(Unknown Source)
321 at com.xpn.xwiki.store.XWikiHibernateBaseStore.setDatabase(XWikiHibernateBaseStore.java:729)
322 at com.xpn.xwiki.store.XWikiHibernateBaseStore.beginTransaction(XWikiHibernateBaseStore.java:911)
323 at com.xpn.xwiki.store.XWikiHibernateBaseStore.beginTransaction(XWikiHibernateBaseStore.java:843)
324 at com.xpn.xwiki.store.XWikiHibernateStore.loadXWikiDoc(XWikiHibernateStore.java:830)
325 ...
326 {{/code}}
327
328 It means that XWiki could connect to your database but there's no ##xwiki## schema available there. This is the default name of the schema XWiki is looking for, for the main wiki database.
329
330 It probably means you've created a database named other than ##xwiki## (for example you might have created a database named ##abcd## and set the following connection URL in your ##hibernate.cfg## file: {{code language="none"}}<property name="connection.url">jdbc:mysql://localhost/abcd</property>{{/code}}).
331
332 If this is the case [[you need to tell XWiki that you're using a different schema by setting the ##xwiki.db## configuration property>>Documentation.AdminGuide.Configuration#HConfigurethenamesofdatabaseschemas]].
333
334 == MySQLSyntaxErrorException: Row size too large (> 8126) ==
335
336 if you get the following error:
337
338 {{code language="none"}}
339 MySQLSyntaxErrorException: Row size too large (> 8126).
340 Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help.
341 In current row format, BLOB prefix of 768 bytes is stored inline.
342 {{/code}}
343
344 When you are using a MySQL Server 5.6.20 you can get a "row size too large error."
345 In the release notes, it is explained that a innodb_log_file_size which is too small will trigger a "Row size too large error."
346
347 You can solve the problem by changing the innodb_log_file_size in the my.ini text file.
348 Find more details in the link below.
349 http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-20.html

Get Connected