Description:
The use disk-based storage, a logifle group needs to be created first:
http://dev.mysql.com/doc/refman/5.1/en/create-logfile-group.html
Undo files maybe added to the logfile group. Addition of a logfile involves a specification of the path of the logfile.
According to the documentation, the undofile is then created for each datanode:
"When used with ENGINE = NDB, a logfile group and associated UNDO logfile are created on each Cluster data node. You can verify that the UNDO files were created and obtain information about them by querying the INFORMATION_SCHEMA.FILES table."
For datanodes that are running on the same physical host, the path specified for the undofile identifies the same actual file. I have not encountered any obvious problems due to this, but it does seem like something is likely to go horribly wrong in such a setup.
How to repeat:
Setup a cluster on one physical host:
[NDB_MGMD DEFAULT]
DataDir=/opt/mysql/cluster
[NDB_MGMD]
Id=1
HostName=localhost
LogDestination=FILE:filename=/opt/mysql/cluster/cluster-log
[NDBD DEFAULT]
NoOfReplicas=2
DataDir=/opt/mysql/cluster
[NDBD]
Id=2
HostName=localhost
[NDBD]
Id=3
HostName=localhost
[MYSQLD]
Id=4
HostName=localhost
[MySQLD]
Id=5
HostName=localhost
Then, startup the cluster, and use mysql command line tool to connect to one of the SQL Nodes.
Create a logfile group + undofile:
create logfile group logfilegroup1
add undofile '/opt/mysql/cluster/logfilegroup1_undofile1.dat'
initial_size 20M
undo_buffer_size 10M
engine ndb;
Use the information schema to get the cluster's view on this logfile group:
mysql> select file_name, tablespace_name, table_name, logfile_group_name, extra from information_schema.files;
+------------------------------------------------+-----------------+------------+--------------------+----------------+
| file_name | tablespace_name | table_name | logfile_group_name | extra |
+------------------------------------------------+-----------------+------------+--------------------+----------------+
| /opt/mysql/cluster/logfilegroup1_undofile1.dat | | | logfilegroup1 | CLUSTER_NODE=2 |
| /opt/mysql/cluster/logfilegroup1_undofile1.dat | | | logfilegroup1 | CLUSTER_NODE=3 |
+------------------------------------------------+-----------------+------------+--------------------+----------------+
2 rows in set (0.00 sec)
verify that there is only one such file using a command line shell:
roland@Rolenove:/opt/mysql/cluster$ ls logfilegroup*
logfilegroup1_undofile1.dat
The behaviour as described above has not been entirely reproducable. Dropping the logfile group, shutting down the cluster (management server + data nodes, leaving the sql node alive) and retrying yielded this very strange result:
mysql> create logfile group logfilegroup1 add undofile '/opt/mysql/cluster/logfilegroup1_undofile1.dat' initial_size 20M undo_buffer_size 10M engine ndb;
ERROR 1515 (HY000): Failed to create UNDOFILE
mysql> select file_name, tablespace_name, table_name, logfile_group_name, extra from information_schema.files;
Empty set (0.00 sec)
(so far so good, we want it to fail, but now:)
repeating the statement:
mysql> create logfile group logfilegroup1 add undofile '/opt/mysql/cluster/logfilegroup1_undofile1.dat' initial_size 20M undo_buffer_size 10M engine ndb;
ERROR 1515 (HY000): Failed to create LOGFILE GROUP
mmm, so first creating only the undo file failed, now, the 2nd time, the logfile group itself fails to be created, implying that we did create a logfile group the first time, only the undo file failed to be created. Strange.
mysql> drop logfile group logfilegroup1 engine = ndb;
Query OK, 0 rows affected (0.29 sec)
so, is it there or not? Drop logfile group seems to have done something...
Suggested fix:
I can't judge really. Maybe disk-based storage is not supported at all in this case? If so, the cluster should not silently accept the creation of the log group.
Another solution would be to change the semantics of the path in the UNDOFILE clause - not letting it specify the actual filename, but rather a basename to which the cluster appends a node id to make the files unique.
Anyhow, the attempt to reproduce it seems to give a very strange result. I mean the
ERROR 1515 (HY000): Failed to create UNDOFILE
followed by the
ERROR 1515 (HY000): Failed to create LOGFILE GROUP
If an 'empty' logfile group would be created, it would be very strange for 2 reasons:
1) the statement specifies creating the logfile group WITH the undofile. Either both or none should be created - not half
2) the CREATE LOGFILE GROUP syntax must include the ADD UNDOFILE clause so it seems strange to be able to create an empty logfilegroup this way.